aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTom Tsou <tom.tsou@ettus.com>2016-07-06 13:29:25 -0700
committerTom Tsou <tom@tsou.cc>2016-07-25 18:36:29 +0000
commit73cb583e5147a267a370c576e8ac77507de6d0d7 (patch)
tree01586359a10410862423aad9d819fe015a444f23 /src
parentc9582ac2d7366233ab64f2868f17071c2ddadf32 (diff)
trx: Add EGPRS tables, sequences, and mappings
Includes EGPRS specific convolutional codes, interleaving tables and functions, burst mappings, training sequences, and parity checks from 3GPP TS 44.060 needed to handle MCS codings 1-9. Change-Id: Ie270398dd7a72f282ba53e646853d8de1eabee93 Signed-off-by: Tom Tsou <tom.tsou@ettus.com>
Diffstat (limited to 'src')
-rw-r--r--src/common/scheduler.c27
-rw-r--r--src/osmo-bts-trx/gsm0503_conv.c178
-rw-r--r--src/osmo-bts-trx/gsm0503_conv.h15
-rw-r--r--src/osmo-bts-trx/gsm0503_interleaving.c413
-rw-r--r--src/osmo-bts-trx/gsm0503_interleaving.h40
-rw-r--r--src/osmo-bts-trx/gsm0503_mapping.c202
-rw-r--r--src/osmo-bts-trx/gsm0503_mapping.h23
-rw-r--r--src/osmo-bts-trx/gsm0503_parity.c23
-rw-r--r--src/osmo-bts-trx/gsm0503_parity.h2
-rw-r--r--src/osmo-bts-trx/gsm0503_tables.c1520
-rw-r--r--src/osmo-bts-trx/gsm0503_tables.h31
11 files changed, 2470 insertions, 4 deletions
diff --git a/src/common/scheduler.c b/src/common/scheduler.c
index 07c2e12f..7c790cd1 100644
--- a/src/common/scheduler.c
+++ b/src/common/scheduler.c
@@ -78,6 +78,33 @@ const ubit_t _sched_tsc[8][26] = {
{ 1,1,1,0,1,1,1,1,0,0,0,1,0,0,1,0,1,1,1,0,1,1,1,1,0,0, },
};
+const ubit_t _sched_egprs_tsc[8][78] = {
+ { 1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,0,0,
+ 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,
+ 1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,0,0,1,0,0,1, },
+ { 1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,0,0,1,1,1,1,0,0,1,0,0,
+ 1,0,0,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,1,1,1,1,1,1,1,
+ 1,1,0,0,1,1,1,1,0,0,1,0,0,1,1,1,1,0,0,1,0,0,1,0,0,1, },
+ { 1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,
+ 1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1, },
+ { 1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,
+ 1,1,1,1,0,0,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,
+ 0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,1,1,1, },
+ { 1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,
+ 1,0,0,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,0,0,1, },
+ { 1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,0,0,
+ 1,1,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
+ 0,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,0,0,1,1,1,1, },
+ { 0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,
+ 1,0,0,1,1,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
+ 1,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1, },
+ { 0,0,1,0,0,1,0,0,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,1,1,
+ 1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,0,
+ 0,1,0,0,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,1,1,1,1,1,1, },
+};
+
/*! \brief SCH trainign sequence (TS 05.02 Chapter 5.2.5) */
const ubit_t _sched_sch_train[64] = {
1,0,1,1,1,0,0,1,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,
diff --git a/src/osmo-bts-trx/gsm0503_conv.c b/src/osmo-bts-trx/gsm0503_conv.c
index dc50e6c2..6fe707e6 100644
--- a/src/osmo-bts-trx/gsm0503_conv.c
+++ b/src/osmo-bts-trx/gsm0503_conv.c
@@ -26,6 +26,43 @@ static const uint8_t conv_xcch_next_state[][2] = {
{ 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
};
+static const uint8_t conv_mcs_next_output[][2] = {
+ { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
+ { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
+ { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
+ { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
+ { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
+ { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
+ { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
+ { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
+ { 7, 0 }, { 4, 3 }, { 1, 6 }, { 2, 5 },
+ { 1, 6 }, { 2, 5 }, { 7, 0 }, { 4, 3 },
+ { 6, 1 }, { 5, 2 }, { 0, 7 }, { 3, 4 },
+ { 0, 7 }, { 3, 4 }, { 6, 1 }, { 5, 2 },
+ { 3, 4 }, { 0, 7 }, { 5, 2 }, { 6, 1 },
+ { 5, 2 }, { 6, 1 }, { 3, 4 }, { 0, 7 },
+ { 2, 5 }, { 1, 6 }, { 4, 3 }, { 7, 0 },
+ { 4, 3 }, { 7, 0 }, { 2, 5 }, { 1, 6 },
+};
+
+static const uint8_t conv_mcs_next_state[][2] = {
+ { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
+ { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
+ { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
+ { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
+ { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
+ { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
+ { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
+ { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
+ { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 },
+ { 8, 9 }, { 10, 11 }, { 12, 13 }, { 14, 15 },
+ { 16, 17 }, { 18, 19 }, { 20, 21 }, { 22, 23 },
+ { 24, 25 }, { 26, 27 }, { 28, 29 }, { 30, 31 },
+ { 32, 33 }, { 34, 35 }, { 36, 37 }, { 38, 39 },
+ { 40, 41 }, { 42, 43 }, { 44, 45 }, { 46, 47 },
+ { 48, 49 }, { 50, 51 }, { 52, 53 }, { 54, 55 },
+ { 56, 57 }, { 58, 59 }, { 60, 61 }, { 62, 63 },
+};
const struct osmo_conv_code gsm0503_conv_xcch = {
.N = 2,
@@ -54,6 +91,147 @@ const struct osmo_conv_code gsm0503_conv_cs3 = {
};
+const struct osmo_conv_code gsm0503_conv_mcs1_dl_hdr = {
+ .N = 3,
+ .K = 7,
+ .len = 36,
+ .term = CONV_TERM_TAIL_BITING,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs1_ul_hdr = {
+ .N = 3,
+ .K = 7,
+ .len = 39,
+ .term = CONV_TERM_TAIL_BITING,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs1 = {
+ .N = 3,
+ .K = 7,
+ .len = 190,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs2 = {
+ .N = 3,
+ .K = 7,
+ .len = 238,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs3 = {
+ .N = 3,
+ .K = 7,
+ .len = 310,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs4 = {
+ .N = 3,
+ .K = 7,
+ .len = 366,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs5_dl_hdr = {
+ .N = 3,
+ .K = 7,
+ .len = 33,
+ .term = CONV_TERM_TAIL_BITING,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs5_ul_hdr = {
+ .N = 3,
+ .K = 7,
+ .len = 45,
+ .term = CONV_TERM_TAIL_BITING,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs5 = {
+ .N = 3,
+ .K = 7,
+ .len = 462,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs6 = {
+ .N = 3,
+ .K = 7,
+ .len = 606,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs7_dl_hdr = {
+ .N = 3,
+ .K = 7,
+ .len = 45,
+ .term = CONV_TERM_TAIL_BITING,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs7_ul_hdr = {
+ .N = 3,
+ .K = 7,
+ .len = 54,
+ .term = CONV_TERM_TAIL_BITING,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs7 = {
+ .N = 3,
+ .K = 7,
+ .len = 462,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs8 = {
+ .N = 3,
+ .K = 7,
+ .len = 558,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
+const struct osmo_conv_code gsm0503_conv_mcs9 = {
+ .N = 3,
+ .K = 7,
+ .len = 606,
+ .next_output = conv_mcs_next_output,
+ .next_state = conv_mcs_next_state,
+};
+
+
const struct osmo_conv_code gsm0503_conv_rach = {
.N = 2,
.K = 5,
diff --git a/src/osmo-bts-trx/gsm0503_conv.h b/src/osmo-bts-trx/gsm0503_conv.h
index 68ad4844..317dbb7f 100644
--- a/src/osmo-bts-trx/gsm0503_conv.h
+++ b/src/osmo-bts-trx/gsm0503_conv.h
@@ -4,6 +4,21 @@
extern const struct osmo_conv_code gsm0503_conv_xcch;
extern const struct osmo_conv_code gsm0503_conv_cs2;
extern const struct osmo_conv_code gsm0503_conv_cs3;
+extern const struct osmo_conv_code gsm0503_conv_mcs1_dl_hdr;
+extern const struct osmo_conv_code gsm0503_conv_mcs1_ul_hdr;
+extern const struct osmo_conv_code gsm0503_conv_mcs1;
+extern const struct osmo_conv_code gsm0503_conv_mcs2;
+extern const struct osmo_conv_code gsm0503_conv_mcs3;
+extern const struct osmo_conv_code gsm0503_conv_mcs4;
+extern const struct osmo_conv_code gsm0503_conv_mcs5_dl_hdr;
+extern const struct osmo_conv_code gsm0503_conv_mcs5_ul_hdr;
+extern const struct osmo_conv_code gsm0503_conv_mcs5;
+extern const struct osmo_conv_code gsm0503_conv_mcs6;
+extern const struct osmo_conv_code gsm0503_conv_mcs7_dl_hdr;
+extern const struct osmo_conv_code gsm0503_conv_mcs7_ul_hdr;
+extern const struct osmo_conv_code gsm0503_conv_mcs7;
+extern const struct osmo_conv_code gsm0503_conv_mcs8;
+extern const struct osmo_conv_code gsm0503_conv_mcs9;
extern const struct osmo_conv_code gsm0503_conv_rach;
extern const struct osmo_conv_code gsm0503_conv_sch;
extern const struct osmo_conv_code gsm0503_conv_tch_fr;
diff --git a/src/osmo-bts-trx/gsm0503_interleaving.c b/src/osmo-bts-trx/gsm0503_interleaving.c
index ec47a6b3..4569cfa2 100644
--- a/src/osmo-bts-trx/gsm0503_interleaving.c
+++ b/src/osmo-bts-trx/gsm0503_interleaving.c
@@ -1,5 +1,6 @@
#include <stdint.h>
+#include <string.h>
#include <osmocom/core/bits.h>
@@ -28,7 +29,7 @@
* Where hl(B) and hn(B) are bits in burst B indicating flags.
*/
-void gsm0503_xcch_deinterleave(sbit_t *cB, sbit_t *iB)
+void gsm0503_xcch_deinterleave(sbit_t *cB, const sbit_t *iB)
{
int j, k, B;
@@ -50,6 +51,416 @@ void gsm0503_xcch_interleave(ubit_t *cB, ubit_t *iB)
}
}
+void gsm0503_mcs1_dl_deinterleave(sbit_t *u, sbit_t *hc,
+ sbit_t *dc, const sbit_t *iB)
+{
+ int k;
+ sbit_t c[452];
+ sbit_t cp[456];
+
+ gsm0503_xcch_deinterleave(cp, iB);
+
+ for (k=0; k<25; k++)
+ c[k] = cp[k];
+ for (k=26; k<82; k++)
+ c[k - 1] = cp[k];
+ for (k=83; k<139; k++)
+ c[k - 2] = cp[k];
+ for (k=140; k<424; k++)
+ c[k - 3] = cp[k];
+ for (k=425; k<456; k++)
+ c[k - 4] = cp[k];
+
+ if (u) {
+ for (k=0; k<12; k++)
+ u[k] = c[k];
+ }
+
+ if (hc) {
+ for (k=12; k<80; k++)
+ hc[k - 12] = c[k];
+ }
+
+ if (dc) {
+ for (k=80; k<452; k++)
+ dc[k - 80] = c[k];
+ }
+}
+
+void gsm0503_mcs1_dl_interleave(const ubit_t *up, const ubit_t *hc,
+ const ubit_t *dc, ubit_t *iB)
+{
+ int k;
+ ubit_t c[452];
+ ubit_t cp[456];
+
+ for (k=0; k<12; k++)
+ c[k] = up[k];
+ for (k=12; k<80; k++)
+ c[k] = hc[k - 12];
+ for (k=80; k<452; k++)
+ c[k] = dc[k - 80];
+
+ for (k=0; k<25; k++)
+ cp[k] = c[k];
+ for (k=26; k<82; k++)
+ cp[k] = c[k - 1];
+ for (k=83; k<139; k++)
+ cp[k] = c[k - 2];
+ for (k=140; k<424; k++)
+ cp[k] = c[k - 3];
+ for (k=425; k<456; k++)
+ cp[k] = c[k - 4];
+
+ cp[25] = 0;
+ cp[82] = 0;
+ cp[139] = 0;
+ cp[424] = 0;
+
+ gsm0503_xcch_interleave(cp, iB);
+}
+
+void gsm0503_mcs1_ul_deinterleave(sbit_t *hc, sbit_t *dc, const sbit_t *iB)
+{
+ int k;
+ sbit_t c[452];
+ sbit_t cp[456];
+
+ gsm0503_xcch_deinterleave(cp, iB);
+
+ for (k=0; k<25; k++)
+ c[k] = cp[k];
+ for (k=26; k<82; k++)
+ c[k - 1] = cp[k];
+ for (k=83; k<139; k++)
+ c[k - 2] = cp[k];
+ for (k=140; k<424; k++)
+ c[k - 3] = cp[k];
+ for (k=425; k<456; k++)
+ c[k - 4] = cp[k];
+
+ if (hc) {
+ for (k=0; k<80; k++)
+ hc[k] = c[k];
+ }
+
+ if (dc) {
+ for (k=80; k<452; k++)
+ dc[k - 80] = c[k];
+ }
+}
+
+void gsm0503_mcs1_ul_interleave(const ubit_t *hc, const ubit_t *dc, ubit_t *iB)
+{
+ int k;
+ ubit_t c[452];
+ ubit_t cp[456];
+
+ for (k=0; k<80; k++)
+ c[k] = hc[k];
+ for (k=80; k<452; k++)
+ c[k] = dc[k - 80];
+
+ for (k=0; k<25; k++)
+ cp[k] = c[k];
+ for (k=26; k<82; k++)
+ cp[k] = c[k - 1];
+ for (k=83; k<139; k++)
+ cp[k] = c[k - 2];
+ for (k=140; k<424; k++)
+ cp[k] = c[k - 3];
+ for (k=425; k<456; k++)
+ cp[k] = c[k - 4];
+
+ cp[25] = 0;
+ cp[82] = 0;
+ cp[139] = 0;
+ cp[424] = 0;
+
+ gsm0503_xcch_interleave(cp, iB);
+}
+
+void gsm0503_mcs5_ul_interleave(const ubit_t *hc, const ubit_t *dc,
+ ubit_t *hi, ubit_t *di)
+{
+ int j, k;
+
+ /* Header */
+ for (k=0; k<136; k++) {
+ j = 34 * (k % 4) + 2 * (11 * k % 17) + k % 8 / 4;
+ hi[j] = hc[k];
+ }
+
+ /* Data */
+ for (k=0; k<1248; k++) {
+ j = gsm0503_interleave_mcs5[k];
+ di[j] = dc[k];
+ }
+}
+
+void gsm0503_mcs5_ul_deinterleave(sbit_t *hc, sbit_t *dc,
+ const sbit_t *hi, const sbit_t *di)
+{
+ int j, k;
+
+ /* Header */
+ if (hc) {
+ for (k=0; k<136; k++) {
+ j = 34 * (k % 4) + 2 * (11 * k % 17) + k % 8 / 4;
+ hc[k] = hi[j];
+ }
+ }
+
+ /* Data */
+ if (dc) {
+ for (k=0; k<1248; k++) {
+ j = gsm0503_interleave_mcs5[k];
+ dc[k] = di[j];
+ }
+ }
+}
+
+void gsm0503_mcs5_dl_interleave(const ubit_t *hc, const ubit_t *dc,
+ ubit_t *hi, ubit_t *di)
+{
+ int j, k;
+
+ /* Header */
+ for (k=0; k<100; k++) {
+ j = 25 * (k % 4) + ((17 * k) % 25);
+ hi[j] = hc[k];
+ }
+
+ /* Data */
+ for (k=0; k<1248; k++) {
+ j = gsm0503_interleave_mcs5[k];
+ di[j] = dc[k];
+ }
+}
+
+void gsm0503_mcs5_dl_deinterleave(sbit_t *hc, sbit_t *dc,
+ const sbit_t *hi, const sbit_t *di)
+{
+ int j, k;
+
+ /* Header */
+ if (hc) {
+ for (k=0; k<100; k++) {
+ j = 25 * (k % 4) + ((17 * k) % 25);
+ hc[k] = hi[j];
+ }
+ }
+
+ /* Data */
+ if (dc) {
+ for (k=0; k<1248; k++) {
+ j = gsm0503_interleave_mcs5[k];
+ dc[k] = di[j];
+ }
+ }
+}
+
+void gsm0503_mcs7_dl_interleave(const ubit_t *hc, const ubit_t *c1,
+ const ubit_t *c2, ubit_t *hi, ubit_t *di)
+{
+ int j, k;
+ ubit_t dc[1224];
+
+ /* Header */
+ for (k=0; k<124; k++) {
+ j = 31 * (k % 4) + ((17 * k) % 31);
+ hi[j] = hc[k];
+ }
+
+ memcpy(&dc[0], c1, 612);
+ memcpy(&dc[612], c2, 612);
+
+ /* Data */
+ for (k=0; k<1224; k++) {
+ j = 306 * (k % 4) + 3 * (44 * k % 102 + k / 4 % 2) +
+ (k + 2 - k / 408) % 3;
+ di[j] = dc[k];
+ }
+}
+
+
+void gsm0503_mcs7_dl_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
+ const sbit_t *hi, const sbit_t *di)
+{
+ int j, k;
+ ubit_t dc[1224];
+
+ /* Header */
+ if (hc) {
+ for (k=0; k<124; k++) {
+ j = 31 * (k % 4) + ((17 * k) % 31);
+ hc[k] = hi[j];
+ }
+ }
+
+ /* Data */
+ if (c1 && c2) {
+ for (k=0; k<1224; k++) {
+ j = 306 * (k % 4) + 3 * (44 * k % 102 + k / 4 % 2) +
+ (k + 2 - k / 408) % 3;
+ dc[k] = di[j];
+ }
+
+ memcpy(c1, &dc[0], 612);
+ memcpy(c2, &dc[612], 612);
+ }
+}
+
+void gsm0503_mcs7_ul_interleave(const ubit_t *hc, const ubit_t *c1,
+ const ubit_t *c2, ubit_t *hi, ubit_t *di)
+{
+ int j, k;
+ ubit_t dc[1224];
+
+ /* Header */
+ for (k=0; k<160; k++) {
+ j = 40 * (k % 4) + 2 * (13 * (k / 8) % 20) + k % 8 / 4;
+ hi[j] = hc[k];
+ }
+
+ memcpy(&dc[0], c1, 612);
+ memcpy(&dc[612], c2, 612);
+
+ /* Data */
+ for (k=0; k<1224; k++) {
+ j = 306 * (k % 4) + 3 * (44 * k % 102 + k / 4 % 2) +
+ (k + 2 - k / 408) % 3;
+ di[j] = dc[k];
+ }
+}
+
+void gsm0503_mcs7_ul_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
+ const sbit_t *hi, const sbit_t *di)
+{
+ int j, k;
+ ubit_t dc[1224];
+
+ /* Header */
+ if (hc) {
+ for (k=0; k<160; k++) {
+ j = 40 * (k % 4) + 2 * (13 * (k / 8) % 20) + k % 8 / 4;
+ hc[k] = hi[j];
+ }
+ }
+
+ /* Data */
+ if (c1 && c2) {
+ for (k=0; k<1224; k++) {
+ j = 306 * (k % 4) + 3 * (44 * k % 102 + k / 4 % 2) +
+ (k + 2 - k / 408) % 3;
+ dc[k] = di[j];
+ }
+
+ memcpy(c1, &dc[0], 612);
+ memcpy(c2, &dc[612], 612);
+ }
+}
+
+void gsm0503_mcs8_ul_interleave(const ubit_t *hc, const ubit_t *c1,
+ const ubit_t *c2, ubit_t *hi, ubit_t *di)
+{
+ int j, k;
+ ubit_t dc[1224];
+
+ /* Header */
+ for (k=0; k<160; k++) {
+ j = 40 * (k % 4) + 2 * (13 * (k / 8) % 20) + k % 8 / 4;
+ hi[j] = hc[k];
+ }
+
+ memcpy(&dc[0], c1, 612);
+ memcpy(&dc[612], c2, 612);
+
+ /* Data */
+ for (k=0; k<1224; k++) {
+ j = 306 * (2 * (k / 612) + (k % 2)) +
+ 3 * (74 * k % 102 + k / 2 % 2) + (k + 2 - k / 204) % 3;
+ di[j] = dc[k];
+ }
+}
+
+void gsm0503_mcs8_ul_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
+ const sbit_t *hi, const sbit_t *di)
+{
+ int j, k;
+ ubit_t dc[1224];
+
+ /* Header */
+ if (hc) {
+ for (k=0; k<160; k++) {
+ j = 40 * (k % 4) + 2 * (13 * (k / 8) % 20) + k % 8 / 4;
+ hc[k] = hi[j];
+ }
+ }
+
+ /* Data */
+ if (c1 && c2) {
+ for (k=0; k<1224; k++) {
+ j = 306 * (2 * (k / 612) + (k % 2)) +
+ 3 * (74 * k % 102 + k / 2 % 2) + (k + 2 - k / 204) % 3;
+ dc[k] = di[j];
+ }
+
+ memcpy(c1, &dc[0], 612);
+ memcpy(c2, &dc[612], 612);
+ }
+}
+
+void gsm0503_mcs8_dl_interleave(const ubit_t *hc, const ubit_t *c1,
+ const ubit_t *c2, ubit_t *hi, ubit_t *di)
+{
+ int j, k;
+ ubit_t dc[1224];
+
+ /* Header */
+ for (k=0; k<124; k++) {
+ j = 31 * (k % 4) + ((17 * k) % 31);
+ hi[j] = hc[k];
+ }
+
+ memcpy(&dc[0], c1, 612);
+ memcpy(&dc[612], c2, 612);
+
+ /* Data */
+ for (k=0; k<1224; k++) {
+ j = 306 * (2 * (k / 612) + (k % 2)) +
+ 3 * (74 * k % 102 + k / 2 % 2) + (k + 2 - k / 204) % 3;
+ di[j] = dc[k];
+ }
+}
+
+void gsm0503_mcs8_dl_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
+ const sbit_t *hi, const sbit_t *di)
+{
+ int j, k;
+ ubit_t dc[1224];
+
+ /* Header */
+ if (hc) {
+ for (k=0; k<124; k++) {
+ j = 31 * (k % 4) + ((17 * k) % 31);
+ hc[k] = hi[j];
+ }
+ }
+
+ /* Data */
+ if (c1 && c2) {
+ for (k=0; k<1224; k++) {
+ j = 306 * (2 * (k / 612) + (k % 2)) +
+ 3 * (74 * k % 102 + k / 2 % 2) + (k + 2 - k / 204) % 3;
+ dc[k] = di[j];
+ }
+
+ memcpy(c1, &dc[0], 612);
+ memcpy(c2, &dc[612], 612);
+ }
+}
+
/*
* GSM TCH FR/EFR/AFS interleaving and burst mapping
*
diff --git a/src/osmo-bts-trx/gsm0503_interleaving.h b/src/osmo-bts-trx/gsm0503_interleaving.h
index 4d546f6a..73767450 100644
--- a/src/osmo-bts-trx/gsm0503_interleaving.h
+++ b/src/osmo-bts-trx/gsm0503_interleaving.h
@@ -1,11 +1,49 @@
#ifndef _0503_INTERLEAVING_H
#define _0503_INTERLEAVING_H
-void gsm0503_xcch_deinterleave(sbit_t *cB, sbit_t *iB);
+void gsm0503_xcch_deinterleave(sbit_t *cB, const sbit_t *iB);
void gsm0503_xcch_interleave(ubit_t *cB, ubit_t *iB);
void gsm0503_tch_fr_deinterleave(sbit_t *cB, sbit_t *iB);
void gsm0503_tch_fr_interleave(ubit_t *cB, ubit_t *iB);
void gsm0503_tch_hr_deinterleave(sbit_t *cB, sbit_t *iB);
void gsm0503_tch_hr_interleave(ubit_t *cB, ubit_t *iB);
+void gsm0503_mcs1_ul_interleave(const ubit_t *hc, const ubit_t *dc, ubit_t *iB);
+void gsm0503_mcs1_ul_deinterleave(sbit_t *hc, sbit_t *dc, const sbit_t *iB);
+
+void gsm0503_mcs1_dl_interleave(const ubit_t *up, const ubit_t *hc,
+ const ubit_t *dc, ubit_t *iB);
+void gsm0503_mcs1_dl_deinterleave(sbit_t *u, sbit_t *hc,
+ sbit_t *dc, const sbit_t *iB);
+
+void gsm0503_mcs5_ul_interleave(const ubit_t *hc, const ubit_t *dc,
+ ubit_t *hi, ubit_t *di);
+void gsm0503_mcs5_ul_deinterleave(sbit_t *hc, sbit_t *dc,
+ const sbit_t *hi, const sbit_t *di);
+
+void gsm0503_mcs5_dl_interleave(const ubit_t *hc, const ubit_t *dc,
+ ubit_t *hi, ubit_t *di);
+void gsm0503_mcs5_dl_deinterleave(sbit_t *hc, sbit_t *dc,
+ const sbit_t *hi, const sbit_t *di);
+
+void gsm0503_mcs7_ul_interleave(const ubit_t *hc, const ubit_t *c1,
+ const ubit_t *c2, ubit_t *hi, ubit_t *di);
+void gsm0503_mcs7_ul_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
+ const sbit_t *hi, const sbit_t *di);
+
+void gsm0503_mcs7_dl_interleave(const ubit_t *hc, const ubit_t *c1,
+ const ubit_t *c2, ubit_t *hi, ubit_t *di);
+void gsm0503_mcs7_dl_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
+ const sbit_t *hi, const sbit_t *di);
+
+void gsm0503_mcs8_ul_interleave(const ubit_t *hc, const ubit_t *c1,
+ const ubit_t *c2, ubit_t *hi, ubit_t *di);
+void gsm0503_mcs8_ul_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
+ const sbit_t *hi, const sbit_t *di);
+
+void gsm0503_mcs8_dl_interleave(const ubit_t *hc, const ubit_t *c1,
+ const ubit_t *c2, ubit_t *hi, ubit_t *di);
+void gsm0503_mcs8_dl_deinterleave(sbit_t *hc, sbit_t *c1, sbit_t *c2,
+ const sbit_t *hi, const sbit_t *di);
+
#endif /* _0503_INTERLEAVING_H */
diff --git a/src/osmo-bts-trx/gsm0503_mapping.c b/src/osmo-bts-trx/gsm0503_mapping.c
index bdaddcef..1937070b 100644
--- a/src/osmo-bts-trx/gsm0503_mapping.c
+++ b/src/osmo-bts-trx/gsm0503_mapping.c
@@ -6,7 +6,8 @@
#include "gsm0503_mapping.h"
-void gsm0503_xcch_burst_unmap(sbit_t *iB, sbit_t *eB, sbit_t *hl, sbit_t *hn)
+void gsm0503_xcch_burst_unmap(sbit_t *iB, const sbit_t *eB,
+ sbit_t *hl, sbit_t *hn)
{
memcpy(iB, eB, 57);
memcpy(iB+57, eB+59, 57);
@@ -70,3 +71,202 @@ void gsm0503_tch_burst_map(ubit_t *iB, ubit_t *eB, const ubit_t *h, int odd)
}
}
+void gsm0503_mcs5_dl_burst_map(const ubit_t *di, ubit_t *eB,
+ const ubit_t *hi, const ubit_t *up, int B)
+{
+ int j;
+ int q[8] = { 0, 0, 0, 0, 0, 0, 0, 0, };
+
+ for (j=0; j<156; j++)
+ eB[j] = di[312*B+j];
+ for (j=156; j<168; j++)
+ eB[j] = hi[25*B+j-156];
+ for (j=168; j<174; j++)
+ eB[j] = up[9*B+j-168];
+ for (j=174; j<176; j++)
+ eB[j] = q[2*B+j-174];
+ for (j=176; j<179; j++)
+ eB[j] = up[9*B+j-170];
+ for (j=179; j<192; j++)
+ eB[j] = hi[25*B+j-167];
+ for (j=192; j<348; j++)
+ eB[j] = di[312*B+j-36];
+}
+
+void gsm0503_mcs5_dl_burst_unmap(sbit_t *di, const sbit_t *eB,
+ sbit_t *hi, sbit_t *up, int B)
+{
+ int j;
+
+ for (j=0; j<156; j++)
+ di[312*B+j] = eB[j];
+ for (j=156; j<168; j++)
+ hi[25*B+j-156] = eB[j];
+ for (j=168; j<174; j++)
+ up[9*B+j-168] = eB[j];
+
+ for (j=176; j<179; j++)
+ up[9*B+j-170] = eB[j];
+ for (j=179; j<192; j++)
+ hi[25*B+j-167] = eB[j];
+ for (j=192; j<348; j++)
+ di[312*B+j-36] = eB[j];
+}
+
+void gsm0503_mcs5_ul_burst_map(const ubit_t *di, ubit_t *eB,
+ const ubit_t *hi, int B)
+{
+ int j;
+
+ for (j=0; j<156; j++)
+ eB[j] = di[312*B+j];
+ for (j=156; j<174; j++)
+ eB[j] = hi[34*B+j-156];
+ for (j=174; j<176; j++)
+ eB[j] = 0;
+ for (j=176; j<192; j++)
+ eB[j] = hi[34*B+j-158];
+ for (j=192; j<348; j++)
+ eB[j] = di[312*B+j-36];
+}
+
+void gsm0503_mcs5_ul_burst_unmap(sbit_t *di, const sbit_t *eB,
+ sbit_t *hi, int B)
+{
+ int j;
+
+ for (j=0; j<156; j++)
+ di[312*B+j] = eB[j];
+ for (j=156; j<174; j++)
+ hi[34*B+j-156] = eB[j];
+ for (j=176; j<192; j++)
+ hi[34*B+j-158] = eB[j];
+ for (j=192; j<348; j++)
+ di[312*B+j-36] = eB[j];
+}
+
+void gsm0503_mcs7_dl_burst_map(const ubit_t *di, ubit_t *eB,
+ const ubit_t *hi, const ubit_t *up, int B)
+{
+ int j;
+ int q[8] = { 1, 1, 1, 0, 0, 1, 1, 1, };
+
+ for (j=0; j<153; j++)
+ eB[j] = di[306*B+j];
+ for (j=153; j<168; j++)
+ eB[j] = hi[31*B+j-153];
+ for (j=168; j<174; j++)
+ eB[j] = up[9*B+j-168];
+ for (j=174; j<176; j++)
+ eB[j] = q[2*B+j-174];
+ for (j=176; j<179; j++)
+ eB[j] = up[9*B+j-170];
+ for (j=179; j<195; j++)
+ eB[j] = hi[31*B+j-164];
+ for (j=195; j<348; j++)
+ eB[j] = di[306*B+j-42];
+}
+
+void gsm0503_mcs7_dl_burst_unmap(sbit_t *di, const sbit_t *eB,
+ sbit_t *hi, sbit_t *up, int B)
+{
+ int j;
+
+ for (j=0; j<153; j++)
+ di[306*B+j] = eB[j];
+ for (j=153; j<168; j++)
+ hi[31*B+j-153] = eB[j];
+ for (j=168; j<174; j++)
+ up[9*B+j-168] = eB[j];
+
+ for (j=176; j<179; j++)
+ up[9*B+j-170] = eB[j];
+ for (j=179; j<195; j++)
+ hi[31*B+j-164] = eB[j];
+ for (j=195; j<348; j++)
+ di[306*B+j-42] = eB[j];
+}
+
+void gsm0503_mcs7_ul_burst_map(const ubit_t *di, ubit_t *eB,
+ const ubit_t *hi, int B)
+{
+ int j;
+ int q[8] = { 1, 1, 1, 0, 0, 1, 1, 1, };
+
+ for (j=0; j<153; j++)
+ eB[j] = di[306*B+j];
+ for (j=153; j<174; j++)
+ eB[j] = hi[40*B+j-153];
+ for (j=174; j<176; j++)
+ eB[j] = q[2*B+j-174];
+ for (j=176; j<195; j++)
+ eB[j] = hi[40*B+j-155];
+ for (j=195; j<348; j++)
+ eB[j] = di[306*B+j-42];
+}
+
+void gsm0503_mcs7_ul_burst_unmap(sbit_t *di, const sbit_t *eB,
+ sbit_t *hi, int B)
+{
+ int j;
+
+ for (j=0; j<153; j++)
+ di[306*B+j] = eB[j];
+ for (j=153; j<174; j++)
+ hi[40*B+j-153] = eB[j];
+
+ for (j=176; j<195; j++)
+ hi[40*B+j-155] = eB[j];
+ for (j=195; j<348; j++)
+ di[306*B+j-42] = eB[j];
+}
+
+void gsm0503_mcs5_burst_swap(sbit_t *eB)
+{
+ sbit_t t[14];
+
+ t[0] = eB[155];
+ t[1] = eB[158];
+ t[2] = eB[161];
+ t[3] = eB[164];
+ t[4] = eB[167];
+ t[5] = eB[170];
+ t[6] = eB[173];
+ t[7] = eB[195];
+ t[8] = eB[196];
+ t[9] = eB[198];
+ t[10] = eB[199];
+ t[11] = eB[201];
+ t[12] = eB[202];
+ t[13] = eB[204];
+
+ eB[155] = eB[142];
+ eB[158] = eB[144];
+ eB[161] = eB[145];
+ eB[164] = eB[147];
+ eB[167] = eB[148];
+ eB[170] = eB[150];
+ eB[173] = eB[151];
+ eB[195] = eB[176];
+ eB[196] = eB[179];
+ eB[198] = eB[182];
+ eB[199] = eB[185];
+ eB[201] = eB[188];
+ eB[202] = eB[191];
+ eB[204] = eB[194];
+
+ eB[142] = t[0];
+ eB[144] = t[1];
+ eB[145] = t[2];
+ eB[147] = t[3];
+ eB[148] = t[4];
+ eB[150] = t[5];
+ eB[151] = t[6];
+ eB[176] = t[7];
+ eB[179] = t[8];
+ eB[182] = t[9];
+ eB[185] = t[10];
+ eB[188] = t[11];
+ eB[191] = t[12];
+ eB[194] = t[13];
+}
diff --git a/src/osmo-bts-trx/gsm0503_mapping.h b/src/osmo-bts-trx/gsm0503_mapping.h
index a693b354..e416c54d 100644
--- a/src/osmo-bts-trx/gsm0503_mapping.h
+++ b/src/osmo-bts-trx/gsm0503_mapping.h
@@ -1,10 +1,31 @@
#ifndef _0503_MAPPING_H
#define _0503_MAPPING_H
-void gsm0503_xcch_burst_unmap(sbit_t *iB, sbit_t *eB, sbit_t *hl, sbit_t *hn);
+void gsm0503_xcch_burst_unmap(sbit_t *iB, const sbit_t *eB,
+ sbit_t *hl, sbit_t *hn);
void gsm0503_xcch_burst_map(ubit_t *iB, ubit_t *eB, const ubit_t *hl,
const ubit_t *hn);
void gsm0503_tch_burst_unmap(sbit_t *iB, sbit_t *eB, sbit_t *h, int odd);
void gsm0503_tch_burst_map(ubit_t *iB, ubit_t *eB, const ubit_t *h, int odd);
+void gsm0503_mcs5_ul_burst_map(const ubit_t *di, ubit_t *eB,
+ const ubit_t *hi, int B);
+void gsm0503_mcs5_ul_burst_unmap(sbit_t *di, const sbit_t *eB,
+ sbit_t *hi, int B);
+void gsm0503_mcs7_ul_burst_map(const ubit_t *di, ubit_t *eB,
+ const ubit_t *hi, int B);
+void gsm0503_mcs7_ul_burst_unmap(sbit_t *di, const sbit_t *eB,
+ sbit_t *hi, int B);
+
+void gsm0503_mcs5_dl_burst_map(const ubit_t *di, ubit_t *eB,
+ const ubit_t *hi, const ubit_t *up, int B);
+void gsm0503_mcs5_dl_burst_unmap(sbit_t *di, const sbit_t *eB,
+ sbit_t *hi, sbit_t *up, int B);
+void gsm0503_mcs7_dl_burst_map(const ubit_t *di, ubit_t *eB,
+ const ubit_t *hi, const ubit_t *up, int B);
+void gsm0503_mcs7_dl_burst_unmap(sbit_t *di, const sbit_t *eB,
+ sbit_t *hi, sbit_t *up, int B);
+
+void gsm0503_mcs5_burst_swap(sbit_t *eB);
+
#endif /* _0503_INTERLEAVING_H */
diff --git a/src/osmo-bts-trx/gsm0503_parity.c b/src/osmo-bts-trx/gsm0503_parity.c
index ba2e144a..65d35621 100644
--- a/src/osmo-bts-trx/gsm0503_parity.c
+++ b/src/osmo-bts-trx/gsm0503_parity.c
@@ -33,6 +33,29 @@ const struct osmo_crc16gen_code gsm0503_cs234_crc16 = {
.remainder = 0xffff,
};
+/*
+ * EDGE MCS header parity
+ *
+ */
+
+const struct osmo_crc8gen_code gsm0503_mcs_crc8_hdr = {
+ .bits = 8,
+ .poly = 0x49,
+ .init = 0x00,
+ .remainder = 0xff,
+};
+
+/*
+ * EDGE MCS data parity
+ *
+ */
+
+const struct osmo_crc16gen_code gsm0503_mcs_crc12 = {
+ .bits = 12,
+ .poly = 0x0d31,
+ .init = 0x0000,
+ .remainder = 0x0fff,
+};
/*
* GSM RACH parity
diff --git a/src/osmo-bts-trx/gsm0503_parity.h b/src/osmo-bts-trx/gsm0503_parity.h
index ee52328b..59d6805e 100644
--- a/src/osmo-bts-trx/gsm0503_parity.h
+++ b/src/osmo-bts-trx/gsm0503_parity.h
@@ -3,6 +3,8 @@
const struct osmo_crc64gen_code gsm0503_fire_crc40;
const struct osmo_crc16gen_code gsm0503_cs234_crc16;
+const struct osmo_crc8gen_code gsm0503_mcs_crc8_hdr;
+const struct osmo_crc16gen_code gsm0503_mcs_crc12;
const struct osmo_crc8gen_code gsm0503_rach_crc6;
const struct osmo_crc16gen_code gsm0503_sch_crc10;
const struct osmo_crc8gen_code gsm0503_tch_fr_crc3;
diff --git a/src/osmo-bts-trx/gsm0503_tables.c b/src/osmo-bts-trx/gsm0503_tables.c
index a3817842..8d5fa0c9 100644
--- a/src/osmo-bts-trx/gsm0503_tables.c
+++ b/src/osmo-bts-trx/gsm0503_tables.c
@@ -12,6 +12,12 @@ const ubit_t gsm0503_pdtch_hl_hn_ubit[4][8] = {
{ 0,0, 0,1, 0,1, 1,0 },
};
+const ubit_t gsm0503_pdtch_edge_hl_hn_ubit[3][8] = {
+ { 0,0, 0,1, 0,1, 1,0 },
+ { 0,0, 0,0, 0,0, 0,0 },
+ { 1,1, 1,0, 0,1, 1,1 },
+};
+
const sbit_t gsm0503_pdtch_hl_hn_sbit[4][8] = {
{ -127,-127, -127,-127, -127,-127, -127,-127 },
{ -127,-127, 127, 127, -127, 127, 127, 127 },
@@ -19,6 +25,12 @@ const sbit_t gsm0503_pdtch_hl_hn_sbit[4][8] = {
{ 127, 127, 127,-127, 127,-127, -127, 127 },
};
+const sbit_t gsm0503_pdtch_edge_hl_hn_sbit[3][8] = {
+ { 127, 127, 127,-127, 127,-127, -127, 127 },
+ { 127, 127, 127, 127, 127, 127, 127, 127 },
+ { -127,-127, -127, 127, 127,-127, -127,-127 },
+};
+
const ubit_t gsm0503_usf2six[8][6] = {
{ 0,0,0, 0,0,0 },
{ 1,0,0, 1,0,1 },
@@ -100,6 +112,1501 @@ const uint8_t gsm0503_puncture_cs3[676] = {
0,0,0,1,0,1, 0,0,0,1,0,1, 0,0,0,0
};
+const uint8_t gsm0503_puncture_mcs1_dl_hdr[108] = {
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,1,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,1,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,1,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,1,1,
+};
+
+const uint8_t gsm0503_puncture_mcs1_ul_hdr[117] = {
+ 0,0,0,0,0,1,0,0,1,0,0,1,
+ 0,0,0,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs1_p1[588] = {
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,0,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs1_p2[588] = {
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,
+};
+
+const uint8_t gsm0503_puncture_mcs2_p1[732] = {
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,0,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,0,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,0,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,0,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,0,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,0,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0, 0,0,1,1,1,0,
+ 0,0,1,1,1,0, 0,0,1,1,1,0,
+};
+
+const uint8_t gsm0503_puncture_mcs2_p2[732] = {
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 0,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 0,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 0,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 0,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 0,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 0,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1, 1,1,0,0,0,1,
+ 1,1,0,0,0,1, 1,1,0,0,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs3_p1[948] = {
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,
+ 0,0,1,0,1,1,0,1,1,1,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs3_p2[948] = {
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,
+};
+
+const uint8_t gsm0503_puncture_mcs3_p3[948] = {
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,
+};
+
+const uint8_t gsm0503_puncture_mcs4_p1[1116] = {
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1,
+};
+
+const uint8_t gsm0503_puncture_mcs4_p2[1116] = {
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs4_p3[1116] = {
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0,
+};
+
+const uint8_t gsm0503_puncture_mcs5_p1[1404] = {
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0, 0,0,1,0,0,1,0,0,1, 0,0,1,0,0,1,0,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs5_p2[1404] = {
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0, 0,1,0,0,1,0,0,1,0, 0,1,0,0,1,0,0,1,0,
+};
+
+const uint8_t gsm0503_puncture_mcs6_p1[1836] = {
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,0, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1,
+ 0,0,1, 0,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs6_p2[1836] = {
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,0,0,
+ 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,1,0,
+ 0,1,0, 0,1,0,
+};
+
+const uint8_t gsm0503_puncture_mcs7_dl_hdr[135] = {
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,
+};
+
+const uint8_t gsm0503_puncture_mcs7_ul_hdr[162] = {
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,
+};
+
+const uint8_t gsm0503_puncture_mcs7_p1[1404] = {
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+ 0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,
+};
+
+const uint8_t gsm0503_puncture_mcs7_p2[1404] = {
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+ 1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,0,
+};
+
+const uint8_t gsm0503_puncture_mcs7_p3[1404] = {
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+ 1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs8_p1[1692] = {
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+ 0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,
+};
+
+const uint8_t gsm0503_puncture_mcs8_p2[1692] = {
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,0,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,
+};
+
+const uint8_t gsm0503_puncture_mcs8_p3[1692] = {
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,0,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+ 1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,1,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs9_p1[1836] = {
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+ 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1, 0,1,1,
+};
+
+const uint8_t gsm0503_puncture_mcs9_p2[1836] = {
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+ 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1, 1,0,1,
+};
+
+const uint8_t gsm0503_puncture_mcs9_p3[1836] = {
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+ 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0, 1,1,0,
+};
+
+const uint16_t gsm0503_interleave_mcs5[1248] = {
+ 0, 463, 890, 1038, 220, 371, 795, 946, 582, 733, 1160, 63, 490, 641, 277, 428,
+ 852, 1003, 185, 333, 1223, 120, 547, 698, 1122, 28, 915, 1066, 242, 390, 817, 968,
+ 610, 761, 1185, 85, 512, 660, 305, 453, 880, 1031, 204, 355, 782, 1242, 148, 575,
+ 723, 1150, 50, 474, 625, 1088, 267, 418, 845, 993, 169, 320, 1207, 113, 537, 688,
+ 1115, 12, 902, 1050, 232, 383, 807, 958, 594, 745, 1172, 75, 502, 653, 289, 440,
+ 864, 1015, 197, 345, 1235, 132, 559, 710, 1134, 40, 927, 1078, 254, 402, 829, 980,
+ 159, 622, 773, 1197, 97, 524, 672, 1099, 5, 465, 892, 1043, 216, 367, 794, 942,
+ 587, 735, 1162, 62, 486, 637, 279, 430, 857, 1005, 181, 332, 1219, 125, 549, 700,
+ 1127, 24, 914, 1062, 244, 395, 819, 970, 606, 757, 1184, 87, 514, 665, 301, 452,
+ 876, 1027, 209, 357, 784, 1247, 144, 571, 722, 1146, 52, 479, 627, 1090, 266, 414,
+ 841, 992, 171, 322, 1209, 109, 536, 684, 1111, 17, 904, 1055, 228, 379, 806, 954,
+ 599, 747, 1174, 74, 498, 649, 291, 442, 869, 1017, 193, 344, 1231, 137, 561, 712,
+ 1139, 36, 926, 1074, 256, 407, 831, 982, 158, 618, 769, 1196, 99, 526, 677, 1101,
+ 7, 458, 894, 1033, 227, 363, 802, 941, 577, 740, 1152, 70, 485, 645, 284, 420,
+ 859, 998, 189, 328, 1215, 127, 542, 702, 1117, 35, 922, 1061, 246, 385, 824, 960,
+ 605, 765, 1180, 92, 504, 667, 309, 448, 887, 1023, 211, 350, 786, 1237, 155, 567,
+ 730, 1145, 54, 469, 632, 1080, 274, 413, 849, 988, 176, 312, 1202, 117, 532, 695,
+ 1107, 19, 906, 1045, 239, 375, 814, 953, 589, 752, 1164, 82, 497, 657, 296, 432,
+ 871, 1010, 201, 340, 1227, 139, 554, 714, 1129, 47, 934, 1073, 258, 397, 836, 972,
+ 166, 617, 777, 1192, 104, 516, 679, 1094, 9, 460, 899, 1035, 223, 362, 798, 937,
+ 579, 742, 1157, 66, 481, 644, 286, 425, 861, 1000, 188, 324, 1214, 129, 544, 707,
+ 1119, 31, 918, 1057, 251, 387, 826, 965, 601, 764, 1176, 94, 509, 669, 308, 444,
+ 883, 1022, 213, 352, 791, 1239, 151, 566, 726, 1141, 59, 471, 634, 1085, 270, 409,
+ 848, 984, 178, 317, 1204, 116, 528, 691, 1106, 21, 911, 1047, 235, 374, 810, 949,
+ 591, 754, 1169, 78, 493, 656, 298, 437, 873, 1012, 200, 336, 1226, 141, 556, 719,
+ 1131, 43, 930, 1069, 263, 399, 838, 977, 162, 613, 776, 1188, 106, 521, 681, 1096,
+ 2, 462, 889, 1040, 219, 370, 797, 945, 584, 732, 1159, 65, 489, 640, 276, 427,
+ 854, 1002, 184, 335, 1222, 122, 546, 697, 1124, 27, 917, 1065, 241, 392, 816, 967,
+ 609, 760, 1187, 84, 511, 662, 304, 455, 879, 1030, 206, 354, 781, 1244, 147, 574,
+ 725, 1149, 49, 476, 624, 1087, 269, 417, 844, 995, 168, 319, 1206, 112, 539, 687,
+ 1114, 14, 901, 1052, 231, 382, 809, 957, 596, 744, 1171, 77, 501, 652, 288, 439,
+ 866, 1014, 196, 347, 1234, 134, 558, 709, 1136, 39, 929, 1077, 253, 404, 828, 979,
+ 161, 621, 772, 1199, 96, 523, 674, 1098, 4, 467, 891, 1042, 218, 366, 793, 944,
+ 586, 737, 1161, 61, 488, 636, 281, 429, 856, 1007, 180, 331, 1218, 124, 551, 699,
+ 1126, 26, 913, 1064, 243, 394, 821, 969, 608, 756, 1183, 89, 513, 664, 300, 451,
+ 878, 1026, 208, 359, 783, 1246, 146, 570, 721, 1148, 51, 478, 629, 1089, 265, 416,
+ 840, 991, 173, 321, 1211, 108, 535, 686, 1110, 16, 903, 1054, 230, 378, 805, 956,
+ 598, 749, 1173, 73, 500, 648, 293, 441, 868, 1019, 192, 343, 1230, 136, 563, 711,
+ 1138, 38, 925, 1076, 255, 406, 833, 981, 157, 620, 768, 1195, 101, 525, 676, 1103,
+ 6, 457, 896, 1032, 226, 365, 801, 940, 576, 739, 1154, 69, 484, 647, 283, 422,
+ 858, 997, 191, 327, 1217, 126, 541, 704, 1116, 34, 921, 1060, 248, 384, 823, 962,
+ 604, 767, 1179, 91, 506, 666, 311, 447, 886, 1025, 210, 349, 788, 1236, 154, 569,
+ 729, 1144, 56, 468, 631, 1082, 273, 412, 851, 987, 175, 314, 1201, 119, 531, 694,
+ 1109, 18, 908, 1044, 238, 377, 813, 952, 588, 751, 1166, 81, 496, 659, 295, 434,
+ 870, 1009, 203, 339, 1229, 138, 553, 716, 1128, 46, 933, 1072, 260, 396, 835, 974,
+ 165, 616, 779, 1191, 103, 518, 678, 1093, 11, 459, 898, 1037, 222, 361, 800, 936,
+ 581, 741, 1156, 68, 480, 643, 285, 424, 863, 999, 187, 326, 1213, 131, 543, 706,
+ 1121, 30, 920, 1056, 250, 389, 825, 964, 600, 763, 1178, 93, 508, 671, 307, 446,
+ 882, 1021, 215, 351, 790, 1241, 150, 565, 728, 1140, 58, 473, 633, 1084, 272, 408,
+ 847, 986, 177, 316, 1203, 115, 530, 690, 1105, 23, 910, 1049, 234, 373, 812, 948,
+ 593, 753, 1168, 80, 492, 655, 297, 436, 875, 1011, 199, 338, 1225, 143, 555, 718,
+ 1133, 42, 932, 1068, 262, 401, 837, 976, 164, 612, 775, 1190, 105, 520, 683, 1095,
+ 1, 464, 888, 1039, 221, 369, 796, 947, 583, 734, 1158, 64, 491, 639, 278, 426,
+ 853, 1004, 183, 334, 1221, 121, 548, 696, 1123, 29, 916, 1067, 240, 391, 818, 966,
+ 611, 759, 1186, 86, 510, 661, 303, 454, 881, 1029, 205, 356, 780, 1243, 149, 573,
+ 724, 1151, 48, 475, 626, 1086, 268, 419, 843, 994, 170, 318, 1208, 111, 538, 689,
+ 1113, 13, 900, 1051, 233, 381, 808, 959, 595, 746, 1170, 76, 503, 651, 290, 438,
+ 865, 1016, 195, 346, 1233, 133, 560, 708, 1135, 41, 928, 1079, 252, 403, 830, 978,
+ 160, 623, 771, 1198, 98, 522, 673, 1100, 3, 466, 893, 1041, 217, 368, 792, 943,
+ 585, 736, 1163, 60, 487, 638, 280, 431, 855, 1006, 182, 330, 1220, 123, 550, 701,
+ 1125, 25, 912, 1063, 245, 393, 820, 971, 607, 758, 1182, 88, 515, 663, 302, 450,
+ 877, 1028, 207, 358, 785, 1245, 145, 572, 720, 1147, 53, 477, 628, 1091, 264, 415,
+ 842, 990, 172, 323, 1210, 110, 534, 685, 1112, 15, 905, 1053, 229, 380, 804, 955,
+ 597, 748, 1175, 72, 499, 650, 292, 443, 867, 1018, 194, 342, 1232, 135, 562, 713,
+ 1137, 37, 924, 1075, 257, 405, 832, 983, 156, 619, 770, 1194, 100, 527, 675, 1102,
+ 8, 456, 895, 1034, 225, 364, 803, 939, 578, 738, 1153, 71, 483, 646, 282, 421,
+ 860, 996, 190, 329, 1216, 128, 540, 703, 1118, 33, 923, 1059, 247, 386, 822, 961,
+ 603, 766, 1181, 90, 505, 668, 310, 449, 885, 1024, 212, 348, 787, 1238, 153, 568,
+ 731, 1143, 55, 470, 630, 1081, 275, 411, 850, 989, 174, 313, 1200, 118, 533, 693,
+ 1108, 20, 907, 1046, 237, 376, 815, 951, 590, 750, 1165, 83, 495, 658, 294, 433,
+ 872, 1008, 202, 341, 1228, 140, 552, 715, 1130, 45, 935, 1071, 259, 398, 834, 973,
+ 167, 615, 778, 1193, 102, 517, 680, 1092, 10, 461, 897, 1036, 224, 360, 799, 938,
+ 580, 743, 1155, 67, 482, 642, 287, 423, 862, 1001, 186, 325, 1212, 130, 545, 705,
+ 1120, 32, 919, 1058, 249, 388, 827, 963, 602, 762, 1177, 95, 507, 670, 306, 445,
+ 884, 1020, 214, 353, 789, 1240, 152, 564, 727, 1142, 57, 472, 635, 1083, 271, 410,
+ 846, 985, 179, 315, 1205, 114, 529, 692, 1104, 22, 909, 1048, 236, 372, 811, 950,
+ 592, 755, 1167, 79, 494, 654, 299, 435, 874, 1013, 198, 337, 1224, 142, 557, 717,
+ 1132, 44, 931, 1070, 261, 400, 839, 975, 163, 614, 774, 1189, 107, 519, 682, 1097,
+};
+
/* this corresponds to the bit-lengths of the individual codec
* parameters as indicated in Table 1.1 of TS 06.10 */
const uint8_t gsm0503_gsm_fr_map[76] = {
@@ -191,3 +1698,16 @@ const uint8_t gsm0503_tch_hr_interleaving[228][2] = {
{ 28 ,1 }, { 29 ,3 }, { 94 ,0 }, { 95 ,2 }, { 4 ,1 }, { 5 ,3 },
};
+/*
+ * 3GPP TS 05.03 5.1.9.1.2 "USF precoding"
+ */
+const ubit_t gsm0503_mcs5_usf_precode_table[8][36] = {
+ { 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, },
+ { 1,1,1,1,1,0,0,0,0, 1,1,1,1,0,0,0,0,0, 1,1,1,1,1,1,0,0,0, 1,1,1,1,1,0,0,0,1, },
+ { 1,1,1,0,0,1,1,1,0, 1,1,1,0,1,1,1,0,0, 1,1,0,0,0,0,1,1,0, 1,1,0,0,0,1,1,0,0, },
+ { 1,0,0,1,1,1,1,0,0, 1,1,0,0,0,0,0,1,1, 1,0,1,1,1,0,1,1,1, 0,0,1,0,0,1,1,1,1, },
+ { 0,0,0,1,1,0,0,1,1, 0,0,1,0,1,1,0,1,0, 1,0,0,0,0,1,1,0,1, 1,1,1,1,1,1,1,1,0, },
+ { 1,1,0,1,0,1,0,1,1, 0,0,0,1,1,0,1,0,1, 0,1,1,1,0,1,0,1,1, 1,0,0,1,0,1,0,1,1, },
+ { 0,0,1,0,0,1,1,0,1, 1,0,1,1,1,1,1,1,1, 0,1,1,0,1,0,0,0,1, 0,0,1,1,1,0,1,0,0, },
+ { 0,1,1,0,1,0,1,1,1, 0,1,0,1,0,1,1,1,1, 0,0,0,1,1,1,1,1,0, 0,1,0,0,1,0,0,1,1, },
+};
diff --git a/src/osmo-bts-trx/gsm0503_tables.h b/src/osmo-bts-trx/gsm0503_tables.h
index 63b45a4d..2b0e7745 100644
--- a/src/osmo-bts-trx/gsm0503_tables.h
+++ b/src/osmo-bts-trx/gsm0503_tables.h
@@ -2,12 +2,42 @@
#define _0503_TABLES_H
extern const ubit_t gsm0503_pdtch_hl_hn_ubit[4][8];
+extern const ubit_t gsm0503_pdtch_edge_hl_hn_ubit[3][8];
extern const sbit_t gsm0503_pdtch_hl_hn_sbit[4][8];
+extern const sbit_t gsm0503_pdtch_edge_hl_hn_sbit[3][8];
extern const ubit_t gsm0503_usf2six[8][6];
extern const ubit_t gsm0503_usf2twelve_ubit[8][12];
extern const sbit_t gsm0503_usf2twelve_sbit[8][12];
extern const uint8_t gsm0503_puncture_cs2[588];
extern const uint8_t gsm0503_puncture_cs3[676];
+extern const uint8_t gsm0503_puncture_mcs1_dl_hdr[108];
+extern const uint8_t gsm0503_puncture_mcs1_ul_hdr[117];
+extern const uint8_t gsm0503_puncture_mcs1_p1[588];
+extern const uint8_t gsm0503_puncture_mcs1_p2[588];
+extern const uint8_t gsm0503_puncture_mcs2_p1[732];
+extern const uint8_t gsm0503_puncture_mcs2_p2[732];
+extern const uint8_t gsm0503_puncture_mcs3_p1[948];
+extern const uint8_t gsm0503_puncture_mcs3_p2[948];
+extern const uint8_t gsm0503_puncture_mcs3_p3[948];
+extern const uint8_t gsm0503_puncture_mcs4_p1[1116];
+extern const uint8_t gsm0503_puncture_mcs4_p2[1116];
+extern const uint8_t gsm0503_puncture_mcs4_p3[1116];
+extern const uint8_t gsm0503_puncture_mcs5_p1[1404];
+extern const uint8_t gsm0503_puncture_mcs5_p2[1404];
+extern const uint8_t gsm0503_puncture_mcs6_p1[1836];
+extern const uint8_t gsm0503_puncture_mcs6_p2[1836];
+extern const uint8_t gsm0503_puncture_mcs7_dl_hdr[135];
+extern const uint8_t gsm0503_puncture_mcs7_ul_hdr[162];
+extern const uint8_t gsm0503_puncture_mcs7_p1[1404];
+extern const uint8_t gsm0503_puncture_mcs7_p2[1404];
+extern const uint8_t gsm0503_puncture_mcs7_p3[1404];
+extern const uint8_t gsm0503_puncture_mcs8_p1[1692];
+extern const uint8_t gsm0503_puncture_mcs8_p2[1692];
+extern const uint8_t gsm0503_puncture_mcs8_p3[1692];
+extern const uint8_t gsm0503_puncture_mcs9_p1[1836];
+extern const uint8_t gsm0503_puncture_mcs9_p2[1836];
+extern const uint8_t gsm0503_puncture_mcs9_p3[1836];
+extern const uint16_t gsm0503_interleave_mcs5[1248];
extern const uint8_t gsm0503_gsm_fr_map[76];
extern const uint8_t gsm0503_gsm_efr_protected_bits[65];
extern const ubit_t gsm0503_afs_ic_ubit[4][8];
@@ -15,5 +45,6 @@ extern const sbit_t gsm0503_afs_ic_sbit[4][8];
extern const ubit_t gsm0503_ahs_ic_ubit[4][4];
extern const sbit_t gsm0503_ahs_ic_sbit[4][4];
extern const uint8_t gsm0503_tch_hr_interleaving[228][2];
+extern const ubit_t gsm0503_mcs5_usf_precode_table[8][36];
#endif /* _0503_TABLES_H */