Compare commits

..
Author SHA1 Message Date
vantablackTea 84da62c45d optimisation: baked jdk and sdk into runner 2026-10-08 16:56:27 +03:00
Agzamus 57e5bd9af8 feat: department display 2026-10-08 02:10:26 +03:00
Agzamus c7298c0c84 fix: wrong parsed teacher schedule 2026-10-08 01:42:26 +03:00
Agzamus ae0fea1ea6 fix: ssl error & offline teacher schedule 2026-10-07 21:55:53 +03:00
Agzamus af1f374b95 Обновить README.md 2026-09-20 17:42:05 +03:00
17 changed files with 3466 additions and 77 deletions
+2 -33
View File
@@ -18,50 +18,19 @@ on:
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
releases: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
# Ставим JDK вручную и явно прописываем JAVA_HOME.
# actions/setup-java не всегда передаёт JAVA_HOME дальше в Gitea Actions.
- name: Verify Environment
run: |
set -euxo pipefail
cd /tmp
wget -q https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.12%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz
tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz -C /opt
mv /opt/jdk-17.0.12+7 /opt/java17
export JAVA_HOME=/opt/java17
export PATH=$JAVA_HOME/bin:$PATH
echo "JAVA_HOME=/opt/java17" >> $GITHUB_ENV
echo "$JAVA_HOME/bin" >> $GITHUB_PATH
java -version
javac -version
- name: Install Android SDK
# Устанавливаем command-line tools и нужные компоненты SDK,
# затем прописываем ANDROID_HOME (читается Gradle/AGP).
run: |
set -euxo pipefail
echo "ANDROID_HOME=/opt/android-sdk" >> "$GITHUB_ENV"
mkdir -p /opt/android-sdk/cmdline-tools
wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O /tmp/clt.zip
unzip -q /tmp/clt.zip -d /tmp/clt
mv /tmp/clt/cmdline-tools /opt/android-sdk/cmdline-tools/latest
yes | /opt/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses >/dev/null 2>&1 || true
/opt/android-sdk/cmdline-tools/latest/bin/sdkmanager \
"platform-tools" \
"platforms;android-36.1" \
"build-tools;36.1.0"
echo "SDK path: $ANDROID_HOME"
- name: Grant execute permission for gradlew
run: |
chmod +x gradlew
java -version
# Версия по дате (ГГГГ.ММ.ДД), при совпадении тега добавляем уникальный суффикс.
- name: Generate version from date
+7 -1
View File
@@ -1,2 +1,8 @@
# vyatsu-schedule
# ВятГУ расписание _(неофициальный Android клиент)_
Расписание загружается и парсится прямиком с сайта ВятГУ, и сохраняется в локальную БД телефона без промежуточных серверов
- Расписание групп - парсится из PDF-ок ([тута](https://www.vyatsu.ru/studentu-1/spravochnaya-informatsiya/raspisanie-zanyatiy-dlya-studentov.html))
- Расписание преподавателей - загружаются все расписания преподавателей [отсюда](https://www.vyatsu.ru/studentu-1/spravochnaya-informatsiya/teacher.html) на выбранный переиод (ибо раскиданы по кафедрам)
+1
View File
@@ -12,6 +12,7 @@
android:fullBackupContent="@xml/backup_rules"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.VyatsuSchedule">
@@ -0,0 +1,10 @@
package agzam.vyatsu.data.local
import androidx.room.Embedded
/** Занятие преподавателя + кафедра-источник. Проекция LEFT JOIN, схема Room не меняется. */
data class TeacherLessonWithDepartment(
@Embedded val lesson: TeacherLessonEntity,
val departmentId: String,
val departmentName: String?
)
@@ -33,6 +33,9 @@ interface TeacherScheduleDao {
@Query("DELETE FROM teacher_schedules")
suspend fun deleteAll()
@Query("SELECT lastSyncedAt FROM teacher_schedules WHERE departmentId = :departmentId AND season = :season AND weekStart = :weekStart")
suspend fun lastSyncedAt(departmentId: String, season: String, weekStart: Long): Long?
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertDays(days: List<TeacherDayEntity>): List<Long>
@@ -41,6 +44,7 @@ interface TeacherScheduleDao {
@Transaction
suspend fun replaceSchedule(schedule: TeacherScheduleEntity, days: List<TeacherDayEntity>, lessons: List<TeacherLessonEntity>) {
deleteSchedule(schedule.departmentId, schedule.season.name, schedule.weekStart)
val scheduleId = insertSchedule(schedule)
val daysWithScheduleId = days.map { it.copy(scheduleId = scheduleId) }
deleteDaysForSchedule(scheduleId)
@@ -57,13 +61,15 @@ interface TeacherScheduleDao {
fun observeDaysForPeriod(season: String, weekStart: Long): Flow<List<TeacherDayEntity>>
@Query(
"SELECT teacher_lessons.* FROM teacher_lessons INNER JOIN teacher_days ON teacher_days.id = teacher_lessons.dayId " +
"SELECT teacher_lessons.*, teacher_schedules.departmentId AS departmentId, departments.name AS departmentName " +
"FROM teacher_lessons INNER JOIN teacher_days ON teacher_days.id = teacher_lessons.dayId " +
"INNER JOIN teacher_schedules ON teacher_schedules.id = teacher_days.scheduleId " +
"LEFT JOIN departments ON departments.departmentId = teacher_schedules.departmentId " +
"WHERE teacher_schedules.season = :season AND teacher_schedules.weekStart <= :weekStart " +
"AND teacher_schedules.weekEnd >= :weekStart " +
"ORDER BY teacher_lessons.date, teacher_lessons.slotIndex, teacher_lessons.lessonIndex"
)
fun observeLessonsForPeriod(season: String, weekStart: Long): Flow<List<TeacherLessonEntity>>
fun observeLessonsForPeriod(season: String, weekStart: Long): Flow<List<TeacherLessonWithDepartment>>
@Query(
"SELECT DISTINCT teacher FROM teacher_lessons INNER JOIN teacher_days ON teacher_days.id = teacher_lessons.dayId " +
@@ -23,9 +23,18 @@ object TeacherScheduleParser {
data class ParsedTeacherSchedule(val teachers: List<String>, val days: List<Day>)
/**
* Столбец расписания преподавателя: имя и абсолютный индекс ячейки в шапке.
* Индекс нужен для точного выравнивания с рядами данных — в шапке могут
* присутствовать пустые колонки-разделители, которые не должны сдвигать
* соответствие «преподаватель → столбец».
*/
private data class Column(val teacher: String, val headerIndex: Int)
fun parse(html: String): ParsedTeacherSchedule {
val doc = Jsoup.parse(html)
var headerFound = false
var columns: List<Column> = emptyList()
var teachers: List<String> = emptyList()
val days = mutableListOf<Day>()
var currentDate: LocalDate? = null
@@ -43,10 +52,12 @@ object TeacherScheduleParser {
val first = cellText(tds[0])
val second = cellText(tds[1])
if (!headerFound && first == "День" && second == "Интервал") {
teachers = tds.drop(2)
.map { cellText(it.selectFirst("span") ?: it) }
.filter { it.isNotEmpty() }
.distinct()
columns = tds.mapIndexedNotNull { index, td ->
if (index < 2) return@mapIndexedNotNull null
val name = cellText(td.selectFirst("span") ?: td)
if (name.isEmpty()) null else Column(name, index)
}.distinctBy { it.teacher }
teachers = columns.map { it.teacher }
headerFound = true
continue
}
@@ -58,7 +69,7 @@ object TeacherScheduleParser {
currentIntervals = mutableListOf()
}
if (intervalMatch != null && currentIntervals != null) {
parseIntervalRow(tds, intervalMatch, if (dayMatch != null) 2 else 1, teachers, currentIntervals!!)
parseIntervalRow(tds, intervalMatch, dayMatch != null, columns, currentIntervals!!)
}
}
flushDay()
@@ -83,16 +94,20 @@ object TeacherScheduleParser {
private fun parseIntervalRow(
tds: List<Element>,
intervalMatch: MatchResult,
startCol: Int,
teachers: List<String>,
dayRow: Boolean,
columns: List<Column>,
intervals: MutableList<TimeSlot>
) {
val start = LocalTime.parse(intervalMatch.groupValues[1])
val end = LocalTime.parse(intervalMatch.groupValues[2])
val lessons = mutableListOf<Lesson>()
for (i in teachers.indices) {
val cell = tds.getOrNull(startCol + i) ?: continue
lessons += parseCell(cell, teachers[i])
for (column in columns) {
// Ряд с днём содержит обе ведущие ячейки (День, Интервал) и совпадает
// по индексам с шапкой; ряд только с интервалом пропускает ячейку дня
// (rowspan) — его ячейки сдвинуты на одну позицию влево.
val dataIndex = if (dayRow) column.headerIndex else column.headerIndex - 1
val cell = tds.getOrNull(dataIndex) ?: continue
lessons += parseCell(cell, column.teacher)
}
if (lessons.isNotEmpty()) intervals.add(TimeSlot(start, end, lessons))
}
@@ -4,6 +4,7 @@ import agzam.vyatsu.data.local.DepartmentPeriodEntity
import agzam.vyatsu.data.local.TeacherDao
import agzam.vyatsu.data.local.TeacherDayEntity
import agzam.vyatsu.data.local.TeacherLessonEntity
import agzam.vyatsu.data.local.TeacherLessonWithDepartment
import agzam.vyatsu.data.local.TeacherScheduleDao
import agzam.vyatsu.data.local.TeacherScheduleEntity
import agzam.vyatsu.data.remote.TeacherScheduleParser
@@ -56,7 +57,7 @@ class TeacherScheduleRepositoryImpl(
scheduleDao.observeDistinctTeachers(period.season.name, period.weekStart.toEpochDay())
.map { names -> names.map { name -> Teacher(name = name) } }
override suspend fun syncPeriod(date: LocalDate): Flow<BulkSyncProgress> = flow {
override suspend fun syncPeriod(date: LocalDate, force: Boolean): Flow<BulkSyncProgress> = flow {
// Unique index (departmentId, season, weekStart) breaks on interleaved
// delete+insert from concurrent syncPeriod() callers.
syncMutex.withLock {
@@ -68,18 +69,27 @@ class TeacherScheduleRepositoryImpl(
return@withLock
}
targets.map { it.season to it.weekStart }
.distinct()
.forEach { (season, weekStart) ->
withContext(Dispatchers.IO) {
scheduleDao.deletePeriod(season.name, weekStart)
val now = now()
var skippedCount = 0
val nonSkipped = mutableListOf<DepartmentPeriodEntity>()
for (target in targets) {
val last = withContext(Dispatchers.IO) {
scheduleDao.lastSyncedAt(target.departmentId, target.season.name, target.weekStart)
}
val shouldSkip = !force && last != null && now - last < STALE_WINDOW_MS
if (shouldSkip) {
skippedCount++
} else {
nonSkipped.add(target)
}
}
emit(BulkSyncProgress(total = targets.size, done = skippedCount, failed = 0))
val total = targets.size
val semaphore = Semaphore(PARALLELISM)
val jobs = coroutineScope {
targets.map { target ->
nonSkipped.map { target ->
async {
semaphore.withPermit {
try {
@@ -102,7 +112,7 @@ class TeacherScheduleRepositoryImpl(
}
}
var done = 0
var done = skippedCount
var failed = 0
for (job in jobs) {
if (job.await()) done++ else failed++
@@ -229,30 +239,30 @@ class TeacherScheduleRepositoryImpl(
private fun buildTeacherSchedule(
period: SchedulePeriod,
dayEntities: List<TeacherDayEntity>,
lessonEntities: List<TeacherLessonEntity>
lessons: List<TeacherLessonWithDepartment>
): TeacherSchedule? {
val weekDays = dayEntities
.filter {
it.date >= period.weekStart.toEpochDay() && it.date <= period.weekEnd.toEpochDay()
}
if (weekDays.isEmpty()) return null
val lessonsByDate = lessonEntities.groupBy { it.date }
val lessonsByDate = lessons.groupBy { it.lesson.date }
val days = weekDays
.sortedBy { it.date }
.distinctBy { it.date }
.map { day ->
val lessons = lessonsByDate[day.date].orEmpty()
val dayLessons = lessonsByDate[day.date].orEmpty()
Log.d(
TAG,
"build: date=${day.date} totalLessons=${lessons.size} " +
"groupedByStart=${lessons.groupBy { it.start }.keys.sorted()}"
"build: date=${day.date} totalLessons=${dayLessons.size} " +
"groupedByStart=${dayLessons.groupBy { it.lesson.start }.keys.sorted()}"
)
val slots = lessons.groupBy { it.start }
val slots = dayLessons.groupBy { it.lesson.start }
.toSortedMap()
.map { (startMin, slotLessons) ->
val first = slotLessons.first()
val times = slotLessons.map { "${it.start}-${it.end}" }.distinct()
val teachers = slotLessons.map { it.teacher }.distinct()
val first = slotLessons.first().lesson
val times = slotLessons.map { "${it.lesson.start}-${it.lesson.end}" }.distinct()
val teachers = slotLessons.map { it.lesson.teacher }.distinct()
Log.d(
TAG,
"build: date=${day.date} start=$startMin firstEnd=$first.end " +
@@ -262,7 +272,7 @@ class TeacherScheduleRepositoryImpl(
start = LocalTime.of(startMin / 60, startMin % 60),
end = LocalTime.of(first.end / 60, first.end % 60),
lessons = slotLessons
.sortedBy { it.lessonIndex }
.sortedBy { it.lesson.lessonIndex }
.map { it.toDomain() }
)
}
@@ -271,16 +281,33 @@ class TeacherScheduleRepositoryImpl(
return TeacherSchedule(period = period, days = days)
}
private fun TeacherLessonEntity.toDomain(): Lesson = Lesson(
raw = raw,
room = room,
group = groupName,
subgroup = subgroup,
subject = subject,
type = type,
teacher = teacher
private fun TeacherLessonWithDepartment.toDomain(): Lesson = Lesson(
raw = lesson.raw,
room = lesson.room,
group = lesson.groupName,
subgroup = lesson.subgroup,
subject = lesson.subject,
type = lesson.type,
teacher = lesson.teacher,
department = departmentLabel(departmentId, departmentName)
)
// Названия, не выводимые акронимом из слов (например «топ-уровня в сфере…»)
private val DEPARTMENT_LABELS = mapOf(
"974" to "Топ ИИ"
)
private fun departmentLabel(departmentId: String, departmentName: String?): String {
DEPARTMENT_LABELS[departmentId]?.let { return it }
val name = departmentName ?: return "каф. $departmentId"
val words = name.removePrefix("Кафедра ").removePrefix("кафедра ")
.substringBefore(" (")
.split(" ")
.filter { it.isNotBlank() && it != "и" }
val acronym = words.joinToString("") { it.first().uppercase().toString() }
return acronym.ifBlank { "каф. $departmentId" }
}
private fun LocalTime.toMinutesOfDay(): Int = hour * 60 + minute
private fun now(): Long = System.currentTimeMillis()
@@ -26,4 +26,6 @@ data class Lesson(
/** Преподаватель **/
val teacher: String? = null,
/** Кафедра-источник (только в расписании преподавателей) **/
val department: String? = null,
)
@@ -10,7 +10,7 @@ import java.time.LocalDate
interface TeacherScheduleRepository {
fun observeTeachers(period: SchedulePeriod): Flow<List<Teacher>>
fun observeSchedule(period: SchedulePeriod): Flow<TeacherSchedule?>
suspend fun syncPeriod(date: LocalDate): Flow<BulkSyncProgress>
suspend fun syncPeriod(date: LocalDate, force: Boolean = false): Flow<BulkSyncProgress>
suspend fun hasData(period: SchedulePeriod): Boolean
suspend fun weeksFor(date: LocalDate): List<SchedulePeriod>
suspend fun clearAll()
@@ -146,7 +146,15 @@ class PickerViewModel(
syncJob = viewModelScope.launch {
try {
teacherScheduleRepository.syncPeriod(today).collect { progress ->
_uiState.value = _uiState.value.copy(syncProgress = progress)
_uiState.value = _uiState.value.copy(
syncProgress = progress,
error = if (progress.failed > 0) {
"Не удалось загрузить расписание: ${progress.failed} из " +
"${progress.total} кафедр. Проверьте подключение к интернету."
} else {
_uiState.value.error
}
)
}
} catch (e: CancellationException) {
throw e
@@ -70,6 +70,16 @@ internal fun LessonSlot(slotIndex: Int, slot: TimeSlot, showTeacher: Boolean = t
) {
var any = false
if (lesson.department != null) {
Text(
lesson.department,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(horizontal = hPadding)
)
any = true
}
val meta = listOfNotNull(
if (lesson.type == LessonType.OTHER) {
null
@@ -89,7 +89,9 @@ class TeacherScheduleViewModel(
if (!scheduleRepository.hasData(period)) {
_uiState.value = _uiState.value.copy(isLoading = true, loadError = false)
try {
scheduleRepository.syncPeriod(period.weekStart).collect { }
// force = true: hasData() already proved there is nothing cached for
// this period, so never let the staleness window skip the fetch.
scheduleRepository.syncPeriod(period.weekStart, force = true).collect { }
} catch (e: CancellationException) {
throw e
} catch (e: Exception) {
@@ -199,7 +201,7 @@ class TeacherScheduleViewModel(
try {
_uiState.value = _uiState.value.copy(isLoading = true, loadError = false)
try {
scheduleRepository.syncPeriod(ScheduleDates.moscowToday()).collect { }
scheduleRepository.syncPeriod(ScheduleDates.moscowToday(), force = true).collect { }
} catch (e: CancellationException) {
throw e
} catch (e: Exception) {
@@ -0,0 +1,27 @@
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV
BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv
b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX
BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es
CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/
r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje
2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt
bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj
K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4
12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on
ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls
eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9
vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM
BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy
gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92
CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm
OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq
JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye
qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz
nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7
DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3
QEUxeCp6
-----END CERTIFICATE-----
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Сертификат vyatsu.ru перевыпущен 05.10.2026 и теперь выдан в иерархии
GlobalSign Root R46, которая в системный trust store Android попала
только в Android 14. На устройствах с Android 13 и ниже все HTTPS-запросы
к сайту падают с "Trust anchor for certification path not found".
Добавляем этот корень как дополнительный якорь доверия ТОЛЬКО для доменов
vyatsu.ru — системные корни сохраняются, остальные сайты не затронуты.
-->
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="system" />
</trust-anchors>
<cleartextTrafficPermitted>false</cleartextTrafficPermitted>
</base-config>
<domain-config>
<domain includeSubdomains="true">vyatsu.ru</domain>
<trust-anchors>
<certificates src="system" />
<certificates src="@raw/globalsign_root_r46" />
</trust-anchors>
</domain-config>
</network-security-config>
@@ -15,6 +15,14 @@ class TeacherScheduleParserTest {
checkNotNull(javaClass.getResourceAsStream("/prepod.html"))
.readBytes().toString(Charsets.UTF_8)
private fun fixture517(): String =
checkNotNull(javaClass.getResourceAsStream("/prepod517.html"))
.readBytes().toString(Charsets.UTF_8)
private fun fixture974(): String =
checkNotNull(javaClass.getResourceAsStream("/prepod974.html"))
.readBytes().toString(Charsets.UTF_8)
@Test
fun teachersHeaderParsedInOrderAndDeduped() {
val parsed = TeacherScheduleParser.parse(fixture())
@@ -83,4 +91,94 @@ class TeacherScheduleParserTest {
val total = parsed.days.sumOf { day -> day.intervals.sumOf { it.lessons.size } }
assertEquals(11, total)
}
private fun spacerColumnFixture(): String = """
<table>
<tr>
<td>День</td><td>Интервал</td><td></td>
<td><span>Марков Р.В.</span></td><td><span>Мельцов В.Ю.</span></td>
</tr>
<tr>
<td>четверг 08.10.26</td><td>08:20-09:50</td><td></td>
<td>2-206 Математика Практическое занятие УТб-2301-02-00</td>
<td>1-334 Организация параллельных вычислительных систем Лекция ИВТб-4301-05-00</td>
</tr>
<tr>
<td>10:00-11:30</td><td></td>
<td>2-206 Математика Практическое занятие УТб-2301-02-00</td>
<td>1-334 Организация параллельных вычислительных систем Лекция ИВТб-4301-05-00</td>
</tr>
</table>
""".trimIndent()
@Test
fun emptyHeaderSpacerDoesNotShiftTeacherColumns() {
val parsed = TeacherScheduleParser.parse(spacerColumnFixture())
assertEquals(listOf("Марков Р.В.", "Мельцов В.Ю."), parsed.teachers)
assertEquals(1, parsed.days.size)
assertEquals(LocalDate.of(2026, 10, 8), parsed.days[0].date)
assertEquals(2, parsed.days[0].intervals.size)
for (slot in parsed.days[0].intervals) {
val markov = slot.lessons.filter { it.teacher == "Марков Р.В." }
val meltsov = slot.lessons.filter { it.teacher == "Мельцов В.Ю." }
assertEquals(1, markov.size)
assertEquals(1, meltsov.size)
assertEquals("Математика", markov[0].subject)
assertEquals("Организация параллельных вычислительных систем", meltsov[0].subject)
}
}
@Test
fun realPage517TeacherColumnsAligned() {
val html = checkNotNull(javaClass.getResourceAsStream("/prepod517.html"))
.readBytes().toString(Charsets.UTF_8)
val parsed = TeacherScheduleParser.parse(html)
assertTrue(parsed.teachers.contains("Мельцов В.Ю."))
val day = parsed.days.first { it.date == LocalDate.of(2026, 10, 8) }
val all = day.intervals.flatMap { it.lessons }
val markov = all.filter { it.teacher == "Марков Р.В." }
val meltsov = all.filter { it.teacher == "Мельцов В.Ю." }
assertTrue("Мельцов должен иметь пары 08.10", meltsov.isNotEmpty())
assertTrue(
"У Мельцова не должно быть математики Маркова",
meltsov.none { it.subject?.contains("Математика") == true }
)
assertTrue(
"У Маркова должна остаться математика",
markov.any { it.subject?.contains("Математика") == true }
)
assertTrue(
"У Мельцова параллельные вычислительные системы",
meltsov.any { it.subject?.contains("Организация параллельных") == true }
)
}
@Test
fun realPage517MeltsovLabsSitAt1000And1145NotAt0820() {
val parsed = TeacherScheduleParser.parse(fixture517())
val day = parsed.days.first { it.date == LocalDate.of(2026, 10, 6) }
val labsAt = { time: java.time.LocalTime ->
day.intervals.firstOrNull { it.start == time }
?.lessons
?.filter { it.teacher == "Мельцов В.Ю." && it.type == LessonType.LABORATORY }
.orEmpty()
}
assertEquals(
"В 08:20 у Мельцова на странице 517 лабораторных нет",
0, labsAt(java.time.LocalTime.of(8, 20)).size
)
assertTrue(labsAt(java.time.LocalTime.of(10, 0)).isNotEmpty())
assertTrue(labsAt(java.time.LocalTime.of(11, 45)).isNotEmpty())
}
@Test
fun realPage974MeltsovHasPracticeAt0820() {
val parsed = TeacherScheduleParser.parse(fixture974())
val day = parsed.days.first { it.date == LocalDate.of(2026, 10, 6) }
val slot = day.intervals.first { it.start == java.time.LocalTime.of(8, 20) }
val mel = slot.lessons.filter { it.teacher == "Мельцов В.Ю." }
assertTrue(mel.isNotEmpty())
assertTrue("08:20 на странице 974 — практическое занятие", mel.all { it.type == LessonType.PRACTICE })
assertEquals("ИВТб-2305-06-00", mel.first().group)
}
}
File diff suppressed because it is too large Load Diff
+980
View File
@@ -0,0 +1,980 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 5.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
<TITLE></TITLE>
<STYLE TYPE="text/css">
body { background: #ffffff; margin: 0; font-family: Arial; font-size: 8pt; font-style: normal; }
tr.R0{ height: 25px; }
tr.R0 td.R0C0{ font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; color: #000000; background-color: #ffffff; text-align: left; }
tr.R0 td.R0C1{ text-align: left; }
tr.R1{ height: 21px; }
tr.R1 td.R15C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R1 td.R15C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R1 td.R1C0{ font-family: Arial; font-size: 8pt; font-style: normal; font-weight: bold; color: #000000; background-color: #fcfaeb; text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R1 td.R1C2{ font-family: Arial; font-size: 12pt; font-style: normal; font-weight: bold; color: #000000; background-color: #fcfaeb; text-align: center; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R1 td.R9C0{ font-family: Arial; font-size: 14pt; font-style: normal; text-align: center; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R1 td.R9C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R1 td.R9C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R1 td.R9C6{ text-align: left; }
tr.R16{ height: 43px; }
tr.R16 td.R16C0{ font-family: Arial; font-size: 14pt; font-style: normal; text-align: center; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R16 td.R16C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R16 td.R16C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R16 td.R16C6{ text-align: left; }
tr.R17{ height: 141px; }
tr.R17 td.R17C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R17 td.R17C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R17 td.R17C6{ text-align: left; }
tr.R17 td.R58C0{ font-family: Arial; font-size: 14pt; font-style: normal; text-align: center; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R18{ height: 15px; }
tr.R18 td.R18C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R18 td.R18C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R18 td.R18C6{ text-align: left; }
tr.R18 td.R22C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R18 td.R22C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R18 td.R65C0{ font-family: Arial; font-size: 14pt; font-style: normal; text-align: center; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R2{ height: 30px; }
tr.R2 td.R2C0{ font-family: Arial; font-size: 14pt; font-style: normal; text-align: center; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R2 td.R2C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R2 td.R2C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R2 td.R2C6{ text-align: left; }
tr.R30{ height: 16px; }
tr.R30 td.R30C0{ font-family: Arial; font-size: 14pt; font-style: normal; text-align: center; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R30 td.R30C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R30 td.R30C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R30 td.R30C6{ text-align: left; }
tr.R30 td.R36C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R30 td.R36C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R37{ height: 24px; }
tr.R37 td.R37C0{ font-family: Arial; font-size: 14pt; font-style: normal; text-align: center; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R37 td.R37C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R37 td.R37C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R37 td.R37C6{ text-align: left; }
tr.R37 td.R43C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R37 td.R43C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R47{ height: 27px; }
tr.R47 td.R47C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R47 td.R47C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R47 td.R47C6{ text-align: left; }
tr.R49{ height: 26px; }
tr.R49 td.R49C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R49 td.R49C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R49 td.R49C6{ text-align: left; }
tr.R49 td.R50C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R49 td.R50C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R7{ height: 29px; }
tr.R7 td.R23C0{ font-family: Arial; font-size: 14pt; font-style: normal; text-align: center; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R7 td.R7C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R7 td.R7C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R7 td.R7C6{ text-align: left; }
tr.R7 td.R8C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R7 td.R8C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R74{ height: 23px; }
tr.R74 td.R74C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R74 td.R74C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
tr.R74 td.R74C6{ text-align: left; }
tr.R74 td.R78C1{ text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R74 td.R78C2{ text-align: left; vertical-align: middle; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 3px solid; border-right: #000000 1px solid; }
tr.R86{ height: 99px; }
tr.R86 td.R86C3{ font-family: Arial; font-size: 8pt; font-style: normal; text-align: center; vertical-align: middle; }
table {table-layout: fixed; padding: 0px; padding-left: 2px; vertical-align:bottom; border-collapse:collapse;width: 100%; font-family: Arial; font-size: 8pt; font-style: normal; }
td { padding: 0px; padding-left: 2px; overflow:hidden; }
</STYLE>
</HEAD>
<BODY STYLE="background: #ffffff; margin: 0; font-family: Arial; font-size: 8pt; font-style: normal; ">
<TABLE style="width:100%; height:0px; " CELLSPACING=0>
<COL WIDTH=31>
<COL WIDTH=89>
<COL WIDTH=420>
<COL WIDTH=420>
<COL WIDTH=420>
<COL WIDTH=420>
<COL WIDTH=63>
<COL>
<TR CLASS=R0>
<TD CLASS="R0C0" COLSPAN=3><SPAN STYLE="white-space:nowrap;max-width:0px;">Обновление&nbsp;07.10.2026</SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R1C0"><SPAN STYLE="white-space:nowrap;max-width:0px;">День</SPAN></TD>
<TD CLASS="R1C0"><SPAN STYLE="white-space:nowrap;max-width:0px;">Интервал</SPAN></TD>
<TD CLASS="R1C2"><SPAN STYLE="white-space:nowrap;max-width:0px;">Долженкова&nbsp;М.Л.</SPAN></TD>
<TD CLASS="R1C2"><SPAN STYLE="white-space:nowrap;max-width:0px;">Коржавина&nbsp;А.С.</SPAN></TD>
<TD CLASS="R1C2"><SPAN STYLE="white-space:nowrap;max-width:0px;">Мельцов&nbsp;В.Ю.</SPAN></TD>
<TD CLASS="R1C2"><SPAN STYLE="white-space:nowrap;max-width:0px;">Прозоров&nbsp;Д.Е.</SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R2>
<TD CLASS="R2C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">понедельник&nbsp;28.09.26&nbsp;</SPAN></TD>
<TD CLASS="R2C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R2>
<TD CLASS="R2C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R2C2">1-109 Программирование Лабораторная работа ИВТб-1301-06-00 ИВТб-1301-06-00, 01 подгруппа</TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R2>
<TD CLASS="R2C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R2C2">1-109 Программирование Лабораторная работа ИВТб-1301-06-00 ИВТб-1301-06-00, 01 подгруппа</TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R2>
<TD CLASS="R2C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R2C2">1-109 Программирование Лабораторная работа ИВТб-1302-06-00 ИВТб-1302-06-00, 01 подгруппа</TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R2>
<TD CLASS="R2C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R2C2">1-109 Программирование Лабораторная работа ИВТб-1302-06-00 ИВТб-1302-06-00, 01 подгруппа</TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C2"><SPAN></SPAN></TD>
<TD CLASS="R2C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R8C2"><SPAN></SPAN></TD>
<TD CLASS="R8C2"><SPAN></SPAN></TD>
<TD CLASS="R8C2"><SPAN></SPAN></TD>
<TD CLASS="R8C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R9C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">вторник&nbsp;29.09.26&nbsp;</SPAN></TD>
<TD CLASS="R9C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R9C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2">1-237 Теория автоматов Практическое занятие ИВТб-2301-06-00 ИВТб-2301-06-00, 01 подгруппа ИВТб-2301-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2">1-237 Теория автоматов Практическое занятие ИВТб-2302-06-00 ИВТб-2302-06-00, 01 подгруппа ИВТб-2302-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R9C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R9C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R15C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R15C2"><SPAN></SPAN></TD>
<TD CLASS="R15C2"><SPAN></SPAN></TD>
<TD CLASS="R15C2"><SPAN></SPAN></TD>
<TD CLASS="R15C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R16>
<TD CLASS="R16C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">среда&nbsp;30.09.26&nbsp;</SPAN></TD>
<TD CLASS="R16C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R16C2">2-207 Программирование Практическое занятие ИВТб-1306-06-00 ИВТб-1306-06-00, 01 подгруппа ИВТб-1306-06-00, 02 подгруппа ИВТб-1306-06-00, 03 подгруппа</TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R17>
<TD CLASS="R17C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C2">2-209 Информатика Лекция ИВТб-1301-06-00 ИВТб-1301-06-00, 01 подгруппа ИВТб-1301-06-00, 02 подгруппа ИВТб-1301-06-00, 03 подгруппа ИВТб-1302-06-00 ИВТб-1302-06-00, 01 подгруппа ИВТб-1302-06-00, 02 подгруппа ИВТб-1302-06-00, 03 подгруппа ИВТб-1303-06-00 ИВТб-1303-06-00, 01 подгруппа ИВТб-1303-06-00, 02 подгруппа ИВТб-1303-06-00, 03 подгруппа ИВТб-1304-06-00 ИВТб-1304-06-00, 01 подгруппа ИВТб-1304-06-00, 02 подгруппа ИВТб-1304-06-00, 03 подгруппа ИВТб-1305-06-00 ИВТб-1305-06-00, 01 подгруппа ИВТб-1305-06-00, 02 подгруппа ИВТб-1305-06-00, 03 подгруппа ИВТб-1306-06-00 ИВТб-1306-06-00, 01 подгруппа ИВТб-1306-06-00, 02 подгруппа ИВТб-1306-06-00, 03 подгруппа</TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R16>
<TD CLASS="R16C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R16C2">1-334 Программирование Практическое занятие ИВТб-1305-06-00 ИВТб-1305-06-00, 01 подгруппа ИВТб-1305-06-00, 02 подгруппа ИВТб-1305-06-00, 03 подгруппа</TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R22C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R23C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">четверг&nbsp;01.10.26&nbsp;</SPAN></TD>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R7C2">1-237 Интеллектуальные системы Лабораторная работа ИВТб-4301-05-00 ИВТб-4301-05-00, 01 подгруппа ИВТб-4301-05-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R7C2">1-237 Интеллектуальные системы Лабораторная работа ИВТб-4301-05-00 ИВТб-4301-05-00, 01 подгруппа ИВТб-4301-05-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R17>
<TD CLASS="R17C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R17C2">2-209 Программирование Лекция ИВТб-1301-06-00 ИВТб-1301-06-00, 01 подгруппа ИВТб-1301-06-00, 02 подгруппа ИВТб-1301-06-00, 03 подгруппа ИВТб-1302-06-00 ИВТб-1302-06-00, 01 подгруппа ИВТб-1302-06-00, 02 подгруппа ИВТб-1302-06-00, 03 подгруппа ИВТб-1303-06-00 ИВТб-1303-06-00, 01 подгруппа ИВТб-1303-06-00, 02 подгруппа ИВТб-1303-06-00, 03 подгруппа ИВТб-1304-06-00 ИВТб-1304-06-00, 01 подгруппа ИВТб-1304-06-00, 02 подгруппа ИВТб-1304-06-00, 03 подгруппа ИВТб-1305-06-00 ИВТб-1305-06-00, 01 подгруппа ИВТб-1305-06-00, 02 подгруппа ИВТб-1305-06-00, 03 подгруппа ИВТб-1306-06-00 ИВТб-1306-06-00, 01 подгруппа ИВТб-1306-06-00, 02 подгруппа ИВТб-1306-06-00, 03 подгруппа</TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R22C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R30>
<TD CLASS="R30C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">пятница&nbsp;02.10.26&nbsp;</SPAN></TD>
<TD CLASS="R30C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R30>
<TD CLASS="R30C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R16>
<TD CLASS="R16C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R16C2">1-435 Программирование Практическое занятие ИВТб-1301-06-00 ИВТб-1301-06-00, 01 подгруппа ИВТб-1301-06-00, 02 подгруппа ИВТб-1301-06-00, 03 подгруппа</TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R7C2">1-109 Программирование Лабораторная работа ИВТб-1301-06-00 ИВТб-1301-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R7C2">1-109 Программирование Лабораторная работа ИВТб-1301-06-00 ИВТб-1301-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2">1-237 Теория автоматов Практическое занятие ИВТб-2304-06-00 ИВТб-2304-06-00, 01 подгруппа ИВТб-2304-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R30>
<TD CLASS="R30C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C2"><SPAN></SPAN></TD>
<TD CLASS="R30C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R30>
<TD CLASS="R36C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R36C2"><SPAN></SPAN></TD>
<TD CLASS="R36C2"><SPAN></SPAN></TD>
<TD CLASS="R36C2"><SPAN></SPAN></TD>
<TD CLASS="R36C2"><SPAN></SPAN></TD>
<TD CLASS="R30C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">суббота&nbsp;03.10.26&nbsp;</SPAN></TD>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R43C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R43C2"><SPAN></SPAN></TD>
<TD CLASS="R43C2"><SPAN></SPAN></TD>
<TD CLASS="R43C2"><SPAN></SPAN></TD>
<TD CLASS="R43C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R16>
<TD CLASS="R16C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">понедельник&nbsp;05.10.26&nbsp;</SPAN></TD>
<TD CLASS="R16C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R16C2">1-311 Программирование Практическое занятие ИВТб-1302-06-00 ИВТб-1302-06-00, 01 подгруппа ИВТб-1302-06-00, 02 подгруппа ИВТб-1302-06-00, 03 подгруппа</TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R7C2">1-109 Программирование Лабораторная работа ИВТб-1302-06-00 ИВТб-1302-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R7C2">1-109 Программирование Лабораторная работа ИВТб-1302-06-00 ИВТб-1302-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R47>
<TD CLASS="R47C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R47C2"><SPAN></SPAN></TD>
<TD CLASS="R47C2"><SPAN></SPAN></TD>
<TD CLASS="R47C2"><SPAN></SPAN></TD>
<TD CLASS="R47C2"><SPAN></SPAN></TD>
<TD CLASS="R47C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R47>
<TD CLASS="R47C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R47C2"><SPAN></SPAN></TD>
<TD CLASS="R47C2"><SPAN></SPAN></TD>
<TD CLASS="R47C2"><SPAN></SPAN></TD>
<TD CLASS="R47C2"><SPAN></SPAN></TD>
<TD CLASS="R47C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R49>
<TD CLASS="R49C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R49C2"><SPAN></SPAN></TD>
<TD CLASS="R49C2"><SPAN></SPAN></TD>
<TD CLASS="R49C2"><SPAN></SPAN></TD>
<TD CLASS="R49C2"><SPAN></SPAN></TD>
<TD CLASS="R49C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R49>
<TD CLASS="R50C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R50C2"><SPAN></SPAN></TD>
<TD CLASS="R50C2"><SPAN></SPAN></TD>
<TD CLASS="R50C2"><SPAN></SPAN></TD>
<TD CLASS="R50C2"><SPAN></SPAN></TD>
<TD CLASS="R49C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R23C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">вторник&nbsp;06.10.26&nbsp;</SPAN></TD>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2">1-237 Теория автоматов Практическое занятие ИВТб-2305-06-00 ИВТб-2305-06-00, 01 подгруппа ИВТб-2305-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R9C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R9C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R9C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2">1-237 Теория автоматов Практическое занятие ИВТб-2303-06-00 ИВТб-2303-06-00, 01 подгруппа ИВТб-2303-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R9C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R1>
<TD CLASS="R15C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R15C2"><SPAN></SPAN></TD>
<TD CLASS="R15C2"><SPAN></SPAN></TD>
<TD CLASS="R15C2"><SPAN></SPAN></TD>
<TD CLASS="R15C2"><SPAN></SPAN></TD>
<TD CLASS="R9C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R17>
<TD CLASS="R58C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">среда&nbsp;07.10.26&nbsp;</SPAN></TD>
<TD CLASS="R17C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R17C2">2-209 Программирование Лекция ИВТб-1301-06-00 ИВТб-1301-06-00, 01 подгруппа ИВТб-1301-06-00, 02 подгруппа ИВТб-1301-06-00, 03 подгруппа ИВТб-1302-06-00 ИВТб-1302-06-00, 01 подгруппа ИВТб-1302-06-00, 02 подгруппа ИВТб-1302-06-00, 03 подгруппа ИВТб-1303-06-00 ИВТб-1303-06-00, 01 подгруппа ИВТб-1303-06-00, 02 подгруппа ИВТб-1303-06-00, 03 подгруппа ИВТб-1304-06-00 ИВТб-1304-06-00, 01 подгруппа ИВТб-1304-06-00, 02 подгруппа ИВТб-1304-06-00, 03 подгруппа ИВТб-1305-06-00 ИВТб-1305-06-00, 01 подгруппа ИВТб-1305-06-00, 02 подгруппа ИВТб-1305-06-00, 03 подгруппа ИВТб-1306-06-00 ИВТб-1306-06-00, 01 подгруппа ИВТб-1306-06-00, 02 подгруппа ИВТб-1306-06-00, 03 подгруппа</TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R17>
<TD CLASS="R17C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C2"><SPAN></SPAN></TD>
<TD CLASS="R17C2">2-209 Введение в профессию Лекция ИВТб-1301-06-00 ИВТб-1301-06-00, 01 подгруппа ИВТб-1301-06-00, 02 подгруппа ИВТб-1301-06-00, 03 подгруппа ИВТб-1302-06-00 ИВТб-1302-06-00, 01 подгруппа ИВТб-1302-06-00, 02 подгруппа ИВТб-1302-06-00, 03 подгруппа ИВТб-1303-06-00 ИВТб-1303-06-00, 01 подгруппа ИВТб-1303-06-00, 02 подгруппа ИВТб-1303-06-00, 03 подгруппа ИВТб-1304-06-00 ИВТб-1304-06-00, 01 подгруппа ИВТб-1304-06-00, 02 подгруппа ИВТб-1304-06-00, 03 подгруппа ИВТб-1305-06-00 ИВТб-1305-06-00, 01 подгруппа ИВТб-1305-06-00, 02 подгруппа ИВТб-1305-06-00, 03 подгруппа ИВТб-1306-06-00 ИВТб-1306-06-00, 01 подгруппа ИВТб-1306-06-00, 02 подгруппа ИВТб-1306-06-00, 03 подгруппа</TD>
<TD CLASS="R17C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R22C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R65C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">четверг&nbsp;08.10.26&nbsp;</SPAN></TD>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R16>
<TD CLASS="R16C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R16C2">1-435 Программирование Практическое занятие ИВТб-1303-06-00 ИВТб-1303-06-00, 01 подгруппа ИВТб-1303-06-00, 02 подгруппа ИВТб-1303-06-00, 03 подгруппа</TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R16>
<TD CLASS="R16C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R16C2">1-435 Программирование Практическое занятие ИВТб-1304-06-00 ИВТб-1304-06-00, 01 подгруппа ИВТб-1304-06-00, 02 подгруппа ИВТб-1304-06-00, 03 подгруппа</TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C2"><SPAN></SPAN></TD>
<TD CLASS="R16C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R7>
<TD CLASS="R7C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C2">2-205 Теория автоматов Практическое занятие ИВТб-2306-06-00 ИВТб-2306-06-00, 01 подгруппа ИВТб-2306-06-00, 02 подгруппа</TD>
<TD CLASS="R7C2"><SPAN></SPAN></TD>
<TD CLASS="R7C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R18C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R18>
<TD CLASS="R22C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R22C2"><SPAN></SPAN></TD>
<TD CLASS="R18C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">пятница&nbsp;09.10.26&nbsp;</SPAN></TD>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R74>
<TD CLASS="R74C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R74>
<TD CLASS="R74C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R74>
<TD CLASS="R74C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R74>
<TD CLASS="R74C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C2"><SPAN></SPAN></TD>
<TD CLASS="R74C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R74>
<TD CLASS="R78C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R78C2"><SPAN></SPAN></TD>
<TD CLASS="R78C2"><SPAN></SPAN></TD>
<TD CLASS="R78C2"><SPAN></SPAN></TD>
<TD CLASS="R78C2"><SPAN></SPAN></TD>
<TD CLASS="R74C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C0" ROWSPAN=7><div style="margin: 0 -17px;-moz-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); -o-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg)"><SPAN STYLE="max-width:0px;">суббота&nbsp;10.10.26&nbsp;</SPAN></TD>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">08:20-09:50</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">10:00-11:30</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">11:45-13:15</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">14:00-15:30</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">15:45-17:15</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">17:20-18:50</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R37>
<TD CLASS="R37C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">18:55-20:25</SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C2"><SPAN></SPAN></TD>
<TD CLASS="R37C6"><SPAN></SPAN></TD>
<TD><SPAN></SPAN></TD>
<TD></TD>
</TR>
<TR CLASS=R86>
<TD><DIV STYLE="position:relative; height:99px;width: 100%; overflow:hidden;"><SPAN></SPAN></DIV></TD>
<TD><DIV STYLE="position:relative; height:99px;width: 100%; overflow:hidden;"><SPAN></SPAN></DIV></TD>
<TD><DIV STYLE="position:relative; height:99px;width: 100%; overflow:hidden;"><SPAN></SPAN></DIV></TD>
<TD CLASS="R86C3"><DIV STYLE="position:relative; height:99px;width: 100%; overflow:hidden;"><SPAN></SPAN></DIV></TD>
<TD><DIV STYLE="position:relative; height:99px;width: 100%; overflow:hidden;"><SPAN></SPAN></DIV></TD>
<TD><DIV STYLE="position:relative; height:99px;width: 100%; overflow:hidden;"><SPAN></SPAN></DIV></TD>
<TD><DIV STYLE="position:relative; height:99px;width: 100%; overflow:hidden;"><SPAN></SPAN></DIV></TD>
<TD><DIV STYLE="position:relative; height:99px;width: 100%; overflow:hidden;"><SPAN></SPAN></DIV></TD>
<TD><DIV STYLE="width:100%;height:99px;overflow:hidden;">&nbsp;</DIV></TD>
</TR>
</TABLE>
</BODY>
</HTML>