10 #include <QStringList>
11 #include <QCoreApplication>
24 m_rbuf(new unsigned char[sizeof(
ccsubtitle)+255])
27 for (
uint i = 0; i < 128; i++)
56 auto then = SystemClock::now() - seconds;
57 for (
uint i = 0; i < 4; i++)
61 static const std::array<const int,16>
rowdata =
63 11, -1, 1, 2, 3, 4, 12, 13,
64 14, 15, 5, 6, 7, 8, 9, 10
69 QLatin1Char(0xAE), QLatin1Char(0xB0), QLatin1Char(0xBD), QLatin1Char(0xBF),
70 QChar(0x2122), QLatin1Char(0xA2), QLatin1Char(0xA3), QChar(0x266A),
71 QLatin1Char(0xE0), QLatin1Char(
' '), QLatin1Char(0xE8), QLatin1Char(0xE2),
72 QLatin1Char(0xEA), QLatin1Char(0xEE), QLatin1Char(0xF4), QLatin1Char(0xFB)
77 QLatin1Char(0xC1), QLatin1Char(0xC9), QLatin1Char(0xD3), QLatin1Char(0xDA),
78 QLatin1Char(0xDC), QLatin1Char(0xFC), QLatin1Char(
'`'), QLatin1Char(0xA1),
79 QLatin1Char(
'*'), QLatin1Char(
'\''), QChar(0x2014), QLatin1Char(0xA9),
80 QChar(0x2120), QLatin1Char(0xB7), QChar(0x201C), QChar(0x201D),
81 QLatin1Char(0xC0), QLatin1Char(0xC2), QLatin1Char(0xC7), QLatin1Char(0xC8),
82 QLatin1Char(0xCA), QLatin1Char(0xCB), QLatin1Char(0xEB), QLatin1Char(0xCE),
83 QLatin1Char(0xCF), QLatin1Char(0xEF), QLatin1Char(0xD4), QLatin1Char(0xD9),
84 QLatin1Char(0xF9), QLatin1Char(0xDB), QLatin1Char(0xAB), QLatin1Char(0xBB)
89 QLatin1Char(0xC3), QLatin1Char(0xE3), QLatin1Char(0xCD), QLatin1Char(0xCC),
90 QLatin1Char(0xEC), QLatin1Char(0xD2), QLatin1Char(0xF2), QLatin1Char(0xD5),
91 QLatin1Char(0xF5), QLatin1Char(
'{'), QLatin1Char(
'}'), QLatin1Char(
'\\'),
92 QLatin1Char(
'^'), QLatin1Char(
'_'), QLatin1Char(0xA6), QLatin1Char(
'~'),
93 QLatin1Char(0xC4), QLatin1Char(0xE4), QLatin1Char(0xD6), QLatin1Char(0xF6),
94 QLatin1Char(0xDF), QLatin1Char(0xA5), QLatin1Char(0xA4), QLatin1Char(
'|'),
95 QLatin1Char(0xC5), QLatin1Char(0xE5), QLatin1Char(0xD8), QLatin1Char(0xF8),
96 QChar(0x250C), QChar(0x2510), QChar(0x2514), QChar(0x2518)
109 for (mode = field*4; mode < (field*4 + 4); mode++)
123 LOG(VB_VBI, LOG_DEBUG,
"Format CC -- Duplicate");
130 int b1 = data & 0x7f;
131 int b2 = (data >> 8) & 0x7f;
133 LOG(VB_VBI, LOG_DEBUG,
134 QString(
"Format CC @%1/%2 = %3 %4, %5/%6 = '%7' '%8'")
135 .arg(tc.count()).arg(field)
136 .arg((data&0xff), 2, 16)
137 .arg((data&0xff00)>>8, 2, 16)
138 .arg(b1, 2, 16, QChar(
'0'))
139 .arg(b2, 2, 16, QChar(
'0'))
140 .arg(QChar((b1 & 0x60) ? b1 :
'_'))
141 .arg(QChar((b2 & 0x60) ? b2 :
'_')));
148 if (mode != std::numeric_limits<std::size_t>::max())
155 mode = std::numeric_limits<std::size_t>::max();
173 if (mode != std::numeric_limits<std::size_t>::max())
193 else if ((b1 & 0x10) && (b2 > 0x1F))
199 int newccmode = (b1 >> 3) & 1;
200 int newtxtmode =
m_txtMode[(field*2) + newccmode];
201 if ((b1 & 0x06) == 0x04)
223 m_txtMode[(field*2) + newccmode] = newtxtmode;
224 mode = (field << 2) | (newtxtmode << 1) |
m_ccMode[field];
246 LOG(VB_VBI, LOG_INFO,
247 QString(
"cc608 preamble indent, b2=%1")
256 LOG(VB_VBI, LOG_INFO,
257 QString(
"cc608 preamble color change, b2=%1")
270 LOG(VB_VBI, LOG_DEBUG,
271 QString(
"<ATTRIBUTE %1 %2>").arg(b1).arg(b2));
281 LOG(VB_VBI, LOG_INFO,
282 QString(
"cc608 mid-row color change, b2=%1")
287 m_ccBuf[mode] += QChar(0x7000 + (b2 & 0xf));
304 m_ccBuf[mode].remove(len - 1, 1);
317 m_ccBuf[mode].remove(len - 1, 1);
325 LOG(VB_VBI, LOG_DEBUG,
326 QString(
"ccmode %1 cmd %2").arg(
m_ccMode)
327 .arg(b2, 2, 16,
'0'));
337 m_ccBuf[mode].startsWith(
"\b"))
344 m_ccBuf[mode].remove(len - 1, 1);
377 (!newtxtmode ||
m_row[mode] >= 16)))
384 if (
m_row[mode] < 16)
418 if (
m_row[mode] == 0)
509 for (
int x = 0; x < (b2 & 0x03); x++)
521 for (mode = field*4; mode < (field*4 + 4); mode++)
547 int b1 = data & 0x7f;
548 int b2 = (data >> 8) & 0x7f;
556 ((b1 & 0x70) == 0x10))
568 std::chrono::milliseconds dup_text_fudge = 0ms;
569 std::chrono::milliseconds dup_ctrl_fudge = 0ms;
570 if (
m_badVbi[field] < 100 && b1 != 0 && b2 != 0)
572 std::chrono::milliseconds
d = tc -
m_lastTc[field];
573 if (d < 25ms || d > 42ms)
581 dup_text_fudge = -2ms;
583 dup_ctrl_fudge = 33ms - 4ms;
587 dup_text_fudge = 4ms;
588 dup_ctrl_fudge = 33ms - 4ms;
593 if ((b1 & 0x70) == 0x10)
631 for (
const auto& cp : std::as_const(cc608str))
633 int cpu = cp.unicode();
638 case 0x2120 : ret +=
"(SM)";
break;
639 case 0x2122 : ret +=
"(TM)";
break;
640 case 0x2014 : ret +=
"(--)";
break;
641 case 0x201C : ret +=
"``";
break;
642 case 0x201D : ret +=
"''";
break;
643 case 0x250C : ret +=
"|-";
break;
644 case 0x2510 : ret +=
"-|";
break;
645 case 0x2514 : ret +=
"|_";
break;
646 case 0x2518 : ret +=
"_|";
break;
647 case 0x2588 : ret +=
"[]";
break;
648 case 0x266A : ret +=
"o/~";
break;
649 case '\b' : ret +=
"\\b";
break;
651 if (cpu >= 0x7000 && cpu < 0x7000 + 0x30)
653 if (!suppress_unknown)
654 ret += QString(
"[%1]").arg(cpu, 2, 16);
656 else if (cpu <= 0x80)
658 ret += QString(cp.toLatin1());
660 else if (!suppress_unknown)
662 ret += QString(
"{%1}").arg(cpu, 2, 16);
676 tmpbuf =
m_ccBuf[mode].toUtf8();
677 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
678 len = std::min(tmpbuf.length(), 255);
680 len = std::min(tmpbuf.length(), 255LL);
684 unsigned char *bp =
m_rbuf;
685 *(bp++) =
m_row[mode];
710 LOG(VB_VBI, LOG_INFO, QString(
"### %1 %2 %3 %4 %5 %6 %7 - '%8'")
713 .arg(
m_style[mode]).arg(f, 2, 16)
714 .arg(clr).arg(len, 3)
715 .arg(
ToASCII(QString::fromUtf8(tmpbuf.constData(), len),
false)));
723 case CC_CC1: stream = 0;
break;
724 case CC_CC2: stream = 1;
break;
725 case CC_CC3: stream = 2;
break;
726 case CC_CC4: stream = 3;
break;
729 m_lastSeen[stream] = std::chrono::system_clock::now();
757 if (
m_row[mode] == 0)
767 if (
m_row[mode] == 0)
820 for (
int x = 0; x < limit; x++)
842 return ((c) & 0x7F) >= 0x20 && ((c) & 0x7F) <= 0x7E;
851 static int OddParity(
unsigned char c)
853 c ^= (c >> 4); c ^= (c >> 2); c ^= (c >> 1);
862 static constexpr
int PIL_TIME(
int day,
int mon,
int hour,
int min)
863 {
return (day << 15) + (mon << 11) + (hour << 6) + min; }
867 int day = (pil >> 15);
868 int mon = (pil >> 11) & 0xF;
869 int hour = (pil >> 6 ) & 0x1F;
870 int min = (pil ) & 0x3F;
873 LOG(VB_VBI, LOG_INFO,
" PDC: Timer-control (no PDC)");
874 else if (pil ==
PIL_TIME(0, 15, 30, 63))
875 LOG(VB_VBI, LOG_INFO,
" PDC: Recording inhibit/terminate");
876 else if (pil ==
PIL_TIME(0, 15, 29, 63))
877 LOG(VB_VBI, LOG_INFO,
" PDC: Interruption");
878 else if (pil ==
PIL_TIME(0, 15, 28, 63))
879 LOG(VB_VBI, LOG_INFO,
" PDC: Continue");
880 else if (pil ==
PIL_TIME(31, 15, 31, 63))
881 LOG(VB_VBI, LOG_INFO,
" PDC: No time");
883 LOG(VB_VBI, LOG_INFO, QString(
" PDC: %1, 200X-%2-%3 %4:%5")
884 .arg(pil).arg(mon).arg(day).arg(hour).arg(min));
902 LOG(VB_VBI, LOG_INFO, QString(
"VPS: 3-10: %1 %2 %3 %4 %5 %6 %7 %8 (\"%9\")")
903 .arg(buf[0]).arg(buf[1]).arg(buf[2]).arg(buf[3]).arg(buf[4])
904 .arg(buf[5]).arg(buf[6]).arg(buf[7]).arg(
m_vpsPrLabel.data()));
906 int pcs = buf[2] >> 6;
907 int cni = + ((buf[10] & 3) << 10)
908 + ((buf[11] & 0xC0) << 2)
909 + ((buf[8] & 0xC0) << 0)
911 int pil = ((buf[8] & 0x3F) << 14) + (buf[9] << 6) + (buf[10] >> 2);
914 LOG(VB_VBI, LOG_INFO, QString(
"CNI: %1 PCS: %2 PTY: %3 ")
915 .arg(cni).arg(pcs).arg(pty));
928 static const std::array<const int,8> kWssBits { 0, 0, 0, 1, 0, 1, 1, 1 };
931 for (
uint i = 0; i < 16; i++)
933 uint b1 = kWssBits[buf[i] & 7];
934 uint b2 = kWssBits[(buf[i] >> 3) & 7];
940 unsigned char parity = wss & 0xf;
941 parity ^= parity >> 2;
942 parity ^= parity >> 1;
944 LOG(VB_VBI, LOG_INFO,
945 QString(
"WSS: %1; %2 mode; %3 color coding;\n\t\t\t"
946 " %4 helper; reserved b7=%5; %6\n\t\t\t"
947 " open subtitles: %7; %scopyright %8; copying %9")
948 .arg(QString::fromStdString(
formats[wss & 7]),
949 (wss & 0x0010) ?
"film" :
"camera",
950 (wss & 0x0020) ?
"MA/CP" :
"standard",
951 (wss & 0x0040) ?
"modulated" :
"no",
952 (wss & 0x0080) ?
"1" :
"0",
953 (wss & 0x0100) ?
"have TTX subtitles; " :
"",
954 QString::fromStdString(
subtitles[(wss >> 9) & 3]),
955 (wss & 0x0800) ?
"surround sound; " :
"",
956 (wss & 0x1000) ?
"asserted" :
"unknown")
958 .arg((wss & 0x2000) ?
"restricted" :
"not restricted"));
971 for (
uint i = start; (i < buf.size()) && (i < end); i++)
973 LOG(VB_VBI, LOG_INFO, QString(
"%1: 0x%2 -> 0x%3 %4")
975 .arg(buf[i],2,16,QChar(
'0'))
982 for (
uint i = start; (i < buf.size()) && (i < end); i++)
989 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecodeString: '%1'").arg(
tmp));
992 return tmp.trimmed();
995 static bool is_better(
const QString &newStr,
const QString &oldStr)
997 if (!newStr.isEmpty() && newStr != oldStr &&
998 (newStr != oldStr.left(newStr.length())))
1000 if (oldStr.isEmpty())
1004 return std::all_of(newStr.cbegin(), newStr.cend(),
1005 [](
auto ch){ return ch.toLatin1() >= 0x20; } );
1026 const std::array<const QString,4>
prefix {
"MPAA-",
"TV-",
"CE-",
"CF-" };
1027 const std::array<const std::array<const QString,8>,4> mainStr
1029 {
"NR",
"G",
"PG",
"PG-13",
"R",
"NC-17",
"X",
"NR" },
1030 {
"NR",
"Y",
"Y7",
"G",
"PG",
"14",
"MA",
"NR" },
1031 {
"E",
"C",
"C8+",
"G",
"PG",
"14+",
"18+",
"NR" },
1032 {
"E",
"G",
"8+",
"13+",
"16+",
"18+",
"NR",
"NR" },
1039 uint cf = (future) ? 1 : 0;
1067 const std::vector<uint> &program_type =
m_xdsProgramType[(future) ? 1 : 0];
1070 for (
size_t i = 0; i < program_type.size(); i++)
1084 if (key ==
"ratings")
1086 if (key.startsWith(
"has_rating_"))
1088 if (key.startsWith(
"rating_"))
1091 if (key ==
"future_ratings")
1093 if (key.startsWith(
"has_future_rating_"))
1095 if (key.startsWith(
"future_rating_"))
1098 if (key ==
"programname")
1100 if (key ==
"future_programname")
1103 if (key ==
"programtype")
1105 if (key ==
"future_programtype")
1108 if (key ==
"callsign")
1110 if (key ==
"channame")
1136 LOG(VB_VBI, LOG_INFO,
1137 QString(
"XDSDecode: 0x%1 0x%2 '%3%4' xds[%5]=%6 in XDS %7")
1138 .arg(b1,2,16,QChar(
'0')).arg(b2,2,16,QChar(
'0'))
1141 .arg(field).arg(
m_xds[field])
1163 else if ((0
x0 < b1) && (b1 < 0x0f))
1187 else if ((0x10 <= b1) && (b1 <= 0x1f))
1190 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecode: Suspending XDS %1 on 0x%2")
1203 bool handled =
false;
1204 int xds_class = xds_buf[0];
1209 if ((xds_class == 0x01) || (xds_class == 0x03))
1211 else if (xds_class == 0x05)
1213 else if ((xds_class == 0x07) ||
1214 (xds_class == 0x09) ||
1215 (xds_class == 0x0b))
1217 else if (xds_class == 0x0d)
1223 LOG(VB_VBI, LOG_INFO, QString(
"XDS: ") +
1224 QString(
"Unhandled packet (0x%1 0x%2) sz(%3) '%4'")
1225 .arg(xds_buf[0],0,16).arg(xds_buf[1],0,16)
1226 .arg(xds_buf.size())
1236 for (
size_t i = 0; i < xds_buf.size() - 1; i++)
1239 if ((((~sum) & 0x7f) + 1) != xds_buf[xds_buf.size() - 1])
1243 LOG(VB_VBI, LOG_ERR, QString(
"XDS: failed CRC %1 of %2")
1254 const std::vector<unsigned char> &xds_buf,
bool future)
1256 bool handled =
true;
1257 int b2 = xds_buf[1];
1258 int cf = (future) ? 1 : 0;
1259 QString loc = (future) ?
"XDS: Future " :
"XDS: Current ";
1261 if ((b2 == 0x01) && (xds_buf.size() >= 6))
1263 uint min = xds_buf[2] & 0x3f;
1264 uint hour = xds_buf[3] & 0x0f;
1265 uint day = xds_buf[4] & 0x1f;
1266 uint month = xds_buf[5] & 0x0f;
1267 month = (month < 1 || month > 12) ? 0 : month;
1269 LOG(VB_VBI, LOG_INFO, loc +
1270 QString(
"Start Time %1/%2 %3:%4%5")
1271 .arg(month).arg(day).arg(hour).arg(min / 10).arg(min % 10));
1273 else if ((b2 == 0x02) && (xds_buf.size() >= 4))
1275 uint length_min = xds_buf[2] & 0x3f;
1276 uint length_hour = xds_buf[3] & 0x3f;
1277 uint length_elapsed_min = 0;
1278 uint length_elapsed_hour = 0;
1279 uint length_elapsed_secs = 0;
1280 if (xds_buf.size() > 6)
1282 length_elapsed_min = xds_buf[4] & 0x3f;
1283 length_elapsed_hour = xds_buf[5] & 0x3f;
1285 if (xds_buf.size() > 8 && xds_buf[7] == 0x40)
1286 length_elapsed_secs = xds_buf[6] & 0x3f;
1288 QString msg = QString(
"Program Length %1:%2%3 "
1289 "Time in Show %4:%5%6.%7%8")
1290 .arg(length_hour).arg(length_min / 10).arg(length_min % 10)
1291 .arg(length_elapsed_hour)
1292 .arg(length_elapsed_min / 10).arg(length_elapsed_min % 10)
1293 .arg(length_elapsed_secs / 10).arg(length_elapsed_secs % 10);
1295 LOG(VB_VBI, LOG_INFO, loc + msg);
1297 else if ((b2 == 0x03) && (xds_buf.size() >= 6))
1303 LOG(VB_VBI, LOG_INFO, loc + QString(
"Program Name: '%1'")
1307 else if ((b2 == 0x04) && (xds_buf.size() >= 6))
1309 std::vector<uint> program_type;
1310 for (
size_t i = 2; i < xds_buf.size() - 2; i++)
1312 int cur = xds_buf[i] - 0x20;
1313 if (cur >= 0 && cur < 96)
1314 program_type.push_back(cur);
1318 for (
uint i = 0; (i < program_type.size()) && unchanged; i++)
1324 LOG(VB_VBI, LOG_INFO, loc + QString(
"Program Type '%1'")
1328 else if ((b2 == 0x05) && (xds_buf.size() >= 4))
1330 uint movie_rating = xds_buf[2] & 0x7;
1331 uint rating_system = (xds_buf[2] >> 3) & 0x7;
1332 uint tv_rating = xds_buf[3] & 0x7;
1333 uint VSL = xds_buf[3] & (0x7 << 3);
1334 uint sel = VSL | rating_system;
1342 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1353 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1357 else if (sel == 0x13 || sel == 0x1f)
1361 else if ((rating_system & 0
x3) == 1)
1366 uint f = ((xds_buf[0]<<3) & 0x80) | ((xds_buf[1]<<1) & 0x70);
1369 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1373 else if (rating_system == 0)
1380 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1386 LOG(VB_VBI, LOG_ERR, loc +
1387 QString(
"VChip Unhandled -- rs(%1) rating(%2:%3)")
1388 .arg(rating_system).arg(tv_rating).arg(movie_rating));
1392 else if (b2 == 0x07)
1394 else if (b2 == 0x08)
1396 else if (b2 == 0x09)
1398 else if (b2 == 0x0c)
1400 else if (b2 == 0x10 || b2 == 0x13 || b2 == 0x15 || b2 == 0x16 ||
1401 b2 == 0x91 || b2 == 0x92 || b2 == 0x94 || b2 == 0x97)
1403 else if (b2 == 0x86)
1405 else if (b2 == 0x89)
1407 else if (b2 == 0x8c)
1420 bool handled =
true;
1422 int b2 = xds_buf[1];
1423 if ((b2 == 0x01) && (xds_buf.size() >= 6))
1428 LOG(VB_VBI, LOG_INFO, QString(
"XDS: Network Name '%1'").arg(
tmp));
1432 else if ((b2 == 0x02) && (xds_buf.size() >= 6))
1437 LOG(VB_VBI, LOG_INFO, QString(
"XDS: Network Call '%1'").arg(
tmp));
1441 else if ((b2 == 0x04) && (xds_buf.size() >= 6))
1443 uint tsid = (xds_buf[2] << 24 | xds_buf[3] << 16 |
1444 xds_buf[4] << 8 | xds_buf[5]);
1447 LOG(VB_VBI, LOG_INFO, QString(
"XDS: TSID 0x%1").arg(tsid,0,16));
1461 xds_program_type[0] = QCoreApplication::translate(
"(Categories)",
1463 xds_program_type[1] = QCoreApplication::translate(
"(Categories)",
1465 xds_program_type[2] = QCoreApplication::translate(
"(Categories)",
1467 xds_program_type[3] = QCoreApplication::translate(
"(Categories)",
1469 xds_program_type[4] = QCoreApplication::translate(
"(Categories)",
1471 xds_program_type[5] = QCoreApplication::translate(
"(Categories)",
1473 xds_program_type[6] = QCoreApplication::translate(
"(Categories)",
1475 xds_program_type[7] = QCoreApplication::translate(
"(Categories)",
1477 xds_program_type[8] = QCoreApplication::translate(
"(Categories)",
1479 xds_program_type[9] = QCoreApplication::translate(
"(Categories)",
1481 xds_program_type[10] = QCoreApplication::translate(
"(Categories)",
1483 xds_program_type[11] = QCoreApplication::translate(
"(Categories)",
1485 xds_program_type[12] = QCoreApplication::translate(
"(Categories)",
1487 xds_program_type[13] = QCoreApplication::translate(
"(Categories)",
1489 xds_program_type[14] = QCoreApplication::translate(
"(Categories)",
1491 xds_program_type[15] = QCoreApplication::translate(
"(Categories)",
1493 xds_program_type[16] = QCoreApplication::translate(
"(Categories)",
1495 xds_program_type[17] = QCoreApplication::translate(
"(Categories)",
1497 xds_program_type[18] = QCoreApplication::translate(
"(Categories)",
1499 xds_program_type[19] = QCoreApplication::translate(
"(Categories)",
1501 xds_program_type[20] = QCoreApplication::translate(
"(Categories)",
1503 xds_program_type[21] = QCoreApplication::translate(
"(Categories)",
1505 xds_program_type[22] = QCoreApplication::translate(
"(Categories)",
1507 xds_program_type[23] = QCoreApplication::translate(
"(Categories)",
1509 xds_program_type[24] = QCoreApplication::translate(
"(Categories)",
1511 xds_program_type[25] = QCoreApplication::translate(
"(Categories)",
1513 xds_program_type[26] = QCoreApplication::translate(
"(Categories)",
1515 xds_program_type[27] = QCoreApplication::translate(
"(Categories)",
1517 xds_program_type[28] = QCoreApplication::translate(
"(Categories)",
1519 xds_program_type[29] = QCoreApplication::translate(
"(Categories)",
1521 xds_program_type[30] = QCoreApplication::translate(
"(Categories)",
1523 xds_program_type[31] = QCoreApplication::translate(
"(Categories)",
1525 xds_program_type[32] = QCoreApplication::translate(
"(Categories)",
1527 xds_program_type[33] = QCoreApplication::translate(
"(Categories)",
1529 xds_program_type[34] = QCoreApplication::translate(
"(Categories)",
1531 xds_program_type[35] = QCoreApplication::translate(
"(Categories)",
1533 xds_program_type[36] = QCoreApplication::translate(
"(Categories)",
1535 xds_program_type[37] = QCoreApplication::translate(
"(Categories)",
1537 xds_program_type[38] = QCoreApplication::translate(
"(Categories)",
1539 xds_program_type[39] = QCoreApplication::translate(
"(Categories)",
1541 xds_program_type[40] = QCoreApplication::translate(
"(Categories)",
1543 xds_program_type[41] = QCoreApplication::translate(
"(Categories)",
1545 xds_program_type[42] = QCoreApplication::translate(
"(Categories)",
1547 xds_program_type[43] = QCoreApplication::translate(
"(Categories)",
1549 xds_program_type[44] = QCoreApplication::translate(
"(Categories)",
1551 xds_program_type[45] = QCoreApplication::translate(
"(Categories)",
1553 xds_program_type[46] = QCoreApplication::translate(
"(Categories)",
1555 xds_program_type[47] = QCoreApplication::translate(
"(Categories)",
1557 xds_program_type[48] = QCoreApplication::translate(
"(Categories)",
1559 xds_program_type[49] = QCoreApplication::translate(
"(Categories)",
1561 xds_program_type[50] = QCoreApplication::translate(
"(Categories)",
1563 xds_program_type[51] = QCoreApplication::translate(
"(Categories)",
1565 xds_program_type[52] = QCoreApplication::translate(
"(Categories)",
1567 xds_program_type[53] = QCoreApplication::translate(
"(Categories)",
1569 xds_program_type[54] = QCoreApplication::translate(
"(Categories)",
1571 xds_program_type[55] = QCoreApplication::translate(
"(Categories)",
1573 xds_program_type[56] = QCoreApplication::translate(
"(Categories)",
1575 xds_program_type[57] = QCoreApplication::translate(
"(Categories)",
1577 xds_program_type[58] = QCoreApplication::translate(
"(Categories)",
1579 xds_program_type[59] = QCoreApplication::translate(
"(Categories)",
1581 xds_program_type[60] = QCoreApplication::translate(
"(Categories)",
1583 xds_program_type[61] = QCoreApplication::translate(
"(Categories)",
1585 xds_program_type[62] = QCoreApplication::translate(
"(Categories)",
1587 xds_program_type[63] = QCoreApplication::translate(
"(Categories)",
1589 xds_program_type[64] = QCoreApplication::translate(
"(Categories)",
1591 xds_program_type[65] = QCoreApplication::translate(
"(Categories)",
1593 xds_program_type[66] = QCoreApplication::translate(
"(Categories)",
1595 xds_program_type[67] = QCoreApplication::translate(
"(Categories)",
1597 xds_program_type[68] = QCoreApplication::translate(
"(Categories)",
1599 xds_program_type[69] = QCoreApplication::translate(
"(Categories)",
1601 xds_program_type[70] = QCoreApplication::translate(
"(Categories)",
1603 xds_program_type[71] = QCoreApplication::translate(
"(Categories)",
1605 xds_program_type[72] = QCoreApplication::translate(
"(Categories)",
1607 xds_program_type[73] = QCoreApplication::translate(
"(Categories)",
1609 xds_program_type[74] = QCoreApplication::translate(
"(Categories)",
1611 xds_program_type[75] = QCoreApplication::translate(
"(Categories)",
1613 xds_program_type[76] = QCoreApplication::translate(
"(Categories)",
1615 xds_program_type[77] = QCoreApplication::translate(
"(Categories)",
1617 xds_program_type[78] = QCoreApplication::translate(
"(Categories)",
1619 xds_program_type[79] = QCoreApplication::translate(
"(Categories)",
1621 xds_program_type[80] = QCoreApplication::translate(
"(Categories)",
1623 xds_program_type[81] = QCoreApplication::translate(
"(Categories)",
1625 xds_program_type[82] = QCoreApplication::translate(
"(Categories)",
1627 xds_program_type[83] = QCoreApplication::translate(
"(Categories)",
1629 xds_program_type[84] = QCoreApplication::translate(
"(Categories)",
1631 xds_program_type[85] = QCoreApplication::translate(
"(Categories)",
1633 xds_program_type[86] = QCoreApplication::translate(
"(Categories)",
1635 xds_program_type[87] = QCoreApplication::translate(
"(Categories)",
1637 xds_program_type[88] = QCoreApplication::translate(
"(Categories)",
1639 xds_program_type[89] = QCoreApplication::translate(
"(Categories)",
1641 xds_program_type[90] = QCoreApplication::translate(
"(Categories)",
1643 xds_program_type[91] = QCoreApplication::translate(
"(Categories)",
1645 xds_program_type[92] = QCoreApplication::translate(
"(Categories)",
1647 xds_program_type[93] = QCoreApplication::translate(
"(Categories)",
1649 xds_program_type[94] = QCoreApplication::translate(
"(Categories)",
1651 xds_program_type[95] = QCoreApplication::translate(
"(Categories)",