وبلاگ
آموزش نصب و راهاندازی Telebot در پایتون: قدم به قدم
فهرست مطالب
“تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان
0 تا 100 عطرسازی + (30 فرمولاسیون اختصاصی حامی صنعت)
دوره آموزش Flutter و برنامه نویسی Dart [پروژه محور]
دوره جامع آموزش برنامهنویسی پایتون + هک اخلاقی [با همکاری شاهک]
دوره جامع آموزش فرمولاسیون لوازم آرایشی
دوره جامع علم داده، یادگیری ماشین، یادگیری عمیق و NLP
دوره فوق فشرده مکالمه زبان انگلیسی (ویژه بزرگسالان)
شمع سازی و عودسازی با محوریت رایحه درمانی
صابون سازی (دستساز و صنعتی)
صفر تا صد طراحی دارو
متخصص طب سنتی و گیاهان دارویی
متخصص کنترل کیفی شرکت دارویی
آموزش نصب و راهاندازی Telebot در پایتون: یک راهنمای جامع و قدم به قدم
توسعهدهندگان پایتون همواره به دنبال ابزارها و کتابخانههایی هستند که فرآیند توسعه را سادهتر و کارآمدتر کنند. در دنیای پرطرفدار پیامرسانها، تلگرام با ارائه API قدرتمند خود، امکان ساخت رباتهای بسیار متنوع و کاربردی را فراهم آورده است. در این میان، کتابخانه pyTelegramBotAPI که معمولاً با نام Telebot شناخته میشود، یکی از محبوبترین و کارآمدترین گزینهها برای توسعه رباتهای تلگرام با پایتون است. Telebot با رابط کاربری ساده و مستندات قوی، به برنامهنویسان پایتون، حتی کسانی که تجربه کمی در توسعه ربات دارند، اجازه میدهد تا به سرعت رباتهای پیچیده و تعاملی را ایجاد کنند.
این راهنمای جامع، شما را از صفر تا صد فرآیند نصب، راهاندازی و توسعه یک ربات تلگرام با استفاده از Telebot در پایتون همراهی میکند. ما نه تنها به شما نحوه نوشتن کد را آموزش میدهیم، بلکه به مفاهیم کلیدی، بهترین شیوهها و نکات پیشرفته نیز خواهیم پرداخت. هدف این مقاله، ارائه یک منبع کامل و تخصصی برای هر توسعهدهندهای است که قصد دارد وارد دنیای هیجانانگیز ساخت رباتهای تلگرام با پایتون شود.
در طول این مقاله، به موضوعاتی از قبیل آمادهسازی محیط توسعه، دریافت توکن ربات از BotFather، نصب کتابخانه Telebot، نوشتن اولین ربات “Hello World”، مدیریت پیامها و دستورات، کار با انواع رسانهها، ایجاد کیبوردهای سفارشی، مدیریت وضعیت ربات، خطایابی و لاگگیری، و در نهایت استقرار و نکات امنیتی خواهیم پرداخت. با مطالعه دقیق این راهنما و تمرین مثالهای ارائه شده، شما قادر خواهید بود رباتهای تلگرامی قدرتمند و مقیاسپذیر برای نیازهای شخصی یا تجاری خود بسازید.
پس با ما همراه باشید تا با قدرت پایتون و سادگی Telebot، ایدههای خود را در قالب رباتهای تلگرامی به واقعیت تبدیل کنید.
۱. پیشنیازها و آمادهسازی محیط توسعه برای Telebot
قبل از اینکه بتوانیم وارد دنیای کدنویسی ربات تلگرام با Telebot شویم، لازم است که محیط توسعه مناسبی را فراهم کنیم. این مرحله شامل اطمینان از نصب بودن ابزارهای لازم و پیکربندی صحیح آنها است. پیشنیازهای اصلی برای شروع کار عبارتند از:
۱.۱. نصب پایتون (Python)
Telebot یک کتابخانه پایتون است، بنابراین بدیهی است که شما به یک نسخه نصب شده از پایتون نیاز دارید. توصیه میشود از نسخههای پایدار پایتون ۳.۸ به بالا استفاده کنید، زیرا این نسخهها از قابلیتها و بهینهسازیهای جدیدتری برخوردارند و مشکلات سازگاری کمتری با کتابخانههای مدرن دارند. برای نصب پایتون، به وبسایت رسمی python.org/downloads مراجعه کرده و آخرین نسخه پایدار را دانلود و نصب کنید. حتماً در هنگام نصب، گزینه “Add Python to PATH” را انتخاب کنید تا بتوانید پایتون و pip را از طریق خط فرمان در هر مسیری فراخوانی کنید.
برای بررسی نصب صحیح پایتون و pip، دستورات زیر را در خط فرمان (Command Prompt در ویندوز یا Terminal در لینوکس/مک) وارد کنید:
python --version
pip --version
در صورتی که خروجی نشاندهنده نسخه پایتون و pip باشد، نصب با موفقیت انجام شده است.
۱.۲. مدیریت بستهها با pip
pip ابزار مدیریت بستههای پایتون است و برای نصب و مدیریت کتابخانههای پایتون مانند Telebot ضروری است. همانطور که در بخش قبل ذکر شد، pip معمولاً همراه با پایتون نصب میشود. اگر به هر دلیلی pip نصب نشده بود یا نیاز به بهروزرسانی داشت، میتوانید از دستورات زیر استفاده کنید:
python -m ensurepip --default-pip
python -m pip install --upgrade pip
۱.۳. استفاده از محیطهای مجازی (Virtual Environments)
استفاده از محیطهای مجازی یک
برای ایجاد و فعالسازی یک محیط مجازی، مراحل زیر را دنبال کنید:
- ایجاد پوشه پروژه: ابتدا یک پوشه برای پروژه ربات تلگرام خود ایجاد کنید و وارد آن شوید.
- ایجاد محیط مجازی: دستور زیر را برای ایجاد یک محیط مجازی با نام
venv(نام دلخواه است) اجرا کنید: - فعالسازی محیط مجازی: پس از ایجاد، باید محیط مجازی را فعال کنید. دستور فعالسازی بستگی به سیستم عامل شما دارد:
- ویندوز:
- لینوکس/مک:
mkdir my_telegram_bot
cd my_telegram_bot
python -m venv venv
این دستور یک پوشه venv در دایرکتوری پروژه شما ایجاد میکند که شامل یک نسخه ایزوله از پایتون و pip است.
venv\Scripts\activate
source venv/bin/activate
پس از فعالسازی، نام محیط مجازی (معمولاً (venv)) در ابتدای خط فرمان شما نمایش داده میشود که نشاندهنده فعال بودن آن است.
اکنون شما در یک محیط ایزوله قرار دارید و هر کتابخانهای که نصب کنید، تنها در این محیط قابل دسترسی خواهد بود. این کار نه تنها به حفظ نظم در سیستم شما کمک میکند، بلکه به اشتراکگذاری پروژه با دیگران نیز کمک شایانی میکند، زیرا وابستگیها به صورت محلی مدیریت میشوند.
۱.۴. انتخاب یک ویرایشگر کد (IDE/Text Editor)
برای نوشتن کد پایتون، شما به یک ویرایشگر کد نیاز دارید. گزینههای محبوب زیادی وجود دارند که برخی از آنها عبارتند از:
- VS Code (Visual Studio Code): یک ویرایشگر کد رایگان، سبک و بسیار قدرتمند از مایکروسافت با پشتیبانی عالی از پایتون از طریق افزونهها.
- PyCharm: یک IDE کامل و قدرتمند مخصوص پایتون از JetBrains، که نسخه Community Edition آن رایگان است و ویژگیهای پیشرفتهای برای توسعه پایتون ارائه میدهد.
- Sublime Text: یک ویرایشگر کد سبک و سریع با پشتیبانی از پایتون.
- Atom: یک ویرایشگر کد قابل تنظیم و متنباز از GitHub.
انتخاب ویرایشگر به سلیقه و نیازهای شما بستگی دارد. VS Code و PyCharm Community Edition گزینههای بسیار مناسبی برای شروع هستند و امکانات زیادی از جمله تکمیل خودکار کد، دیباگکردن و مدیریت پروژههای پایتون را فراهم میکنند.
با آمادهسازی این پیشنیازها، شما آماده نصب کتابخانه Telebot و شروع کدنویسی ربات تلگرام خود هستید.
۲. دریافت توکن ربات از BotFather: قلب ربات شما
قبل از اینکه بتوانید هرگونه کدی برای ربات تلگرام خود بنویسید، نیاز به یک “توکن” (Token) دارید. این توکن یک رشته منحصربهفرد از حروف و اعداد است که هویت ربات شما را مشخص میکند و به آن اجازه میدهد تا با API تلگرام ارتباط برقرار کند. دریافت توکن ربات از طریق ربات رسمی تلگرام به نام BotFather انجام میشود.
۲.۱. گام به گام با BotFather
- جستجو و شروع BotFather:
ابتدا اپلیکیشن تلگرام را باز کنید و در قسمت جستجو، عبارت
@BotFatherرا تایپ کنید. BotFather یک ربات رسمی و تایید شده توسط تلگرام است. آن را پیدا کرده و روی دکمه “Start” (شروع) کلیک کنید تا مکالمه با آن آغاز شود. BotFather لیستی از دستوراتی که میتوانید استفاده کنید را نمایش میدهد.به یاد داشته باشید که BotFather مسئول ایجاد و مدیریت تمام رباتهای شما است. همیشه از طریق همین ربات با رباتهای خود تعامل خواهید داشت.
- ایجاد یک ربات جدید:
برای ایجاد یک ربات جدید، دستور
/newbotرا برای BotFather ارسال کنید. BotFather از شما میپرسد که چه نامی برای ربات خود انتخاب میکنید. این نام، نامی است که کاربران در تلگرام آن را میبینند.مثال:
Please choose a name for your bot. MyAwesomeBotپس از ارسال نام، BotFather از شما میخواهد که یک نام کاربری (username) برای ربات خود انتخاب کنید. نام کاربری باید منحصر به فرد باشد و به
botختم شود (مثلاًMyAwesomeBot_botیاAwesomeBotBot).مثال:
Good. Now let's choose a username for your bot. It must end in 'bot'. MyAwesomeBot_bot - دریافت توکن ربات:
پس از انتخاب نام کاربری موفق، BotFather پیامی شامل تبریک و مهمتر از همه، توکن API ربات شما را ارسال میکند. این توکن یک رشته طولانی از حروف و اعداد است که شبیه به این فرمت است:
123456789:AAHh_iJkLmNoPqRsTuVwXyZ01234567890این توکن را با دقت کپی کنید و در مکانی امن نگه دارید. هرگز آن را در کدهای خود به صورت عمومی قرار ندهید و به اشتراک نگذارید. توکن ربات شما کلید دسترسی به ربات شماست و کسی که به آن دسترسی داشته باشد، میتواند ربات شما را کنترل کند.
BotFather همچنین لینکی به ربات شما (
t.me/MyAwesomeBot_bot) ارائه میدهد تا بتوانید به راحتی آن را پیدا و با آن تعامل کنید. - تنظیمات اختیاری ربات (با استفاده از BotFather):
BotFather دستورات دیگری نیز برای مدیریت ربات شما ارائه میدهد که برخی از آنها عبارتند از:
/setname: برای تغییر نام نمایش داده شده ربات./setdescription: برای تنظیم توضیحات ربات که در صفحه اطلاعات آن نمایش داده میشود./setabouttext: برای تنظیم متن “درباره” ربات که در ابتدای مکالمه با کاربر جدید نمایش داده میشود./setuserpic: برای آپلود عکس پروفایل ربات./setcommands: برای تنظیم لیستی از دستورات اصلی ربات که با تایپ/نمایش داده میشوند./token: برای دریافت مجدد توکن ربات (در صورت فراموشی)./revoke: برای باطل کردن توکن فعلی و دریافت توکن جدید (در صورتی که فکر میکنید توکن شما به خطر افتاده است).
توصیه میشود حداقل توضیحات، متن “درباره” و عکس پروفایل مناسبی برای ربات خود تنظیم کنید تا تجربه کاربری بهتری ارائه دهید.
با در دست داشتن توکن ربات، اکنون آمادهاید تا کتابخانه Telebot را نصب کرده و شروع به کدنویسی اولین ربات خود کنید. این توکن، مهمترین عنصر برای اتصال کد پایتون شما به سرورهای تلگرام است.
۳. نصب کتابخانه Telebot (pyTelegramBotAPI): آمادهسازی برای کدنویسی
پس از آمادهسازی محیط توسعه و دریافت توکن ربات، گام بعدی نصب کتابخانه pyTelegramBotAPI است. همانطور که پیشتر اشاره شد، این کتابخانه به سادگی با نام Telebot شناخته میشود و استفاده از آن از طریق pip بسیار آسان است.
۳.۱. نصب Telebot با pip
اطمینان حاصل کنید که محیط مجازی پروژه شما فعال است (اگر از آن استفاده میکنید). سپس، دستور زیر را در خط فرمان اجرا کنید:
pip install pyTelegramBotAPI
این دستور آخرین نسخه پایدار Telebot را از PyPI (Python Package Index) دانلود و در محیط مجازی یا سراسری پایتون شما نصب میکند. خروجی نصب باید شبیه به این باشد:
Collecting pyTelegramBotAPI
Downloading pyTelegramBotAPI-x.y.z.tar.gz (xxx kB)
...
Installing collected packages: pyTelegramBotAPI
Successfully installed pyTelegramBotAPI-x.y.z
در صورتی که با پیغام خطا مواجه شدید، مطمئن شوید که اتصال اینترنت دارید و pip به درستی نصب شده است. اگر در محیط مجازی کار میکنید و همچنان مشکل دارید، اطمینان حاصل کنید که محیط مجازی فعال است.
۳.۲. وابستگیها (Dependencies)
pyTelegramBotAPI خود دارای وابستگیهای کمی است که pip به صورت خودکار آنها را نیز نصب میکند. اصلیترین وابستگی آن requests است که برای برقراری ارتباط با API تلگرام استفاده میشود. شما نیازی به نصب دستی این وابستگیها ندارید، زیرا pip به صورت هوشمندانه آنها را مدیریت میکند.
۳.۳. تأیید نصب
برای اطمینان از اینکه Telebot به درستی نصب شده است، میتوانید یک اسکریپت پایتون بسیار ساده ایجاد کرده و سعی کنید کتابخانه را import کنید. یک فایل با نام check_install.py ایجاد کنید و کد زیر را در آن قرار دهید:
import telebot
print("Telebot imported successfully!")
سپس، این فایل را از طریق خط فرمان اجرا کنید:
python check_install.py
اگر خروجی Telebot imported successfully! را مشاهده کردید و هیچ خطایی نمایش داده نشد، به این معنی است که Telebot به درستی نصب شده و آماده استفاده است.
۳.۴. بهروزرسانی Telebot
همانند هر کتابخانه دیگری، Telebot نیز به صورت مداوم بهروزرسانی میشود تا ویژگیهای جدید اضافه شده، باگها رفع شده و عملکرد آن بهبود یابد. برای بهروزرسانی Telebot به آخرین نسخه، میتوانید از دستور زیر استفاده کنید:
pip install --upgrade pyTelegramBotAPI
این کار تضمین میکند که شما همیشه از جدیدترین قابلیتها و رفع اشکالات بهرهمند شوید.
اکنون که Telebot با موفقیت نصب شده است، میتوانید به مرحله هیجانانگیز نوشتن کد برای اولین ربات تلگرام خود بروید.
۴. اولین ربات خود را بسازید: Hello World با Telebot
زمان آن فرا رسیده است که اولین ربات خود را با Telebot ایجاد کنید. این بخش به شما نشان میدهد که چگونه یک ربات ساده “Hello World” بسازید که به دستور /start پاسخ دهد و یک پیغام خوشآمدگویی ارسال کند.
۴.۱. ایجاد فایل پروژه و وارد کردن توکن
در پوشه پروژه خود (که محیط مجازی در آن فعال است)، یک فایل پایتون جدید با نام bot.py (یا هر نام دلخواه دیگری) ایجاد کنید.
امنیت توکن: همانطور که قبلاً ذکر شد، توکن ربات شما یک اطلاعات حساس است. هرگز آن را مستقیماً در کد خود قرار ندهید و آن را در گیتهاب یا هر مخزن عمومی دیگری منتشر نکنید. بهترین روش برای مدیریت توکن، استفاده از متغیرهای محیطی است. برای سادگی در این آموزش، ما آن را در یک فایل .env قرار میدهیم و سپس با کتابخانه python-dotenv آن را بارگذاری میکنیم. اگر پروژه شما کوچک است و به صورت محلی اجرا میشود، میتوانید آن را در یک متغیر معمولی نگه دارید، اما برای پروژههای جدیتر، استفاده از متغیرهای محیطی حیاتی است.
- نصب
python-dotenv:این کتابخانه به شما امکان میدهد متغیرهای محیطی را از یک فایل
.envبارگذاری کنید.pip install python-dotenv - ایجاد فایل
.env:در همان پوشه
bot.py، یک فایل با نام.envایجاد کنید و توکن ربات خود را به شکل زیر در آن قرار دهید:BOT_TOKEN=123456789:AAHh_iJkLmNoPqRsTuVwXyZ01234567890توجه:
.envرا به فایل.gitignoreخود اضافه کنید تا تصادفی آن را در کنترل نسخه قرار ندهید.
۴.۲. کدنویسی اولین ربات
حالا فایل bot.py را باز کرده و کد زیر را در آن وارد کنید:
import os
import telebot
from dotenv import load_dotenv
# بارگذاری متغیرهای محیطی از فایل .env
load_dotenv()
# دریافت توکن ربات از متغیر محیطی
BOT_TOKEN = os.getenv('BOT_TOKEN')
# بررسی وجود توکن
if BOT_TOKEN is None:
print("خطا: توکن ربات در متغیرهای محیطی یا فایل .env یافت نشد.")
exit(1)
# ایجاد یک نمونه از ربات
# parse_mode='HTML' اجازه میدهد که پیامها را با فرمت HTML ارسال کنیم
bot = telebot.TeleBot(BOT_TOKEN, parse_mode='HTML')
# Message handler برای دستور /start
# این تابع هر پیامی را که با دستور /start شروع شود، مدیریت میکند
@bot.message_handler(commands=['start'])
def send_welcome(message):
# دریافت اطلاعات کاربر
user_first_name = message.from_user.first_name
user_id = message.from_user.id
# ارسال پیام خوشآمدگویی به کاربر
# استفاده از HTML برای فرمتدهی متن
welcome_message = (
f"سلام {user_first_name}!\n"
f"به ربات من خوش آمدید!\n"
f"آیدی شما: {user_id}\n"
f"برای دریافت راهنمایی، دستور /help را ارسال کنید."
)
bot.reply_to(message, welcome_message)
# Message handler برای دستور /help
# این تابع به دستور /help پاسخ میدهد
@bot.message_handler(commands=['help'])
def send_help(message):
help_text = (
"دستورات موجود:\n"
"/start - شروع ربات و دریافت پیام خوش آمدگویی\n"
"/help - مشاهده لیست دستورات\n"
"هر متن دیگری را ارسال کنید تا ربات آن را تکرار کند!"
)
bot.reply_to(message, help_text)
# Message handler برای هر نوع پیام متنی (به غیر از دستورات)
# این handler برای مدیریت پیامهایی است که هیچ command خاصی نیستند.
# content_types=['text'] نشان میدهد که فقط پیامهای متنی را مدیریت کند.
@bot.message_handler(func=lambda message: True, content_types=['text'])
def echo_all(message):
# ربات، پیام دریافتی را برای کاربر تکرار میکند
bot.reply_to(message, f"شما گفتید: {message.text}")
# شروع polling ربات
# این خط ربات را فعال میکند تا پیامهای جدید را از تلگرام دریافت کند.
# non_stop=True باعث میشود که ربات حتی پس از بروز خطا نیز به کار خود ادامه دهد.
# interval=0 به معنای این است که بلافاصله پس از دریافت یک بهروزرسانی، بهروزرسانی بعدی را درخواست کند.
# timeout=20 به سرور تلگرام میگوید که تا 20 ثانیه برای پاسخ منتظر بماند.
print("ربات در حال اجرا است...")
try:
bot.polling(non_stop=True, interval=0, timeout=20)
except Exception as e:
print(f"خطایی رخ داد: {e}")
# در محیطهای production باید لاگگیری دقیقتری انجام شود.
# میتوانید از یک کتابخانه لاگگیری مانند logging پایتون استفاده کنید.
۴.۳. توضیحات کد
بیایید خط به خط کد را بررسی کنیم تا هر بخش را درک کنید:
import os, telebot, load_dotenv: ما ماژولهای لازم را وارد میکنیم.osبرای تعامل با سیستم عامل (مثلاً دسترسی به متغیرهای محیطی) وload_dotenvبرای بارگذاری.env.load_dotenv(): این تابع ازpython-dotenvبرای بارگذاری متغیرهای تعریف شده در فایل.envبه متغیرهای محیطی سیستم استفاده میشود.BOT_TOKEN = os.getenv('BOT_TOKEN'): توکن ربات را از متغیرهای محیطی دریافت میکنیم.bot = telebot.TeleBot(BOT_TOKEN, parse_mode='HTML'): یک نمونه از کلاسTeleBotایجاد میکنیم. این شیء ربات اصلی شما است که برای تعامل با API تلگرام استفاده میشود. پارامترparse_mode='HTML'به ربات میگوید که پیامهایی که ارسال میکنید را به عنوان HTML تفسیر کند، که به شما امکان میدهد متن را bold، italic، و غیره کنید.@bot.message_handler(commands=['start']): این یک “دکوراتور” (decorator) است. دکوراتورها تابعی را که بلافاصله پس از آنها تعریف میشود، به یک handler پیام تبدیل میکنند. این handler خاص به ربات میگوید که تابعsend_welcomeرا هر زمانی که کاربر دستور/startرا ارسال کرد، فراخوانی کند.def send_welcome(message):: این تابع handler است. متغیرmessageیک شیء حاوی تمام اطلاعات مربوط به پیام دریافتی از کاربر است (مثل متن پیام، اطلاعات کاربر، زمان ارسال و…).bot.reply_to(message, welcome_message): این متد برای ارسال پاسخ به کاربر استفاده میشود.messageپیامی است که ربات به آن پاسخ میدهد وwelcome_messageمتنی است که ربات ارسال میکند.@bot.message_handler(func=lambda message: True, content_types=['text']): این یک handler دیگر است که کمی عمومیتر است.func=lambda message: True: این یک تابع لامبدا است که همیشه True را برمیگرداند. به این معنی که این handler برای هر پیامی (که توسط سایر handlerها گرفته نشده باشد) فعال میشود.content_types=['text']: این پارامتر مشخص میکند که این handler فقط برای پیامهای از نوع “متنی” فعال شود. Telebot میتواند انواع دیگری از محتوا مانند عکس، ویدئو، فایل و غیره را نیز مدیریت کند.
bot.polling(non_stop=True, interval=0, timeout=20): این خط کد مهمترین بخش است که ربات را فعال میکند. متدpollingبه صورت مداوم (با الگوی Long Polling) به سرورهای تلگرام درخواست میدهد تا بهروزرسانیهای جدید (پیامها، تغییرات وضعیت و…) را دریافت کند.non_stop=True: این تضمین میکند که ربات در صورت بروز خطا نیز از کار نمیافتد و سعی میکند به کار خود ادامه دهد.interval=0: مشخص میکند که ربات چقدر باید بین هر درخواست Long Polling منتظر بماند (صفر یعنی بلافاصله درخواست بعدی را ارسال کند).timeout=20: حداکثر زمانی (به ثانیه) که تلگرام باید برای ارسال بهروزرسانیهای جدید منتظر بماند، اگر هیچ بهروزرسانی در دسترس نباشد.
try...exceptبلاک: برای مدیریت خطاهای احتمالی در حین اجرای ربات استفاده میشود.
۴.۴. اجرای ربات
پس از ذخیره فایل bot.py، آن را از طریق خط فرمان اجرا کنید:
python bot.py
شما باید خروجی ربات در حال اجرا است... را مشاهده کنید.
حالا اپلیکیشن تلگرام را باز کنید، رباتی را که با BotFather ایجاد کردهاید پیدا کنید و با آن گفتگو را شروع کنید. دستور /start را ارسال کنید. ربات باید با یک پیام خوشآمدگویی به شما پاسخ دهد. سپس /help را امتحان کنید و هر متن دیگری را برای تست تابع echo_all ارسال کنید.
تبریک میگوییم! شما اولین ربات تلگرام خود را با Telebot ساختید و آن را با موفقیت اجرا کردید. در بخشهای بعدی، به قابلیتهای پیشرفتهتر Telebot خواهیم پرداخت.
۵. مدیریت پیامها و دستورات: Message Handlerها و Command Handlerها
در رباتهای تلگرام، تعامل با کاربر عمدتاً از طریق پیامها و دستورات (commands) انجام میشود. Telebot برای مدیریت این تعاملات، مفهومی به نام “Handler” را معرفی کرده است. Handlerها توابعی هستند که بر اساس معیارهای خاصی (مانند متن پیام، نوع محتوا، یا اینکه یک دستور خاص است) فراخوانی میشوند.
۵.۱. Command Handlers
@bot.message_handler(commands=[...]) برای مدیریت دستورات خاصی طراحی شده است که با / شروع میشوند (مانند /start، /help، /settings). شما میتوانید یک یا چند دستور را در لیست commands مشخص کنید.
# handler برای دستور /settings
@bot.message_handler(commands=['settings'])
def settings_command(message):
bot.reply_to(message, "این بخش تنظیمات ربات است.")
# handler برای چندین دستور
@bot.message_handler(commands=['about', 'info'])
def about_info_commands(message):
bot.reply_to(message, "این ربات توسط [نام شما] توسعه داده شده است.")
۵.۲. Text Message Handlers
برای مدیریت پیامهای متنی عادی که دستور نیستند، میتوانید از message_handler بدون آرگومان commands استفاده کنید و به جای آن از پارامتر func یا content_types بهره بگیرید.
# handler برای هر پیام متنی که دستور نیست
# این handler فقط پیامهای متنی را دریافت میکند که توسط هیچ handler دستوری دیگری پردازش نشده باشند.
@bot.message_handler(func=lambda message: True, content_types=['text'])
def handle_text_messages(message):
if "سلام" in message.text:
bot.reply_to(message, "سلام بر شما!")
elif "چطوری" in message.text:
bot.reply_to(message, "من یک ربات هستم، همیشه عالی!")
else:
bot.reply_to(message, f"متن دریافتی شما: '{message.text}'")
تابع func یک تابع (یا لامبدا) است که یک شیء message را به عنوان ورودی میگیرد و اگر True برگرداند، handler فعال میشود. اگر False برگرداند، handler نادیده گرفته میشود. این امکان را به شما میدهد تا منطق پیچیدهتری برای فعالسازی یک handler ایجاد کنید.
۵.۳. Content Type Handlers
رباتهای تلگرام میتوانند انواع مختلفی از محتوا را دریافت کنند، از جمله عکس، ویدئو، فایل، صدا، استیکر، و موارد دیگر. شما میتوانید handlerهای خاصی برای هر نوع محتوا ایجاد کنید:
# handler برای عکسها
@bot.message_handler(content_types=['photo'])
def handle_photos(message):
# message.photo حاوی لیستی از سایزهای مختلف عکس است
# آخرین آیتم در لیست معمولاً بزرگترین سایز است
file_id = message.photo[-1].file_id
bot.reply_to(message, "عکس شما دریافت شد! شناسه فایل: " + file_id)
# handler برای اسناد (فایلها)
@bot.message_handler(content_types=['document'])
def handle_documents(message):
file_name = message.document.file_name
file_id = message.document.file_id
bot.reply_to(message, f"فایل '{file_name}' با شناسه '{file_id}' دریافت شد.")
# handler برای استیکرها
@bot.message_handler(content_types=['sticker'])
def handle_stickers(message):
bot.reply_to(message, "چه استیکر باحالی! 😎")
# handler عمومی برای انواع مختلف محتوا
@bot.message_handler(content_types=['audio', 'video', 'voice'])
def handle_media(message):
bot.reply_to(message, "محتوای چندرسانهای شما دریافت شد!")
شما میتوانید چندین content_type را در یک لیست به message_handler ارسال کنید تا یک handler بتواند انواع مختلفی از محتوا را مدیریت کند.
۵.۴. اولویت Handlerها
ترتیب تعریف handlerها در کد شما اهمیت دارد. Telebot handlerها را به ترتیبی که تعریف شدهاند، بررسی میکند. اگر یک پیام توسط یک handler گرفته شود، دیگر به handlerهای بعدی نمیرود. بنابراین، همیشه handlerهای خاصتر (مثلاً برای دستورات خاص) را قبل از handlerهای عمومیتر (مانند func=lambda message: True) قرار دهید.
مثال اشتباه (handler عمومی قبل از handler خاص):
# اشتباه! این handler تمام پیامها (از جمله دستورات) را میگیرد
@bot.message_handler(func=lambda message: True, content_types=['text'])
def catch_all_text(message):
bot.reply_to(message, "هرچیزی گفتی!")
@bot.message_handler(commands=['start'])
def start_command(message):
# این handler هرگز فراخوانی نمیشود چون catch_all_text قبل از آن پیام /start را گرفته است.
bot.reply_to(message, "شروع شد!")
مثال صحیح (handler خاص قبل از handler عمومی):
@bot.message_handler(commands=['start'])
def start_command(message):
bot.reply_to(message, "شروع شد!")
# این handler فقط پیامهای متنی را میگیرد که توسط هیچ handler دیگری (مثل /start) گرفته نشده باشند.
@bot.message_handler(func=lambda message: True, content_types=['text'])
def catch_all_text(message):
bot.reply_to(message, "هرچیزی گفتی!")
با درک و استفاده صحیح از Message Handlerها، میتوانید رباتهایی با تعاملات پیچیده و پاسخهای هوشمندانه برای انواع ورودیهای کاربر ایجاد کنید.
۶. ارسال و دریافت انواع رسانه: عکس، ویدئو، فایل و داکیومنت با Telebot
رباتهای تلگرام فقط به پیامهای متنی محدود نمیشوند؛ آنها میتوانند انواع مختلفی از رسانهها را ارسال و دریافت کنند. Telebot ابزارهای قدرتمندی برای کار با عکسها، ویدئوها، فایلها، صداها و سایر انواع محتوا فراهم میکند.
۶.۱. ارسال انواع رسانه
برای ارسال رسانهها، میتوانید از متدهای مختلفی که TeleBot ارائه میدهد استفاده کنید، مانند send_photo، send_video، send_document، send_audio و send_sticker. برای این متدها، شما باید chat_id (شناسه چت کاربر یا گروه) و محتوای رسانه را ارائه دهید.
محتوای رسانه میتواند به سه صورت ارائه شود:
- شناسه فایل (File ID): اگر فایل قبلاً در تلگرام آپلود شده باشد (مثلاً توسط ربات شما یا کاربران دیگر و شما
file_idآن را دارید)، میتوانید مستقیماً ازfile_idاستفاده کنید. این کار سریعترین روش است زیرا تلگرام نیازی به آپلود مجدد فایل ندارد. - لینک URL: میتوانید یک URL مستقیم به فایل رسانه ارائه دهید. ربات تلگرام آن را از URL دانلود و ارسال میکند.
- فایل محلی: میتوانید یک شیء فایل باز (open file object) را ارسال کنید. ربات تلگرام فایل را از دیسک شما میخواند و آپلود میکند.
مثالهای ارسال رسانه:
# فرض کنید bot قبلاً تعریف و راهاندازی شده است
# ارسال عکس
@bot.message_handler(commands=['send_photo'])
def send_random_photo(message):
chat_id = message.chat.id
# روش ۱: ارسال عکس با URL
# bot.send_photo(chat_id, "https://picsum.photos/200/300", caption="یک عکس تصادفی از اینترنت")
# روش ۲: ارسال عکس از فایل محلی
try:
with open('images/example_photo.jpg', 'rb') as photo:
bot.send_photo(chat_id, photo, caption="عکسی از فایل محلی")
except FileNotFoundError:
bot.send_message(chat_id, "فایل example_photo.jpg یافت نشد. لطفا مطمئن شوید که در پوشه images قرار دارد.")
# روش ۳: ارسال عکس با File ID (اگر قبلا آپلود شده باشد)
# file_id_of_previous_photo = "AgADBAADm..._ID_HERE" # جایگزین با File ID واقعی
# bot.send_photo(chat_id, file_id_of_previous_photo, caption="عکس با File ID")
# ارسال ویدئو
@bot.message_handler(commands=['send_video'])
def send_example_video(message):
chat_id = message.chat.id
try:
with open('videos/example_video.mp4', 'rb') as video:
bot.send_video(chat_id, video, caption="یک ویدئوی کوتاه")
# میتوانید thumbnail هم اضافه کنید: thumbnail=open('videos/thumbnail.jpg', 'rb')
except FileNotFoundError:
bot.send_message(chat_id, "فایل example_video.mp4 یافت نشد.")
# ارسال فایل (سند)
@bot.message_handler(commands=['send_document'])
def send_example_document(message):
chat_id = message.chat.id
try:
with open('documents/example_document.pdf', 'rb') as doc:
bot.send_document(chat_id, doc, caption="یک فایل PDF مهم")
except FileNotFoundError:
bot.send_message(chat_id, "فایل example_document.pdf یافت نشد.")
# ارسال صدا
@bot.message_handler(commands=['send_audio'])
def send_example_audio(message):
chat_id = message.chat.id
try:
with open('audios/example_audio.mp3', 'rb') as audio:
bot.send_audio(chat_id, audio, caption="یک فایل صوتی", title="آهنگ نمونه", performer="هنرمند ناشناس")
except FileNotFoundError:
bot.send_message(chat_id, "فایل example_audio.mp3 یافت نشد.")
# ارسال استیکر
@bot.message_handler(commands=['send_sticker'])
def send_example_sticker(message):
chat_id = message.chat.id
# از file_id یک استیکر موجود استفاده کنید
sticker_id = "CAACAgIAAxkBAAIDaWN1D0vA94s_k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o-k-n1o
“تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان