雑談掲示板


対象スレッド
件名: Re: あきひろしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこスレ@あきひろの名言:返信遅いやつはデブ
名前: Manda ◆yJgqE12nbI

処理選択


パスワード