aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2019-01-17 12:25:49 +0100
committerKostya Shishkov <kostya.shishkov@gmail.com>2019-01-17 12:25:49 +0100
commit5641dccfbf2a70d589cf094a0d4ed5a10f919f00 (patch)
treeab444f3e91b46723187546b1b2820924fb332513 /src
parentb74ff9fac35d41737d71d97227fad233aa4a4b49 (diff)
downloadnihav-5641dccfbf2a70d589cf094a0d4ed5a10f919f00.tar.gz
split NihAV into subcrates
Diffstat (limited to 'src')
-rw-r--r--src/TODO15
-rw-r--r--src/codecs/aac.rs1768
-rw-r--r--src/codecs/atrac3.rs765
-rw-r--r--src/codecs/blockdsp.rs185
-rw-r--r--src/codecs/clearvideo.rs2570
-rw-r--r--src/codecs/gremlinvideo.rs566
-rw-r--r--src/codecs/h263/code.rs497
-rw-r--r--src/codecs/h263/data.rs214
-rw-r--r--src/codecs/h263/decoder.rs581
-rw-r--r--src/codecs/h263/intel263.rs420
-rw-r--r--src/codecs/h263/mod.rs396
-rw-r--r--src/codecs/h263/rv10.rs620
-rw-r--r--src/codecs/h263/rv20.rs529
-rw-r--r--src/codecs/indeo/imc.rs1121
-rw-r--r--src/codecs/indeo/indeo2.rs375
-rw-r--r--src/codecs/indeo/indeo3.rs1460
-rw-r--r--src/codecs/indeo/indeo4.rs773
-rw-r--r--src/codecs/indeo/indeo5.rs727
-rw-r--r--src/codecs/indeo/ivi.rs287
-rw-r--r--src/codecs/indeo/ivibr.rs1292
-rw-r--r--src/codecs/indeo/ividsp.rs467
-rw-r--r--src/codecs/indeo/mod.rs18
-rw-r--r--src/codecs/mod.rs324
-rw-r--r--src/codecs/pcm.rs65
-rw-r--r--src/codecs/real/cook.rs1125
-rw-r--r--src/codecs/real/mod.rs31
-rw-r--r--src/codecs/real/ra144.rs2305
-rw-r--r--src/codecs/real/ra288.rs330
-rw-r--r--src/codecs/real/ralf.rs10377
-rw-r--r--src/codecs/real/rv30.rs307
-rw-r--r--src/codecs/real/rv3040.rs1279
-rw-r--r--src/codecs/real/rv30dsp.rs435
-rw-r--r--src/codecs/real/rv34codes.rs4284
-rw-r--r--src/codecs/real/rv34dsp.rs564
-rw-r--r--src/codecs/real/rv40.rs1062
-rw-r--r--src/codecs/real/rv40dsp.rs875
-rw-r--r--src/codecs/real/rv60.rs1490
-rw-r--r--src/codecs/real/rv60codes.rs1437
-rw-r--r--src/codecs/real/rv60dsp.rs928
-rw-r--r--src/codecs/sipro.rs1584
-rw-r--r--src/codecs/ts102366.rs1534
-rw-r--r--src/demuxers/avi.rs421
-rw-r--r--src/demuxers/gdv.rs196
-rw-r--r--src/demuxers/mod.rs242
-rw-r--r--src/demuxers/realmedia.rs1675
-rw-r--r--src/detect.rs268
-rw-r--r--src/dsp/fft.rs475
-rw-r--r--src/dsp/mdct.rs57
-rw-r--r--src/dsp/mod.rs6
-rw-r--r--src/dsp/window.rs52
-rw-r--r--src/formats.rs511
-rw-r--r--src/frame.rs688
-rw-r--r--src/io/bitreader.rs250
-rw-r--r--src/io/byteio.rs634
-rw-r--r--src/io/codebook.rs415
-rw-r--r--src/io/intcode.rs145
-rw-r--r--src/io/mod.rs5
-rw-r--r--src/lib.rs17
-rw-r--r--src/register.rs196
-rw-r--r--src/test/dec_video.rs212
-rw-r--r--src/test/mod.rs2
-rw-r--r--src/test/wavwriter.rs115
62 files changed, 0 insertions, 52564 deletions
diff --git a/src/TODO b/src/TODO
deleted file mode 100644
index 6abbf2b..0000000
--- a/src/TODO
+++ /dev/null
@@ -1,15 +0,0 @@
- Design:
-better interface for registered demuxers/codecs
-paletted formats support
-MDCT
-
- Formats:
-Smacker
-Bink
-
- Demuxers:
-seeking - maybe with more generic interface too
-index reading
-
- Misc:
-indeo3: requantisation, better data end check
diff --git a/src/codecs/aac.rs b/src/codecs/aac.rs
deleted file mode 100644
index 23d6689..0000000
--- a/src/codecs/aac.rs
+++ /dev/null
@@ -1,1768 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use crate::codecs::*;
-use crate::dsp::fft::FFTMode;
-use crate::dsp::mdct::IMDCT;
-use crate::dsp::window::*;
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use std::fmt;
-use crate::io::intcode::*;
-use std::mem;
-use std::ptr;
-use std::str::FromStr;
-use std::f32::consts;
-
-#[allow(non_camel_case_types)]
-#[derive(Clone,Copy,PartialEq)]
-enum M4AType {
- None,
- Main,
- LC,
- SSR,
- LTP,
- SBR,
- Scalable,
- TwinVQ,
- CELP,
- HVXC,
- TTSI,
- MainSynth,
- WavetableSynth,
- GeneralMIDI,
- Algorithmic,
- ER_AAC_LC,
- ER_AAC_LTP,
- ER_AAC_Scalable,
- ER_TwinVQ,
- ER_BSAC,
- ER_AAC_LD,
- ER_CELP,
- ER_HVXC,
- ER_HILN,
- ER_Parametric,
- SSC,
- PS,
- MPEGSurround,
- Layer1,
- Layer2,
- Layer3,
- DST,
- ALS,
- SLS,
- SLSNonCore,
- ER_AAC_ELD,
- SMRSimple,
- SMRMain,
- Reserved,
- Unknown,
-}
-
-const M4A_TYPES: &[M4AType] = &[
- M4AType::None, M4AType::Main, M4AType::LC, M4AType::SSR,
- M4AType::LTP, M4AType::SBR, M4AType::Scalable, M4AType::TwinVQ,
- M4AType::CELP, M4AType::HVXC, M4AType::Reserved, M4AType::Reserved,
- M4AType::TTSI, M4AType::MainSynth, M4AType::WavetableSynth, M4AType::GeneralMIDI,
- M4AType::Algorithmic, M4AType::ER_AAC_LC, M4AType::Reserved, M4AType::ER_AAC_LTP,
- M4AType::ER_AAC_Scalable, M4AType::ER_TwinVQ, M4AType::ER_BSAC, M4AType::ER_AAC_LD,
- M4AType::ER_CELP, M4AType::ER_HVXC, M4AType::ER_HILN, M4AType::ER_Parametric,
- M4AType::SSC, M4AType::PS, M4AType::MPEGSurround, M4AType::Reserved /*escape*/,
- M4AType::Layer1, M4AType::Layer2, M4AType::Layer3, M4AType::DST,
- M4AType::ALS, M4AType::SLS, M4AType::SLSNonCore, M4AType::ER_AAC_ELD,
- M4AType::SMRSimple, M4AType::SMRMain,
-];
-const M4A_TYPE_NAMES: &[&str] = &[
- "None", "AAC Main", "AAC LC", "AAC SSR", "AAC LTP", "SBR", "AAC Scalable", "TwinVQ", "CELP", "HVXC",
- /*"(reserved10)", "(reserved11)", */ "TTSI",
- "Main synthetic", "Wavetable synthesis", "General MIDI", "Algorithmic Synthesis and Audio FX",
- "ER AAC LC", /*"(reserved18)",*/ "ER AAC LTP", "ER AAC Scalable", "ER TwinVQ", "ER BSAC", "ER AAC LD",
- "ER CELP", "ER HVXC", "ER HILN", "ER Parametric", "SSC", "PS", "MPEG Surround", /*"(escape)",*/
- "Layer-1", "Layer-2", "Layer-3", "DST", "ALS", "SLS", "SLS non-core", "ER AAC ELD", "SMR Simple", "SMR Main",
- "(reserved)", "(unknown)",
-];
-
-impl fmt::Display for M4AType {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{}", M4A_TYPE_NAMES[*self as usize])
- }
-}
-
-const AAC_SAMPLE_RATES: [u32; 16] = [
- 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
- 16000, 12000, 11025, 8000, 7350, 0, 0, 0
-];
-
-const AAC_CHANNELS: [usize; 8] = [ 0, 1, 2, 3, 4, 5, 6, 8 ];
-
-struct M4AInfo {
- otype: M4AType,
- srate: u32,
- channels: usize,
- samples: usize,
- sbr_ps_info: Option<(u32, usize)>,
- sbr_present: bool,
- ps_present: bool,
-}
-
-impl M4AInfo {
- fn new() -> Self {
- Self {
- otype: M4AType::None,
- srate: 0,
- channels: 0,
- samples: 0,
- sbr_ps_info: Option::None,
- sbr_present: false,
- ps_present: false,
- }
- }
- fn read_object_type(br: &mut BitReader) -> DecoderResult<M4AType> {
- let otypeidx;
- if br.peek(5) == 31 {
- br.skip(5)?;
- otypeidx = (br.read(6)? as usize) + 32;
- } else {
- otypeidx = br.read(5)? as usize;
- }
- if otypeidx >= M4A_TYPES.len() {
- Ok(M4AType::Unknown)
- } else {
- Ok(M4A_TYPES[otypeidx])
- }
- }
- fn read_sampling_frequency(br: &mut BitReader) -> DecoderResult<u32> {
- if br.peek(4) == 15 {
- let srate = br.read(24)?;
- Ok(srate)
- } else {
- let srate_idx = br.read(4)? as usize;
- Ok(AAC_SAMPLE_RATES[srate_idx])
- }
- }
- fn read_channel_config(br: &mut BitReader) -> DecoderResult<usize> {
- let chidx = br.read(4)? as usize;
- if chidx < AAC_CHANNELS.len() {
- Ok(AAC_CHANNELS[chidx])
- } else {
- Ok(chidx)
- }
- }
- fn read(&mut self, src: &[u8]) -> DecoderResult<()> {
- let mut br = BitReader::new(src, src.len(), BitReaderMode::BE);
- self.otype = Self::read_object_type(&mut br)?;
- self.srate = Self::read_sampling_frequency(&mut br)?;
- validate!(self.srate > 0);
- self.channels = Self::read_channel_config(&mut br)?;
-
- if (self.otype == M4AType::SBR) || (self.otype == M4AType::PS) {
- let ext_srate = Self::read_sampling_frequency(&mut br)?;
- self.otype = Self::read_object_type(&mut br)?;
- let ext_chans;
- if self.otype == M4AType::ER_BSAC {
- ext_chans = Self::read_channel_config(&mut br)?;
- } else {
- ext_chans = 0;
- }
- self.sbr_ps_info = Some((ext_srate, ext_chans));
- }
-
- match self.otype {
- M4AType::Main | M4AType::LC | M4AType::SSR | M4AType::Scalable | M4AType::TwinVQ |
- M4AType::ER_AAC_LC | M4AType::ER_AAC_LTP | M4AType::ER_AAC_Scalable | M4AType::ER_TwinVQ |
- M4AType::ER_BSAC | M4AType::ER_AAC_LD => {
- // GASpecificConfig
- let short_frame = br.read_bool()?;
- self.samples = if short_frame { 960 } else { 1024 };
- let depends_on_core = br.read_bool()?;
- if depends_on_core {
- let _delay = br.read(14)?;
- }
- let extension_flag = br.read_bool()?;
- if self.channels == 0 {
- unimplemented!("program config element");
- }
- if (self.otype == M4AType::Scalable) || (self.otype == M4AType::ER_AAC_Scalable) {
- let _layer = br.read(3)?;
- }
- if extension_flag {
- if self.otype == M4AType::ER_BSAC {
- let _num_subframes = br.read(5)? as usize;
- let _layer_length = br.read(11)?;
- }
- if (self.otype == M4AType::ER_AAC_LC) ||
- (self.otype == M4AType::ER_AAC_LTP) ||
- (self.otype == M4AType::ER_AAC_Scalable) ||
- (self.otype == M4AType::ER_AAC_LD) {
- let _section_data_resilience = br.read_bool()?;
- let _scalefactors_resilience = br.read_bool()?;
- let _spectral_data_resilience = br.read_bool()?;
- }
- let extension_flag3 = br.read_bool()?;
- if extension_flag3 {
- unimplemented!("version3 extensions");
- }
- }
- },
- M4AType::CELP => { unimplemented!("CELP config"); },
- M4AType::HVXC => { unimplemented!("HVXC config"); },
- M4AType::TTSI => { unimplemented!("TTS config"); },
- M4AType::MainSynth | M4AType::WavetableSynth | M4AType::GeneralMIDI | M4AType::Algorithmic => { unimplemented!("structured audio config"); },
- M4AType::ER_CELP => { unimplemented!("ER CELP config"); },
- M4AType::ER_HVXC => { unimplemented!("ER HVXC config"); },
- M4AType::ER_HILN | M4AType::ER_Parametric => { unimplemented!("parametric config"); },
- M4AType::SSC => { unimplemented!("SSC config"); },
- M4AType::MPEGSurround => {
- br.skip(1)?; // sacPayloadEmbedding
- unimplemented!("MPEG Surround config");
- },
- M4AType::Layer1 | M4AType::Layer2 | M4AType::Layer3 => { unimplemented!("MPEG Layer 1/2/3 config"); },
- M4AType::DST => { unimplemented!("DST config"); },
- M4AType::ALS => {
- br.skip(5)?; // fillBits
- unimplemented!("ALS config");
- },
- M4AType::SLS | M4AType::SLSNonCore => { unimplemented!("SLS config"); },
- M4AType::ER_AAC_ELD => { unimplemented!("ELD config"); },
- M4AType::SMRSimple | M4AType::SMRMain => { unimplemented!("symbolic music config"); },
- _ => {},
- };
- match self.otype {
- M4AType::ER_AAC_LC | M4AType::ER_AAC_LTP | M4AType::ER_AAC_Scalable | M4AType::ER_TwinVQ |
- M4AType::ER_BSAC | M4AType::ER_AAC_LD | M4AType::ER_CELP | M4AType::ER_HVXC |
- M4AType::ER_HILN | M4AType::ER_Parametric | M4AType::ER_AAC_ELD => {
- let ep_config = br.read(2)?;
- if (ep_config == 2) || (ep_config == 3) {
- unimplemented!("error protection config");
- }
- if ep_config == 3 {
- let direct_mapping = br.read_bool()?;
- validate!(direct_mapping);
- }
- },
- _ => {},
- };
- if self.sbr_ps_info.is_some() && (br.left() >= 16) {
- let sync = br.read(11)?;
- if sync == 0x2B7 {
- let ext_otype = Self::read_object_type(&mut br)?;
- if ext_otype == M4AType::SBR {
- self.sbr_present = br.read_bool()?;
- if self.sbr_present {
- let _ext_srate = Self::read_sampling_frequency(&mut br)?;
- if br.left() >= 12 {
- let sync = br.read(11)?;
- if sync == 0x548 {
- self.ps_present = br.read_bool()?;
- }
- }
- }
- }
- if ext_otype == M4AType::PS {
- self.sbr_present = br.read_bool()?;
- if self.sbr_present {
- let _ext_srate = Self::read_sampling_frequency(&mut br)?;
- }
- let _ext_channels = br.read(4)?;
- }
- }
- }
-
- Ok(())
- }
-}
-
-impl fmt::Display for M4AInfo {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "MPEG 4 Audio {}, {} Hz, {} channels, {} samples per frame",
- self.otype, self.srate, self.channels, self.samples)
- }
-}
-
-const MAX_WINDOWS: usize = 8;
-const MAX_SFBS: usize = 64;
-
-#[derive(Clone,Copy)]
-struct ICSInfo {
- window_sequence: u8,
- prev_window_sequence: u8,
- window_shape: bool,
- prev_window_shape: bool,
- scale_factor_grouping: [bool; MAX_WINDOWS],
- group_start: [usize; MAX_WINDOWS],
- window_groups: usize,
- num_windows: usize,
- max_sfb: usize,
- predictor_data: Option<LTPData>,
- long_win: bool,
-}
-
-const ONLY_LONG_SEQUENCE: u8 = 0;
-const LONG_START_SEQUENCE: u8 = 1;
-const EIGHT_SHORT_SEQUENCE: u8 = 2;
-const LONG_STOP_SEQUENCE: u8 = 3;
-
-impl ICSInfo {
- fn new() -> Self {
- Self {
- window_sequence: 0,
- prev_window_sequence: 0,
- window_shape: false,
- prev_window_shape: false,
- scale_factor_grouping: [false; MAX_WINDOWS],
- group_start: [0; MAX_WINDOWS],
- num_windows: 0,
- window_groups: 0,
- max_sfb: 0,
- predictor_data: None,
- long_win: true,
- }
- }
- fn decode_ics_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- self.prev_window_sequence = self.window_sequence;
- self.prev_window_shape = self.window_shape;
- let ics_reserved_bit = br.read(1)?;
- validate!(ics_reserved_bit == 0);
- self.window_sequence = br.read(2)? as u8;
- match self.prev_window_sequence {
- ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => {
- validate!((self.window_sequence == ONLY_LONG_SEQUENCE) ||
- (self.window_sequence == LONG_START_SEQUENCE));
- },
- LONG_START_SEQUENCE | EIGHT_SHORT_SEQUENCE => {
- validate!((self.window_sequence == EIGHT_SHORT_SEQUENCE) ||
- (self.window_sequence == LONG_STOP_SEQUENCE));
- },
- _ => {},
- };
- self.window_shape = br.read_bool()?;
- self.window_groups = 1;
- if self.window_sequence == EIGHT_SHORT_SEQUENCE {
- self.long_win = false;
- self.num_windows = 8;
- self.max_sfb = br.read(4)? as usize;
- for i in 0..MAX_WINDOWS-1 {
- self.scale_factor_grouping[i] = br.read_bool()?;
- if !self.scale_factor_grouping[i] {
- self.group_start[self.window_groups] = i + 1;
- self.window_groups += 1;
- }
- }
- } else {
- self.long_win = true;
- self.num_windows = 1;
- self.max_sfb = br.read(6)? as usize;
- self.predictor_data = LTPData::read(br)?;
- }
- Ok(())
- }
- fn get_group_start(&self, g: usize) -> usize {
- if g == 0 {
- 0
- } else if g >= self.window_groups {
- if self.long_win { 1 } else { 8 }
- } else {
- self.group_start[g]
- }
- }
-}
-
-#[derive(Clone,Copy)]
-struct LTPData {
-}
-
-impl LTPData {
- fn read(br: &mut BitReader) -> DecoderResult<Option<Self>> {
- let predictor_data_present = br.read_bool()?;
- if !predictor_data_present { return Ok(None); }
-unimplemented!("predictor data");
-/*
- if is_main {
- let predictor_reset = br.read_bool()?;
- if predictor_reset {
- let predictor_reset_group_number = br.read(5)?;
- }
- for sfb in 0..max_sfb.min(PRED_SFB_MAX) {
- prediction_used[sfb] = br.read_bool()?;
- }
- } else {
- let ltp_data_present = br.read_bool()?;
- if ltp_data_present {
- //ltp data
- }
- if common_window {
- let ltp_data_present = br.read_bool()?;
- if ltp_data_present {
- //ltp data
- }
- }
- }
- Ok(Some(Self { }))
-*/
- }
-}
-
-#[derive(Clone,Copy)]
-#[allow(dead_code)]
-struct PulseData {
- number_pulse: usize,
- pulse_start_sfb: usize,
- pulse_offset: [u8; 4],
- pulse_amp: [u8; 4],
-}
-
-impl PulseData {
- fn read(br: &mut BitReader) -> DecoderResult<Option<Self>> {
- let pulse_data_present = br.read_bool()?;
- if !pulse_data_present { return Ok(None); }
-
- let number_pulse = (br.read(2)? as usize) + 1;
- let pulse_start_sfb = br.read(6)? as usize;
- let mut pulse_offset: [u8; 4] = [0; 4];
- let mut pulse_amp: [u8; 4] = [0; 4];
- for i in 0..number_pulse {
- pulse_offset[i] = br.read(5)? as u8;
- pulse_amp[i] = br.read(4)? as u8;
- }
- Ok(Some(Self{ number_pulse, pulse_start_sfb, pulse_offset, pulse_amp }))
- }
-}
-
-const TNS_MAX_ORDER: usize = 20;
-const TNS_MAX_LONG_BANDS: [usize; 12] = [ 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 ];
-const TNS_MAX_SHORT_BANDS: [usize; 12] = [ 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14 ];
-
-#[derive(Clone,Copy)]
-struct TNSCoeffs {
- length: usize,
- order: usize,
- direction: bool,
- compress: bool,
- coef: [f32; TNS_MAX_ORDER + 1],
-}
-
-impl TNSCoeffs {
- fn new() -> Self {
- Self {
- length: 0, order: 0, direction: false, compress: false, coef: [0.0; TNS_MAX_ORDER + 1],
- }
- }
- fn read(&mut self, br: &mut BitReader, long_win: bool, coef_res: bool, max_order: usize) -> DecoderResult<()> {
- self.length = br.read(if long_win { 6 } else { 4 })? as usize;
- self.order = br.read(if long_win { 5 } else { 3 })? as usize;
- validate!(self.order <= max_order);
- if self.order > 0 {
- self.direction = br.read_bool()?;
- self.compress = br.read_bool()?;
- let mut coef_bits = 3;
- if coef_res { coef_bits += 1; }
- if self.compress { coef_bits -= 1; }
- let sign_mask = 1 << (coef_bits - 1);
- let neg_mask = !(sign_mask * 2 - 1);
-
- let fac_base = if coef_res { 1 << 3 } else { 1 << 2 } as f32;
- let iqfac = (fac_base - 0.5) / (consts::PI / 2.0);
- let iqfac_m = (fac_base + 0.5) / (consts::PI / 2.0);
- let mut tmp: [f32; TNS_MAX_ORDER] = [0.0; TNS_MAX_ORDER];
- for i in 0..self.order {
- let val = br.read(coef_bits)? as i8;
- let c = if (val & sign_mask) != 0 { val | neg_mask } else { val } as f32;
- tmp[i] = (if c >= 0.0 { c / iqfac } else { c / iqfac_m }).sin();
- }
- // convert to LPC coefficients
- let mut b: [f32; TNS_MAX_ORDER + 1] = [0.0; TNS_MAX_ORDER + 1];
- for m in 1..(self.order + 1) {
- for i in 1..m {
- b[i] = self.coef[i - 1] + tmp[m - 1] * self.coef[m - i - 1];
- }
- for i in 1..m {
- self.coef[i - 1] = b[i];
- }
- self.coef[m - 1] = tmp[m - 1];
- }
- }
- Ok(())
- }
-}
-
-#[derive(Clone,Copy)]
-#[allow(dead_code)]
-struct TNSData {
- n_filt: [usize; MAX_WINDOWS],
- coef_res: [bool; MAX_WINDOWS],
- coeffs: [[TNSCoeffs; 4]; MAX_WINDOWS],
-}
-
-impl TNSData {
- fn read(br: &mut BitReader, long_win: bool, num_windows: usize, max_order: usize) -> DecoderResult<Option<Self>> {
- let tns_data_present = br.read_bool()?;
- if !tns_data_present { return Ok(None); }
- let mut n_filt: [usize; MAX_WINDOWS] = [0; MAX_WINDOWS];
- let mut coef_res: [bool; MAX_WINDOWS] = [false; MAX_WINDOWS];
- let mut coeffs: [[TNSCoeffs; 4]; MAX_WINDOWS] = [[TNSCoeffs::new(); 4]; MAX_WINDOWS];
- for w in 0..num_windows {
- n_filt[w] = br.read(if long_win { 2 } else { 1 })? as usize;
- if n_filt[w] != 0 {
- coef_res[w] = br.read_bool()?;
- }
- for filt in 0..n_filt[w] {
- coeffs[w][filt].read(br, long_win, coef_res[w], max_order)?;
- }
- }
- Ok(Some(Self { n_filt, coef_res, coeffs }))
- }
-}
-
-#[derive(Clone,Copy)]
-#[allow(dead_code)]
-struct GainControlData {
- max_band: u8,
-}
-
-impl GainControlData {
- fn read(br: &mut BitReader) -> DecoderResult<Option<Self>> {
- let gain_control_data_present = br.read_bool()?;
- if !gain_control_data_present { return Ok(None); }
-unimplemented!("gain control data");
-/* self.max_band = br.read(2)? as u8;
- if window_sequence == ONLY_LONG_SEQUENCE {
- for bd in 0..max_band
-...
- }
- Ok(Some(Self { }))*/
- }
-}
-
-const ZERO_HCB: u8 = 0;
-const FIRST_PAIR_HCB: u8 = 5;
-const ESC_HCB: u8 = 11;
-const RESERVED_HCB: u8 = 12;
-const NOISE_HCB: u8 = 13;
-const INTENSITY_HCB2: u8 = 14;
-const INTENSITY_HCB: u8 = 15;
-
-struct Codebooks {
- scale_cb: Codebook<i8>,
- spec_cb: [Codebook<u16>; 11],
-}
-
-fn scale_map(idx: usize) -> i8 { (idx as i8) - 60 }
-fn cb_map(idx: usize) -> u16 { idx as u16 }
-
-impl Codebooks {
- fn new() -> Self {
- let mut coderead = TableCodebookDescReader::new(AAC_SCF_CODEBOOK_CODES, AAC_SCF_CODEBOOK_BITS, scale_map);
- let scale_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut spec_cb: [Codebook<u16>; 11];
- unsafe {
- spec_cb = mem::uninitialized();
- for i in 0..AAC_SPEC_CODES.len() {
- let mut coderead = TableCodebookDescReader::new(AAC_SPEC_CODES[i], AAC_SPEC_BITS[i], cb_map);
- ptr::write(&mut spec_cb[i], Codebook::new(&mut coderead, CodebookMode::MSB).unwrap());
- }
- }
- Self { scale_cb, spec_cb }
- }
-}
-
-#[derive(Clone)]
-struct ICS {
- global_gain: u8,
- info: ICSInfo,
- pulse_data: Option<PulseData>,
- tns_data: Option<TNSData>,
- gain_control: Option<GainControlData>,
- sect_cb: [[u8; MAX_SFBS]; MAX_WINDOWS],
- sect_len: [[usize; MAX_SFBS]; MAX_WINDOWS],
- sfb_cb: [[u8; MAX_SFBS]; MAX_WINDOWS],
- num_sec: [usize; MAX_WINDOWS],
- scales: [[u8; MAX_SFBS]; MAX_WINDOWS],
- sbinfo: GASubbandInfo,
- coeffs: [f32; 1024],
- delay: [f32; 1024],
-}
-
-const INTENSITY_SCALE_MIN: i16 = -155;
-const NOISE_SCALE_MIN: i16 = -100;
-impl ICS {
- fn new(sbinfo: GASubbandInfo) -> Self {
- Self {
- global_gain: 0,
- info: ICSInfo::new(),
- pulse_data: None,
- tns_data: None,
- gain_control: None,
- sect_cb: [[0; MAX_SFBS]; MAX_WINDOWS],
- sect_len: [[0; MAX_SFBS]; MAX_WINDOWS],
- sfb_cb: [[0; MAX_SFBS]; MAX_WINDOWS],
- scales: [[0; MAX_SFBS]; MAX_WINDOWS],
- num_sec: [0; MAX_WINDOWS],
- sbinfo,
- coeffs: [0.0; 1024],
- delay: [0.0; 1024],
- }
- }
- fn decode_section_data(&mut self, br: &mut BitReader, may_have_intensity: bool) -> DecoderResult<()> {
- let sect_bits = if self.info.long_win { 5 } else { 3 };
- let sect_esc_val = (1 << sect_bits) - 1;
-
- for g in 0..self.info.window_groups {
- let mut k = 0;
- let mut l = 0;
- while k < self.info.max_sfb {
- self.sect_cb[g][l] = br.read(4)? as u8;
- self.sect_len[g][l] = 0;
- validate!(self.sect_cb[g][l] != RESERVED_HCB);
- if ((self.sect_cb[g][l] == INTENSITY_HCB) || (self.sect_cb[g][l] == INTENSITY_HCB2)) && !may_have_intensity {
- return Err(DecoderError::InvalidData);
- }
- loop {
- let sect_len_incr = br.read(sect_bits)? as usize;
- self.sect_len[g][l] += sect_len_incr;
- if sect_len_incr < sect_esc_val { break; }
- }
- validate!(k + self.sect_len[g][l] <= self.info.max_sfb);
- for _ in 0..self.sect_len[g][l] {
- self.sfb_cb[g][k] = self.sect_cb[g][l];
- k += 1;
- }
- l += 1;
- }
- self.num_sec[g] = l;
- }
- Ok(())
- }
- fn is_intensity(&self, g: usize, sfb: usize) -> bool {
- (self.sfb_cb[g][sfb] == INTENSITY_HCB) || (self.sfb_cb[g][sfb] == INTENSITY_HCB2)
- }
- fn get_intensity_dir(&self, g: usize, sfb: usize) -> bool {
- self.sfb_cb[g][sfb] == INTENSITY_HCB
- }
- fn decode_scale_factor_data(&mut self, br: &mut BitReader, codebooks: &Codebooks) -> DecoderResult<()> {
- let mut noise_pcm_flag = true;
- let mut scf_normal = self.global_gain as i16;
- let mut scf_intensity = 0i16;
- let mut scf_noise = 0i16;
- for g in 0..self.info.window_groups {
- for sfb in 0..self.info.max_sfb {
- if self.sfb_cb[g][sfb] != ZERO_HCB {
- if self.is_intensity(g, sfb) {
- let diff = br.read_cb(&codebooks.scale_cb)? as i16;
- scf_intensity += diff;
- validate!((scf_intensity >= INTENSITY_SCALE_MIN) && (scf_intensity < INTENSITY_SCALE_MIN + 256));
- self.scales[g][sfb] = (scf_intensity - INTENSITY_SCALE_MIN) as u8;
- } else {
- if self.sfb_cb[g][sfb] == NOISE_HCB {
- if noise_pcm_flag {
- noise_pcm_flag = false;
- scf_noise = (br.read(9)? as i16) - 256 + (self.global_gain as i16) - 90;
- } else {
- scf_noise += br.read_cb(&codebooks.scale_cb)? as i16;
- }
- validate!((scf_noise >= NOISE_SCALE_MIN) && (scf_noise < NOISE_SCALE_MIN + 256));
- self.scales[g][sfb] = (scf_noise - NOISE_SCALE_MIN) as u8;
- } else {
- scf_normal += br.read_cb(&codebooks.scale_cb)? as i16;
- validate!((scf_normal >= 0) && (scf_normal < 255));
- self.scales[g][sfb] = scf_normal as u8;
- }
- }
- }
- }
- }
- Ok(())
- }
- fn get_band_start(&self, swb: usize) -> usize {
- if self.info.long_win {
- self.sbinfo.long_bands[swb]
- } else {
- self.sbinfo.short_bands[swb]
- }
- }
- fn get_num_bands(&self) -> usize {
- if self.info.long_win {
- self.sbinfo.long_bands.len() - 1
- } else {
- self.sbinfo.short_bands.len() - 1
- }
- }
- fn decode_spectrum(&mut self, br: &mut BitReader, codebooks: &Codebooks) -> DecoderResult<()> {
- self.coeffs = [0.0; 1024];
- for g in 0..self.info.window_groups {
- let cur_w = self.info.get_group_start(g);
- let next_w = self.info.get_group_start(g + 1);
- for sfb in 0..self.info.max_sfb {
- let start = self.get_band_start(sfb);
- let end = self.get_band_start(sfb + 1);
- let cb_idx = self.sfb_cb[g][sfb];
- for w in cur_w..next_w {
- let dst = &mut self.coeffs[start + w*128..end + w*128];
- match cb_idx {
- ZERO_HCB => { /* zeroes */ },
- NOISE_HCB => { /* noise */ },
- INTENSITY_HCB | INTENSITY_HCB2 => { /* intensity */ },
- _ => {
- let unsigned = AAC_UNSIGNED_CODEBOOK[(cb_idx - 1) as usize];
- let scale = get_scale(self.scales[g][sfb]);
- let cb = &codebooks.spec_cb[(cb_idx - 1) as usize];
- if cb_idx < FIRST_PAIR_HCB {
- decode_quads(br, cb, unsigned, scale, dst)?;
- } else {
- decode_pairs(br, cb, unsigned, cb_idx == ESC_HCB,
- AAC_CODEBOOK_MODULO[(cb_idx - FIRST_PAIR_HCB) as usize], scale, dst)?;
- }
- },
- };
- }
- }
- }
- Ok(())
- }
- fn place_pulses(&mut self) {
- if let Some(ref pdata) = self.pulse_data {
- if pdata.pulse_start_sfb >= self.sbinfo.long_bands.len() - 1 { return; }
- let mut k = self.get_band_start(pdata.pulse_start_sfb);
- let mut band = pdata.pulse_start_sfb;
- for pno in 0..pdata.number_pulse {
- k += pdata.pulse_offset[pno] as usize;
- if k >= 1024 { return; }
- while self.get_band_start(band + 1) <= k { band += 1; }
- let scale = get_scale(self.scales[0][band]);
- let mut base = self.coeffs[k];
- if base != 0.0 {
- base = requant(self.coeffs[k], scale);
- }
- if base > 0.0 {
- base += pdata.pulse_amp[pno] as f32;
- } else {
- base -= pdata.pulse_amp[pno] as f32;
- }
- self.coeffs[k] = iquant(base) * scale;
- }
- }
- }
- fn decode_ics(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType, common_window: bool, may_have_intensity: bool) -> DecoderResult<()> {
- self.global_gain = br.read(8)? as u8;
- if !common_window {
- self.info.decode_ics_info(br)?;
- }
- self.decode_section_data(br, may_have_intensity)?;
- self.decode_scale_factor_data(br, codebooks)?;
- self.pulse_data = PulseData::read(br)?;
- validate!(self.pulse_data.is_none() || self.info.long_win);
- let tns_max_order;
- if !self.info.long_win {
- tns_max_order = 7;
- } else if m4atype == M4AType::LC {
- tns_max_order = 12;
- } else {
- tns_max_order = TNS_MAX_ORDER;
- }
- self.tns_data = TNSData::read(br, self.info.long_win, self.info.num_windows, tns_max_order)?;
- if m4atype == M4AType::SSR {
- self.gain_control = GainControlData::read(br)?;
- } else {
- let gain_control_data_present = br.read_bool()?;
- validate!(!gain_control_data_present);
- }
- self.decode_spectrum(br, codebooks)?;
- Ok(())
- }
- fn synth_channel(&mut self, dsp: &mut DSP, dst: &mut [f32], srate_idx: usize) {
- self.place_pulses();
- if let Some(ref tns_data) = self.tns_data {
- let tns_max_bands = (if self.info.long_win {
- TNS_MAX_LONG_BANDS[srate_idx]
- } else {
- TNS_MAX_SHORT_BANDS[srate_idx]
- }).min(self.info.max_sfb);
- for w in 0..self.info.num_windows {
- let mut bottom = self.get_num_bands();
- for f in 0..tns_data.n_filt[w] {
- let top = bottom;
- bottom = if top >= tns_data.coeffs[w][f].length { top - tns_data.coeffs[w][f].length } else { 0 };
- let order = tns_data.coeffs[w][f].order;
- if order == 0 { continue; }
- let start = w * 128 + self.get_band_start(tns_max_bands.min(bottom));
- let end = w * 128 + self.get_band_start(tns_max_bands.min(top));
- let lpc = &tns_data.coeffs[w][f].coef;
- if !tns_data.coeffs[w][f].direction {
- for m in start..end {
- for i in 0..order.min(m) {
- self.coeffs[m] -= self.coeffs[m - i - 1] * lpc[i];
- }
- }
- } else {
- for m in (start..end).rev() {
- for i in 0..order.min(m) {
- self.coeffs[m] -= self.coeffs[m + i - 1] * lpc[i];
- }
- }
- }
- }
- }
- }
- dsp.synth(&self.coeffs, &mut self.delay, self.info.window_sequence, self.info.window_shape, self.info.prev_window_shape, dst);
- }
-}
-
-fn get_scale(scale: u8) -> f32 {
- 2.0f32.powf(0.25 * ((scale as f32) - 100.0 - 56.0))
-}
-fn iquant(val: f32) -> f32 {
- if val < 0.0 {
- -((-val).powf(4.0 / 3.0))
- } else {
- val.powf(4.0 / 3.0)
- }
-}
-fn requant(val: f32, scale: f32) -> f32 {
- if scale == 0.0 { return 0.0; }
- let bval = val / scale;
- if bval >= 0.0 {
- val.powf(3.0 / 4.0)
- } else {
- -((-val).powf(3.0 / 4.0))
- }
-}
-fn decode_quads(br: &mut BitReader, cb: &Codebook<u16>, unsigned: bool, scale: f32, dst: &mut [f32]) -> DecoderResult<()> {
- for out in dst.chunks_mut(4) {
- let cw = br.read_cb(cb)? as usize;
- if unsigned {
- for i in 0..4 {
- let val = AAC_QUADS[cw][i];
- if val != 0 {
- if br.read_bool()? {
- out[i] = iquant(-val as f32) * scale;
- } else {
- out[i] = iquant( val as f32) * scale;
- }
- }
- }
- } else {
- for i in 0..4 {
- out[i] = iquant((AAC_QUADS[cw][i] - 1) as f32) * scale;
- }
- }
- }
- Ok(())
-}
-fn decode_pairs(br: &mut BitReader, cb: &Codebook<u16>, unsigned: bool, escape: bool, modulo: u16, scale: f32, dst: &mut [f32]) -> DecoderResult<()> {
- for out in dst.chunks_mut(2) {
- let cw = br.read_cb(cb)?;
- let mut x = (cw / modulo) as i16;
- let mut y = (cw % modulo) as i16;
- if unsigned {
- if x != 0 && br.read_bool()? {
- x = -x;
- }
- if y != 0 && br.read_bool()? {
- y = -y;
- }
- } else {
- x -= (modulo >> 1) as i16;
- y -= (modulo >> 1) as i16;
- }
- if escape {
- if (x == 16) || (x == -16) {
- x += read_escape(br, x > 0)?;
- }
- if (y == 16) || (y == -16) {
- y += read_escape(br, y > 0)?;
- }
- }
- out[0] = iquant(x as f32) * scale;
- out[1] = iquant(y as f32) * scale;
- }
- Ok(())
-}
-fn read_escape(br: &mut BitReader, sign: bool) -> DecoderResult<i16> {
- let prefix = br.read_code(UintCodeType::UnaryOnes)? as u8;
- validate!(prefix < 9);
- let bits = br.read(prefix + 4)? as i16;
- if sign {
- Ok(bits)
- } else {
- Ok(-bits)
- }
-}
-
-#[derive(Clone)]
-struct ChannelPair {
- pair: bool,
- channel: usize,
- common_window: bool,
- ms_mask_present: u8,
- ms_used: [[bool; MAX_SFBS]; MAX_WINDOWS],
- ics: [ICS; 2],
-}
-
-impl ChannelPair {
- fn new(pair: bool, channel: usize, sbinfo: GASubbandInfo) -> Self {
- Self {
- pair, channel,
- common_window: false,
- ms_mask_present: 0,
- ms_used: [[false; MAX_SFBS]; MAX_WINDOWS],
- ics: [ICS::new(sbinfo), ICS::new(sbinfo)],
- }
- }
- fn decode_ga_sce(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType) -> DecoderResult<()> {
- self.ics[0].decode_ics(br, codebooks, m4atype, false, false)?;
- Ok(())
- }
- fn decode_ga_cpe(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType) -> DecoderResult<()> {
- let common_window = br.read_bool()?;
- self.common_window = common_window;
- if common_window {
- self.ics[0].info.decode_ics_info(br)?;
- self.ms_mask_present = br.read(2)? as u8;
- validate!(self.ms_mask_present != 3);
- if self.ms_mask_present == 1 {
- for g in 0..self.ics[0].info.window_groups {
- for sfb in 0..self.ics[0].info.max_sfb {
- self.ms_used[g][sfb] = br.read_bool()?;
- }
- }
- }
- self.ics[1].info = self.ics[0].info;
- }
- self.ics[0].decode_ics(br, codebooks, m4atype, common_window, true)?;
- self.ics[1].decode_ics(br, codebooks, m4atype, common_window, false)?;
- if common_window && self.ms_mask_present != 0 {
- let mut g = 0;
- for w in 0..self.ics[0].info.num_windows {
- if w > 0 && self.ics[0].info.scale_factor_grouping[w - 1] {
- g += 1;
- }
- for sfb in 0..self.ics[0].info.max_sfb {
- let start = w * 128 + self.ics[0].get_band_start(sfb);
- let end = w * 128 + self.ics[0].get_band_start(sfb + 1);
- if self.ics[0].is_intensity(g, sfb) {
- let invert = (self.ms_mask_present == 1) && self.ms_used[g][sfb];
- let dir = self.ics[0].get_intensity_dir(g, sfb) ^ invert;
- let scale = 0.5f32.powf(0.25 * ((self.ics[0].scales[g][sfb] as f32) + (INTENSITY_SCALE_MIN as f32)));
- if !dir {
- for i in start..end {
- self.ics[1].coeffs[i] = scale * self.ics[0].coeffs[i];
- }
- } else {
- for i in start..end {
- self.ics[1].coeffs[i] = -scale * self.ics[0].coeffs[i];
- }
- }
- } else if (self.ms_mask_present == 2) || self.ms_used[g][sfb] {
- for i in start..end {
- let tmp = self.ics[0].coeffs[i] - self.ics[1].coeffs[i];
- self.ics[0].coeffs[i] += self.ics[1].coeffs[i];
- self.ics[1].coeffs[i] = tmp;
- }
- }
- }
- }
- }
- Ok(())
- }
- fn synth_audio(&mut self, dsp: &mut DSP, abuf: &mut NABufferType, srate_idx: usize) {
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut output = adata.get_data_mut();
- let off0 = abuf.get_offset(self.channel);
- let off1 = abuf.get_offset(self.channel + 1);
- self.ics[0].synth_channel(dsp, &mut output[off0..], srate_idx);
- if self.pair {
- self.ics[1].synth_channel(dsp, &mut output[off1..], srate_idx);
- }
- }
-}
-
-struct DSP {
- kbd_long_win: [f32; 1024],
- kbd_short_win: [f32; 128],
- sine_long_win: [f32; 1024],
- sine_short_win: [f32; 128],
- imdct_long: IMDCT,
- imdct_short: IMDCT,
- tmp: [f32; 2048],
- ew_buf: [f32; 1152],
-}
-
-const SHORT_WIN_POINT0: usize = 512 - 64;
-const SHORT_WIN_POINT1: usize = 512 + 64;
-
-impl DSP {
- fn new() -> Self {
- let mut kbd_long_win: [f32; 1024] = [0.0; 1024];
- let mut kbd_short_win: [f32; 128] = [0.0; 128];
- generate_window(WindowType::KaiserBessel(4.0), 1.0, 1024, true, &mut kbd_long_win);
- generate_window(WindowType::KaiserBessel(6.0), 1.0, 128, true, &mut kbd_short_win);
- let mut sine_long_win: [f32; 1024] = [0.0; 1024];
- let mut sine_short_win: [f32; 128] = [0.0; 128];
- generate_window(WindowType::Sine, 1.0, 1024, true, &mut sine_long_win);
- generate_window(WindowType::Sine, 1.0, 128, true, &mut sine_short_win);
- Self {
- kbd_long_win, kbd_short_win,
- sine_long_win, sine_short_win,
- imdct_long: IMDCT::new(FFTMode::SplitRadix, 1024 * 2, true),
- imdct_short: IMDCT::new(FFTMode::SplitRadix, 128 * 2, true),
- tmp: [0.0; 2048], ew_buf: [0.0; 1152],
- }
- }
- fn synth(&mut self, coeffs: &[f32; 1024], delay: &mut [f32; 1024], seq: u8, window_shape: bool, prev_window_shape: bool, dst: &mut [f32]) {
- let long_win = if window_shape { &self.kbd_long_win } else { &self.sine_long_win };
- let short_win = if window_shape { &self.kbd_short_win } else { &self.sine_short_win };
- let left_long_win = if prev_window_shape { &self.kbd_long_win } else { &self.sine_long_win };
- let left_short_win = if prev_window_shape { &self.kbd_short_win } else { &self.sine_short_win };
- if seq != EIGHT_SHORT_SEQUENCE {
- self.imdct_long.imdct(coeffs, &mut self.tmp);
- } else {
- for (ain, aout) in coeffs.chunks(128).zip(self.tmp.chunks_mut(256)) {
- self.imdct_short.imdct(ain, aout);
- }
- self.ew_buf = [0.0; 1152];
- for (w, src) in self.tmp.chunks(256).enumerate() {
- if w > 0 {
- for i in 0..128 {
- self.ew_buf[w * 128 + i] += src[i] * short_win[i];
- }
- } else { // to be left-windowed
- for i in 0..128 {
- self.ew_buf[i] = src[i];
- }
- }
- for i in 0..128 {
- self.ew_buf[w * 128 + i + 128] += src[i + 128] * short_win[127 - i];
- }
- }
- }
- if seq == ONLY_LONG_SEQUENCE { // should be the most common case
- for i in 0..1024 {
- dst[i] = delay[i] + self.tmp[i] * left_long_win[i];
- delay[i] = self.tmp[i + 1024] * long_win[1023 - i];
- }
- return;
- }
- // output new data
- match seq {
- ONLY_LONG_SEQUENCE | LONG_START_SEQUENCE => {
- for i in 0..1024 {
- dst[i] = self.tmp[i] * left_long_win[i] + delay[i];
- }
- },
- EIGHT_SHORT_SEQUENCE => {
- for i in 0..SHORT_WIN_POINT0 {
- dst[i] = delay[i];
- }
- for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 {
- let j = i - SHORT_WIN_POINT0;
- dst[i] = delay[i] + self.ew_buf[j] * left_short_win[j];
- }
- for i in SHORT_WIN_POINT1..1024 {
- let j = i - SHORT_WIN_POINT0;
- dst[i] = self.ew_buf[j];
- }
- },
- LONG_STOP_SEQUENCE => {
- for i in 0..SHORT_WIN_POINT0 {
- dst[i] = delay[i];
- }
- for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 {
- dst[i] = delay[i] + self.tmp[i] * left_short_win[i - SHORT_WIN_POINT0];
- }
- for i in SHORT_WIN_POINT1..1024 {
- dst[i] = self.tmp[i];
- }
- },
- _ => unreachable!(""),
- };
- // save delay
- match seq {
- ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => {
- for i in 0..1024 {
- delay[i] = self.tmp[i + 1024] * long_win[1023 - i];
- }
- },
- EIGHT_SHORT_SEQUENCE => {
- for i in 0..SHORT_WIN_POINT1 { // last part is already windowed
- delay[i] = self.ew_buf[i + 512+64];
- }
- for i in SHORT_WIN_POINT1..1024 {
- delay[i] = 0.0;
- }
- },
- LONG_START_SEQUENCE => {
- for i in 0..SHORT_WIN_POINT0 {
- delay[i] = self.tmp[i + 1024];
- }
- for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 {
- delay[i] = self.tmp[i + 1024] * short_win[127 - (i - SHORT_WIN_POINT0)];
- }
- for i in SHORT_WIN_POINT1..1024 {
- delay[i] = 0.0;
- }
- },
- _ => unreachable!(""),
- };
- }
-}
-
-struct AACDecoder {
- info: Rc<NACodecInfo>,
- chmap: NAChannelMap,
- m4ainfo: M4AInfo,
- pairs: Vec<ChannelPair>,
- codebooks: Codebooks,
- dsp: DSP,
- sbinfo: GASubbandInfo,
-}
-
-impl AACDecoder {
- fn new() -> Self {
- AACDecoder {
- info: NACodecInfo::new_dummy(),
- chmap: NAChannelMap::new(),
- m4ainfo: M4AInfo::new(),
- pairs: Vec::new(),
- codebooks: Codebooks::new(),
- dsp: DSP::new(),
- sbinfo: AAC_SUBBAND_INFO[0],
- }
- }
- fn set_pair(&mut self, pair_no: usize, channel: usize, pair: bool) -> DecoderResult<()> {
- if self.pairs.len() <= pair_no {
- self.pairs.push(ChannelPair::new(pair, channel, self.sbinfo));
- } else {
- validate!(self.pairs[pair_no].channel == channel);
- validate!(self.pairs[pair_no].pair == pair);
- }
- validate!(if pair { channel + 1 } else { channel } < self.m4ainfo.channels);
- Ok(())
- }
- fn decode_ga(&mut self, br: &mut BitReader, abuf: &mut NABufferType) -> DecoderResult<()> {
- let mut cur_pair = 0;
- let mut cur_ch = 0;
- while br.left() > 3 {
- let id = br.read(3)?;
- match id {
- 0 => { // ID_SCE
- let _tag = br.read(4)?;
- self.set_pair(cur_pair, cur_ch, false)?;
- self.pairs[cur_pair].decode_ga_sce(br, &self.codebooks, self.m4ainfo.otype)?;
- cur_pair += 1;
- cur_ch += 1;
- },
- 1 => { // ID_CPE
- let _tag = br.read(4)?;
- self.set_pair(cur_pair, cur_ch, true)?;
- self.pairs[cur_pair].decode_ga_cpe(br, &self.codebooks, self.m4ainfo.otype)?;
- cur_pair += 1;
- cur_ch += 2;
- },
- 2 => { // ID_CCE
- unimplemented!("coupling channel element");
- },
- 3 => { // ID_LFE
- let _tag = br.read(4)?;
- self.set_pair(cur_pair, cur_ch, false)?;
- self.pairs[cur_pair].decode_ga_sce(br, &self.codebooks, self.m4ainfo.otype)?;
- cur_pair += 1;
- cur_ch += 1;
- },
- 4 => { // ID_DSE
- let _id = br.read(4)?;
- let align = br.read_bool()?;
- let mut count = br.read(8)? as u32;
- if count == 255 { count += br.read(8)? as u32; }
- if align { br.align(); }
- br.skip(count * 8)?; // no SBR payload or such
- },
- 5 => { // ID_PCE
- unimplemented!("program config");
- },
- 6 => { // ID_FIL
- let mut count = br.read(4)? as usize;
- if count == 15 {
- count += br.read(8)? as usize;
- count -= 1;
- }
- for _ in 0..count {
- // ext payload
- br.skip(8)?;
- }
- },
- 7 => { // ID_TERM
- break;
- },
- _ => { unreachable!(); },
- };
- }
- let srate_idx = GASubbandInfo::find_idx(self.m4ainfo.srate);
- for pair in 0..cur_pair {
- self.pairs[pair].synth_audio(&mut self.dsp, abuf, srate_idx);
- }
- Ok(())
- }
-}
-
-impl NADecoder for AACDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(_) = info.get_properties() {
- let edata = info.get_extradata().unwrap();
- validate!(edata.len() >= 2);
-
-//print!("edata:"); for s in edata.iter() { print!(" {:02X}", *s);}println!("");
- self.m4ainfo.read(&edata)?;
-
- //println!("{}", self.m4ainfo);
- if (self.m4ainfo.otype != M4AType::LC) || (self.m4ainfo.channels > 2) || (self.m4ainfo.samples != 1024) {
- return Err(DecoderError::NotImplemented);
- }
- self.sbinfo = GASubbandInfo::find(self.m4ainfo.srate);
-
- let ainfo = NAAudioInfo::new(self.m4ainfo.srate, self.m4ainfo.channels as u8,
- SND_F32P_FORMAT, self.m4ainfo.samples);
- self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo));
-
- if self.m4ainfo.channels >= DEFAULT_CHANNEL_MAP.len() {
- return Err(DecoderError::NotImplemented);
- }
- let chmap_str = DEFAULT_CHANNEL_MAP[self.m4ainfo.channels];
- if chmap_str.len() == 0 { return Err(DecoderError::NotImplemented); }
- self.chmap = NAChannelMap::from_str(chmap_str).unwrap();
-
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
-
- let ainfo = self.info.get_properties().get_audio_info().unwrap();
- let mut abuf = alloc_audio_buffer(ainfo, self.m4ainfo.samples, self.chmap.clone())?;
-
- let mut br = BitReader::new(&pktbuf, pktbuf.len(), BitReaderMode::BE);
- match self.m4ainfo.otype {
- M4AType::LC => {
- self.decode_ga(&mut br, &mut abuf)?;
- },
- _ => { unimplemented!(""); }
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(AACDecoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_aac() {
-// let file = "assets/RV/rv40_weighted_mc.rmvb";
- let file = "assets/RV/rv40_weighted_mc_2.rmvb";
- test_decode_audio("realmedia", file, Some(12000), "aac");
- }
-}
-
-const AAC_SCF_CODEBOOK_BITS: &[u8] = &[
- 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 18, 19, 18, 17, 17, 16, 17, 16, 16, 16, 16, 15, 15,
- 14, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 11, 12, 11, 10, 10,
- 10, 9, 9, 8, 8, 8, 7, 6, 6, 5, 4, 3, 1, 4, 4, 5,
- 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12,
- 12, 13, 13, 13, 14, 14, 16, 15, 16, 15, 18, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19
-];
-
-const AAC_SCF_CODEBOOK_CODES: &[u32] = &[
- 0x3FFE8, 0x3FFE6, 0x3FFE7, 0x3FFE5, 0x7FFF5, 0x7FFF1, 0x7FFED, 0x7FFF6,
- 0x7FFEE, 0x7FFEF, 0x7FFF0, 0x7FFFC, 0x7FFFD, 0x7FFFF, 0x7FFFE, 0x7FFF7,
- 0x7FFF8, 0x7FFFB, 0x7FFF9, 0x3FFE4, 0x7FFFA, 0x3FFE3, 0x1FFEF, 0x1FFF0,
- 0x0FFF5, 0x1FFEE, 0x0FFF2, 0x0FFF3, 0x0FFF4, 0x0FFF1, 0x07FF6, 0x07FF7,
- 0x03FF9, 0x03FF5, 0x03FF7, 0x03FF3, 0x03FF6, 0x03FF2, 0x01FF7, 0x01FF5,
- 0x00FF9, 0x00FF7, 0x00FF6, 0x007F9, 0x00FF4, 0x007F8, 0x003F9, 0x003F7,
- 0x003F5, 0x001F8, 0x001F7, 0x000FA, 0x000F8, 0x000F6, 0x00079, 0x0003A,
- 0x00038, 0x0001A, 0x0000B, 0x00004, 0x00000, 0x0000A, 0x0000C, 0x0001B,
- 0x00039, 0x0003B, 0x00078, 0x0007A, 0x000F7, 0x000F9, 0x001F6, 0x001F9,
- 0x003F4, 0x003F6, 0x003F8, 0x007F5, 0x007F4, 0x007F6, 0x007F7, 0x00FF5,
- 0x00FF8, 0x01FF4, 0x01FF6, 0x01FF8, 0x03FF8, 0x03FF4, 0x0FFF0, 0x07FF4,
- 0x0FFF6, 0x07FF5, 0x3FFE2, 0x7FFD9, 0x7FFDA, 0x7FFDB, 0x7FFDC, 0x7FFDD,
- 0x7FFDE, 0x7FFD8, 0x7FFD2, 0x7FFD3, 0x7FFD4, 0x7FFD5, 0x7FFD6, 0x7FFF2,
- 0x7FFDF, 0x7FFE7, 0x7FFE8, 0x7FFE9, 0x7FFEA, 0x7FFEB, 0x7FFE6, 0x7FFE0,
- 0x7FFE1, 0x7FFE2, 0x7FFE3, 0x7FFE4, 0x7FFE5, 0x7FFD7, 0x7FFEC, 0x7FFF4,
- 0x7FFF3
-];
-
-const AAC_SPEC_CB1_BITS: &[u8] = &[
- 11, 9, 11, 10, 7, 10, 11, 9, 11, 10, 7, 10, 7, 5, 7, 9,
- 7, 10, 11, 9, 11, 9, 7, 9, 11, 9, 11, 9, 7, 9, 7, 5,
- 7, 9, 7, 9, 7, 5, 7, 5, 1, 5, 7, 5, 7, 9, 7, 9,
- 7, 5, 7, 9, 7, 9, 11, 9, 11, 9, 7, 9, 11, 9, 11, 10,
- 7, 9, 7, 5, 7, 9, 7, 10, 11, 9, 11, 10, 7, 9, 11, 9,
- 11
-];
-const AAC_SPEC_CB1_CODES: &[u16] = &[
- 0x7f8, 0x1f1, 0x7fd, 0x3f5, 0x068, 0x3f0, 0x7f7, 0x1ec,
- 0x7f5, 0x3f1, 0x072, 0x3f4, 0x074, 0x011, 0x076, 0x1eb,
- 0x06c, 0x3f6, 0x7fc, 0x1e1, 0x7f1, 0x1f0, 0x061, 0x1f6,
- 0x7f2, 0x1ea, 0x7fb, 0x1f2, 0x069, 0x1ed, 0x077, 0x017,
- 0x06f, 0x1e6, 0x064, 0x1e5, 0x067, 0x015, 0x062, 0x012,
- 0x000, 0x014, 0x065, 0x016, 0x06d, 0x1e9, 0x063, 0x1e4,
- 0x06b, 0x013, 0x071, 0x1e3, 0x070, 0x1f3, 0x7fe, 0x1e7,
- 0x7f3, 0x1ef, 0x060, 0x1ee, 0x7f0, 0x1e2, 0x7fa, 0x3f3,
- 0x06a, 0x1e8, 0x075, 0x010, 0x073, 0x1f4, 0x06e, 0x3f7,
- 0x7f6, 0x1e0, 0x7f9, 0x3f2, 0x066, 0x1f5, 0x7ff, 0x1f7,
- 0x7f4
-];
-const AAC_SPEC_CB2_BITS: &[u8] = &[
- 9, 7, 9, 8, 6, 8, 9, 8, 9, 8, 6, 7, 6, 5, 6, 7,
- 6, 8, 9, 7, 8, 8, 6, 8, 9, 7, 9, 8, 6, 7, 6, 5,
- 6, 7, 6, 8, 6, 5, 6, 5, 3, 5, 6, 5, 6, 8, 6, 7,
- 6, 5, 6, 8, 6, 8, 9, 7, 9, 8, 6, 8, 8, 7, 9, 8,
- 6, 7, 6, 4, 6, 8, 6, 7, 9, 7, 9, 7, 6, 8, 9, 7,
- 9
-];
-const AAC_SPEC_CB2_CODES: &[u16] = &[
- 0x1f3, 0x06f, 0x1fd, 0x0eb, 0x023, 0x0ea, 0x1f7, 0x0e8,
- 0x1fa, 0x0f2, 0x02d, 0x070, 0x020, 0x006, 0x02b, 0x06e,
- 0x028, 0x0e9, 0x1f9, 0x066, 0x0f8, 0x0e7, 0x01b, 0x0f1,
- 0x1f4, 0x06b, 0x1f5, 0x0ec, 0x02a, 0x06c, 0x02c, 0x00a,
- 0x027, 0x067, 0x01a, 0x0f5, 0x024, 0x008, 0x01f, 0x009,
- 0x000, 0x007, 0x01d, 0x00b, 0x030, 0x0ef, 0x01c, 0x064,
- 0x01e, 0x00c, 0x029, 0x0f3, 0x02f, 0x0f0, 0x1fc, 0x071,
- 0x1f2, 0x0f4, 0x021, 0x0e6, 0x0f7, 0x068, 0x1f8, 0x0ee,
- 0x022, 0x065, 0x031, 0x002, 0x026, 0x0ed, 0x025, 0x06a,
- 0x1fb, 0x072, 0x1fe, 0x069, 0x02e, 0x0f6, 0x1ff, 0x06d,
- 0x1f6
-];
-const AAC_SPEC_CB3_BITS: &[u8] = &[
- 1, 4, 8, 4, 5, 8, 9, 9, 10, 4, 6, 9, 6, 6, 9, 9,
- 9, 10, 9, 10, 13, 9, 9, 11, 11, 10, 12, 4, 6, 10, 6, 7,
- 10, 10, 10, 12, 5, 7, 11, 6, 7, 10, 9, 9, 11, 9, 10, 13,
- 8, 9, 12, 10, 11, 12, 8, 10, 15, 9, 11, 15, 13, 14, 16, 8,
- 10, 14, 9, 10, 14, 12, 12, 15, 11, 12, 16, 10, 11, 15, 12, 12,
- 15
-];
-const AAC_SPEC_CB3_CODES: &[u16] = &[
- 0x0000, 0x0009, 0x00ef, 0x000b, 0x0019, 0x00f0, 0x01eb, 0x01e6,
- 0x03f2, 0x000a, 0x0035, 0x01ef, 0x0034, 0x0037, 0x01e9, 0x01ed,
- 0x01e7, 0x03f3, 0x01ee, 0x03ed, 0x1ffa, 0x01ec, 0x01f2, 0x07f9,
- 0x07f8, 0x03f8, 0x0ff8, 0x0008, 0x0038, 0x03f6, 0x0036, 0x0075,
- 0x03f1, 0x03eb, 0x03ec, 0x0ff4, 0x0018, 0x0076, 0x07f4, 0x0039,
- 0x0074, 0x03ef, 0x01f3, 0x01f4, 0x07f6, 0x01e8, 0x03ea, 0x1ffc,
- 0x00f2, 0x01f1, 0x0ffb, 0x03f5, 0x07f3, 0x0ffc, 0x00ee, 0x03f7,
- 0x7ffe, 0x01f0, 0x07f5, 0x7ffd, 0x1ffb, 0x3ffa, 0xffff, 0x00f1,
- 0x03f0, 0x3ffc, 0x01ea, 0x03ee, 0x3ffb, 0x0ff6, 0x0ffa, 0x7ffc,
- 0x07f2, 0x0ff5, 0xfffe, 0x03f4, 0x07f7, 0x7ffb, 0x0ff7, 0x0ff9,
- 0x7ffa
-];
-const AAC_SPEC_CB4_BITS: &[u8] = &[
- 4, 5, 8, 5, 4, 8, 9, 8, 11, 5, 5, 8, 5, 4, 8, 8,
- 7, 10, 9, 8, 11, 8, 8, 10, 11, 10, 11, 4, 5, 8, 4, 4,
- 8, 8, 8, 10, 4, 4, 8, 4, 4, 7, 8, 7, 9, 8, 8, 10,
- 7, 7, 9, 10, 9, 10, 8, 8, 11, 8, 7, 10, 11, 10, 12, 8,
- 7, 10, 7, 7, 9, 10, 9, 11, 11, 10, 12, 10, 9, 11, 11, 10,
- 11
-];
-const AAC_SPEC_CB4_CODES: &[u16] = &[
- 0x007, 0x016, 0x0f6, 0x018, 0x008, 0x0ef, 0x1ef, 0x0f3,
- 0x7f8, 0x019, 0x017, 0x0ed, 0x015, 0x001, 0x0e2, 0x0f0,
- 0x070, 0x3f0, 0x1ee, 0x0f1, 0x7fa, 0x0ee, 0x0e4, 0x3f2,
- 0x7f6, 0x3ef, 0x7fd, 0x005, 0x014, 0x0f2, 0x009, 0x004,
- 0x0e5, 0x0f4, 0x0e8, 0x3f4, 0x006, 0x002, 0x0e7, 0x003,
- 0x000, 0x06b, 0x0e3, 0x069, 0x1f3, 0x0eb, 0x0e6, 0x3f6,
- 0x06e, 0x06a, 0x1f4, 0x3ec, 0x1f0, 0x3f9, 0x0f5, 0x0ec,
- 0x7fb, 0x0ea, 0x06f, 0x3f7, 0x7f9, 0x3f3, 0xfff, 0x0e9,
- 0x06d, 0x3f8, 0x06c, 0x068, 0x1f5, 0x3ee, 0x1f2, 0x7f4,
- 0x7f7, 0x3f1, 0xffe, 0x3ed, 0x1f1, 0x7f5, 0x7fe, 0x3f5,
- 0x7fc
-];
-const AAC_SPEC_CB5_BITS: &[u8] = &[
- 13, 12, 11, 11, 10, 11, 11, 12, 13, 12, 11, 10, 9, 8, 9, 10,
- 11, 12, 12, 10, 9, 8, 7, 8, 9, 10, 11, 11, 9, 8, 5, 4,
- 5, 8, 9, 11, 10, 8, 7, 4, 1, 4, 7, 8, 11, 11, 9, 8,
- 5, 4, 5, 8, 9, 11, 11, 10, 9, 8, 7, 8, 9, 10, 11, 12,
- 11, 10, 9, 8, 9, 10, 11, 12, 13, 12, 12, 11, 10, 10, 11, 12,
- 13
-];
-const AAC_SPEC_CB5_CODES: &[u16] = &[
- 0x1fff, 0x0ff7, 0x07f4, 0x07e8, 0x03f1, 0x07ee, 0x07f9, 0x0ff8,
- 0x1ffd, 0x0ffd, 0x07f1, 0x03e8, 0x01e8, 0x00f0, 0x01ec, 0x03ee,
- 0x07f2, 0x0ffa, 0x0ff4, 0x03ef, 0x01f2, 0x00e8, 0x0070, 0x00ec,
- 0x01f0, 0x03ea, 0x07f3, 0x07eb, 0x01eb, 0x00ea, 0x001a, 0x0008,
- 0x0019, 0x00ee, 0x01ef, 0x07ed, 0x03f0, 0x00f2, 0x0073, 0x000b,
- 0x0000, 0x000a, 0x0071, 0x00f3, 0x07e9, 0x07ef, 0x01ee, 0x00ef,
- 0x0018, 0x0009, 0x001b, 0x00eb, 0x01e9, 0x07ec, 0x07f6, 0x03eb,
- 0x01f3, 0x00ed, 0x0072, 0x00e9, 0x01f1, 0x03ed, 0x07f7, 0x0ff6,
- 0x07f0, 0x03e9, 0x01ed, 0x00f1, 0x01ea, 0x03ec, 0x07f8, 0x0ff9,
- 0x1ffc, 0x0ffc, 0x0ff5, 0x07ea, 0x03f3, 0x03f2, 0x07f5, 0x0ffb,
- 0x1ffe
-];
-const AAC_SPEC_CB6_BITS: &[u8] = &[
- 11, 10, 9, 9, 9, 9, 9, 10, 11, 10, 9, 8, 7, 7, 7, 8,
- 9, 10, 9, 8, 6, 6, 6, 6, 6, 8, 9, 9, 7, 6, 4, 4,
- 4, 6, 7, 9, 9, 7, 6, 4, 4, 4, 6, 7, 9, 9, 7, 6,
- 4, 4, 4, 6, 7, 9, 9, 8, 6, 6, 6, 6, 6, 8, 9, 10,
- 9, 8, 7, 7, 7, 7, 8, 10, 11, 10, 9, 9, 9, 9, 9, 10,
- 11
-];
-const AAC_SPEC_CB6_CODES: &[u16] = &[
- 0x7fe, 0x3fd, 0x1f1, 0x1eb, 0x1f4, 0x1ea, 0x1f0, 0x3fc,
- 0x7fd, 0x3f6, 0x1e5, 0x0ea, 0x06c, 0x071, 0x068, 0x0f0,
- 0x1e6, 0x3f7, 0x1f3, 0x0ef, 0x032, 0x027, 0x028, 0x026,
- 0x031, 0x0eb, 0x1f7, 0x1e8, 0x06f, 0x02e, 0x008, 0x004,
- 0x006, 0x029, 0x06b, 0x1ee, 0x1ef, 0x072, 0x02d, 0x002,
- 0x000, 0x003, 0x02f, 0x073, 0x1fa, 0x1e7, 0x06e, 0x02b,
- 0x007, 0x001, 0x005, 0x02c, 0x06d, 0x1ec, 0x1f9, 0x0ee,
- 0x030, 0x024, 0x02a, 0x025, 0x033, 0x0ec, 0x1f2, 0x3f8,
- 0x1e4, 0x0ed, 0x06a, 0x070, 0x069, 0x074, 0x0f1, 0x3fa,
- 0x7ff, 0x3f9, 0x1f6, 0x1ed, 0x1f8, 0x1e9, 0x1f5, 0x3fb,
- 0x7fc
-];
-const AAC_SPEC_CB7_BITS: &[u8] = &[
- 1, 3, 6, 7, 8, 9, 10, 11, 3, 4, 6, 7, 8, 8, 9, 9,
- 6, 6, 7, 8, 8, 9, 9, 10, 7, 7, 8, 8, 9, 9, 10, 10,
- 8, 8, 9, 9, 10, 10, 10, 11, 9, 8, 9, 9, 10, 10, 11, 11,
- 10, 9, 9, 10, 10, 11, 12, 12, 11, 10, 10, 10, 11, 11, 12, 12
-];
-const AAC_SPEC_CB7_CODES: &[u16] = &[
- 0x000, 0x005, 0x037, 0x074, 0x0f2, 0x1eb, 0x3ed, 0x7f7,
- 0x004, 0x00c, 0x035, 0x071, 0x0ec, 0x0ee, 0x1ee, 0x1f5,
- 0x036, 0x034, 0x072, 0x0ea, 0x0f1, 0x1e9, 0x1f3, 0x3f5,
- 0x073, 0x070, 0x0eb, 0x0f0, 0x1f1, 0x1f0, 0x3ec, 0x3fa,
- 0x0f3, 0x0ed, 0x1e8, 0x1ef, 0x3ef, 0x3f1, 0x3f9, 0x7fb,
- 0x1ed, 0x0ef, 0x1ea, 0x1f2, 0x3f3, 0x3f8, 0x7f9, 0x7fc,
- 0x3ee, 0x1ec, 0x1f4, 0x3f4, 0x3f7, 0x7f8, 0xffd, 0xffe,
- 0x7f6, 0x3f0, 0x3f2, 0x3f6, 0x7fa, 0x7fd, 0xffc, 0xfff
-];
-const AAC_SPEC_CB8_BITS: &[u8] = &[
- 5, 4, 5, 6, 7, 8, 9, 10, 4, 3, 4, 5, 6, 7, 7, 8,
- 5, 4, 4, 5, 6, 7, 7, 8, 6, 5, 5, 6, 6, 7, 8, 8,
- 7, 6, 6, 6, 7, 7, 8, 9, 8, 7, 6, 7, 7, 8, 8, 10,
- 9, 7, 7, 8, 8, 8, 9, 9, 10, 8, 8, 8, 9, 9, 9, 10
-];
-const AAC_SPEC_CB8_CODES: &[u16] = &[
- 0x00e, 0x005, 0x010, 0x030, 0x06f, 0x0f1, 0x1fa, 0x3fe,
- 0x003, 0x000, 0x004, 0x012, 0x02c, 0x06a, 0x075, 0x0f8,
- 0x00f, 0x002, 0x006, 0x014, 0x02e, 0x069, 0x072, 0x0f5,
- 0x02f, 0x011, 0x013, 0x02a, 0x032, 0x06c, 0x0ec, 0x0fa,
- 0x071, 0x02b, 0x02d, 0x031, 0x06d, 0x070, 0x0f2, 0x1f9,
- 0x0ef, 0x068, 0x033, 0x06b, 0x06e, 0x0ee, 0x0f9, 0x3fc,
- 0x1f8, 0x074, 0x073, 0x0ed, 0x0f0, 0x0f6, 0x1f6, 0x1fd,
- 0x3fd, 0x0f3, 0x0f4, 0x0f7, 0x1f7, 0x1fb, 0x1fc, 0x3ff
-];
-const AAC_SPEC_CB9_BITS: &[u8] = &[
- 1, 3, 6, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6,
- 7, 8, 8, 9, 10, 10, 10, 11, 12, 12, 6, 6, 7, 8, 8, 9,
- 10, 10, 10, 11, 12, 12, 12, 8, 7, 8, 9, 9, 10, 10, 11, 11,
- 11, 12, 12, 13, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12,
- 13, 10, 9, 9, 10, 11, 11, 11, 12, 11, 12, 12, 13, 13, 11, 9,
- 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 11, 10, 10, 11, 11,
- 12, 12, 13, 13, 13, 13, 13, 13, 11, 10, 10, 11, 11, 11, 12, 12,
- 13, 13, 14, 13, 14, 11, 10, 11, 11, 12, 12, 12, 12, 13, 13, 14,
- 14, 14, 12, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 12,
- 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 13, 12, 12, 12,
- 13, 13, 13, 13, 14, 14, 14, 14, 15
-];
-const AAC_SPEC_CB9_CODES: &[u16] = &[
- 0x0000, 0x0005, 0x0037, 0x00e7, 0x01de, 0x03ce, 0x03d9, 0x07c8,
- 0x07cd, 0x0fc8, 0x0fdd, 0x1fe4, 0x1fec, 0x0004, 0x000c, 0x0035,
- 0x0072, 0x00ea, 0x00ed, 0x01e2, 0x03d1, 0x03d3, 0x03e0, 0x07d8,
- 0x0fcf, 0x0fd5, 0x0036, 0x0034, 0x0071, 0x00e8, 0x00ec, 0x01e1,
- 0x03cf, 0x03dd, 0x03db, 0x07d0, 0x0fc7, 0x0fd4, 0x0fe4, 0x00e6,
- 0x0070, 0x00e9, 0x01dd, 0x01e3, 0x03d2, 0x03dc, 0x07cc, 0x07ca,
- 0x07de, 0x0fd8, 0x0fea, 0x1fdb, 0x01df, 0x00eb, 0x01dc, 0x01e6,
- 0x03d5, 0x03de, 0x07cb, 0x07dd, 0x07dc, 0x0fcd, 0x0fe2, 0x0fe7,
- 0x1fe1, 0x03d0, 0x01e0, 0x01e4, 0x03d6, 0x07c5, 0x07d1, 0x07db,
- 0x0fd2, 0x07e0, 0x0fd9, 0x0feb, 0x1fe3, 0x1fe9, 0x07c4, 0x01e5,
- 0x03d7, 0x07c6, 0x07cf, 0x07da, 0x0fcb, 0x0fda, 0x0fe3, 0x0fe9,
- 0x1fe6, 0x1ff3, 0x1ff7, 0x07d3, 0x03d8, 0x03e1, 0x07d4, 0x07d9,
- 0x0fd3, 0x0fde, 0x1fdd, 0x1fd9, 0x1fe2, 0x1fea, 0x1ff1, 0x1ff6,
- 0x07d2, 0x03d4, 0x03da, 0x07c7, 0x07d7, 0x07e2, 0x0fce, 0x0fdb,
- 0x1fd8, 0x1fee, 0x3ff0, 0x1ff4, 0x3ff2, 0x07e1, 0x03df, 0x07c9,
- 0x07d6, 0x0fca, 0x0fd0, 0x0fe5, 0x0fe6, 0x1feb, 0x1fef, 0x3ff3,
- 0x3ff4, 0x3ff5, 0x0fe0, 0x07ce, 0x07d5, 0x0fc6, 0x0fd1, 0x0fe1,
- 0x1fe0, 0x1fe8, 0x1ff0, 0x3ff1, 0x3ff8, 0x3ff6, 0x7ffc, 0x0fe8,
- 0x07df, 0x0fc9, 0x0fd7, 0x0fdc, 0x1fdc, 0x1fdf, 0x1fed, 0x1ff5,
- 0x3ff9, 0x3ffb, 0x7ffd, 0x7ffe, 0x1fe7, 0x0fcc, 0x0fd6, 0x0fdf,
- 0x1fde, 0x1fda, 0x1fe5, 0x1ff2, 0x3ffa, 0x3ff7, 0x3ffc, 0x3ffd,
- 0x7fff
-];
-const AAC_SPEC_CB10_BITS: &[u8] = &[
- 6, 5, 6, 6, 7, 8, 9, 10, 10, 10, 11, 11, 12, 5, 4, 4,
- 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 6, 4, 5, 5, 6, 6,
- 7, 8, 8, 9, 9, 10, 10, 6, 5, 5, 5, 6, 7, 7, 8, 8,
- 9, 9, 10, 10, 7, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10,
- 10, 8, 7, 6, 7, 7, 7, 8, 8, 8, 9, 10, 10, 11, 9, 7,
- 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 9, 8, 8, 8, 8,
- 8, 9, 9, 9, 10, 10, 11, 11, 9, 8, 8, 8, 8, 8, 9, 9,
- 10, 10, 10, 11, 11, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 11,
- 11, 12, 10, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 11,
- 10, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 11, 10, 10, 10,
- 10, 10, 10, 11, 11, 12, 12, 12, 12
-];
-const AAC_SPEC_CB10_CODES: &[u16] = &[
- 0x022, 0x008, 0x01d, 0x026, 0x05f, 0x0d3, 0x1cf, 0x3d0,
- 0x3d7, 0x3ed, 0x7f0, 0x7f6, 0xffd, 0x007, 0x000, 0x001,
- 0x009, 0x020, 0x054, 0x060, 0x0d5, 0x0dc, 0x1d4, 0x3cd,
- 0x3de, 0x7e7, 0x01c, 0x002, 0x006, 0x00c, 0x01e, 0x028,
- 0x05b, 0x0cd, 0x0d9, 0x1ce, 0x1dc, 0x3d9, 0x3f1, 0x025,
- 0x00b, 0x00a, 0x00d, 0x024, 0x057, 0x061, 0x0cc, 0x0dd,
- 0x1cc, 0x1de, 0x3d3, 0x3e7, 0x05d, 0x021, 0x01f, 0x023,
- 0x027, 0x059, 0x064, 0x0d8, 0x0df, 0x1d2, 0x1e2, 0x3dd,
- 0x3ee, 0x0d1, 0x055, 0x029, 0x056, 0x058, 0x062, 0x0ce,
- 0x0e0, 0x0e2, 0x1da, 0x3d4, 0x3e3, 0x7eb, 0x1c9, 0x05e,
- 0x05a, 0x05c, 0x063, 0x0ca, 0x0da, 0x1c7, 0x1ca, 0x1e0,
- 0x3db, 0x3e8, 0x7ec, 0x1e3, 0x0d2, 0x0cb, 0x0d0, 0x0d7,
- 0x0db, 0x1c6, 0x1d5, 0x1d8, 0x3ca, 0x3da, 0x7ea, 0x7f1,
- 0x1e1, 0x0d4, 0x0cf, 0x0d6, 0x0de, 0x0e1, 0x1d0, 0x1d6,
- 0x3d1, 0x3d5, 0x3f2, 0x7ee, 0x7fb, 0x3e9, 0x1cd, 0x1c8,
- 0x1cb, 0x1d1, 0x1d7, 0x1df, 0x3cf, 0x3e0, 0x3ef, 0x7e6,
- 0x7f8, 0xffa, 0x3eb, 0x1dd, 0x1d3, 0x1d9, 0x1db, 0x3d2,
- 0x3cc, 0x3dc, 0x3ea, 0x7ed, 0x7f3, 0x7f9, 0xff9, 0x7f2,
- 0x3ce, 0x1e4, 0x3cb, 0x3d8, 0x3d6, 0x3e2, 0x3e5, 0x7e8,
- 0x7f4, 0x7f5, 0x7f7, 0xffb, 0x7fa, 0x3ec, 0x3df, 0x3e1,
- 0x3e4, 0x3e6, 0x3f0, 0x7e9, 0x7ef, 0xff8, 0xffe, 0xffc,
- 0xfff
-];
-const AAC_SPEC_CB11_BITS: &[u8] = &[
- 4, 5, 6, 7, 8, 8, 9, 10, 10, 10, 11, 11, 12, 11, 12, 12,
- 10, 5, 4, 5, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10,
- 11, 8, 6, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10,
- 10, 10, 8, 7, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10,
- 10, 10, 10, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9,
- 10, 10, 10, 10, 8, 8, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9,
- 9, 10, 10, 10, 10, 8, 9, 8, 8, 8, 8, 8, 8, 8, 9, 9,
- 9, 10, 10, 10, 10, 10, 8, 9, 8, 8, 8, 8, 8, 8, 9, 9,
- 9, 10, 10, 10, 10, 10, 10, 8, 10, 9, 8, 8, 9, 9, 9, 9,
- 9, 10, 10, 10, 10, 10, 10, 11, 8, 10, 9, 9, 9, 9, 9, 9,
- 9, 10, 10, 10, 10, 10, 10, 11, 11, 8, 11, 9, 9, 9, 9, 9,
- 9, 10, 10, 10, 10, 10, 11, 10, 11, 11, 8, 11, 10, 9, 9, 10,
- 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 9, 11, 10, 9,
- 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 9, 11, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 9, 12,
- 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 9,
- 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
- 5
-];
-const AAC_SPEC_CB11_CODES: &[u16] = &[
- 0x000, 0x006, 0x019, 0x03d, 0x09c, 0x0c6, 0x1a7, 0x390,
- 0x3c2, 0x3df, 0x7e6, 0x7f3, 0xffb, 0x7ec, 0xffa, 0xffe,
- 0x38e, 0x005, 0x001, 0x008, 0x014, 0x037, 0x042, 0x092,
- 0x0af, 0x191, 0x1a5, 0x1b5, 0x39e, 0x3c0, 0x3a2, 0x3cd,
- 0x7d6, 0x0ae, 0x017, 0x007, 0x009, 0x018, 0x039, 0x040,
- 0x08e, 0x0a3, 0x0b8, 0x199, 0x1ac, 0x1c1, 0x3b1, 0x396,
- 0x3be, 0x3ca, 0x09d, 0x03c, 0x015, 0x016, 0x01a, 0x03b,
- 0x044, 0x091, 0x0a5, 0x0be, 0x196, 0x1ae, 0x1b9, 0x3a1,
- 0x391, 0x3a5, 0x3d5, 0x094, 0x09a, 0x036, 0x038, 0x03a,
- 0x041, 0x08c, 0x09b, 0x0b0, 0x0c3, 0x19e, 0x1ab, 0x1bc,
- 0x39f, 0x38f, 0x3a9, 0x3cf, 0x093, 0x0bf, 0x03e, 0x03f,
- 0x043, 0x045, 0x09e, 0x0a7, 0x0b9, 0x194, 0x1a2, 0x1ba,
- 0x1c3, 0x3a6, 0x3a7, 0x3bb, 0x3d4, 0x09f, 0x1a0, 0x08f,
- 0x08d, 0x090, 0x098, 0x0a6, 0x0b6, 0x0c4, 0x19f, 0x1af,
- 0x1bf, 0x399, 0x3bf, 0x3b4, 0x3c9, 0x3e7, 0x0a8, 0x1b6,
- 0x0ab, 0x0a4, 0x0aa, 0x0b2, 0x0c2, 0x0c5, 0x198, 0x1a4,
- 0x1b8, 0x38c, 0x3a4, 0x3c4, 0x3c6, 0x3dd, 0x3e8, 0x0ad,
- 0x3af, 0x192, 0x0bd, 0x0bc, 0x18e, 0x197, 0x19a, 0x1a3,
- 0x1b1, 0x38d, 0x398, 0x3b7, 0x3d3, 0x3d1, 0x3db, 0x7dd,
- 0x0b4, 0x3de, 0x1a9, 0x19b, 0x19c, 0x1a1, 0x1aa, 0x1ad,
- 0x1b3, 0x38b, 0x3b2, 0x3b8, 0x3ce, 0x3e1, 0x3e0, 0x7d2,
- 0x7e5, 0x0b7, 0x7e3, 0x1bb, 0x1a8, 0x1a6, 0x1b0, 0x1b2,
- 0x1b7, 0x39b, 0x39a, 0x3ba, 0x3b5, 0x3d6, 0x7d7, 0x3e4,
- 0x7d8, 0x7ea, 0x0ba, 0x7e8, 0x3a0, 0x1bd, 0x1b4, 0x38a,
- 0x1c4, 0x392, 0x3aa, 0x3b0, 0x3bc, 0x3d7, 0x7d4, 0x7dc,
- 0x7db, 0x7d5, 0x7f0, 0x0c1, 0x7fb, 0x3c8, 0x3a3, 0x395,
- 0x39d, 0x3ac, 0x3ae, 0x3c5, 0x3d8, 0x3e2, 0x3e6, 0x7e4,
- 0x7e7, 0x7e0, 0x7e9, 0x7f7, 0x190, 0x7f2, 0x393, 0x1be,
- 0x1c0, 0x394, 0x397, 0x3ad, 0x3c3, 0x3c1, 0x3d2, 0x7da,
- 0x7d9, 0x7df, 0x7eb, 0x7f4, 0x7fa, 0x195, 0x7f8, 0x3bd,
- 0x39c, 0x3ab, 0x3a8, 0x3b3, 0x3b9, 0x3d0, 0x3e3, 0x3e5,
- 0x7e2, 0x7de, 0x7ed, 0x7f1, 0x7f9, 0x7fc, 0x193, 0xffd,
- 0x3dc, 0x3b6, 0x3c7, 0x3cc, 0x3cb, 0x3d9, 0x3da, 0x7d3,
- 0x7e1, 0x7ee, 0x7ef, 0x7f5, 0x7f6, 0xffc, 0xfff, 0x19d,
- 0x1c2, 0x0b5, 0x0a1, 0x096, 0x097, 0x095, 0x099, 0x0a0,
- 0x0a2, 0x0ac, 0x0a9, 0x0b1, 0x0b3, 0x0bb, 0x0c0, 0x18f,
- 0x004
-];
-
-const AAC_SPEC_BITS: [&[u8]; 11] = [
- AAC_SPEC_CB1_BITS, AAC_SPEC_CB2_BITS, AAC_SPEC_CB3_BITS, AAC_SPEC_CB4_BITS,
- AAC_SPEC_CB5_BITS, AAC_SPEC_CB6_BITS, AAC_SPEC_CB7_BITS, AAC_SPEC_CB8_BITS,
- AAC_SPEC_CB9_BITS, AAC_SPEC_CB10_BITS, AAC_SPEC_CB11_BITS
-];
-const AAC_SPEC_CODES: [&[u16]; 11] = [
- AAC_SPEC_CB1_CODES, AAC_SPEC_CB2_CODES, AAC_SPEC_CB3_CODES, AAC_SPEC_CB4_CODES,
- AAC_SPEC_CB5_CODES, AAC_SPEC_CB6_CODES, AAC_SPEC_CB7_CODES, AAC_SPEC_CB8_CODES,
- AAC_SPEC_CB9_CODES, AAC_SPEC_CB10_CODES, AAC_SPEC_CB11_CODES
-];
-const AAC_UNSIGNED_CODEBOOK: [bool; 11] = [
- false, false, true, true, false, false, true, true, true, true, true
-];
-const AAC_CODEBOOK_MODULO: [u16; 7] = [
- 9, 9, 8, 8, 13, 13, 17
-];
-
-const AAC_QUADS: [[i8; 4]; 81] = [
- [ 0, 0, 0, 0 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 2 ],
- [ 0, 0, 1, 0 ], [ 0, 0, 1, 1 ], [ 0, 0, 1, 2 ],
- [ 0, 0, 2, 0 ], [ 0, 0, 2, 1 ], [ 0, 0, 2, 2 ],
- [ 0, 1, 0, 0 ], [ 0, 1, 0, 1 ], [ 0, 1, 0, 2 ],
- [ 0, 1, 1, 0 ], [ 0, 1, 1, 1 ], [ 0, 1, 1, 2 ],
- [ 0, 1, 2, 0 ], [ 0, 1, 2, 1 ], [ 0, 1, 2, 2 ],
- [ 0, 2, 0, 0 ], [ 0, 2, 0, 1 ], [ 0, 2, 0, 2 ],
- [ 0, 2, 1, 0 ], [ 0, 2, 1, 1 ], [ 0, 2, 1, 2 ],
- [ 0, 2, 2, 0 ], [ 0, 2, 2, 1 ], [ 0, 2, 2, 2 ],
- [ 1, 0, 0, 0 ], [ 1, 0, 0, 1 ], [ 1, 0, 0, 2 ],
- [ 1, 0, 1, 0 ], [ 1, 0, 1, 1 ], [ 1, 0, 1, 2 ],
- [ 1, 0, 2, 0 ], [ 1, 0, 2, 1 ], [ 1, 0, 2, 2 ],
- [ 1, 1, 0, 0 ], [ 1, 1, 0, 1 ], [ 1, 1, 0, 2 ],
- [ 1, 1, 1, 0 ], [ 1, 1, 1, 1 ], [ 1, 1, 1, 2 ],
- [ 1, 1, 2, 0 ], [ 1, 1, 2, 1 ], [ 1, 1, 2, 2 ],
- [ 1, 2, 0, 0 ], [ 1, 2, 0, 1 ], [ 1, 2, 0, 2 ],
- [ 1, 2, 1, 0 ], [ 1, 2, 1, 1 ], [ 1, 2, 1, 2 ],
- [ 1, 2, 2, 0 ], [ 1, 2, 2, 1 ], [ 1, 2, 2, 2 ],
- [ 2, 0, 0, 0 ], [ 2, 0, 0, 1 ], [ 2, 0, 0, 2 ],
- [ 2, 0, 1, 0 ], [ 2, 0, 1, 1 ], [ 2, 0, 1, 2 ],
- [ 2, 0, 2, 0 ], [ 2, 0, 2, 1 ], [ 2, 0, 2, 2 ],
- [ 2, 1, 0, 0 ], [ 2, 1, 0, 1 ], [ 2, 1, 0, 2 ],
- [ 2, 1, 1, 0 ], [ 2, 1, 1, 1 ], [ 2, 1, 1, 2 ],
- [ 2, 1, 2, 0 ], [ 2, 1, 2, 1 ], [ 2, 1, 2, 2 ],
- [ 2, 2, 0, 0 ], [ 2, 2, 0, 1 ], [ 2, 2, 0, 2 ],
- [ 2, 2, 1, 0 ], [ 2, 2, 1, 1 ], [ 2, 2, 1, 2 ],
- [ 2, 2, 2, 0 ], [ 2, 2, 2, 1 ], [ 2, 2, 2, 2 ],
-];
-
-const DEFAULT_CHANNEL_MAP: [&str; 9] = [
- "",
- "C",
- "L,R",
- "C,L,R",
- "C,L,R,Cs",
- "C,L,R,Ls,Rs",
- "C,L,R,Ls,Rs,LFE",
- "",
- "C,L,R,Ls,Rs,Lss,Rss,LFE",
-];
-
-const SWB_OFFSET_48K_LONG: [usize; 49+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 48, 56, 64, 72, 80,
- 88, 96, 108, 120, 132, 144, 160, 176,
- 196, 216, 240, 264, 292, 320, 352, 384,
- 416, 448, 480, 512, 544, 576, 608, 640,
- 672, 704, 736, 768, 800, 832, 864, 896,
- 928, 1024
-];
-const SWB_OFFSET_48K_SHORT: [usize; 14+1] = [
- 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128
-];
-const SWB_OFFSET_32K_LONG: [usize; 51+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 48, 56, 64, 72, 80,
- 88, 96, 108, 120, 132, 144, 160, 176,
- 196, 216, 240, 264, 292, 320, 352, 384,
- 416, 448, 480, 512, 544, 576, 608, 640,
- 672, 704, 736, 768, 800, 832, 864, 896,
- 928, 960, 992, 1024
-];
-const SWB_OFFSET_8K_LONG: [usize; 40+1] = [
- 0, 12, 24, 36, 48, 60, 72, 84,
- 96, 108, 120, 132, 144, 156, 172, 188,
- 204, 220, 236, 252, 268, 288, 308, 328,
- 348, 372, 396, 420, 448, 476, 508, 544,
- 580, 620, 664, 712, 764, 820, 880, 944,
- 1024
-];
-const SWB_OFFSET_8K_SHORT: [usize; 15+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128
-];
-const SWB_OFFSET_16K_LONG: [usize; 43+1] = [
- 0, 8, 16, 24, 32, 40, 48, 56,
- 64, 72, 80, 88, 100, 112, 124, 136,
- 148, 160, 172, 184, 196, 212, 228, 244,
- 260, 280, 300, 320, 344, 368, 396, 424,
- 456, 492, 532, 572, 616, 664, 716, 772,
- 832, 896, 960, 1024
-];
-const SWB_OFFSET_16K_SHORT: [usize; 15+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128
-];
-const SWB_OFFSET_24K_LONG: [usize; 47+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 44, 52, 60, 68, 76,
- 84, 92, 100, 108, 116, 124, 136, 148,
- 160, 172, 188, 204, 220, 240, 260, 284,
- 308, 336, 364, 396, 432, 468, 508, 552,
- 600, 652, 704, 768, 832, 896, 960, 1024
-];
-const SWB_OFFSET_24K_SHORT: [usize; 15+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128
-];
-const SWB_OFFSET_64K_LONG: [usize; 47+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 44, 48, 52, 56, 64,
- 72, 80, 88, 100, 112, 124, 140, 156,
- 172, 192, 216, 240, 268, 304, 344, 384,
- 424, 464, 504, 544, 584, 624, 664, 704,
- 744, 784, 824, 864, 904, 944, 984, 1024
-];
-const SWB_OFFSET_64K_SHORT: [usize; 12+1] = [
- 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
-];
-const SWB_OFFSET_96K_LONG: [usize; 41+1] = [
- 0, 4, 8, 12, 16, 20, 24, 28,
- 32, 36, 40, 44, 48, 52, 56, 64,
- 72, 80, 88, 96, 108, 120, 132, 144,
- 156, 172, 188, 212, 240, 276, 320, 384,
- 448, 512, 576, 640, 704, 768, 832, 896,
- 960, 1024
-];
-
-#[derive(Clone,Copy)]
-struct GASubbandInfo {
- min_srate: u32,
- long_bands: &'static [usize],
- short_bands: &'static [usize],
-}
-
-impl GASubbandInfo {
- fn find(srate: u32) -> GASubbandInfo {
- for i in 0..AAC_SUBBAND_INFO.len() {
- if srate >= AAC_SUBBAND_INFO[i].min_srate {
- return AAC_SUBBAND_INFO[i];
- }
- }
- unreachable!("")
- }
- fn find_idx(srate: u32) -> usize {
- for i in 0..AAC_SUBBAND_INFO.len() {
- if srate >= AAC_SUBBAND_INFO[i].min_srate {
- return i;
- }
- }
- unreachable!("")
- }
-}
-
-const AAC_SUBBAND_INFO: [GASubbandInfo; 12] = [
- GASubbandInfo { min_srate: 92017, long_bands: &SWB_OFFSET_96K_LONG, short_bands: &SWB_OFFSET_64K_SHORT }, //96K
- GASubbandInfo { min_srate: 75132, long_bands: &SWB_OFFSET_96K_LONG, short_bands: &SWB_OFFSET_64K_SHORT }, //88.2K
- GASubbandInfo { min_srate: 55426, long_bands: &SWB_OFFSET_64K_LONG, short_bands: &SWB_OFFSET_64K_SHORT }, //64K
- GASubbandInfo { min_srate: 46009, long_bands: &SWB_OFFSET_48K_LONG, short_bands: &SWB_OFFSET_48K_SHORT }, //48K
- GASubbandInfo { min_srate: 37566, long_bands: &SWB_OFFSET_48K_LONG, short_bands: &SWB_OFFSET_48K_SHORT }, //44.1K
- GASubbandInfo { min_srate: 27713, long_bands: &SWB_OFFSET_32K_LONG, short_bands: &SWB_OFFSET_48K_SHORT }, //32K
- GASubbandInfo { min_srate: 23004, long_bands: &SWB_OFFSET_24K_LONG, short_bands: &SWB_OFFSET_24K_SHORT }, //24K
- GASubbandInfo { min_srate: 18783, long_bands: &SWB_OFFSET_24K_LONG, short_bands: &SWB_OFFSET_24K_SHORT }, //22.05K
- GASubbandInfo { min_srate: 13856, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //16K
- GASubbandInfo { min_srate: 11502, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //12K
- GASubbandInfo { min_srate: 9391, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //11.025K
- GASubbandInfo { min_srate: 0, long_bands: &SWB_OFFSET_8K_LONG, short_bands: &SWB_OFFSET_8K_SHORT }, //8K
-];
diff --git a/src/codecs/atrac3.rs b/src/codecs/atrac3.rs
deleted file mode 100644
index 5281892..0000000
--- a/src/codecs/atrac3.rs
+++ /dev/null
@@ -1,765 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use super::*;
-use crate::io::bitreader::*;
-use crate::io::byteio::*;
-use crate::io::codebook::*;
-use crate::dsp::fft::FFTMode;
-use crate::dsp::mdct::IMDCT;
-use std::f32::consts;
-
-#[derive(Clone,Copy,PartialEq)]
-enum Mode {
- Mono,
- Stereo,
- JointStereo,
-}
-
-const ATRAC3_FRAME_SIZE: usize = 1024;
-
-#[derive(Clone,Copy)]
-struct Tone {
- pos: usize,
- ncoeffs: usize,
- coeffs: [f32; 8],
-}
-
-struct GainData {
- ngains: [usize; 4],
- gain_lev: [[usize; 8]; 4],
- gain_loc: [[usize; 8]; 4],
-}
-
-impl GainData {
- fn new() -> Self {
- Self {
- ngains: [0; 4],
- gain_lev: [[0; 8]; 4],
- gain_loc: [[0; 8]; 4],
- }
- }
- fn read(&mut self, br: &mut BitReader, bands: usize) -> DecoderResult<()> {
- self.ngains = [0; 4];
- for band in 0..bands {
- self.ngains[band] = br.read(3)? as usize;
- for i in 0..self.ngains[band] {
- self.gain_lev[band][i] = br.read(4)? as usize;
- self.gain_loc[band][i] = br.read(5)? as usize;
- }
- }
- Ok(())
- }
-}
-
-struct Channel {
- data: [f32; ATRAC3_FRAME_SIZE],
- delay: [f32; ATRAC3_FRAME_SIZE],
- qmf_delay: [f32; 64 * 3],
-
- bands: usize,
- block_no: usize,
-
- gain_data: [GainData; 2],
-
- subbands: usize,
- components: usize,
- ntones: usize,
- tones: [Tone; 64],
-}
-
-impl Channel {
- fn new() -> Self {
- Self {
- data: [0.0; ATRAC3_FRAME_SIZE],
- delay: [0.0; ATRAC3_FRAME_SIZE],
- qmf_delay: [0.0; 64 * 3],
-
- bands: 0,
- block_no: 0,
-
- gain_data: [GainData::new(), GainData::new()],
-
- subbands: 0,
- components: 0,
- ntones: 0,
- tones: [Tone {pos: 0, ncoeffs: 0, coeffs: [0.0; 8]}; 64],
- }
- }
- fn decode_unit(&mut self, br: &mut BitReader, codebooks: &[Codebook<u8>; 7], scalefactors: &[f32; 64]) -> DecoderResult<()> {
- self.bands = (br.read(2)? as usize) + 1;
- self.gain_data[self.block_no].read(br, self.bands)?;
- self.data = [0.0; ATRAC3_FRAME_SIZE];
-
- self.ntones = 0;
- self.components = br.read(5)? as usize;
- if self.components > 0 {
- let selector = br.read(2)?;
- validate!(selector != 2);
- let mut mode0 = (selector & 1) != 0;
-
- for _ in 0..self.components {
- let mut flags: [bool; 4] = [false; 4];
- for band in 0..self.bands {
- flags[band] = br.read_bool()?;
- }
- let nvals = br.read(3)? as usize;
- let quant = br.read(3)? as usize;
- validate!(quant > 1);
- if selector == 3 {
- mode0 = br.read_bool()?;
- }
- for j in 0..self.bands*4 {
- if !flags[j >> 2] { continue; }
- let count = br.read(3)? as usize;
- validate!(self.ntones + count < 64);
- for _ in 0..count {
- let scale_idx = br.read(6)? as usize;
- let tone = &mut self.tones[self.ntones];
- tone.pos = (br.read(6)? as usize) + j * 64;
- tone.ncoeffs = (ATRAC3_FRAME_SIZE - tone.pos).min(nvals + 1);
- let scale = scalefactors[scale_idx] * ATRAC3_MAX_QUANT[quant];
- read_coeffs(br, codebooks, &mut tone.coeffs[..tone.ncoeffs], quant, scale, mode0)?;
- self.ntones += 1;
- }
- }
- }
- }
-
- // spectrum
- let mut quants: [usize; 32] = [0; 32];
- let mut scf: [usize; 32] = [0; 32];
- self.subbands = (br.read(5)? as usize) + 1;
- let mode0 = br.read_bool()?;
- for i in 0..self.subbands {
- quants[i] = br.read(3)? as usize;
- }
- for i in 0..self.subbands {
- if quants[i] == 0 { continue; }
- scf[i] = br.read(6)? as usize;
- }
-
- self.data = [0.0; ATRAC3_FRAME_SIZE];
- for i in 0..self.subbands {
- if quants[i] == 0 { continue; }
- let start = ATRAC3_SUBBANDS[i];
- let end = ATRAC3_SUBBANDS[i + 1];
- let scale = scalefactors[scf[i]] * ATRAC3_MAX_QUANT[quants[i]];
- read_coeffs(br, codebooks, &mut self.data[start..end], quants[i], scale, mode0)?;
- }
-
- for i in 0..self.ntones {
- let tone = &self.tones[i];
- for j in 0..tone.ncoeffs {
- self.data[tone.pos + j] += tone.coeffs[j];
- }
- }
- Ok(())
- }
- fn synth(&mut self, dsp: &mut DSP) {
- let mut flag = 0;
- let mut band = 0;
- for (data, delay) in self.data.chunks_mut(256).zip(self.delay.chunks_mut(256)) {
- if (flag & 1) != 0 {
- for i in 0..128 {
- let t0 = data[i];
- let t1 = data[255 - i];
- data[i] = t1;
- data[255 - i] = t0;
- }
- }
- dsp.synth_band(data);
- dsp.apply_gains(data, delay, &mut self.gain_data, self.block_no, band);
- delay.copy_from_slice(&dsp.tmp[256..512]);
- flag ^= 1;
- band += 1;
- }
- self.block_no ^= 1;
- }
- fn do_qmf(&mut self, dsp: &mut DSP, dst: &mut [f32]) {
- let mut qchunks = self.qmf_delay.chunks_mut(64);
- let qmf0 = qchunks.next().unwrap();
- let qmf1 = qchunks.next().unwrap();
- let qmf2 = qchunks.next().unwrap();
- {
- let mut tchunks = self.data.chunks_mut(512);
- let tmp0 = tchunks.next().unwrap();
- let tmp1 = tchunks.next().unwrap();
- dsp.do_qmf(tmp0, qmf0, false);
- dsp.do_qmf(tmp1, qmf1, true);
- }
- dsp.do_qmf_out(dst, &self.data, qmf2);
- }
-}
-
-const ATRAC3_DEFAULT_DELAY: usize = 2190;
-const ATRAC3_WEIGHTING_DELAYS: [u8; 6] = [ 0, 7, 0, 7, 0, 7 ];
-
-fn read_coeffs(br: &mut BitReader, cb: &[Codebook<u8>; 7], dst: &mut [f32], quant: usize, scale: f32, mode0: bool) -> DecoderResult<()> {
- if mode0 {
- read_coeffs_mode0(br, dst, quant, scale)
- } else if quant == 1 {
- read_coeffs_mode1(br, &cb[0], dst, scale)
- } else {
- read_coeffs_other(br, &cb[quant - 1], dst, scale)
- }
-}
-
-const ATRAC3_MODE0_CB: [f32; 4] = [ 0.0, 1.0, -2.0, -1.0 ];
-const ATRAC3_MODE0_BITS: [u8; 8] = [ 0, 4, 3, 3, 4, 4, 5, 6 ];
-
-fn read_coeffs_mode0(br: &mut BitReader, dst: &mut [f32], quant: usize, scale: f32) -> DecoderResult<()> {
- let bits = ATRAC3_MODE0_BITS[quant];
- if bits > 0 {
- for i in 0..dst.len() {
- let val = br.read_s(bits)? as f32;
- dst[i] = val * scale;
- }
- } else {
- for i in (0..dst.len()).step_by(2) {
- let val = br.read(4)? as usize;
- dst[i + 0] = ATRAC3_MODE0_CB[val >> 2] * scale;
- dst[i + 1] = ATRAC3_MODE0_CB[val & 3] * scale;
- }
- }
- Ok(())
-}
-
-const ATRAC3_MODE1_CB: [f32; 9 * 2] = [
- 0.0, 0.0,
- 0.0, 1.0,
- 0.0, -1.0,
- 1.0, 0.0,
- -1.0, 0.0,
- 1.0, 1.0,
- 1.0, -1.0,
- -1.0, 1.0,
- -1.0, -1.0
-];
-
-fn read_coeffs_mode1(br: &mut BitReader, cb: &Codebook<u8>, dst: &mut [f32], scale: f32) -> DecoderResult<()> {
- for i in (0..dst.len()).step_by(2) {
- let val = br.read_cb(cb)? as usize;
- dst[i + 0] = ATRAC3_MODE1_CB[val * 2 + 0] * scale;
- dst[i + 1] = ATRAC3_MODE1_CB[val * 2 + 1] * scale;
- }
- Ok(())
-}
-
-fn read_coeffs_other(br: &mut BitReader, cb: &Codebook<u8>, dst: &mut [f32], scale: f32) -> DecoderResult<()> {
- for i in 0..dst.len() {
- let val = (br.read_cb(cb)? as i8) + 1;
- let sign = (val & 1) != 0;
- let coef = (if sign { -(val >> 1) } else { val >> 1 }) as f32;
- dst[i] = coef * scale;
- }
- Ok(())
-}
-
-struct DSP {
- imdct: IMDCT,
- window: [f32; 512],
- gain_tab: [f32; 16],
- gain_tab2: [f32; 32],
- tmp: [f32; ATRAC3_FRAME_SIZE + 64],
-}
-
-impl DSP {
- fn new() -> Self {
- let mut gain_tab: [f32; 16] = [0.0; 16];
- let mut gain_tab2: [f32; 32] = [0.0; 32];
-
- for i in 0..16 {
- gain_tab[i] = 2.0f32.powf(4.0 - (i as f32));
- }
- for i in 0..32 {
- gain_tab2[i] = 2.0f32.powf(((i as f32) - 15.0) * -0.125);
- }
-
- let mut tmpw: [f32; 256] = [0.0; 256];
- for i in 0..tmpw.len() {
- tmpw[i] = (((((i as f32) + 0.5) / 256.0 - 0.5) * consts::PI).sin() + 1.0) * 0.5;
- }
-
- let mut window: [f32; 512] = [0.0; 512];
- for i in 0..tmpw.len() {
- let w = tmpw[i] / (tmpw[i] * tmpw[i] + tmpw[255 - i] * tmpw[255 - i]);
- window[i] = w;
- window[512 - 1 - i] = w;
- }
-
- Self {
- imdct: IMDCT::new(FFTMode::SplitRadix, 512, false),
- tmp: [0.0; ATRAC3_FRAME_SIZE + 64],
- gain_tab, gain_tab2, window,
- }
- }
- fn synth_band(&mut self, src: &[f32]) {
- let dst = &mut self.tmp;
- self.imdct.imdct(src, dst);
- for i in 0..512 {
- dst[i] *= self.window[i];
- }
- }
- fn apply_gains(&mut self, dst: &mut [f32], delay: &[f32], gain_data: &mut [GainData; 2], block_no: usize, band: usize) {
- let prev_ngains = gain_data[block_no ^ 1].ngains[band];
- let gain1 = if gain_data[block_no].ngains[band] > 0 {
- self.gain_tab[gain_data[block_no].gain_lev[band][0]]
- } else { 1.0 };
-
- if prev_ngains == 0 {
- for i in 0..256 {
- dst[i] = self.tmp[i] * gain1 + delay[i];
- }
- return;
- }
-
- gain_data[block_no ^ 1].gain_lev[band][prev_ngains] = 4;
- gain_data[block_no ^ 1].gain_loc[band][prev_ngains] = 32;
-
- let mut off = 0;
- for i in 0..prev_ngains {
- let start = gain_data[block_no ^ 1].gain_loc[band][i] * 8;
- let end = start + 8;
-
- let mut gain2 = self.gain_tab [gain_data[block_no ^ 1].gain_lev[band][i]];
- let gain_inc = self.gain_tab2[gain_data[block_no ^ 1].gain_lev[band][i + 1] + 15 -
- gain_data[block_no ^ 1].gain_lev[band][i]];
-
- while off < start {
- dst[off] = (self.tmp[off] * gain1 + delay[off]) * gain2;
- off += 1;
- }
- while off < end {
- dst[off] = (self.tmp[off] * gain1 + delay[off]) * gain2;
- gain2 *= gain_inc;
- off += 1;
- }
- }
- for i in off..256 {
- dst[i] = self.tmp[i] * gain1 + delay[i];
- }
- }
- fn qmf_prepare(&mut self, src: &[f32], delay: &[f32], size: usize, swap: bool) {
- for i in 0..46 {
- self.tmp[i] = delay[i];
- }
- let (s0, s1) = if !swap {
- (&src[0..], &src[size/2..])
- } else {
- (&src[size/2..], &src[0..])
- };
- for i in (0..size).step_by(4) {
- self.tmp[46 + i + 0] = s0[i / 2 + 0] + s1[i / 2 + 0];
- self.tmp[46 + i + 1] = s0[i / 2 + 0] - s1[i / 2 + 0];
- self.tmp[46 + i + 2] = s0[i / 2 + 1] + s1[i / 2 + 1];
- self.tmp[46 + i + 3] = s0[i / 2 + 1] - s1[i / 2 + 1];
- }
- }
- fn qmf_synth(&mut self, dst: &mut [f32], size: usize) {
- for i in (0..size).step_by(2) {
- let mut acc0 = 0.0;
- let mut acc1 = 0.0;
-
- for j in (0..ATRAC3_QMF_FILTER.len()).step_by(2) {
- acc0 += self.tmp[i + j + 0] * ATRAC3_QMF_FILTER[j + 0];
- acc1 += self.tmp[i + j + 1] * ATRAC3_QMF_FILTER[j + 1];
- }
- dst[i + 0] = acc1 * consts::SQRT_2 / 256.0;
- dst[i + 1] = acc0 * consts::SQRT_2 / 256.0;
- }
- }
- fn do_qmf(&mut self, dst: &mut [f32], delay: &mut [f32], swap: bool) {
- self.qmf_prepare(dst, delay, 512, swap);
- self.qmf_synth(dst, 512);
- for i in 0..46 {
- delay[i] = self.tmp[512 + i];
- }
- }
- fn do_qmf_out(&mut self, dst: &mut [f32], src: &[f32], delay: &mut [f32]) {
- self.qmf_prepare(src, delay, 1024, false);
- self.qmf_synth(dst, 1024);
- for i in 0..46 {
- delay[i] = self.tmp[1024 + i];
- }
- }
-}
-
-struct Atrac3Decoder {
- info: Rc<NACodecInfo>,
- channels: usize,
- chmap: NAChannelMap,
- samples: usize,
- mode: Mode,
- scrambled: bool,
-
- codebooks: [Codebook<u8>; 7],
- dsp: DSP,
- ch_data: [Channel; 2],
- scalefactors: [f32; 64],
-
- mci_prev: [usize; 4],
- mci_cur: [usize; 4],
- mci_next: [usize; 4],
-
- weighting_delay: [u8; 6],
-
- pkt_buf: Vec<u8>,
-}
-
-struct Atrac3CodebookReader {
- bits: &'static [u8],
- codes: &'static [u8],
-}
-impl CodebookDescReader<u8> for Atrac3CodebookReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
- fn len(&mut self) -> usize { self.bits.len() }
-}
-
-impl Atrac3Decoder {
- fn new() -> Self {
- let mut scalefactors: [f32; 64] = [0.0; 64];
- for i in 0..scalefactors.len() {
- scalefactors[i] = 2.0f32.powf(((i as f32) - 15.0) / 3.0);
- }
-
- let mut cb0 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[0], bits: ATRAC3_HUFF_BITS[0] };
- let mut cb1 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[1], bits: ATRAC3_HUFF_BITS[1] };
- let mut cb2 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[2], bits: ATRAC3_HUFF_BITS[2] };
- let mut cb3 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[3], bits: ATRAC3_HUFF_BITS[3] };
- let mut cb4 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[4], bits: ATRAC3_HUFF_BITS[4] };
- let mut cb5 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[5], bits: ATRAC3_HUFF_BITS[5] };
- let mut cb6 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[6], bits: ATRAC3_HUFF_BITS[6] };
- Self {
- info: NACodecInfo::new_dummy(),
- chmap: NAChannelMap::new(),
- channels: 0,
- samples: 0,
- mode: Mode::Mono,
- scrambled: false,
-
- dsp: DSP::new(),
- ch_data: [Channel::new(), Channel::new()],
- codebooks: [Codebook::new(&mut cb0, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb1, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb2, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb3, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb4, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb5, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cb6, CodebookMode::MSB).unwrap() ],
-
- mci_prev: [3; 4],
- mci_cur: [3; 4],
- mci_next: [3; 4],
-
- weighting_delay: ATRAC3_WEIGHTING_DELAYS,
- pkt_buf: Vec::with_capacity(65536),
- scalefactors,
- }
- }
- fn rev_matrix(&mut self) {
- for i in 0..4 {
- let c0 = self.mci_prev[i];
- let c1 = self.mci_cur[i];
- let off;
- if c0 != c1 {
- let l0 = ATRAC3_MATRIX_COEFFS[c0 * 2 + 0];
- let r0 = ATRAC3_MATRIX_COEFFS[c1 * 2 + 0];
- let l1 = ATRAC3_MATRIX_COEFFS[c0 * 2 + 1];
- let r1 = ATRAC3_MATRIX_COEFFS[c1 * 2 + 1];
- for idx in 0..8 {
- let t0 = self.ch_data[0].data[idx + i * 256];
- let t1 = self.ch_data[1].data[idx + i * 256];
- let n1 = t0 * interp(l0, r0, idx) + t1 * interp(l1, r1, idx);
- self.ch_data[0].data[idx + i * 256] = n1;
- self.ch_data[1].data[idx + i * 256] = t0 * 2.0 - n1;
- }
- off = i * 256 + 8;
- } else {
- off = i * 256;
- }
- match c1 {
- 0 => {
- for i in off..256 {
- let t0 = self.ch_data[0].data[i];
- let t1 = self.ch_data[1].data[i];
- self.ch_data[0].data[i] = t1 * 2.0;
- self.ch_data[1].data[i] = (t0 - t1) * 2.0;
- }
- },
- 1 => {
- for i in off..256 {
- let t0 = self.ch_data[0].data[i];
- let t1 = self.ch_data[1].data[i];
- self.ch_data[0].data[i] = (t0 + t1) * 2.0;
- self.ch_data[1].data[i] = t1 * -2.0;
- }
- },
- _ => {
- for i in off..256 {
- let t0 = self.ch_data[0].data[i];
- let t1 = self.ch_data[1].data[i];
- self.ch_data[0].data[i] = t0 + t1;
- self.ch_data[1].data[i] = t0 - t1;
- }
- },
- };
- }
- }
- fn weigh_channels(&mut self) {
- if (self.weighting_delay[1] == 7) && (self.weighting_delay[3] == 7) { return; }
- let pw: [f32; 2];
- if self.weighting_delay[1] == 7 {
- pw = [1.0; 2];
- } else {
- let w = (self.weighting_delay[1] as f32) / 7.0;
- let iw = (2.0 - w * w).sqrt();
- if self.weighting_delay[0] == 0 {
- pw = [w, iw];
- } else {
- pw = [iw, w];
- }
- }
- let cw: [f32; 2];
- if self.weighting_delay[3] == 7 {
- cw = [1.0; 2];
- } else {
- let w = (self.weighting_delay[3] as f32) / 7.0;
- let iw = (2.0 - w * w).sqrt();
- if self.weighting_delay[2] == 0 {
- cw = [w, iw];
- } else {
- cw = [iw, w];
- }
- }
-
- for i in 0..4 {
- let off = i * 256;
- for j in 0..8 {
- self.ch_data[0].data[off + j] *= interp(pw[0], pw[1], j);
- self.ch_data[1].data[off + j] *= interp(pw[0], pw[1], j);
- }
- for j in 8..256 {
- self.ch_data[0].data[off + j] *= cw[0];
- self.ch_data[1].data[off + j] *= cw[1];
- }
- }
- }
-}
-
-fn interp(a: f32, b: f32, pos: usize) -> f32 {
- a + ((pos as f32) / 8.0) * (b - a)
-}
-
-impl NADecoder for Atrac3Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- self.info = info.clone();
- let edata = info.get_extradata().unwrap();
- validate!(edata.len() >= 4);
-
- let mut mr = MemoryReader::new_read(&edata);
- let mut br = ByteReader::new(&mut mr);
-
- match edata.len() {
- 10 => {
- let version = br.read_u32be()?;
- validate!(version == 4);
- self.samples = br.read_u16be()? as usize;
- let delay = br.read_u16be()? as usize;
- validate!(delay == ATRAC3_DEFAULT_DELAY);
- let mode = br.read_u16be()?;
- self.mode = match mode {
- 0 => Mode::Mono,
- 2 => Mode::Stereo,
- 0x12 => Mode::JointStereo,
- _ => return Err(DecoderError::InvalidData),
- };
- self.channels = if self.mode == Mode::Mono { 1 } else { 2 };
- self.scrambled = true;
- },
- 14 | 16 => {
- if edata.len() == 16 { br.read_skip(2)?; }
- self.samples = br.read_u32be()? as usize;
- let mode = br.read_u16be()?;
- self.mode = if mode != 0 { Mode::JointStereo } else { Mode::Stereo };
- self.channels = 2;
- br.read_skip(2)?;
- let ffactor = br.read_u16be()? as usize;
- validate!((ffactor > 0) && (ffactor <= 16));
- // calculate block_align / channels / ffactor, validate it's 96/152/192
- },
- _ => { return Err(DecoderError::InvalidData) }
- };
- validate!(self.samples == ATRAC3_FRAME_SIZE * self.channels);
- if self.mode == Mode::Mono {
- self.chmap.add_channel(NAChannelType::C);
- } else {
- self.chmap.add_channel(NAChannelType::L);
- self.chmap.add_channel(NAChannelType::R);
- }
- let ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), self.channels as u8,
- SND_F32P_FORMAT, self.samples);
- self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo));
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- validate!(pktbuf.len() > 5);
-
- let frame_size = pktbuf.len();
- self.pkt_buf.resize(frame_size, 0);
- if self.scrambled {
- for (i, s) in pktbuf.iter().enumerate() {
- self.pkt_buf[i] = s ^ ATRAC3_XOR_KEY[i & 3];
- }
- } else {
- let dst = &mut self.pkt_buf[0..frame_size];
- dst.copy_from_slice(pktbuf.as_slice());
- }
-
- {
- let mut br = BitReader::new(self.pkt_buf.as_slice(), frame_size, BitReaderMode::BE);
- let id = br.read(6)?;
- validate!(id == 0x28);
- self.ch_data[0].decode_unit(&mut br, &self.codebooks, &self.scalefactors)?;
- self.ch_data[0].synth(&mut self.dsp);
- }
- if self.channels == 2 {
- let off;
- if self.mode == Mode::JointStereo {
- for i in 0..frame_size / 2 {
- let b0 = self.pkt_buf[i];
- let b1 = self.pkt_buf[frame_size - i - 1];
- self.pkt_buf[i] = b1;
- self.pkt_buf[frame_size - i - 1] = b0;
- }
- let mut i = 0;
- while (i < frame_size) && (self.pkt_buf[i] == 0xF8) { i += 1; }
- validate!(frame_size - i > 4);
- off = i;
- } else {
- off = frame_size / 2;
- }
- let mut br = BitReader::new(&self.pkt_buf[off..], frame_size - off, BitReaderMode::BE);
- if self.mode == Mode::JointStereo {
- let id = br.read(2)?;
- validate!(id == 0x3);
- } else {
- let id = br.read(6)?;
- validate!(id == 0x28);
- }
- if self.mode == Mode::JointStereo {
- for i in 0..self.weighting_delay.len() - 2 {
- self.weighting_delay[i] = self.weighting_delay[i + 2];
- }
- self.weighting_delay[4] = br.read(1)? as u8;
- self.weighting_delay[5] = br.read(3)? as u8;
- self.mci_prev = self.mci_cur;
- self.mci_cur = self.mci_next;
- for i in 0..4 {
- self.mci_next[i] = br.read(2)? as usize;
- }
- }
- self.ch_data[1].decode_unit(&mut br, &self.codebooks, &self.scalefactors)?;
- self.ch_data[1].synth(&mut self.dsp);
- }
- if self.mode == Mode::JointStereo {
- self.rev_matrix();
- self.weigh_channels();
- }
-
- let ainfo = self.info.get_properties().get_audio_info().unwrap();
-
- let mut abuf = alloc_audio_buffer(ainfo, ATRAC3_FRAME_SIZE, self.chmap.clone())?;
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut output = adata.get_data_mut();
-
- for ch in 0..self.channels {
- let dpos = abuf.get_offset(ch);
- self.ch_data[ch].do_qmf(&mut self.dsp, &mut output[dpos..][..ATRAC3_FRAME_SIZE]);
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(Atrac3Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_atrac3() {
- let file = "assets/RV/rv30_atrc_384x208_realproducer_plus_8.51.rm";
-// let file = "assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm";
- test_decode_audio("realmedia", file, Some(12000), "atrac3");
- }
-}
-
-const ATRAC3_XOR_KEY: [u8; 4] = [ 0x53, 0x7F, 0x61, 0x03 ];
-
-const ATRAC3_HUFF_CODES: [&[u8]; 7] = [
- &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x1C, 0x1D, 0x1E, 0x1F ],
- &[ 0x00, 0x04, 0x05, 0x06, 0x07 ],
- &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x0E, 0x0F ],
- &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x1C, 0x1D, 0x1E, 0x1F ], // same as 0
- &[ 0x00, 0x02, 0x03, 0x08, 0x09, 0x0A, 0x0B, 0x1C, 0x1D, 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x0D ],
- &[ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x14,
- 0x15, 0x16, 0x17, 0x18, 0x19, 0x34, 0x35, 0x36,
- 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x78, 0x79, 0x7A,
- 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x08, 0x09 ],
- &[ 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
- 0x0F, 0x10, 0x11, 0x24, 0x25, 0x26, 0x27, 0x28,
- 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
- 0x31, 0x32, 0x33, 0x68, 0x69, 0x6A, 0x6B, 0x6C,
- 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
- 0x75, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2,
- 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
- 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x02, 0x03 ]
-];
-const ATRAC3_HUFF_BITS: [&[u8]; 7] = [
- &[ 1, 3, 3, 4, 4, 5, 5, 5, 5 ],
- &[ 1, 3, 3, 3, 3 ],
- &[ 1, 3, 3, 4, 4, 4, 4 ],
- &[ 1, 3, 3, 4, 4, 5, 5, 5, 5 ],
- &[ 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 4, 4 ],
- &[ 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4 ],
- &[ 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4 ],
-];
-
-const ATRAC3_MAX_QUANT: [f32; 8] = [ 0.0, 1.0/1.5, 1.0/2.5, 1.0/3.5, 1.0/4.5, 1.0/7.5, 1.0/15.5, 1.0/31.5 ];
-
-const ATRAC3_SUBBANDS: [usize; 32 + 1] = [
- 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176,
- 192, 224, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896,
- 1024
-];
-
-const ATRAC3_MATRIX_COEFFS: [f32; 8] = [ 0.0, 2.0, 2.0, 2.0, 0.0, 0.0, 1.0, 1.0 ];
-
-const ATRAC3_QMF_FILTER: [f32; 48] = [
- -0.000029238139, -0.000184109580, -0.000112315138, 0.000602345390,
- 0.000484503806, -0.001705877949, -0.001041114796, 0.004068033770,
- 0.001566677820, -0.008430772461, -0.001512299757, 0.015680588782,
- -0.000122339843, -0.026883240789, 0.004925364163, 0.043472178280,
- -0.015603342094, -0.068180441856, 0.037618979812, 0.108652018011,
- -0.087192758918, -0.198768734932, 0.264158189297, 0.928483188152,
- 0.928483188152, 0.264158189297, -0.198768734932, -0.087192758918,
- 0.108652018011, 0.037618979812, -0.068180441856, -0.015603342094,
- 0.043472178280, 0.004925364163, -0.026883240789, -0.000122339843,
- 0.015680588782, -0.001512299757, -0.008430772461, 0.001566677820,
- 0.004068033770, -0.001041114796, -0.001705877949, 0.000484503806,
- 0.000602345390, -0.000112315138, -0.000184109580, -0.000029238139
-];
diff --git a/src/codecs/blockdsp.rs b/src/codecs/blockdsp.rs
deleted file mode 100644
index 33d682a..0000000
--- a/src/codecs/blockdsp.rs
+++ /dev/null
@@ -1,185 +0,0 @@
-use crate::frame::*;
-
-pub fn put_blocks(buf: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize, blk: &[[i16;64]; 6]) {
- let stridey = buf.get_stride(0);
- let strideu = buf.get_stride(1);
- let stridev = buf.get_stride(2);
- let mut idxy = buf.get_offset(0) + xpos * 16 + ypos * 16 * stridey;
- let mut idxu = buf.get_offset(1) + xpos * 8 + ypos * 8 * strideu;
- let mut idxv = buf.get_offset(2) + xpos * 8 + ypos * 8 * stridev;
-
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[0][k + j * 8];
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[1][k + j * 8];
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k + 8] = v as u8;
- }
- idxy += stridey;
- }
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[2][k + j * 8];
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[3][k + j * 8];
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k + 8] = v as u8;
- }
- idxy += stridey;
- }
-
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[4][k + j * 8];
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxu + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[5][k + j * 8];
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxv + k] = v as u8;
- }
- idxu += strideu;
- idxv += stridev;
- }
-}
-
-pub fn add_blocks(buf: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize, blk: &[[i16;64]; 6]) {
- let stridey = buf.get_stride(0);
- let strideu = buf.get_stride(1);
- let stridev = buf.get_stride(2);
- let mut idxy = buf.get_offset(0) + xpos * 16 + ypos * 16 * stridey;
- let mut idxu = buf.get_offset(1) + xpos * 8 + ypos * 8 * strideu;
- let mut idxv = buf.get_offset(2) + xpos * 8 + ypos * 8 * stridev;
-
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[0][k + j * 8] + (framebuf[idxy + k] as i16);
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[1][k + j * 8] + (framebuf[idxy + k + 8] as i16);
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k + 8] = v as u8;
- }
- idxy += stridey;
- }
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[2][k + j * 8] + (framebuf[idxy + k] as i16);
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[3][k + j * 8] + (framebuf[idxy + k + 8] as i16);
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k + 8] = v as u8;
- }
- idxy += stridey;
- }
-
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[4][k + j * 8] + (framebuf[idxu + k] as i16);
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxu + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[5][k + j * 8] + (framebuf[idxv + k] as i16);
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxv + k] = v as u8;
- }
- idxu += strideu;
- idxv += stridev;
- }
-}
-
-pub fn edge_emu(src: &NAVideoBuffer<u8>, xpos: isize, ypos: isize, bw: usize, bh: usize, dst: &mut [u8], dstride: usize, comp: usize) {
- let stride = src.get_stride(comp);
- let offs = src.get_offset(comp);
- let (w, h) = src.get_dimensions(comp);
- let data = src.get_data();
- let framebuf: &[u8] = data.as_slice();
-
- for y in 0..bh {
- let srcy;
- if (y as isize) + ypos < 0 { srcy = 0; }
- else if (y as isize) + ypos >= (h as isize) { srcy = h - 1; }
- else { srcy = ((y as isize) + ypos) as usize; }
-
- for x in 0..bw {
- let srcx;
- if (x as isize) + xpos < 0 { srcx = 0; }
- else if (x as isize) + xpos >= (w as isize) { srcx = w - 1; }
- else { srcx = ((x as isize) + xpos) as usize; }
- dst[x + y * dstride] = framebuf[offs + srcx + srcy * stride];
- }
- }
-}
-
-pub fn copy_blocks(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>,
- dx: usize, dy: usize, sx: isize, sy: isize, bw: usize, bh: usize,
- preborder: usize, postborder: usize,
- mode: usize, interp: &[fn(&mut [u8], usize, &[u8], usize, usize, usize)])
-{
- let pre = if mode != 0 { preborder as isize } else { 0 };
- let post = if mode != 0 { postborder as isize } else { 0 };
- let (w, h) = src.get_dimensions(0);
-
- if (sx - pre < 0) || ((sx >> 1) - pre < 0) || (sx + (bw as isize) + post > (w as isize)) ||
- (sy - pre < 0) || ((sy >> 1) - pre < 0) || (sy + (bh as isize) + post > (h as isize)) {
- let ebuf_stride: usize = 32;
- let mut ebuf: Vec<u8> = Vec::with_capacity(ebuf_stride * (bh + ((pre + post) as usize)));
- ebuf.resize((((pre + post) as usize) + bh) * ebuf_stride, 0);
-
- for comp in 0..3 {
- let dstride = dst.get_stride(comp);
- let doff = dst.get_offset(comp);
- let mut ddta = dst.get_data_mut();
- let dbuf: &mut [u8] = ddta.as_mut_slice();
- let x = if comp > 0 { dx/2 } else { dx };
- let y = if comp > 0 { dy/2 } else { dy };
- let sx_ = (if comp > 0 { sx >> 1 } else { sx }) - pre;
- let sy_ = (if comp > 0 { sy >> 1 } else { sy }) - pre;
- let bw_ = (if comp > 0 { bw/2 } else { bw }) + ((pre + post) as usize);
- let bh_ = (if comp > 0 { bh/2 } else { bh }) + ((pre + post) as usize);
- edge_emu(src, sx_ - pre, sy_ - pre, bw_, bh_,
- ebuf.as_mut_slice(), ebuf_stride, comp);
- let bw_ = if comp > 0 { bw/2 } else { bw };
- let bh_ = if comp > 0 { bh/2 } else { bh };
- (interp[mode])(&mut dbuf[doff + x + y * dstride..], dstride, ebuf.as_slice(), ebuf_stride, bw_, bh_);
- }
- } else {
- for comp in 0..3 {
- let sstride = src.get_stride(comp);
- let soff = src.get_offset(comp);
- let sdta = src.get_data();
- let sbuf: &[u8] = sdta.as_slice();
- let dstride = dst.get_stride(comp);
- let doff = dst.get_offset(comp);
- let mut ddta = dst.get_data_mut();
- let dbuf: &mut [u8] = ddta.as_mut_slice();
- let x = if comp > 0 { dx/2 } else { dx };
- let y = if comp > 0 { dy/2 } else { dy };
- let sx_ = ((if comp > 0 { sx >> 1 } else { sx }) - pre) as usize;
- let sy_ = ((if comp > 0 { sy >> 1 } else { sy }) - pre) as usize;
- let bw_ = if comp > 0 { bw/2 } else { bw };
- let bh_ = if comp > 0 { bh/2 } else { bh };
- (interp[mode])(&mut dbuf[doff + x + y * dstride..], dstride, &sbuf[(soff + sx_ + sy_ * sstride)..], sstride, bw_, bh_);
- }
- }
-}
diff --git a/src/codecs/clearvideo.rs b/src/codecs/clearvideo.rs
deleted file mode 100644
index 8a27006..0000000
--- a/src/codecs/clearvideo.rs
+++ /dev/null
@@ -1,2570 +0,0 @@
-use crate::io::byteio::{ByteReader,MemoryReader};
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use crate::formats;
-use super::*;
-use std::fmt;
-use std::ops::{Add, Sub};
-
-struct CLVDCCodeReader { }
-struct CLVACCodeReader { }
-struct CLVFlagsCodeReader { codes: &'static [u16], bits: &'static [u8] }
-struct CLVSym16CodeReader { codes: &'static [u16], bits: &'static [u8], syms: &'static [u16] }
-
-impl CodebookDescReader<i8> for CLVDCCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { CLV_DC_BITS[idx] }
- fn code(&mut self, idx: usize) -> u32 { CLV_DC_CODES[idx] as u32 }
- fn sym (&mut self, idx: usize) -> i8 { (idx as i8) - 63 }
- fn len(&mut self) -> usize { CLV_DC_BITS.len() }
-}
-
-impl CodebookDescReader<u16> for CLVACCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { CLV_AC_BITS[idx] }
- fn code(&mut self, idx: usize) -> u32 { CLV_AC_CODES[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u16 { CLV_AC_SYMS[idx] }
- fn len(&mut self) -> usize { CLV_AC_BITS.len() }
-}
-
-impl CodebookDescReader<u8> for CLVFlagsCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
- fn len(&mut self) -> usize { self.bits.len() }
-}
-
-impl CodebookDescReader<u16> for CLVSym16CodeReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u16 { self.syms[idx] }
- fn len(&mut self) -> usize { self.bits.len() }
-}
-
-#[allow(dead_code)]
-struct LevelCodes {
- flags_cb: Option<Codebook<u8>>,
- mv_cb: Option<Codebook<u16>>,
- mv_esc: u16,
- bias_cb: Option<Codebook<u16>>,
- bias_esc: u16,
-}
-
-impl LevelCodes {
- fn new(flgd: Option<(&'static [u8], &'static [u16])>,
- mvd: Option<(&'static [u8], &'static [u16], &'static [u16])>, mv_esc: u16,
- bias: Option<(&'static [u8], &'static [u16], &'static [u16])>, bias_esc: u16) -> Self {
- let flags_cb = if let Some((bits, codes)) = flgd {
- let mut coderead = CLVFlagsCodeReader { bits: bits, codes: codes };
- Some(Codebook::new(&mut coderead, CodebookMode::MSB).unwrap())
- } else {
- None
- };
- let mv_cb = if let Some((bits, codes, syms)) = mvd {
- let mut coderead = CLVSym16CodeReader { bits: bits, codes: codes, syms: syms };
- Some(Codebook::new(&mut coderead, CodebookMode::MSB).unwrap())
- } else {
- None
- };
- let bias_cb = if let Some((bits, codes, syms)) = bias {
- let mut coderead = CLVSym16CodeReader { bits: bits, codes: codes, syms: syms };
- Some(Codebook::new(&mut coderead, CodebookMode::MSB).unwrap())
- } else {
- None
- };
- LevelCodes { flags_cb: flags_cb, mv_cb: mv_cb, mv_esc: mv_esc, bias_cb: bias_cb, bias_esc: bias_esc }
- }
-}
-
-#[derive(Debug,Clone,Copy)]
-pub struct MV {
- x: i16,
- y: i16,
-}
-
-impl MV {
- pub fn new(x: i16, y: i16) -> Self { MV{ x: x, y: y } }
- pub fn pred(a: MV, b: MV, c: MV) -> Self {
- let x;
- if a.x < b.x {
- if b.x < c.x {
- x = b.x;
- } else {
- if a.x < c.x { x = c.x; } else { x = a.x; }
- }
- } else {
- if b.x < c.x {
- if a.x < c.x { x = a.x; } else { x = c.x; }
- } else {
- x = b.x;
- }
- }
- let y;
- if a.y < b.y {
- if b.y < c.y {
- y = b.y;
- } else {
- if a.y < c.y { y = c.y; } else { y = a.y; }
- }
- } else {
- if b.y < c.y {
- if a.y < c.y { y = a.y; } else { y = c.y; }
- } else {
- y = b.y;
- }
- }
- MV { x: x, y: y }
- }
-}
-
-pub const ZERO_MV: MV = MV { x: 0, y: 0 };
-
-impl Add for MV {
- type Output = MV;
- fn add(self, other: MV) -> MV { MV { x: self.x + other.x, y: self.y + other.y } }
-}
-
-impl Sub for MV {
- type Output = MV;
- fn sub(self, other: MV) -> MV { MV { x: self.x - other.x, y: self.y - other.y } }
-}
-
-impl fmt::Display for MV {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{},{}", self.x, self.y)
- }
-}
-
-struct MVInfo {
- mv: Vec<MV>,
- mb_w: usize,
- mb_h: usize,
- mb_size: usize,
- mb_stride: usize,
- top: bool,
-}
-
-impl MVInfo {
- fn new() -> Self { MVInfo{ mv: Vec::new(), mb_w: 0, mb_h: 0, mb_size: 0, mb_stride: 0, top: true } }
- fn reset(&mut self, mb_w: usize, mb_h: usize, mb_size: usize) {
- self.mb_w = mb_w;
- self.mb_h = mb_h;
- self.mb_size = mb_size;
- self.mb_stride = mb_w;
- self.mv.resize(self.mb_stride * 2, ZERO_MV);
- }
- fn update_row(&mut self) {
- self.top = false;
- for i in 0..self.mb_stride {
- self.mv[i] = self.mv[self.mb_stride + i];
- }
- }
- #[allow(non_snake_case)]
- fn predict(&mut self, mb_x: usize, mb_y: usize, diff: MV) -> MV {
- let pred_mv = if self.top {
- if mb_x > 0 { self.mv[self.mb_stride + mb_x - 1] } else { ZERO_MV }
- } else if (mb_x == 0) || (mb_x == self.mb_w - 1) {
- self.mv[mb_x]
- } else {
- let A = self.mv[self.mb_stride + mb_x - 1];
- let B = self.mv[ mb_x];
- let C = self.mv[ mb_x + 1];
- MV::pred(A, B, C)
- };
- let mut res = pred_mv;
-
- let left_mv = -((mb_x * self.mb_size) as i16);
- let right_mv = ((self.mb_w - mb_x - 1) * self.mb_size) as i16;
- if res.x < left_mv { res.x = left_mv; }
- if res.x > right_mv { res.x = right_mv; }
- let top_mv = -((mb_y * self.mb_size) as i16);
- let bot_mv = ((self.mb_h - mb_y - 1) * self.mb_size) as i16;
- if res.y < top_mv { res.y = top_mv; }
- if res.y > bot_mv { res.y = bot_mv; }
-
- self.mv[self.mb_stride + mb_x] = res + diff;
-
- res
- }
-}
-
-
-struct TileInfo {
- flags: u8,
- mv: MV,
- bias: i16,
- child: [Option<Box<TileInfo>>; 4],
-}
-
-#[allow(non_snake_case)]
-fn dct_row(blk: &mut [i32]) {
- let dshift = 11;
- let shift = 8;
- let t0 = 2841 * blk[1] + 565 * blk[7];
- let t1 = 565 * blk[1] - 2841 * blk[7];
- let t2 = 1609 * blk[5] + 2408 * blk[3];
- let t3 = 2408 * blk[5] - 1609 * blk[3];
- let t4 = 1108 * blk[2] - 2676 * blk[6];
- let t5 = 2676 * blk[2] + 1108 * blk[6];
- let t6 = ((blk[0] + blk[4]) << dshift) + (1 << (shift - 1));
- let t7 = ((blk[0] - blk[4]) << dshift) + (1 << (shift - 1));
- let t8 = t0 + t2;
- let t9 = t0 - t2;
- let tA = 181 * (t9 + (t1 - t3)) + 0x80 >> 8;
- let tB = 181 * (t9 - (t1 - t3)) + 0x80 >> 8;
- let tC = t1 + t3;
-
- blk[0] = (t6 + t5 + t8) >> shift;
- blk[1] = (t7 + t4 + tA) >> shift;
- blk[2] = (t7 - t4 + tB) >> shift;
- blk[3] = (t6 - t5 + tC) >> shift;
- blk[4] = (t6 - t5 - tC) >> shift;
- blk[5] = (t7 - t4 - tB) >> shift;
- blk[6] = (t7 + t4 - tA) >> shift;
- blk[7] = (t6 + t5 - t8) >> shift;
-}
-
-#[allow(non_snake_case)]
-fn dct_col(blk: &mut [i32; 64], col: usize) {
- let dshift = 8;
- let shift = 14;
- let t0 = (2841 * blk[1*8 + col] + 565 * blk[7*8 + col] + 4) >> 3;
- let t1 = ( 565 * blk[1*8 + col] - 2841 * blk[7*8 + col] + 4) >> 3;
- let t2 = (1609 * blk[5*8 + col] + 2408 * blk[3*8 + col] + 4) >> 3;
- let t3 = (2408 * blk[5*8 + col] - 1609 * blk[3*8 + col] + 4) >> 3;
- let t4 = (1108 * blk[2*8 + col] - 2676 * blk[6*8 + col] + 4) >> 3;
- let t5 = (2676 * blk[2*8 + col] + 1108 * blk[6*8 + col] + 4) >> 3;
- let t6 = ((blk[0*8 + col] + blk[4*8 + col]) << dshift) + (1 << (shift - 1));
- let t7 = ((blk[0*8 + col] - blk[4*8 + col]) << dshift) + (1 << (shift - 1));
- let t8 = t0 + t2;
- let t9 = t0 - t2;
- let tA = 181 * (t9 + (t1 - t3)) + 0x80 >> 8;
- let tB = 181 * (t9 - (t1 - t3)) + 0x80 >> 8;
- let tC = t1 + t3;
-
- blk[0*8 + col] = (t6 + t5 + t8) >> shift;
- blk[1*8 + col] = (t7 + t4 + tA) >> shift;
- blk[2*8 + col] = (t7 - t4 + tB) >> shift;
- blk[3*8 + col] = (t6 - t5 + tC) >> shift;
- blk[4*8 + col] = (t6 - t5 - tC) >> shift;
- blk[5*8 + col] = (t7 - t4 - tB) >> shift;
- blk[6*8 + col] = (t7 + t4 - tA) >> shift;
- blk[7*8 + col] = (t6 + t5 - t8) >> shift;
-}
-
-fn clv_dct(blk: &mut [i32; 64]) {
- for row in blk.chunks_mut(8) { dct_row(row); }
- for i in 0..8 { dct_col(blk, i); }
-}
-
-fn clv_dct_dc(blk: &mut [i32; 64]) {
- let dval = blk[0] >> 3;
- for i in 0..64 { blk[i] = dval; }
-}
-
-fn put_blocks(buf: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize, blk: &[[i32;64]; 6]) {
- let stridey = buf.get_stride(0);
- let strideu = buf.get_stride(1);
- let stridev = buf.get_stride(2);
- let mut idxy = buf.get_offset(0) + xpos * 16 + ypos * 16 * stridey;
- let mut idxu = buf.get_offset(1) + xpos * 8 + ypos * 8 * strideu;
- let mut idxv = buf.get_offset(2) + xpos * 8 + ypos * 8 * stridev;
-
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[0][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[1][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k + 8] = v as u8;
- }
- idxy += stridey;
- }
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[2][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[3][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxy + k + 8] = v as u8;
- }
- idxy += stridey;
- }
-
- for j in 0..8 {
- for k in 0..8 {
- let mut v = blk[4][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxu + k] = v as u8;
- }
- for k in 0..8 {
- let mut v = blk[5][k + j * 8] + 128;
- if v < 0 { v = 0; } if v > 255 { v = 255; }
- framebuf[idxv + k] = v as u8;
- }
- idxu += strideu;
- idxv += stridev;
- }
-}
-
-fn copy_block(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>,
- plane: usize, x: usize, y: usize, dx: isize, dy: isize, size: usize)
-{
- let sx: isize = (x as isize) + dx;
- let sy: isize = (y as isize) + dy;
-
- let sstride = src.get_stride(plane);
- let mut soff = src.get_offset(plane) + (sx as usize) + (sy as usize) * sstride;
- let sdta = src.get_data();
- let sbuf: &[u8] = sdta.as_slice();
- let dstride = dst.get_stride(plane);
- let mut doff = dst.get_offset(plane) + x + y * dstride;
- let mut ddta = dst.get_data_mut();
- let dbuf: &mut [u8] = ddta.as_mut_slice();
- for _ in 0..size {
- let dst = &mut dbuf[doff..][..size];
- let src = &sbuf[soff..][..size];
- dst.copy_from_slice(src);
- doff += dstride;
- soff += sstride;
- }
-}
-
-fn copyadd_block(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>,
- plane: usize, x: usize, y: usize, dx: isize, dy: isize, size: usize, bias: i16)
-{
- let sx: isize = (x as isize) + dx;
- let sy: isize = (y as isize) + dy;
-
- let sstride = src.get_stride(plane);
- let mut soff = src.get_offset(plane) + (sx as usize) + (sy as usize) * sstride;
- let sdta = src.get_data();
- let sbuf: &[u8] = sdta.as_slice();
- let dstride = dst.get_stride(plane);
- let mut doff = dst.get_offset(plane) + x + y * dstride;
- let mut ddta = dst.get_data_mut();
- let dbuf: &mut [u8] = ddta.as_mut_slice();
- for _ in 0..size {
- let dst = &mut dbuf[doff..][..size];
- let src = &sbuf[soff..][..size];
- for i in 0..size {
- let val = (src[i] as i16) + bias;
- if val < 0x00 { dst[i] = 0x00; }
- else if val > 0xFF { dst[i] = 0xFF; }
- else { dst[i] = val as u8; }
- }
- doff += dstride;
- soff += sstride;
- }
-}
-
-fn tile_do_block(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>,
- plane: usize, x: usize, y: usize, dx: i16, dy: i16, size: usize, bias: i16)
-{
- if bias == 0 {
- copy_block(dst, src, plane, x, y, dx as isize, dy as isize, size);
- } else {
- copyadd_block(dst, src, plane, x, y, dx as isize, dy as isize, size, bias);
- }
-}
-
-fn restore_tree(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, plane: usize,
- x: usize, y: usize, size: usize, tile: &TileInfo, root_mv: MV) {
- let mv = root_mv + tile.mv;
-
- if tile.flags == 0 {
- tile_do_block(dst, src, plane, x, y, mv.x, mv.y, size, tile.bias);
- } else {
- let hsize = size >> 1;
- for i in 0..4 {
- let xoff = if (i & 2) == 0 { 0 } else { hsize };
- let yoff = if (i & 1) == 0 { 0 } else { hsize };
-
- if let Some(ref subtile) = tile.child[i] {
- restore_tree(dst, src, plane, x + xoff, y + yoff, hsize, subtile, root_mv);
- } else {
- tile_do_block(dst, src, plane, x + xoff, y + yoff, mv.x, mv.y, hsize, tile.bias);
- }
- }
- }
-}
-
-fn extend_edges(buf: &mut NAVideoBuffer<u8>, tile_size: usize) {
- for comp in 0..3 {
- let (w, h) = buf.get_dimensions(comp);
- let size = if comp == 0 { tile_size } else { tile_size >> 1 };
- let stride = buf.get_stride(comp);
- let planeoff = buf.get_offset(comp);
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- let right = size - (w & (size - 1));
- let bottom = size - (h & (size - 1));
-
- if (right == size) && (bottom == size) { return; }
- if right != size {
- let mut off = planeoff + w;
- for _ in 0..h {
- for i in 0..right { framebuf[off + i] = 0x80; }
- off += stride;
- }
- }
- if bottom != size {
- let mut off = planeoff + h * stride;
- for _ in 0..bottom {
- for i in 0..stride { framebuf[off + i] = 0x80; }
- off += stride;
- }
- }
- }
-}
-
-#[allow(dead_code)]
-struct ClearVideoDecoder {
- info: Rc<NACodecInfo>,
- dc_cb: Codebook<i8>,
- ac_cb: Codebook<u16>,
- frmmgr: HAMShuffler,
- is_rm: bool,
- ylev: [LevelCodes; 4],
- ulev: [LevelCodes; 3],
- vlev: [LevelCodes; 3],
- tsize: u8,
-}
-
-fn decode_dct_block(br: &mut BitReader, blk: &mut [i32; 64], ac_quant: i32, has_ac: bool,
- dc_cb: &Codebook<i8>, ac_cb: &Codebook<u16>) -> DecoderResult<()> {
- let mut idx = 1;
- let mut eob = false;
-
- blk[0] = br.read_cb(dc_cb)? as i32;
-
- if !has_ac { return Ok(()); }
-
- while (idx < 64) && !eob {
- let val = br.read_cb(ac_cb)?;
- let (level, skip) = if val != CLV_AC_ESCAPE {
- eob = ((val >> 12) & 1) != 0;
- let run = ((val >> 4) & 0xFF) as usize;
- let lev = (val & 0xF) as i32;
- if br.read_bool()? {
- (-lev, run)
- } else {
- ( lev, run)
- }
- } else {
- eob = br.read_bool()?;
- let run = br.read(6)? as usize;
- let lev = br.read_s(8)? as i32;
- (lev, run)
- };
- idx += skip;
- validate!(idx < 64);
- if level != 0 {
- let (aval, sign) = if level >= 0 { (level, false) } else { (-level, true) };
- let mut val = ac_quant * (2 * aval + 1);
- if (ac_quant & 1) == 0 {
- val -= 1;
- }
- if sign {
- val = -val;
- }
- blk[ZIGZAG[idx]] = val;
- }
- idx += 1;
- }
-
- validate!(idx <= 64 && eob);
-
- Ok(())
-}
-
-fn decode_tile_info(br: &mut BitReader, lc: &[LevelCodes], level: usize) -> DecoderResult<Box<TileInfo>> {
- let flags = if let Some(ref cb) = lc[level].flags_cb {
- br.read_cb(cb)?
- } else {
- 0
- };
- let mv = if let Some(ref cb) = lc[level].mv_cb {
- let mv_code = br.read_cb(cb)?;
- if mv_code != lc[level].mv_esc {
- MV::new(((mv_code & 0xFF) as i8) as i16, (mv_code as i16) >> 8)
- } else {
- let x = br.read_s(8)? as i16;
- let y = br.read_s(8)? as i16;
- MV::new(x, y)
- }
- } else {
- ZERO_MV
- };
- let bias = if let Some(ref cb) = lc[level].bias_cb {
- let bias_val = br.read_cb(cb)?;
- if bias_val != lc[level].bias_esc {
- bias_val as i16
- } else {
- br.read_s(16)? as i16
- }
- } else {
- 0
- };
- let mut ti = TileInfo { flags: flags, mv: mv, bias: bias, child: [None, None, None, None] };
- if ti.flags != 0 {
- for i in 0..4 {
- if (ti.flags & (1 << i)) != 0 {
- let subti = decode_tile_info(br, lc, level + 1)?;
- ti.child[i] = Some(subti);
- }
- }
- }
- Ok(Box::new(ti))
-}
-
-impl ClearVideoDecoder {
- fn new(is_rm: bool) -> Self {
- let dummy_info = Rc::new(DUMMY_CODEC_INFO);
- let mut coderead = CLVDCCodeReader{};
- let dc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = CLVACCodeReader{};
- let ac_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
-
- ClearVideoDecoder {
- info: dummy_info,
- dc_cb: dc_cb, ac_cb: ac_cb,
- frmmgr: HAMShuffler::new(),
- is_rm: is_rm,
- ylev: [
- LevelCodes::new(Some((CLV_FLAGSY_0_BITS, CLV_FLAGSY_0_CODES)),
- Some((CLV_MVY_0_BITS, CLV_MVY_0_CODES, CLV_MVY_0_SYMS)), CLV_MVY_0_ESCAPE,
- None, 0),
- LevelCodes::new(Some((CLV_FLAGSY_1_BITS, CLV_FLAGSY_1_CODES)),
- Some((CLV_MVY_1_BITS, CLV_MVY_1_CODES, CLV_MVY_1_SYMS)), CLV_MVY_1_ESCAPE,
- Some((CLV_BIASY_1_BITS, CLV_BIASY_1_CODES, CLV_BIASY_1_SYMS)), CLV_BIAS_ESCAPE),
- LevelCodes::new(Some((CLV_FLAGSY_2_BITS, CLV_FLAGSY_2_CODES)),
- Some((CLV_MVY_2_BITS, CLV_MVY_2_CODES, CLV_MVY_2_SYMS)), CLV_MVY_2_ESCAPE,
- Some((CLV_BIASY_2_BITS, CLV_BIASY_2_CODES, CLV_BIASY_2_SYMS)), CLV_BIAS_ESCAPE),
- LevelCodes::new(None,
- Some((CLV_MVY_3_BITS, CLV_MVY_3_CODES, CLV_MVY_3_SYMS)), CLV_MVY_3_ESCAPE,
- Some((CLV_BIASY_3_BITS, CLV_BIASY_3_CODES, CLV_BIASY_3_SYMS)), CLV_BIAS_ESCAPE)
- ],
- ulev: [
- LevelCodes::new(Some((CLV_FLAGSU_0_BITS, CLV_FLAGSU_0_CODES)),
- None, 0,
- None, 0),
- LevelCodes::new(Some((CLV_FLAGSU_1_BITS, CLV_FLAGSU_1_CODES)),
- Some((CLV_MVU_1_BITS, CLV_MVU_1_CODES, CLV_MVU_1_SYMS)), CLV_MVU_1_ESCAPE,
- Some((CLV_BIASU_1_BITS, CLV_BIASU_1_CODES, CLV_BIASU_1_SYMS)), CLV_BIAS_ESCAPE),
- LevelCodes::new(None,
- Some((CLV_MVU_2_BITS, CLV_MVU_2_CODES, CLV_MVU_2_SYMS)), CLV_MVU_2_ESCAPE,
- Some((CLV_BIASU_2_BITS, CLV_BIASU_2_CODES, CLV_BIASU_2_SYMS)), CLV_BIAS_ESCAPE),
- ],
- vlev: [
- LevelCodes::new(Some((CLV_FLAGSV_0_BITS, CLV_FLAGSV_0_CODES)),
- None, 0,
- None, 0),
- LevelCodes::new(Some((CLV_FLAGSV_1_BITS, CLV_FLAGSV_1_CODES)),
- Some((CLV_MVV_1_BITS, CLV_MVV_1_CODES, CLV_MVV_1_SYMS)), CLV_MVV_1_ESCAPE,
- Some((CLV_BIASV_1_BITS, CLV_BIASV_1_CODES, CLV_BIASV_1_SYMS)), CLV_BIAS_ESCAPE),
- LevelCodes::new(None,
- Some((CLV_MVV_2_BITS, CLV_MVV_2_CODES, CLV_MVV_2_SYMS)), CLV_MVV_2_ESCAPE,
- Some((CLV_BIASV_2_BITS, CLV_BIASV_2_CODES, CLV_BIASV_2_SYMS)), CLV_BIAS_ESCAPE),
- ],
- tsize: 0,
- }
- }
-
- fn decode_frame_intra(&mut self, br: &mut BitReader, buf: &mut NAVideoBuffer<u8>,
- width: usize, height: usize) -> DecoderResult<()> {
- let ac_quant = br.read(8)? as i32;
-
- let mut top_dc: [i32; 3] = [0; 3];
- let mut left_dc: [i32; 4] = [0; 4];
-
- let mb_w = (width + 0xF) >> 4;
- let mb_h = (height + 0xF) >> 4;
- for mb_y in 0..mb_h {
- for mb_x in 0..mb_w {
- let mut blks: [[i32; 64]; 6] = [[0; 64]; 6];
- let mut has_ac: [bool; 6] = [false; 6];
-
- for i in 0..6 { has_ac[i] = br.read_bool()? }
-
- for i in 0..4 {
- decode_dct_block(br, &mut blks[i], ac_quant, has_ac[i], &self.dc_cb, &self.ac_cb)?;
- if (mb_x == 0) && (i == 0 || i == 2) {
- blks[i][0] += top_dc[0];
- top_dc[0] = blks[i][0];
- } else {
- blks[i][0] += left_dc[(i & 2) >> 1];
- }
- left_dc[(i & 2) >> 1] = blks[i][0];
- blks[i][0] <<= 5; // DC dequant
- if has_ac[i] {
- clv_dct(&mut blks[i]);
- } else {
- clv_dct_dc(&mut blks[i]);
- }
- }
- for i in 1..3 {
- let blk_idx = i + 3;
- decode_dct_block(br, &mut blks[blk_idx], ac_quant, has_ac[blk_idx], &self.dc_cb, &self.ac_cb)?;
- if mb_x == 0 {
- blks[blk_idx][0] += top_dc[i];
- top_dc[i] = blks[blk_idx][0];
- } else {
- blks[blk_idx][0] += left_dc[i + 1];
- }
- left_dc[i + 1] = blks[blk_idx][0];
- blks[blk_idx][0] <<= 5; // DC dequant
- if has_ac[blk_idx] {
- clv_dct(&mut blks[blk_idx]);
- } else {
- clv_dct_dc(&mut blks[blk_idx]);
- }
- }
- put_blocks(buf, mb_x, mb_y, &blks);
- }
- }
- Ok(())
- }
- fn decode_frame_inter(&mut self, br: &mut BitReader,
- buf: &mut NAVideoBuffer<u8>, prev: &mut NAVideoBuffer<u8>,
- width: usize, height: usize) -> DecoderResult<()> {
- let mb_size = 1 << self.tsize;
- let mb_w = (width + mb_size - 1) >> self.tsize;
- let mb_h = (height + mb_size - 1) >> self.tsize;
-
- let mut mvi = MVInfo::new();
- mvi.reset(mb_w, mb_h, mb_size);
-
- for t_y in 0..mb_h {
- for t_x in 0..mb_w {
- if !br.read_bool()? {
- let x = t_x << self.tsize;
- let y = t_y << self.tsize;
- let size = 1 << self.tsize;
- let tile = decode_tile_info(br, &self.ylev, 0)?;
- let mv = mvi.predict(t_x, t_y, tile.mv);
- restore_tree(buf, prev, 0, x, y, size, &tile, mv);
- let x = t_x << (self.tsize - 1);
- let y = t_y << (self.tsize - 1);
- let size = 1 << (self.tsize - 1);
- let mut cmv = mv + tile.mv;
- cmv.x /= 2;
- cmv.y /= 2;
- let tile = decode_tile_info(br, &self.ulev, 0)?;
- restore_tree(buf, prev, 1, x, y, size, &tile, cmv);
- let tile = decode_tile_info(br, &self.vlev, 0)?;
- restore_tree(buf, prev, 2, x, y, size, &tile, cmv);
- } else {
- let mv = mvi.predict(t_x, t_y, ZERO_MV);
- for plane in 0..3 {
- let x = if plane == 0 { t_x << self.tsize } else { t_x << (self.tsize - 1) };
- let y = if plane == 0 { t_y << self.tsize } else { t_y << (self.tsize - 1) };
- let size = if plane == 0 { 1 << self.tsize } else { 1 << (self.tsize - 1) };
- let mx = if plane == 0 { mv.x as isize } else { (mv.x >> 1) as isize };
- let my = if plane == 0 { mv.y as isize } else { (mv.y >> 1) as isize };
- copy_block(buf, prev, plane, x, y, mx, my, size);
- }
- }
- }
- mvi.update_row();
- }
- Ok(())
- }
-}
-
-impl NADecoder for ClearVideoDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if info.get_extradata().is_none() { return Err(DecoderError::InvalidData); }
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- let f = vinfo.is_flipped();
- let fmt = formats::YUV420_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
- self.frmmgr.clear();
- let edata = info.get_extradata().unwrap();
-//todo detect simply by extradata contents?
- if !self.is_rm {
- let mut mr = MemoryReader::new_read(edata.as_slice());
- let mut br = ByteReader::new(&mut mr);
- br.read_skip(0x5E).unwrap();
- let tile_size = br.read_u32le()?;
- self.tsize = tile_size.trailing_zeros() as u8;
- } else {
- let mut mr = MemoryReader::new_read(edata.as_slice());
- let mut br = ByteReader::new(&mut mr);
- br.read_skip(0x86).unwrap();
- let tile_size = br.read_u32be()?;
- self.tsize = tile_size.trailing_zeros() as u8;
- }
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
- if src.len() <= 1 { return Err(DecoderError::ShortData); }
- let off = if self.is_rm {
- let nhdr = src[0] as usize;
- (nhdr + 1) * 8 + 1
- } else {
- 0
- };
- if src.len() <= off + 1 { return Err(DecoderError::ShortData); }
-
- if (src[off] & 0x7F) == 0x30 {
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None);
- frm.set_keyframe(false);
- frm.set_frame_type(FrameType::Skip);
- return Ok(Rc::new(RefCell::new(frm)));
- }
-
- let is_intra = (src[off] & 2) == 2;
- let mut br = BitReader::new(&src[(off + 1)..], src.len() - (off + 1), BitReaderMode::BE);
-
- let vinfo = self.info.get_properties().get_video_info().unwrap();
- let bufret = alloc_video_buffer(vinfo, self.tsize);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let mut bufinfo = bufret.unwrap();
- let mut buf = bufinfo.get_vbuf().unwrap();
-
- if is_intra {
- let fsize = br.read(32)? as usize;
- validate!(fsize <= src.len() - off);
- self.decode_frame_intra(&mut br, &mut buf, vinfo.get_width(), vinfo.get_height())?;
- extend_edges(&mut buf, 1 << self.tsize);
- } else {
- let mut prev = self.frmmgr.clone_ref().unwrap();
- extend_edges(&mut prev, 1 << self.tsize);
- self.decode_frame_inter(&mut br, &mut buf, &mut prev, vinfo.get_width(), vinfo.get_height())?;
- extend_edges(&mut buf, 1 << self.tsize);
- }
- self.frmmgr.add_frame(buf);
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(is_intra);
- if is_intra {
- frm.set_frame_type(FrameType::I);
- } else {
- frm.set_frame_type(FrameType::P);
- }
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(ClearVideoDecoder::new(false))
-}
-
-pub fn get_decoder_rm() -> Box<NADecoder> {
- Box::new(ClearVideoDecoder::new(true))
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_clv() {
- test_file_decoding("avi", "assets/TalkingHead_352x288.avi", Some(10), true, false, None/*Some("clv")*/);
-// test_file_decoding("avi", "assets/basketball.avi", None/*Some(10)*/, true, false, Some("clv1"));
-//panic!("debug");
- }
-}
-
-const CLV_DC_CODES: &[u8] = &[
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x07, 0x0B,
- 0x0C, 0x08, 0x08, 0x09, 0x04, 0x06, 0x07, 0x05,
- 0x04, 0x05, 0x04, 0x06, 0x05, 0x06, 0x07, 0x05,
- 0x06, 0x07, 0x06, 0x07, 0x08, 0x06, 0x07, 0x08,
- 0x09, 0x0A, 0x0B, 0x07, 0x08, 0x09, 0x07, 0x08,
- 0x06, 0x07, 0x08, 0x06, 0x04, 0x05, 0x02, 0x01,
- 0x03, 0x06, 0x07, 0x07, 0x09, 0x0A, 0x0B, 0x09,
- 0x0A, 0x0B, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x09,
- 0x0D, 0x0A, 0x0B, 0x08, 0x09, 0x0A, 0x0B, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x06, 0x07, 0x06, 0x08,
- 0x07, 0x09, 0x0A, 0x0B, 0x09, 0x0A, 0x0B, 0x0C,
- 0x14, 0x0D, 0x0D, 0x0E, 0x0F, 0x15, 0x15, 0x16,
- 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E,
- 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
-];
-
-const CLV_DC_BITS: &[u8] = &[
- 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 21, 22, 22, 19, 20,
- 20, 19, 18, 18, 15, 17, 17, 16,
- 14, 15, 12, 13, 14, 14, 14, 12,
- 12, 12, 11, 11, 11, 10, 10, 10,
- 10, 10, 10, 9, 9, 9, 8, 8,
- 7, 7, 7, 6, 5, 5, 3, 1,
- 3, 5, 5, 6, 7, 7, 7, 8,
- 8, 8, 9, 9, 9, 9, 10, 11,
- 10, 11, 11, 12, 12, 12, 12, 13,
- 14, 14, 14, 14, 15, 15, 16, 17,
- 16, 17, 18, 18, 19, 19, 19, 19,
- 21, 19, 20, 19, 19, 21, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22,
-];
-
-const CLV_AC_SYMS: &[u16] = &[
- 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008,
- 0x0009, 0x000A, 0x000B, 0x000C, 0x0011, 0x0012, 0x0013, 0x0014,
- 0x0015, 0x0016, 0x0021, 0x0022, 0x0023, 0x0024, 0x0031, 0x0032,
- 0x0033, 0x0041, 0x0042, 0x0043, 0x0051, 0x0052, 0x0053, 0x0061,
- 0x0062, 0x0063, 0x0071, 0x0072, 0x0081, 0x0082, 0x0091, 0x0092,
- 0x00A1, 0x00A2, 0x00B1, 0x00C1, 0x00D1, 0x00E1, 0x00F1, 0x0101,
- 0x0111, 0x0121, 0x0131, 0x0141, 0x0151, 0x0161, 0x0171, 0x0181,
- 0x0191, 0x01A1, 0x1001, 0x1002, 0x1003, 0x1011, 0x1012, 0x1021,
- 0x1031, 0x1041, 0x1051, 0x1061, 0x1071, 0x1081, 0x1091, 0x10A1,
- 0x10B1, 0x10C1, 0x10D1, 0x10E1, 0x10F1, 0x1101, 0x1111, 0x1121,
- 0x1131, 0x1141, 0x1151, 0x1161, 0x1171, 0x1181, 0x1191, 0x11A1,
- 0x11B1, 0x11C1, 0x11D1, 0x11E1, 0x11F1, 0x1201, 0x1211, 0x1221,
- 0x1231, 0x1241, 0x1251, 0x1261, 0x1271, 0x1281, 0x1BFF,
-];
-
-const CLV_AC_CODES: &[u8] = &[
- 0x02, 0x0F, 0x15, 0x17, 0x1F, 0x25, 0x24, 0x21,
- 0x20, 0x07, 0x06, 0x20, 0x06, 0x14, 0x1E, 0x0F,
- 0x21, 0x50, 0x0E, 0x1D, 0x0E, 0x51, 0x0D, 0x23,
- 0x0D, 0x0C, 0x22, 0x52, 0x0B, 0x0C, 0x53, 0x13,
- 0x0B, 0x54, 0x12, 0x0A, 0x11, 0x09, 0x10, 0x08,
- 0x16, 0x55, 0x15, 0x14, 0x1C, 0x1B, 0x21, 0x20,
- 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x22, 0x23,
- 0x56, 0x57, 0x07, 0x19, 0x05, 0x0F, 0x04, 0x0E,
- 0x0D, 0x0C, 0x13, 0x12, 0x11, 0x10, 0x1A, 0x19,
- 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x18, 0x17,
- 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x07, 0x06,
- 0x05, 0x04, 0x24, 0x25, 0x26, 0x27, 0x58, 0x59,
- 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x03,
-];
-
-const CLV_AC_BITS: &[u8] = &[
- 2, 4, 6, 7, 8, 9, 9, 10,
- 10, 11, 11, 11, 3, 6, 8, 10,
- 11, 12, 4, 8, 10, 12, 5, 9,
- 10, 5, 9, 12, 5, 10, 12, 6,
- 10, 12, 6, 10, 6, 10, 6, 10,
- 7, 12, 7, 7, 8, 8, 9, 9,
- 9, 9, 9, 9, 9, 9, 11, 11,
- 12, 12, 4, 9, 11, 6, 11, 6,
- 6, 6, 7, 7, 7, 7, 8, 8,
- 8, 8, 8, 8, 8, 8, 9, 9,
- 9, 9, 9, 9, 9, 9, 10, 10,
- 10, 10, 11, 11, 11, 11, 12, 12,
- 12, 12, 12, 12, 12, 12, 7,
-];
-
-const CLV_AC_ESCAPE: u16 = 0x1BFF;
-
-const ZIGZAG: &[usize] = &[
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63
-];
-
-const CLV_BIAS_ESCAPE: u16 = 0x100;
-
-const CLV_MVY_0_BITS: &[u8] = &[
- 16, 14, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 14,
- 16, 15, 14, 14, 14, 13, 13, 12, 10, 7, 10, 12, 13, 13, 14, 14,
- 14, 15, 15, 14, 14, 14, 13, 13, 11, 10, 7, 10, 11, 13, 13, 14,
- 14, 14, 15, 15, 14, 14, 13, 13, 12, 11, 10, 7, 10, 11, 12, 13,
- 13, 14, 14, 15, 16, 15, 14, 12, 12, 12, 11, 10, 6, 10, 11, 12,
- 12, 12, 14, 15, 16, 15, 14, 13, 13, 12, 11, 10, 9, 6, 9, 10,
- 11, 12, 13, 13, 14, 15, 14, 14, 13, 12, 12, 11, 10, 8, 6, 8,
- 10, 11, 12, 12, 13, 14, 14, 14, 13, 13, 13, 11, 11, 9, 7, 4,
- 7, 9, 11, 11, 12, 13, 13, 14, 11, 10, 10, 9, 9, 8, 7, 5,
- 1, 5, 7, 8, 9, 9, 10, 10, 11, 14, 13, 13, 12, 11, 11, 9,
- 7, 4, 7, 9, 11, 11, 13, 13, 13, 14, 14, 14, 13, 12, 12, 11,
- 10, 8, 6, 8, 10, 11, 12, 12, 13, 14, 14, 15, 14, 13, 13, 12,
- 11, 10, 9, 7, 9, 10, 11, 12, 13, 13, 14, 15, 16, 15, 14, 12,
- 12, 12, 11, 10, 6, 10, 11, 12, 12, 12, 14, 15, 16, 15, 14, 14,
- 13, 13, 12, 11, 10, 7, 10, 11, 12, 13, 13, 14, 14, 15, 15, 14,
- 14, 14, 13, 13, 11, 10, 7, 10, 11, 13, 13, 14, 14, 14, 15, 15,
- 14, 14, 14, 13, 13, 12, 10, 7, 10, 12, 13, 13, 14, 14, 14, 15,
- 16, 14, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 14,
- 16, 6,
-];
-const CLV_MVY_0_CODES: &[u16] = &[
- 0xFFFD, 0x3FE5, 0x1FD8, 0x1FC4, 0x1FBC, 0x0FCB, 0x07CF, 0x07C4,
- 0x01D7, 0x07C6, 0x07CE, 0x0FCA, 0x1FBD, 0x1FC2, 0x1FD9, 0x3FE4,
- 0xFFFE, 0x7FF0, 0x3FEF, 0x3FD2, 0x3FC9, 0x1FCC, 0x1FC0, 0x0FB6,
- 0x03D6, 0x0070, 0x03D7, 0x0FB7, 0x1FC1, 0x1FCD, 0x3FCB, 0x3FD0,
- 0x3FED, 0x7FF2, 0x7FFB, 0x3FDC, 0x3FD9, 0x3FD4, 0x1FB6, 0x1FAE,
- 0x07C0, 0x03BC, 0x006D, 0x03BD, 0x07C1, 0x1FAF, 0x1FB7, 0x3FD1,
- 0x3FDB, 0x3FDF, 0x7FF9, 0x7FEE, 0x3FF0, 0x3FC7, 0x1FC9, 0x1FA7,
- 0x0FAD, 0x07D2, 0x03CE, 0x006C, 0x03CF, 0x07D0, 0x0FAF, 0x1FA6,
- 0x1FC6, 0x3FC4, 0x3FF1, 0x7FED, 0xFFFB, 0x7FF6, 0x3FE6, 0x0FCC,
- 0x0FC4, 0x0FB0, 0x07B0, 0x03C6, 0x0031, 0x03C7, 0x07B1, 0x0FB1,
- 0x0FC5, 0x0FCD, 0x3FEA, 0x7FF7, 0xFFF9, 0x7FE9, 0x3FCE, 0x1FCF,
- 0x1FB2, 0x0FB8, 0x07BC, 0x03D0, 0x01DA, 0x002F, 0x01DB, 0x03D1,
- 0x07BE, 0x0FBA, 0x1FB4, 0x1FD0, 0x3FCD, 0x7FEB, 0x3FE1, 0x3FC1,
- 0x1FD3, 0x0FC3, 0x0FBE, 0x07B6, 0x03C4, 0x00E4, 0x002D, 0x00E5,
- 0x03C5, 0x07B7, 0x0FBF, 0x0FC1, 0x1FD2, 0x3FC3, 0x3FE2, 0x3FBF,
- 0x1FDB, 0x1FAD, 0x1FA5, 0x07CB, 0x07BB, 0x01D5, 0x0068, 0x0008,
- 0x0065, 0x01D2, 0x07B8, 0x07C8, 0x0FD0, 0x1FAA, 0x1FDA, 0x3FBC,
- 0x07D4, 0x03CA, 0x03C0, 0x01D8, 0x01D0, 0x00E6, 0x0069, 0x0014,
- 0x0000, 0x0015, 0x006A, 0x00E7, 0x01D1, 0x01D9, 0x03C1, 0x03CB,
- 0x07D5, 0x3FBE, 0x1FDC, 0x1FAB, 0x0FD1, 0x07C9, 0x07B9, 0x01D3,
- 0x0066, 0x0009, 0x0067, 0x01D4, 0x07BA, 0x07CA, 0x1FA4, 0x1FAC,
- 0x1FDD, 0x3FBD, 0x3FE0, 0x3FC0, 0x1FD5, 0x0FC0, 0x0FBC, 0x07B4,
- 0x03C2, 0x00E2, 0x002C, 0x00E3, 0x03C3, 0x07B5, 0x0FBD, 0x0FC2,
- 0x1FD7, 0x3FC2, 0x3FE3, 0x7FEA, 0x3FCC, 0x1FCE, 0x1FB3, 0x0FB9,
- 0x07BD, 0x03D2, 0x01DC, 0x0064, 0x01DD, 0x03D3, 0x07BF, 0x0FBB,
- 0x1FB5, 0x1FD1, 0x3FCF, 0x7FE8, 0xFFFA, 0x7FF4, 0x3FEB, 0x0FCE,
- 0x0FC6, 0x0FB2, 0x07B2, 0x03C8, 0x0030, 0x03C9, 0x07B3, 0x0FB3,
- 0x0FC7, 0x0FCF, 0x3FE9, 0x7FF5, 0xFFF8, 0x7FF3, 0x3FF3, 0x3FC6,
- 0x1FC8, 0x1FA8, 0x0FAC, 0x07D1, 0x03CC, 0x006B, 0x03CD, 0x07D3,
- 0x0FAE, 0x1FA9, 0x1FC7, 0x3FC5, 0x3FF2, 0x7FEC, 0x7FFA, 0x3FDE,
- 0x3FDA, 0x3FD7, 0x1FB9, 0x1FB0, 0x07C2, 0x03BE, 0x006E, 0x03BF,
- 0x07C3, 0x1FB1, 0x1FB8, 0x3FD3, 0x3FD8, 0x3FDD, 0x7FF8, 0x7FEF,
- 0x3FEE, 0x3FD6, 0x3FC8, 0x1FCB, 0x1FBE, 0x0FB5, 0x03D4, 0x006F,
- 0x03D5, 0x0FB4, 0x1FBF, 0x1FCA, 0x3FCA, 0x3FD5, 0x3FEC, 0x7FF1,
- 0xFFFF, 0x3FE8, 0x1FD4, 0x1FC5, 0x1FBA, 0x0FC9, 0x07CD, 0x07C7,
- 0x01D6, 0x07C5, 0x07CC, 0x0FC8, 0x1FBB, 0x1FC3, 0x1FD6, 0x3FE7,
- 0xFFFC, 0x002E,
-];
-const CLV_MVY_0_SYMS: &[u16] = &[
- 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8,
- 0x00F8, 0x01F8, 0x02F8, 0x03F8, 0x04F8, 0x05F8, 0x06F8, 0x07F8,
- 0x08F8, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9,
- 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9,
- 0x07F9, 0x08F9, 0xF8FA, 0xF9FA, 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA,
- 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, 0x02FA, 0x03FA, 0x04FA, 0x05FA,
- 0x06FA, 0x07FA, 0x08FA, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB,
- 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB,
- 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC,
- 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC,
- 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0x08FC, 0xF8FD, 0xF9FD, 0xFAFD,
- 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD,
- 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0xF8FE, 0xF9FE,
- 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, 0xFEFE, 0xFFFE, 0x00FE, 0x01FE,
- 0x02FE, 0x03FE, 0x04FE, 0x05FE, 0x06FE, 0x07FE, 0x08FE, 0xF8FF,
- 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF,
- 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF,
- 0xF800, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00,
- 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
- 0x0800, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01,
- 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601,
- 0x0701, 0x0801, 0xF802, 0xF902, 0xFA02, 0xFB02, 0xFC02, 0xFD02,
- 0xFE02, 0xFF02, 0x0002, 0x0102, 0x0202, 0x0302, 0x0402, 0x0502,
- 0x0602, 0x0702, 0x0802, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03,
- 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403,
- 0x0503, 0x0603, 0x0703, 0x0803, 0xF804, 0xF904, 0xFA04, 0xFB04,
- 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304,
- 0x0404, 0x0504, 0x0604, 0x0704, 0x0804, 0xF805, 0xF905, 0xFA05,
- 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205,
- 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0xF806, 0xF906,
- 0xFA06, 0xFB06, 0xFC06, 0xFD06, 0xFE06, 0xFF06, 0x0006, 0x0106,
- 0x0206, 0x0306, 0x0406, 0x0506, 0x0606, 0x0706, 0x0806, 0xF807,
- 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007,
- 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807,
- 0xF808, 0xF908, 0xFA08, 0xFB08, 0xFC08, 0xFD08, 0xFE08, 0xFF08,
- 0x0008, 0x0108, 0x0208, 0x0308, 0x0408, 0x0508, 0x0608, 0x0708,
- 0x0808, 0x0909,
-];
-const CLV_MVY_0_ESCAPE: u16 = 0x0909;
-
-const CLV_FLAGSY_0_BITS: &[u8] = &[
- 3, 4, 4, 4, 4, 4, 6, 5, 4, 7, 4, 5, 4, 7, 5, 2,
-];
-const CLV_FLAGSY_0_CODES: &[u16] = &[
- 0x0002, 0x0009, 0x000B, 0x0006, 0x000C, 0x0007, 0x003E, 0x001C,
- 0x000D, 0x007E, 0x000A, 0x001D, 0x0008, 0x007F, 0x001E, 0x0000,
-];
-
-const CLV_MVY_1_BITS: &[u8] = &[
- 15, 15, 15, 15, 14, 14, 13, 13, 11, 9, 11, 13, 13, 14, 14, 15,
- 15, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 10, 9, 10, 12, 12,
- 12, 13, 13, 14, 14, 15, 15, 15, 14, 14, 13, 13, 13, 12, 11, 8,
- 11, 12, 13, 13, 13, 14, 14, 15, 15, 14, 14, 14, 14, 13, 12, 12,
- 12, 10, 8, 10, 12, 12, 12, 13, 14, 14, 14, 14, 15, 14, 14, 13,
- 13, 12, 12, 11, 10, 8, 10, 11, 12, 12, 13, 13, 14, 14, 15, 14,
- 14, 13, 13, 13, 12, 12, 11, 9, 7, 9, 11, 12, 12, 13, 13, 13,
- 14, 14, 14, 14, 13, 13, 13, 12, 11, 10, 9, 7, 9, 10, 11, 12,
- 13, 13, 13, 14, 14, 14, 13, 13, 12, 12, 11, 11, 10, 8, 7, 8,
- 10, 11, 11, 12, 12, 13, 13, 14, 13, 13, 13, 12, 11, 11, 10, 9,
- 6, 4, 6, 9, 10, 11, 12, 12, 13, 13, 13, 12, 11, 10, 10, 10,
- 9, 9, 7, 5, 1, 5, 7, 9, 9, 10, 10, 10, 11, 12, 13, 13,
- 13, 12, 11, 11, 10, 9, 6, 4, 6, 9, 10, 11, 11, 12, 13, 13,
- 13, 14, 13, 13, 12, 12, 11, 11, 10, 8, 7, 8, 10, 11, 11, 12,
- 12, 13, 13, 14, 14, 14, 13, 13, 13, 12, 11, 10, 9, 7, 9, 10,
- 11, 12, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 12, 12, 11, 9,
- 7, 9, 11, 12, 12, 13, 13, 13, 14, 14, 15, 14, 14, 13, 13, 12,
- 12, 11, 10, 8, 10, 11, 12, 12, 13, 13, 14, 14, 15, 14, 14, 14,
- 14, 13, 12, 12, 12, 10, 8, 10, 12, 12, 12, 13, 14, 14, 14, 14,
- 15, 15, 14, 14, 13, 13, 13, 12, 11, 8, 11, 12, 13, 13, 13, 14,
- 14, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 10, 9, 10, 12, 12,
- 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 14, 14, 13, 13, 11, 9,
- 11, 13, 13, 14, 14, 15, 15, 15, 15, 5,
-];
-const CLV_MVY_1_CODES: &[u16] = &[
- 0x7FF9, 0x7FF6, 0x7FEB, 0x7FE3, 0x3FCF, 0x3FB3, 0x1FBD, 0x1FA1,
- 0x07AD, 0x01CE, 0x07AF, 0x1FA0, 0x1FBB, 0x3FB0, 0x3FCC, 0x7FE2,
- 0x7FE9, 0x7FF4, 0x7FFB, 0x7FF1, 0x3FE7, 0x3FBD, 0x1FA5, 0x1F9B,
- 0x0FB4, 0x0FAF, 0x0FAA, 0x03CC, 0x01CD, 0x03CD, 0x0FAB, 0x0FAD,
- 0x0FB1, 0x1F9C, 0x1FA3, 0x3FBE, 0x3FE6, 0x7FF0, 0x7FFC, 0x7FE5,
- 0x3FB5, 0x3FAE, 0x1FB4, 0x1FAA, 0x1F97, 0x0F85, 0x07A2, 0x00DD,
- 0x07A3, 0x0F86, 0x1F99, 0x1FAD, 0x1FB2, 0x3FAC, 0x3FB7, 0x7FE4,
- 0x7FFD, 0x3FEA, 0x3FD8, 0x3FC3, 0x3FBB, 0x1FC9, 0x0FBC, 0x0F97,
- 0x0F8F, 0x03B8, 0x00DA, 0x03B9, 0x0F90, 0x0F98, 0x0FB9, 0x1FC6,
- 0x3FBA, 0x3FC0, 0x3FD9, 0x3FEB, 0x7FEF, 0x3FEE, 0x3FD7, 0x1FC3,
- 0x1F96, 0x0FC0, 0x0FA8, 0x07AA, 0x03BE, 0x00D9, 0x03BF, 0x07AB,
- 0x0FA7, 0x0FBF, 0x1F98, 0x1FC5, 0x3FD6, 0x3FEF, 0x7FEE, 0x3FDC,
- 0x3FCA, 0x1FBF, 0x1F8B, 0x1F87, 0x0FA2, 0x0F94, 0x07A5, 0x01D4,
- 0x0069, 0x01D5, 0x07A6, 0x0F95, 0x0FA3, 0x1F89, 0x1F8D, 0x1FC0,
- 0x3FC6, 0x3FDE, 0x3FE0, 0x3FD3, 0x1FB8, 0x1F8F, 0x1F84, 0x0F89,
- 0x07BC, 0x03C6, 0x01C6, 0x0067, 0x01C7, 0x03C7, 0x07BD, 0x0F87,
- 0x1F82, 0x1F8A, 0x1FB6, 0x3FD1, 0x3FE2, 0x3FC5, 0x1FCE, 0x1FAE,
- 0x0FB5, 0x0F8B, 0x07B4, 0x07B0, 0x03B4, 0x00DE, 0x0064, 0x00DF,
- 0x03B5, 0x07B1, 0x07B5, 0x0F8C, 0x0FB6, 0x1FAF, 0x1FD1, 0x3FCB,
- 0x1FD3, 0x1FCC, 0x1FA7, 0x0F9B, 0x07BE, 0x079C, 0x03C0, 0x01C8,
- 0x002E, 0x0008, 0x002F, 0x01C9, 0x03C1, 0x079D, 0x0F82, 0x0F9A,
- 0x1FA9, 0x1FCA, 0x1FD4, 0x0F9F, 0x07B6, 0x03C8, 0x03B2, 0x03B0,
- 0x01D6, 0x01D0, 0x006A, 0x0014, 0x0000, 0x0015, 0x006B, 0x01D1,
- 0x01D7, 0x03B1, 0x03B3, 0x03C9, 0x07B7, 0x0FA0, 0x1FD5, 0x1FCB,
- 0x1FAB, 0x0F9C, 0x07BF, 0x079E, 0x03C2, 0x01CA, 0x0030, 0x0009,
- 0x0031, 0x01CB, 0x03C3, 0x079F, 0x07C0, 0x0F9D, 0x1FAC, 0x1FCD,
- 0x1FD2, 0x3FC8, 0x1FD0, 0x1FB0, 0x0FB7, 0x0F8D, 0x07B8, 0x07B2,
- 0x03B6, 0x00E0, 0x0065, 0x00E1, 0x03B7, 0x07B3, 0x07B9, 0x0F8E,
- 0x0FB8, 0x1FB1, 0x1FCF, 0x3FC9, 0x3FE1, 0x3FD2, 0x1FB7, 0x1F8E,
- 0x1F83, 0x0F88, 0x07BA, 0x03C4, 0x01C4, 0x0066, 0x01C5, 0x03C5,
- 0x07BB, 0x0F8A, 0x1F85, 0x1F90, 0x1FB9, 0x3FD0, 0x3FE3, 0x3FDD,
- 0x3FC7, 0x1FC1, 0x1F91, 0x1F88, 0x0FA4, 0x0F96, 0x07A7, 0x01D2,
- 0x0068, 0x01D3, 0x07A4, 0x0F93, 0x0FA1, 0x1F86, 0x1F8C, 0x1FBE,
- 0x3FC4, 0x3FDF, 0x7FED, 0x3FEC, 0x3FD4, 0x1FC4, 0x1F92, 0x0FBD,
- 0x0FA5, 0x07A8, 0x03BC, 0x00D8, 0x03BD, 0x07A9, 0x0FA6, 0x0FBE,
- 0x1F93, 0x1FC2, 0x3FD5, 0x3FED, 0x7FEC, 0x3FE8, 0x3FDB, 0x3FC1,
- 0x3FB9, 0x1FC7, 0x0FBA, 0x0F9E, 0x0F91, 0x03BA, 0x00DB, 0x03BB,
- 0x0F92, 0x0F99, 0x0FBB, 0x1FC8, 0x3FB8, 0x3FC2, 0x3FDA, 0x3FE9,
- 0x7FFF, 0x7FE7, 0x3FB6, 0x3FAF, 0x1FB3, 0x1FA6, 0x1F94, 0x0F83,
- 0x07A0, 0x00DC, 0x07A1, 0x0F84, 0x1F95, 0x1FA8, 0x1FB5, 0x3FAD,
- 0x3FB4, 0x7FE6, 0x7FFE, 0x7FF3, 0x3FE5, 0x3FBC, 0x1FA4, 0x1F9D,
- 0x0FB2, 0x0FAE, 0x0FA9, 0x03CA, 0x01CC, 0x03CB, 0x0FAC, 0x0FB0,
- 0x0FB3, 0x1F9A, 0x1FA2, 0x3FBF, 0x3FE4, 0x7FF2, 0x7FF8, 0x7FF5,
- 0x7FEA, 0x7FE0, 0x3FCD, 0x3FB1, 0x1FBA, 0x1F9F, 0x07AE, 0x01CF,
- 0x07AC, 0x1F9E, 0x1FBC, 0x3FB2, 0x3FCE, 0x7FE1, 0x7FE8, 0x7FF7,
- 0x7FFA, 0x0016,
-];
-const CLV_MVY_1_SYMS: &[u16] = &[
- 0xF7F7, 0xF8F7, 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7,
- 0xFFF7, 0x00F7, 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7,
- 0x07F7, 0x08F7, 0x09F7, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8,
- 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8,
- 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0xF7F9, 0xF8F9,
- 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9,
- 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0x08F9,
- 0x09F9, 0xF7FA, 0xF8FA, 0xF9FA, 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA,
- 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, 0x02FA, 0x03FA, 0x04FA, 0x05FA,
- 0x06FA, 0x07FA, 0x08FA, 0x09FA, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB,
- 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB,
- 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0xF7FC,
- 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC,
- 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC,
- 0x08FC, 0x09FC, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD,
- 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD,
- 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0xF7FE, 0xF8FE, 0xF9FE,
- 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, 0xFEFE, 0xFFFE, 0x00FE, 0x01FE,
- 0x02FE, 0x03FE, 0x04FE, 0x05FE, 0x06FE, 0x07FE, 0x08FE, 0x09FE,
- 0xF7FF, 0xF8FF, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF,
- 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF,
- 0x07FF, 0x08FF, 0x09FF, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00,
- 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300,
- 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0xF701, 0xF801,
- 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001,
- 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0x0801,
- 0x0901, 0xF702, 0xF802, 0xF902, 0xFA02, 0xFB02, 0xFC02, 0xFD02,
- 0xFE02, 0xFF02, 0x0002, 0x0102, 0x0202, 0x0302, 0x0402, 0x0502,
- 0x0602, 0x0702, 0x0802, 0x0902, 0xF703, 0xF803, 0xF903, 0xFA03,
- 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203,
- 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0xF704,
- 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04,
- 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704,
- 0x0804, 0x0904, 0xF705, 0xF805, 0xF905, 0xFA05, 0xFB05, 0xFC05,
- 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405,
- 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0xF706, 0xF806, 0xF906,
- 0xFA06, 0xFB06, 0xFC06, 0xFD06, 0xFE06, 0xFF06, 0x0006, 0x0106,
- 0x0206, 0x0306, 0x0406, 0x0506, 0x0606, 0x0706, 0x0806, 0x0906,
- 0xF707, 0xF807, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07,
- 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607,
- 0x0707, 0x0807, 0x0907, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08,
- 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308,
- 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0xF709, 0xF809,
- 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09, 0xFF09, 0x0009,
- 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609, 0x0709, 0x0809,
- 0x0909, 0x0A0A,
-];
-const CLV_MVY_1_ESCAPE: u16 = 0x0A0A;
-
-const CLV_BIASY_1_BITS: &[u8] = &[
- 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13,
- 13, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9,
- 8, 8, 7, 7, 5, 2, 1, 3, 5, 7, 7, 8, 9, 9, 10, 10,
- 10, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13,
- 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 12,
-];
-const CLV_BIASY_1_CODES: &[u16] = &[
- 0xFFFE, 0x7FFE, 0x7FFC, 0x7FFA, 0x7FF6, 0x7FF7, 0x7FF3, 0x7FF2,
- 0x7FEF, 0x7FEE, 0x3FF5, 0x3FF3, 0x3FF1, 0x1FF7, 0x1FF5, 0x1FF2,
- 0x1FF0, 0x1FEE, 0x1FEC, 0x1FEA, 0x1FE8, 0x0FF2, 0x0FF0, 0x0FEE,
- 0x0FEB, 0x07F4, 0x07F3, 0x07F1, 0x03F7, 0x03F5, 0x03F3, 0x01F7,
- 0x00FA, 0x00F8, 0x007A, 0x0078, 0x001C, 0x0002, 0x0000, 0x0006,
- 0x001D, 0x0079, 0x007B, 0x00F9, 0x01F6, 0x01F8, 0x03F2, 0x03F4,
- 0x03F6, 0x07F0, 0x07F2, 0x0FEA, 0x0FEC, 0x0FEF, 0x0FF1, 0x0FF3,
- 0x1FE9, 0x1FEB, 0x1FED, 0x1FEF, 0x1FF1, 0x1FF3, 0x1FF4, 0x1FF6,
- 0x3FF0, 0x3FF2, 0x3FF4, 0x3FF6, 0x7FF0, 0x7FF1, 0x7FF4, 0x7FF8,
- 0x7FF5, 0x7FF9, 0x7FFB, 0x7FFD, 0xFFFF, 0x0FED,
-];
-const CLV_BIASY_1_SYMS: &[u16] = &[
- 0xFF68, 0xFF6C, 0xFF70, 0xFF74, 0xFF78, 0xFF7C, 0xFF80, 0xFF84,
- 0xFF88, 0xFF8C, 0xFF90, 0xFF94, 0xFF98, 0xFF9C, 0xFFA0, 0xFFA4,
- 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4,
- 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4,
- 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004,
- 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024,
- 0x0028, 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044,
- 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, 0x0060, 0x0064,
- 0x0068, 0x006C, 0x0070, 0x0074, 0x0078, 0x007C, 0x0080, 0x0084,
- 0x0088, 0x008C, 0x0090, 0x0094, 0x0098, 0x0100,
-];
-
-const CLV_FLAGSY_1_BITS: &[u8] = &[
- 2, 4, 4, 3, 4, 4, 7, 6, 4, 6, 4, 6, 4, 8, 8, 3,
-];
-const CLV_FLAGSY_1_CODES: &[u16] = &[
- 0x0000, 0x000A, 0x000C, 0x0003, 0x000B, 0x0009, 0x007E, 0x003D,
- 0x000D, 0x003E, 0x000E, 0x003C, 0x0008, 0x00FE, 0x00FF, 0x0002,
-];
-
-const CLV_MVY_2_BITS: &[u8] = &[
- 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11,
- 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16,
- 15, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 11, 10, 11,
- 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 15,
- 15, 15, 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 11, 10, 11, 13,
- 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 15, 15,
- 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 12, 11, 9, 11, 12, 13,
- 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 16, 16, 15, 15, 14,
- 14, 13, 13, 13, 13, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13,
- 13, 13, 13, 13, 13, 13, 14, 14, 14, 15, 16, 16, 15, 15, 15, 14,
- 13, 13, 13, 13, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13,
- 13, 13, 13, 13, 13, 14, 15, 15, 15, 16, 16, 15, 15, 15, 15, 14,
- 14, 13, 13, 13, 12, 12, 12, 11, 11, 9, 11, 11, 12, 12, 12, 13,
- 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 15, 15, 14, 14, 14, 13,
- 13, 13, 12, 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13,
- 13, 13, 14, 14, 14, 15, 15, 16, 16, 15, 14, 14, 14, 13, 13, 13,
- 13, 12, 12, 12, 11, 11, 10, 8, 10, 11, 11, 12, 12, 12, 13, 13,
- 13, 13, 14, 14, 14, 15, 16, 15, 15, 14, 14, 13, 13, 13, 13, 13,
- 12, 12, 12, 11, 10, 9, 8, 9, 10, 11, 12, 12, 12, 13, 13, 13,
- 13, 13, 14, 14, 15, 15, 15, 15, 14, 14, 13, 13, 13, 13, 13, 12,
- 12, 11, 11, 10, 10, 7, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13,
- 13, 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12,
- 11, 11, 10, 9, 7, 9, 10, 11, 11, 12, 12, 12, 12, 12, 13, 13,
- 14, 14, 14, 14, 15, 13, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11,
- 11, 10, 8, 7, 8, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13,
- 13, 13, 15, 14, 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10,
- 9, 8, 6, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14,
- 14, 14, 16, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 9, 9, 8,
- 6, 4, 6, 8, 9, 9, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13,
- 16, 12, 12, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 8, 7, 4,
- 2, 4, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
- 16, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 9, 9, 8, 6, 4,
- 6, 8, 9, 9, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 16, 14,
- 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 9, 8, 6, 8,
- 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 13,
- 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 10, 8, 7, 8, 10,
- 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 15, 14, 14, 14,
- 14, 13, 13, 12, 12, 12, 12, 12, 11, 11, 10, 9, 7, 9, 10, 11,
- 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 14, 14,
- 13, 13, 13, 13, 13, 12, 12, 11, 11, 10, 10, 7, 10, 10, 11, 11,
- 12, 12, 13, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 14, 14, 13,
- 13, 13, 13, 13, 12, 12, 12, 11, 10, 9, 8, 9, 10, 11, 12, 12,
- 12, 13, 13, 13, 13, 13, 14, 14, 15, 15, 16, 15, 14, 14, 14, 13,
- 13, 13, 13, 12, 12, 12, 11, 11, 10, 8, 10, 11, 11, 12, 12, 12,
- 13, 13, 13, 13, 14, 14, 14, 15, 16, 16, 15, 15, 14, 14, 14, 13,
- 13, 13, 12, 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13,
- 13, 13, 14, 14, 14, 15, 15, 16, 16, 15, 15, 15, 15, 14, 14, 13,
- 13, 13, 12, 12, 12, 11, 11, 9, 11, 11, 12, 12, 12, 13, 13, 13,
- 14, 14, 15, 15, 15, 15, 16, 16, 15, 15, 15, 14, 13, 13, 13, 13,
- 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 13, 13, 13,
- 13, 14, 15, 15, 15, 16, 16, 15, 15, 14, 14, 13, 13, 13, 13, 13,
- 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13,
- 14, 14, 14, 15, 16, 16, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13,
- 13, 13, 12, 11, 9, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14,
- 15, 15, 15, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13,
- 13, 13, 11, 10, 11, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15,
- 15, 15, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13,
- 13, 12, 10, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
- 15, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13,
- 12, 11, 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16,
- 16, 7,
-];
-const CLV_MVY_2_CODES: &[u16] = &[
- 0xFFF5, 0xFFD8, 0x7FE6, 0x7FB9, 0x7FB5, 0x7FB0, 0x7FA0, 0x7F99,
- 0x7F93, 0x3FAA, 0x3F9B, 0x3F52, 0x1F76, 0x1EF5, 0x0F0B, 0x06F0,
- 0x0F08, 0x1EF0, 0x1F75, 0x3F53, 0x3F9A, 0x3FA8, 0x7F94, 0x7F98,
- 0x7F9E, 0x7FAE, 0x7FAF, 0x7FB7, 0x7FE9, 0xFFDB, 0xFFF6, 0xFFFD,
- 0x7FD9, 0x7FCC, 0x7FC6, 0x7F9C, 0x7F80, 0x3FA5, 0x3F80, 0x3F6A,
- 0x3F31, 0x1F54, 0x1F40, 0x1F11, 0x1F05, 0x075E, 0x0360, 0x075F,
- 0x1F07, 0x1F12, 0x1F43, 0x1F56, 0x3F33, 0x3F68, 0x3F83, 0x3FA6,
- 0x7F7F, 0x7F9A, 0x7FC9, 0x7FCA, 0x7FDB, 0xFFF8, 0xFFEC, 0x7FDE,
- 0x7FE2, 0x7FA6, 0x7F6F, 0x3FA1, 0x3F8D, 0x3F5C, 0x3F39, 0x3F21,
- 0x3F18, 0x1F58, 0x1F1E, 0x1EF1, 0x0740, 0x035A, 0x0741, 0x1EF2,
- 0x1F1F, 0x1F5A, 0x3F19, 0x3F22, 0x3F3B, 0x3F5E, 0x3F8E, 0x3FA3,
- 0x7F6B, 0x7FA2, 0x7FE3, 0x7FE1, 0xFFEE, 0xFFFC, 0x7FC3, 0x7FBC,
- 0x7F71, 0x3F96, 0x3F86, 0x3F7A, 0x3F72, 0x3F59, 0x3F46, 0x1F0A,
- 0x1EFD, 0x1ED0, 0x0F02, 0x0712, 0x019F, 0x0713, 0x0F03, 0x1ED3,
- 0x1EFF, 0x1F09, 0x3F4A, 0x3F5A, 0x3F76, 0x3F7B, 0x3F87, 0x3F97,
- 0x7F73, 0x7FBB, 0x7FBF, 0xFFFB, 0xFFEB, 0x7F88, 0x7F5C, 0x3F7C,
- 0x3F3C, 0x1F60, 0x1F4C, 0x1F14, 0x1F0C, 0x1F00, 0x1EF9, 0x1ED8,
- 0x0F42, 0x075A, 0x0714, 0x0186, 0x0715, 0x075B, 0x0F43, 0x1EDA,
- 0x1EFA, 0x1F01, 0x1F0E, 0x1F15, 0x1F4D, 0x1F62, 0x3F3D, 0x3F7D,
- 0x3FAC, 0x7F86, 0xFFE8, 0xFFE7, 0x7FA7, 0x7F8C, 0x7F68, 0x3F9C,
- 0x1F7C, 0x1F6C, 0x1F69, 0x1EEC, 0x1EE4, 0x1ED5, 0x1ECD, 0x0EF0,
- 0x0752, 0x06F6, 0x018C, 0x06F7, 0x0753, 0x0EF1, 0x1ECE, 0x1ED6,
- 0x1EE5, 0x1EED, 0x1F6A, 0x1F6E, 0x1F7D, 0x3F9F, 0x7F66, 0x7F8A,
- 0x7FA5, 0xFFE6, 0xFFDC, 0x7FDA, 0x7FC0, 0x7FAC, 0x7F61, 0x3F42,
- 0x3F0E, 0x1F45, 0x1F2C, 0x1ECA, 0x0F27, 0x0EF6, 0x0EEE, 0x072E,
- 0x06F4, 0x0185, 0x06F5, 0x072F, 0x0EEF, 0x0EF7, 0x0F28, 0x1ECB,
- 0x1F2F, 0x1F46, 0x3F0F, 0x3F40, 0x7F5F, 0x7FB4, 0x7FC2, 0x7FDC,
- 0xFFDA, 0xFFE0, 0x7F72, 0x7F63, 0x3F70, 0x3F1C, 0x3F16, 0x1F82,
- 0x1EE2, 0x1EB2, 0x0F4C, 0x0EFC, 0x0EE0, 0x0ED3, 0x0722, 0x036C,
- 0x00BF, 0x036D, 0x0723, 0x0ECC, 0x0EE1, 0x0EFF, 0x0F4D, 0x1EB3,
- 0x1EE3, 0x1F83, 0x3F17, 0x3F1F, 0x3F75, 0x7F65, 0x7F70, 0xFFE2,
- 0xFFD7, 0x7F76, 0x3F2B, 0x3F13, 0x3F0A, 0x1F33, 0x1F23, 0x1EB4,
- 0x1EA0, 0x0F46, 0x0F32, 0x0F1A, 0x0756, 0x0728, 0x0356, 0x00B0,
- 0x0357, 0x0729, 0x0757, 0x0F1B, 0x0F33, 0x0F47, 0x1EA1, 0x1EB5,
- 0x1F20, 0x1F30, 0x3F08, 0x3F10, 0x3F28, 0x7F77, 0xFFD5, 0x7FD5,
- 0x7FD1, 0x3F5D, 0x3F25, 0x1F34, 0x1F24, 0x1EE8, 0x1EBC, 0x1EA8,
- 0x0F3A, 0x0F2E, 0x0EE2, 0x071C, 0x0374, 0x01A0, 0x00AE, 0x01A1,
- 0x0375, 0x071D, 0x0EE3, 0x0F2F, 0x0F3C, 0x1EA9, 0x1EBD, 0x1EE9,
- 0x1F25, 0x1F36, 0x3F24, 0x3F61, 0x7FCE, 0x7FD2, 0x7F91, 0x7F7D,
- 0x3F6C, 0x3F34, 0x1F72, 0x1F61, 0x1EDD, 0x1EC5, 0x1EA5, 0x0F05,
- 0x0ED6, 0x0750, 0x073E, 0x0368, 0x034A, 0x0052, 0x034B, 0x0369,
- 0x073F, 0x0751, 0x0ED7, 0x0F07, 0x1EA7, 0x1EC7, 0x1EDF, 0x1F65,
- 0x1F70, 0x3F36, 0x3F6F, 0x7F7C, 0x7F8F, 0x3F90, 0x3F66, 0x3F58,
- 0x3F4E, 0x1F48, 0x1EBB, 0x0F40, 0x0F18, 0x0F10, 0x0EDA, 0x0ECF,
- 0x0732, 0x0704, 0x0354, 0x0190, 0x004F, 0x0191, 0x0355, 0x0705,
- 0x0733, 0x0ED0, 0x0EDB, 0x0F11, 0x0F19, 0x0F41, 0x1EB8, 0x1F4B,
- 0x3F4F, 0x3F55, 0x3F65, 0x3F92, 0x7F85, 0x1F51, 0x1F39, 0x1F2B,
- 0x1F18, 0x1EC2, 0x0F38, 0x0F14, 0x0ECA, 0x074C, 0x0736, 0x0700,
- 0x06FC, 0x0350, 0x00BA, 0x004D, 0x00BB, 0x0351, 0x06FD, 0x0701,
- 0x0737, 0x074D, 0x0ECB, 0x0F15, 0x0F39, 0x1EC3, 0x1F1B, 0x1F2E,
- 0x1F3A, 0x1F53, 0x7F82, 0x3F8A, 0x3F47, 0x3F2E, 0x1F5E, 0x1E9E,
- 0x0F24, 0x0F20, 0x0EC6, 0x0746, 0x0726, 0x070E, 0x0370, 0x035E,
- 0x018A, 0x00AC, 0x0021, 0x00AD, 0x018B, 0x035F, 0x0371, 0x070F,
- 0x0727, 0x0747, 0x0EC7, 0x0F21, 0x0F25, 0x1E9F, 0x1F5F, 0x3F2D,
- 0x3F48, 0x3F8B, 0xFFF1, 0x1F78, 0x1F3D, 0x1EAD, 0x0F2B, 0x0EF9,
- 0x0EE9, 0x0739, 0x0719, 0x0709, 0x0363, 0x019B, 0x0195, 0x00B3,
- 0x0023, 0x0005, 0x0024, 0x00B4, 0x0196, 0x019C, 0x0364, 0x070A,
- 0x071A, 0x073A, 0x0EEA, 0x0EFA, 0x0F2C, 0x1EAE, 0x1F3E, 0x1F79,
- 0xFFF0, 0x0F0C, 0x0EE6, 0x0EDC, 0x0EC2, 0x0748, 0x0706, 0x0372,
- 0x034C, 0x0198, 0x0192, 0x00C0, 0x00BC, 0x00B6, 0x0053, 0x0006,
- 0x0000, 0x0007, 0x0054, 0x00B7, 0x00BD, 0x00C1, 0x0193, 0x0199,
- 0x034D, 0x0373, 0x0707, 0x0749, 0x0EC3, 0x0EDD, 0x0EE7, 0x0F0D,
- 0xFFF2, 0x1F7A, 0x1F3F, 0x1EAF, 0x0F2D, 0x0EFB, 0x0EEB, 0x073B,
- 0x071B, 0x070B, 0x0365, 0x019D, 0x0197, 0x00B5, 0x0025, 0x0004,
- 0x0022, 0x00B2, 0x0194, 0x019A, 0x0362, 0x0708, 0x0718, 0x0738,
- 0x0EE8, 0x0EF8, 0x0F2A, 0x1EAC, 0x1F3C, 0x1F7B, 0xFFF3, 0x3F89,
- 0x3F44, 0x3F2F, 0x1F5C, 0x1E9C, 0x0F22, 0x0F1E, 0x0EC4, 0x0744,
- 0x0724, 0x070C, 0x036E, 0x035C, 0x0188, 0x00AA, 0x0020, 0x00AB,
- 0x0189, 0x035D, 0x036F, 0x070D, 0x0725, 0x0745, 0x0EC5, 0x0F1F,
- 0x0F23, 0x1E9D, 0x1F5D, 0x3F2C, 0x3F45, 0x3F88, 0x7F81, 0x1F52,
- 0x1F38, 0x1F28, 0x1F19, 0x1EC0, 0x0F36, 0x0F12, 0x0EC8, 0x074A,
- 0x0734, 0x06FE, 0x06FA, 0x034E, 0x00B8, 0x004C, 0x00B9, 0x034F,
- 0x06FB, 0x06FF, 0x0735, 0x074B, 0x0EC9, 0x0F13, 0x0F37, 0x1EC1,
- 0x1F1A, 0x1F29, 0x1F3B, 0x1F50, 0x7F84, 0x3F91, 0x3F64, 0x3F54,
- 0x3F4C, 0x1F49, 0x1EB9, 0x0F3B, 0x0F16, 0x0F0E, 0x0ED8, 0x0ECD,
- 0x0730, 0x0702, 0x0352, 0x018E, 0x004E, 0x018F, 0x0353, 0x0703,
- 0x0731, 0x0ECE, 0x0ED9, 0x0F0F, 0x0F17, 0x0F3D, 0x1EBA, 0x1F4A,
- 0x3F4D, 0x3F51, 0x3F67, 0x3F93, 0x7F90, 0x7F7A, 0x3F6E, 0x3F37,
- 0x1F71, 0x1F63, 0x1EDC, 0x1EC4, 0x1EA4, 0x0F04, 0x0ED4, 0x074E,
- 0x073C, 0x0366, 0x0348, 0x0051, 0x0349, 0x0367, 0x073D, 0x074F,
- 0x0ED5, 0x0F06, 0x1EA6, 0x1EC6, 0x1EDE, 0x1F64, 0x1F73, 0x3F35,
- 0x3F6D, 0x7F7B, 0x7F8E, 0x7FD4, 0x7FD0, 0x3F5F, 0x3F26, 0x1F35,
- 0x1F27, 0x1EEA, 0x1EBE, 0x1EAA, 0x0F3E, 0x0F30, 0x0EE4, 0x071E,
- 0x0376, 0x01A2, 0x00AF, 0x01A3, 0x0377, 0x071F, 0x0EE5, 0x0F31,
- 0x0F3F, 0x1EAB, 0x1EBF, 0x1EEB, 0x1F26, 0x1F37, 0x3F27, 0x3F62,
- 0x7FCF, 0x7FD3, 0xFFD4, 0x7F78, 0x3F29, 0x3F11, 0x3F0B, 0x1F32,
- 0x1F22, 0x1EB6, 0x1EA2, 0x0F48, 0x0F34, 0x0F1C, 0x0758, 0x072A,
- 0x0358, 0x00B1, 0x0359, 0x072B, 0x0759, 0x0F1D, 0x0F35, 0x0F49,
- 0x1EA3, 0x1EB7, 0x1F21, 0x1F31, 0x3F09, 0x3F12, 0x3F2A, 0x7F79,
- 0xFFD6, 0xFFE1, 0x7F6D, 0x7F64, 0x3F73, 0x3F1D, 0x3F14, 0x1F81,
- 0x1EE0, 0x1EB0, 0x0F4A, 0x0EFD, 0x0EDE, 0x0ED1, 0x0720, 0x036A,
- 0x00BE, 0x036B, 0x0721, 0x0ED2, 0x0EDF, 0x0EFE, 0x0F4B, 0x1EB1,
- 0x1EE1, 0x1F7E, 0x3F15, 0x3F1E, 0x3F74, 0x7F62, 0x7F75, 0xFFE3,
- 0xFFDE, 0x7FDD, 0x7FBE, 0x7FB3, 0x7F60, 0x3F43, 0x3F0C, 0x1F47,
- 0x1F2D, 0x1EC8, 0x0F26, 0x0EF4, 0x0EEC, 0x072C, 0x06F2, 0x0184,
- 0x06F3, 0x072D, 0x0EED, 0x0EF5, 0x0F29, 0x1EC9, 0x1F2A, 0x1F44,
- 0x3F0D, 0x3F41, 0x7F5E, 0x7FB1, 0x7FC1, 0x7FD7, 0xFFDF, 0xFFEA,
- 0x7FA3, 0x7F8B, 0x7F69, 0x3F9E, 0x1F7F, 0x1F6D, 0x1F6B, 0x1EEE,
- 0x1EE6, 0x1ED4, 0x1ECF, 0x0EF2, 0x0754, 0x06F8, 0x018D, 0x06F9,
- 0x0755, 0x0EF3, 0x1ECC, 0x1ED7, 0x1EE7, 0x1EEF, 0x1F68, 0x1F6F,
- 0x1F80, 0x3F9D, 0x7F67, 0x7F8D, 0x7FA8, 0xFFE9, 0xFFE5, 0x7F89,
- 0x7F5D, 0x3F7F, 0x3F3F, 0x1F67, 0x1F4F, 0x1F17, 0x1F0F, 0x1F02,
- 0x1EFB, 0x1ED9, 0x0F45, 0x075C, 0x0716, 0x0187, 0x0717, 0x075D,
- 0x0F44, 0x1EDB, 0x1EF8, 0x1F03, 0x1F0D, 0x1F16, 0x1F4E, 0x1F66,
- 0x3F3E, 0x3F7E, 0x3FAD, 0x7F87, 0xFFE4, 0xFFF9, 0x7FC4, 0x7FBA,
- 0x7F6E, 0x3F95, 0x3F85, 0x3F78, 0x3F77, 0x3F5B, 0x3F49, 0x1F08,
- 0x1EFE, 0x1ED2, 0x0F01, 0x0710, 0x019E, 0x0711, 0x0F00, 0x1ED1,
- 0x1EFC, 0x1F0B, 0x3F4B, 0x3F57, 0x3F71, 0x3F79, 0x3F84, 0x3F94,
- 0x7F74, 0x7FBD, 0x7FC5, 0xFFFE, 0xFFED, 0x7FE0, 0x7FDF, 0x7FA4,
- 0x7F6A, 0x3FA0, 0x3F8F, 0x3F63, 0x3F3A, 0x3F23, 0x3F1A, 0x1F59,
- 0x1F1D, 0x1EF3, 0x0743, 0x035B, 0x0742, 0x1EF7, 0x1F1C, 0x1F5B,
- 0x3F1B, 0x3F20, 0x3F38, 0x3F60, 0x3F8C, 0x3FA2, 0x7F6C, 0x7FA9,
- 0x7FE5, 0x7FE4, 0xFFEF, 0xFFFF, 0x7FD6, 0x7FCB, 0x7FC7, 0x7F9B,
- 0x7F83, 0x3FA4, 0x3F81, 0x3F69, 0x3F30, 0x1F57, 0x1F41, 0x1F13,
- 0x1F06, 0x0EC0, 0x0361, 0x0EC1, 0x1F04, 0x1F10, 0x1F42, 0x1F55,
- 0x3F32, 0x3F6B, 0x3F82, 0x3FA7, 0x7F7E, 0x7F9D, 0x7FC8, 0x7FCD,
- 0x7FD8, 0xFFFA, 0xFFF7, 0xFFD9, 0x7FE8, 0x7FB6, 0x7FAB, 0x7FAA,
- 0x7FA1, 0x7F96, 0x7F95, 0x3FAB, 0x3F98, 0x3F50, 0x1F77, 0x1EF4,
- 0x0F0A, 0x06F1, 0x0F09, 0x1EF6, 0x1F74, 0x3F56, 0x3F99, 0x3FA9,
- 0x7F92, 0x7F97, 0x7F9F, 0x7FAD, 0x7FB2, 0x7FB8, 0x7FE7, 0xFFDD,
- 0xFFF4, 0x0050,
-];
-const CLV_MVY_2_SYMS: &[u16] = &[
- 0xF1F1, 0xF2F1, 0xF3F1, 0xF4F1, 0xF5F1, 0xF6F1, 0xF7F1, 0xF8F1,
- 0xF9F1, 0xFAF1, 0xFBF1, 0xFCF1, 0xFDF1, 0xFEF1, 0xFFF1, 0x00F1,
- 0x01F1, 0x02F1, 0x03F1, 0x04F1, 0x05F1, 0x06F1, 0x07F1, 0x08F1,
- 0x09F1, 0x0AF1, 0x0BF1, 0x0CF1, 0x0DF1, 0x0EF1, 0x0FF1, 0xF1F2,
- 0xF2F2, 0xF3F2, 0xF4F2, 0xF5F2, 0xF6F2, 0xF7F2, 0xF8F2, 0xF9F2,
- 0xFAF2, 0xFBF2, 0xFCF2, 0xFDF2, 0xFEF2, 0xFFF2, 0x00F2, 0x01F2,
- 0x02F2, 0x03F2, 0x04F2, 0x05F2, 0x06F2, 0x07F2, 0x08F2, 0x09F2,
- 0x0AF2, 0x0BF2, 0x0CF2, 0x0DF2, 0x0EF2, 0x0FF2, 0xF1F3, 0xF2F3,
- 0xF3F3, 0xF4F3, 0xF5F3, 0xF6F3, 0xF7F3, 0xF8F3, 0xF9F3, 0xFAF3,
- 0xFBF3, 0xFCF3, 0xFDF3, 0xFEF3, 0xFFF3, 0x00F3, 0x01F3, 0x02F3,
- 0x03F3, 0x04F3, 0x05F3, 0x06F3, 0x07F3, 0x08F3, 0x09F3, 0x0AF3,
- 0x0BF3, 0x0CF3, 0x0DF3, 0x0EF3, 0x0FF3, 0xF1F4, 0xF2F4, 0xF3F4,
- 0xF4F4, 0xF5F4, 0xF6F4, 0xF7F4, 0xF8F4, 0xF9F4, 0xFAF4, 0xFBF4,
- 0xFCF4, 0xFDF4, 0xFEF4, 0xFFF4, 0x00F4, 0x01F4, 0x02F4, 0x03F4,
- 0x04F4, 0x05F4, 0x06F4, 0x07F4, 0x08F4, 0x09F4, 0x0AF4, 0x0BF4,
- 0x0CF4, 0x0DF4, 0x0EF4, 0x0FF4, 0xF1F5, 0xF2F5, 0xF3F5, 0xF4F5,
- 0xF5F5, 0xF6F5, 0xF7F5, 0xF8F5, 0xF9F5, 0xFAF5, 0xFBF5, 0xFCF5,
- 0xFDF5, 0xFEF5, 0xFFF5, 0x00F5, 0x01F5, 0x02F5, 0x03F5, 0x04F5,
- 0x05F5, 0x06F5, 0x07F5, 0x08F5, 0x09F5, 0x0AF5, 0x0BF5, 0x0CF5,
- 0x0DF5, 0x0EF5, 0x0FF5, 0xF1F6, 0xF2F6, 0xF3F6, 0xF4F6, 0xF5F6,
- 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6,
- 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6,
- 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0x0BF6, 0x0CF6, 0x0DF6,
- 0x0EF6, 0x0FF6, 0xF1F7, 0xF2F7, 0xF3F7, 0xF4F7, 0xF5F7, 0xF6F7,
- 0xF7F7, 0xF8F7, 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7,
- 0xFFF7, 0x00F7, 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7,
- 0x07F7, 0x08F7, 0x09F7, 0x0AF7, 0x0BF7, 0x0CF7, 0x0DF7, 0x0EF7,
- 0x0FF7, 0xF1F8, 0xF2F8, 0xF3F8, 0xF4F8, 0xF5F8, 0xF6F8, 0xF7F8,
- 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8,
- 0x00F8, 0x01F8, 0x02F8, 0x03F8, 0x04F8, 0x05F8, 0x06F8, 0x07F8,
- 0x08F8, 0x09F8, 0x0AF8, 0x0BF8, 0x0CF8, 0x0DF8, 0x0EF8, 0x0FF8,
- 0xF1F9, 0xF2F9, 0xF3F9, 0xF4F9, 0xF5F9, 0xF6F9, 0xF7F9, 0xF8F9,
- 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9,
- 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0x08F9,
- 0x09F9, 0x0AF9, 0x0BF9, 0x0CF9, 0x0DF9, 0x0EF9, 0x0FF9, 0xF1FA,
- 0xF2FA, 0xF3FA, 0xF4FA, 0xF5FA, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA,
- 0x0AFA, 0x0BFA, 0x0CFA, 0x0DFA, 0x0EFA, 0x0FFA, 0xF1FB, 0xF2FB,
- 0xF3FB, 0xF4FB, 0xF5FB, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB,
- 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB,
- 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB,
- 0x0BFB, 0x0CFB, 0x0DFB, 0x0EFB, 0x0FFB, 0xF1FC, 0xF2FC, 0xF3FC,
- 0xF4FC, 0xF5FC, 0xF6FC, 0xF7FC, 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC,
- 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC,
- 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0x08FC, 0x09FC, 0x0AFC, 0x0BFC,
- 0x0CFC, 0x0DFC, 0x0EFC, 0x0FFC, 0xF1FD, 0xF2FD, 0xF3FD, 0xF4FD,
- 0xF5FD, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD,
- 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD,
- 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD, 0x0BFD, 0x0CFD,
- 0x0DFD, 0x0EFD, 0x0FFD, 0xF1FE, 0xF2FE, 0xF3FE, 0xF4FE, 0xF5FE,
- 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0x0BFE, 0x0CFE, 0x0DFE,
- 0x0EFE, 0x0FFE, 0xF1FF, 0xF2FF, 0xF3FF, 0xF4FF, 0xF5FF, 0xF6FF,
- 0xF7FF, 0xF8FF, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF,
- 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF,
- 0x07FF, 0x08FF, 0x09FF, 0x0AFF, 0x0BFF, 0x0CFF, 0x0DFF, 0x0EFF,
- 0x0FFF, 0xF100, 0xF200, 0xF300, 0xF400, 0xF500, 0xF600, 0xF700,
- 0xF800, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00,
- 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
- 0x0800, 0x0900, 0x0A00, 0x0B00, 0x0C00, 0x0D00, 0x0E00, 0x0F00,
- 0xF101, 0xF201, 0xF301, 0xF401, 0xF501, 0xF601, 0xF701, 0xF801,
- 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001,
- 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0x0801,
- 0x0901, 0x0A01, 0x0B01, 0x0C01, 0x0D01, 0x0E01, 0x0F01, 0xF102,
- 0xF202, 0xF302, 0xF402, 0xF502, 0xF602, 0xF702, 0xF802, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902,
- 0x0A02, 0x0B02, 0x0C02, 0x0D02, 0x0E02, 0x0F02, 0xF103, 0xF203,
- 0xF303, 0xF403, 0xF503, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03,
- 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203,
- 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03,
- 0x0B03, 0x0C03, 0x0D03, 0x0E03, 0x0F03, 0xF104, 0xF204, 0xF304,
- 0xF404, 0xF504, 0xF604, 0xF704, 0xF804, 0xF904, 0xFA04, 0xFB04,
- 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304,
- 0x0404, 0x0504, 0x0604, 0x0704, 0x0804, 0x0904, 0x0A04, 0x0B04,
- 0x0C04, 0x0D04, 0x0E04, 0x0F04, 0xF105, 0xF205, 0xF305, 0xF405,
- 0xF505, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05, 0xFB05, 0xFC05,
- 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405,
- 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05, 0x0B05, 0x0C05,
- 0x0D05, 0x0E05, 0x0F05, 0xF106, 0xF206, 0xF306, 0xF406, 0xF506,
- 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0x0B06, 0x0C06, 0x0D06,
- 0x0E06, 0x0F06, 0xF107, 0xF207, 0xF307, 0xF407, 0xF507, 0xF607,
- 0xF707, 0xF807, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07,
- 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607,
- 0x0707, 0x0807, 0x0907, 0x0A07, 0x0B07, 0x0C07, 0x0D07, 0x0E07,
- 0x0F07, 0xF108, 0xF208, 0xF308, 0xF408, 0xF508, 0xF608, 0xF708,
- 0xF808, 0xF908, 0xFA08, 0xFB08, 0xFC08, 0xFD08, 0xFE08, 0xFF08,
- 0x0008, 0x0108, 0x0208, 0x0308, 0x0408, 0x0508, 0x0608, 0x0708,
- 0x0808, 0x0908, 0x0A08, 0x0B08, 0x0C08, 0x0D08, 0x0E08, 0x0F08,
- 0xF109, 0xF209, 0xF309, 0xF409, 0xF509, 0xF609, 0xF709, 0xF809,
- 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09, 0xFF09, 0x0009,
- 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609, 0x0709, 0x0809,
- 0x0909, 0x0A09, 0x0B09, 0x0C09, 0x0D09, 0x0E09, 0x0F09, 0xF10A,
- 0xF20A, 0xF30A, 0xF40A, 0xF50A, 0xF60A, 0xF70A, 0xF80A, 0xF90A,
- 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A,
- 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A,
- 0x0A0A, 0x0B0A, 0x0C0A, 0x0D0A, 0x0E0A, 0x0F0A, 0xF10B, 0xF20B,
- 0xF30B, 0xF40B, 0xF50B, 0xF60B, 0xF70B, 0xF80B, 0xF90B, 0xFA0B,
- 0xFB0B, 0xFC0B, 0xFD0B, 0xFE0B, 0xFF0B, 0x000B, 0x010B, 0x020B,
- 0x030B, 0x040B, 0x050B, 0x060B, 0x070B, 0x080B, 0x090B, 0x0A0B,
- 0x0B0B, 0x0C0B, 0x0D0B, 0x0E0B, 0x0F0B, 0xF10C, 0xF20C, 0xF30C,
- 0xF40C, 0xF50C, 0xF60C, 0xF70C, 0xF80C, 0xF90C, 0xFA0C, 0xFB0C,
- 0xFC0C, 0xFD0C, 0xFE0C, 0xFF0C, 0x000C, 0x010C, 0x020C, 0x030C,
- 0x040C, 0x050C, 0x060C, 0x070C, 0x080C, 0x090C, 0x0A0C, 0x0B0C,
- 0x0C0C, 0x0D0C, 0x0E0C, 0x0F0C, 0xF10D, 0xF20D, 0xF30D, 0xF40D,
- 0xF50D, 0xF60D, 0xF70D, 0xF80D, 0xF90D, 0xFA0D, 0xFB0D, 0xFC0D,
- 0xFD0D, 0xFE0D, 0xFF0D, 0x000D, 0x010D, 0x020D, 0x030D, 0x040D,
- 0x050D, 0x060D, 0x070D, 0x080D, 0x090D, 0x0A0D, 0x0B0D, 0x0C0D,
- 0x0D0D, 0x0E0D, 0x0F0D, 0xF10E, 0xF20E, 0xF30E, 0xF40E, 0xF50E,
- 0xF60E, 0xF70E, 0xF80E, 0xF90E, 0xFA0E, 0xFB0E, 0xFC0E, 0xFD0E,
- 0xFE0E, 0xFF0E, 0x000E, 0x010E, 0x020E, 0x030E, 0x040E, 0x050E,
- 0x060E, 0x070E, 0x080E, 0x090E, 0x0A0E, 0x0B0E, 0x0C0E, 0x0D0E,
- 0x0E0E, 0x0F0E, 0xF10F, 0xF20F, 0xF30F, 0xF40F, 0xF50F, 0xF60F,
- 0xF70F, 0xF80F, 0xF90F, 0xFA0F, 0xFB0F, 0xFC0F, 0xFD0F, 0xFE0F,
- 0xFF0F, 0x000F, 0x010F, 0x020F, 0x030F, 0x040F, 0x050F, 0x060F,
- 0x070F, 0x080F, 0x090F, 0x0A0F, 0x0B0F, 0x0C0F, 0x0D0F, 0x0E0F,
- 0x0F0F, 0x1010,
-];
-const CLV_MVY_2_ESCAPE: u16 = 0x1010;
-
-const CLV_BIASY_2_BITS: &[u8] = &[
- 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 12, 11,
- 11, 11, 10, 10, 10, 10, 9, 9, 8, 8, 8, 7, 6, 6, 4, 3,
- 1, 3, 4, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 11,
- 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16,
- 16, 15,
-];
-const CLV_BIASY_2_CODES: &[u16] = &[
- 0xFFFE, 0xFFFC, 0xFFFA, 0xFFF9, 0xFFF6, 0xFFF5, 0xFFF3, 0x7FF7,
- 0x7FF5, 0x7FF1, 0x7FF3, 0x7FF0, 0x7FEE, 0x7FEC, 0x7FE9, 0x7FE6,
- 0x7FE4, 0x7FE2, 0x3FEF, 0x3FEE, 0x3FEC, 0x3FEA, 0x1FF2, 0x1FF1,
- 0x1FEF, 0x1FED, 0x0FF4, 0x0FF3, 0x0FF1, 0x0FEF, 0x0FED, 0x07F4,
- 0x07F3, 0x07F1, 0x03F6, 0x03F4, 0x03F2, 0x03F0, 0x01F6, 0x01F4,
- 0x00F8, 0x00F6, 0x00F4, 0x0078, 0x003A, 0x0038, 0x000C, 0x0004,
- 0x0000, 0x0005, 0x000D, 0x0039, 0x003B, 0x0079, 0x00F5, 0x00F7,
- 0x00F9, 0x01F5, 0x01F7, 0x03F1, 0x03F3, 0x03F5, 0x03F7, 0x07F0,
- 0x07F2, 0x07F5, 0x0FEC, 0x0FEE, 0x0FF0, 0x0FF2, 0x0FF5, 0x1FEC,
- 0x1FEE, 0x1FF0, 0x1FF3, 0x1FF4, 0x3FEB, 0x3FED, 0x3FF0, 0x7FE3,
- 0x7FE5, 0x7FE7, 0x7FEA, 0x7FEB, 0x7FED, 0x7FEF, 0x7FF4, 0x7FF2,
- 0x7FF6, 0x7FF8, 0xFFF2, 0xFFF4, 0xFFF7, 0xFFF8, 0xFFFB, 0xFFFD,
- 0xFFFF, 0x7FE8,
-];
-const CLV_BIASY_2_SYMS: &[u16] = &[
- 0xFF40, 0xFF44, 0xFF48, 0xFF4C, 0xFF50, 0xFF54, 0xFF58, 0xFF5C,
- 0xFF60, 0xFF64, 0xFF68, 0xFF6C, 0xFF70, 0xFF74, 0xFF78, 0xFF7C,
- 0xFF80, 0xFF84, 0xFF88, 0xFF8C, 0xFF90, 0xFF94, 0xFF98, 0xFF9C,
- 0xFFA0, 0xFFA4, 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC,
- 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC,
- 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC,
- 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C,
- 0x0020, 0x0024, 0x0028, 0x002C, 0x0030, 0x0034, 0x0038, 0x003C,
- 0x0040, 0x0044, 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C,
- 0x0060, 0x0064, 0x0068, 0x006C, 0x0070, 0x0074, 0x0078, 0x007C,
- 0x0080, 0x0084, 0x0088, 0x008C, 0x0090, 0x0094, 0x0098, 0x009C,
- 0x00A0, 0x00A4, 0x00A8, 0x00AC, 0x00B0, 0x00B4, 0x00B8, 0x00BC,
- 0x00C0, 0x0100,
-];
-
-const CLV_FLAGSY_2_BITS: &[u8] = &[
- 1, 4, 4, 4, 4, 5, 7, 5, 4, 6, 5, 8, 4, 9, 10, 10,
-];
-const CLV_FLAGSY_2_CODES: &[u16] = &[
- 0x0000, 0x000C, 0x000B, 0x0008, 0x000A, 0x001C, 0x007E, 0x001D,
- 0x000D, 0x003E, 0x001E, 0x00FE, 0x0009, 0x01FE, 0x03FE, 0x03FF,
-];
-
-const CLV_MVY_3_BITS: &[u8] = &[
- 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 13,
- 13, 12, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15,
- 15, 15, 14, 14, 14, 13, 12, 11, 12, 13, 14, 14, 14, 15, 15, 15,
- 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15,
- 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 12, 11, 12, 14, 14,
- 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16,
- 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13,
- 12, 11, 12, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15,
- 15, 16, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 13, 13, 12, 10, 12, 13, 13, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 15, 15, 15, 15,
- 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 12, 10, 12, 12, 13, 13,
- 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 15, 15,
- 15, 15, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 11,
- 10, 11, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15,
- 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12,
- 12, 12, 12, 11, 10, 9, 10, 11, 12, 12, 12, 12, 12, 13, 13, 13,
- 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13,
- 12, 12, 12, 12, 12, 12, 12, 11, 11, 10, 9, 10, 11, 11, 12, 12,
- 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 16, 15, 15,
- 15, 15, 14, 14, 13, 13, 12, 12, 12, 12, 12, 11, 11, 11, 10, 9,
- 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15,
- 15, 16, 15, 15, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12,
- 11, 11, 11, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13,
- 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12,
- 12, 12, 12, 12, 12, 11, 11, 11, 10, 8, 10, 11, 11, 11, 12, 12,
- 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 14, 14,
- 14, 14, 13, 13, 12, 12, 12, 12, 12, 11, 11, 11, 10, 10, 8, 10,
- 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15,
- 15, 15, 14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11,
- 10, 10, 9, 7, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13,
- 13, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, 13, 12, 12,
- 12, 12, 11, 11, 11, 10, 10, 9, 7, 9, 10, 10, 11, 11, 11, 12,
- 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14,
- 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 7, 9, 9,
- 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15,
- 15, 14, 14, 14, 13, 13, 13, 13, 12, 11, 11, 11, 11, 10, 10, 10,
- 9, 8, 6, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13, 13,
- 13, 14, 14, 14, 15, 15, 14, 14, 14, 13, 13, 12, 12, 11, 11, 11,
- 11, 10, 10, 9, 9, 8, 6, 4, 6, 8, 9, 9, 10, 10, 11, 11,
- 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 13, 13, 13, 12, 12, 12,
- 12, 11, 10, 10, 10, 10, 9, 9, 8, 8, 7, 5, 2, 5, 7, 8,
- 8, 9, 9, 10, 10, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 15,
- 14, 14, 14, 13, 13, 12, 12, 11, 11, 11, 11, 10, 10, 9, 9, 8,
- 6, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 12, 13, 13,
- 14, 14, 14, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 11, 11, 11,
- 11, 10, 10, 10, 9, 8, 6, 8, 9, 10, 10, 10, 11, 11, 11, 11,
- 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 14, 14, 14, 14, 13, 13,
- 12, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 7, 9, 9, 10, 11,
- 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 14,
- 14, 14, 14, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 10, 10, 9,
- 7, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14,
- 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 12, 11,
- 11, 11, 10, 10, 9, 7, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12,
- 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 14, 14, 14, 14, 13, 13,
- 12, 12, 12, 12, 12, 11, 11, 11, 10, 10, 8, 10, 10, 11, 11, 11,
- 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15,
- 14, 14, 14, 13, 13, 12, 12, 12, 12, 12, 12, 11, 11, 11, 10, 8,
- 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 15,
- 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12,
- 11, 11, 11, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13,
- 14, 14, 14, 14, 14, 15, 15, 16, 15, 15, 15, 15, 14, 14, 13, 13,
- 12, 12, 12, 12, 12, 11, 11, 11, 10, 9, 10, 11, 11, 11, 12, 12,
- 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 15, 15, 15, 14,
- 14, 14, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 10, 9, 10,
- 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15,
- 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12,
- 12, 11, 10, 9, 10, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14,
- 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14,
- 13, 13, 13, 13, 13, 13, 13, 11, 10, 11, 13, 13, 13, 13, 13, 13,
- 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 15, 15,
- 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 12, 10, 12, 12,
- 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16,
- 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,
- 13, 12, 10, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15,
- 15, 15, 15, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 14,
- 14, 14, 14, 14, 13, 13, 12, 11, 12, 13, 13, 14, 14, 14, 14, 14,
- 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 15, 15, 15,
- 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 12, 11, 12, 14, 14,
- 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13,
- 12, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15,
- 15, 14, 14, 13, 13, 12, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15,
- 15, 15, 16, 16, 16, 16, 16, 16, 16, 7,
-];
-const CLV_MVY_3_CODES: &[u16] = &[
- 0xFFF6, 0xFFEE, 0xFFDC, 0xFFD7, 0xFFB4, 0xFFAA, 0xFFA0, 0x7FCC,
- 0x7F8E, 0x7F7B, 0x7F77, 0x7F13, 0x7F11, 0x3F56, 0x3F48, 0x1F16,
- 0x1E94, 0x0F28, 0x06F0, 0x0F2A, 0x1E96, 0x1F1C, 0x3F46, 0x3F58,
- 0x7F15, 0x7F0E, 0x7F76, 0x7F80, 0x7F90, 0x7FC8, 0xFFA2, 0xFFA7,
- 0xFFB5, 0xFFD8, 0xFFDD, 0xFFEC, 0xFFF5, 0xFFF1, 0xFFEA, 0xFFE4,
- 0xFFD1, 0xFFC1, 0xFFA8, 0x7F70, 0x7F5C, 0x7F44, 0x7F40, 0x7F2A,
- 0x7F16, 0x7EDF, 0x3ED6, 0x3ECA, 0x3ECC, 0x1EB5, 0x0EDE, 0x06D3,
- 0x0EDF, 0x1EB6, 0x3ECE, 0x3ED0, 0x3ED8, 0x7EE5, 0x7F19, 0x7F31,
- 0x7F3E, 0x7F45, 0x7F5B, 0x7F6F, 0xFFA9, 0xFFC0, 0xFFCE, 0xFFE5,
- 0xFFE8, 0xFFF2, 0xFFFE, 0xFFE2, 0xFFBE, 0x7FBB, 0x7F75, 0x7F6B,
- 0x7F58, 0x7EF9, 0x7EDC, 0x3F68, 0x3F27, 0x3F28, 0x3EDF, 0x3ED2,
- 0x3EC1, 0x3EA6, 0x3E87, 0x0F0F, 0x06B3, 0x0F10, 0x3E89, 0x3EA8,
- 0x3EC3, 0x3ED5, 0x3EE0, 0x3F2B, 0x3F26, 0x3F67, 0x7EDA, 0x7EFB,
- 0x7F56, 0x7F6A, 0x7F72, 0x7FC1, 0xFFBC, 0xFFE0, 0xFFFF, 0xFFF8,
- 0xFFD3, 0xFFB9, 0x7FAC, 0x7F94, 0x7F8B, 0x7F62, 0x7F4A, 0x7F05,
- 0x7EEE, 0x3F44, 0x3EA4, 0x3E78, 0x3E6F, 0x3E54, 0x1EEF, 0x1EA9,
- 0x0ED4, 0x06A8, 0x0ED5, 0x1EA8, 0x1EEC, 0x3E51, 0x3E69, 0x3E75,
- 0x3EA3, 0x3F43, 0x7EF1, 0x7F04, 0x7F4B, 0x7F5D, 0x7F89, 0x7F95,
- 0x7FAA, 0xFFBB, 0xFFC8, 0xFFF9, 0xFFD9, 0xFFCA, 0x7FC3, 0x7F8C,
- 0x7F38, 0x7F02, 0x3F5A, 0x3F4A, 0x3F30, 0x3EFF, 0x3EF4, 0x3EE9,
- 0x3E95, 0x3E73, 0x3E43, 0x1F08, 0x1E81, 0x0E84, 0x0349, 0x0E85,
- 0x1E82, 0x1F07, 0x3E45, 0x3E74, 0x3E96, 0x3EEA, 0x3EF1, 0x3F00,
- 0x3F32, 0x3F4F, 0x3F5C, 0x7F01, 0x7F3B, 0x7F8D, 0x7FC2, 0xFFCF,
- 0xFFD6, 0xFFC7, 0xFFB1, 0xFFA6, 0x7FA1, 0x7F2F, 0x7F24, 0x7F0A,
- 0x3EF6, 0x3E97, 0x3E83, 0x3E7F, 0x1F04, 0x1EE1, 0x1ECB, 0x1EAE,
- 0x1E7E, 0x0EBA, 0x0E8C, 0x0333, 0x0E8D, 0x0EBB, 0x1E7F, 0x1EAF,
- 0x1ECC, 0x1EE2, 0x1F05, 0x3E80, 0x3E84, 0x3E98, 0x3EF9, 0x7F06,
- 0x7F1B, 0x7F2D, 0x7F9F, 0xFFAF, 0xFFB0, 0xFFC6, 0x7FB5, 0x7FB1,
- 0x7F36, 0x7F25, 0x3F63, 0x3F3A, 0x3F1B, 0x3EBB, 0x3E63, 0x3E5B,
- 0x3E40, 0x1F14, 0x1EF5, 0x1EEB, 0x1EBE, 0x1E92, 0x1E6A, 0x070C,
- 0x032D, 0x070D, 0x1E6B, 0x1E93, 0x1EBF, 0x1EE8, 0x1EF3, 0x1F15,
- 0x3E3F, 0x3E5C, 0x3E64, 0x3EB9, 0x3F1C, 0x3F3C, 0x3F62, 0x7F22,
- 0x7F39, 0x7FAF, 0x7FAE, 0x7FC6, 0x7F7F, 0x7F53, 0x7F32, 0x3F66,
- 0x3EF0, 0x3E65, 0x1EDA, 0x1ED3, 0x1E98, 0x1E74, 0x0F20, 0x0F1D,
- 0x0EEA, 0x0EA9, 0x0E70, 0x0718, 0x033E, 0x0179, 0x033F, 0x0719,
- 0x0E71, 0x0EAB, 0x0EE9, 0x0F1F, 0x0F22, 0x1E76, 0x1E9B, 0x1ED5,
- 0x1EDD, 0x3E68, 0x3EF3, 0x3F6C, 0x7F33, 0x7F4E, 0x7F7D, 0x7FCB,
- 0x7FBD, 0x7F21, 0x7EF6, 0x3F0C, 0x3EBE, 0x3EAE, 0x1EA3, 0x1E85,
- 0x0F0C, 0x0F06, 0x0EEE, 0x0EE6, 0x0ECA, 0x0EA2, 0x0E78, 0x0720,
- 0x06BA, 0x0326, 0x015D, 0x0327, 0x06BB, 0x0721, 0x0E79, 0x0EA3,
- 0x0ECB, 0x0EE7, 0x0EEF, 0x0F07, 0x0F0D, 0x1E86, 0x1EA4, 0x3EAF,
- 0x3EBF, 0x3F0A, 0x7EF8, 0x7F1E, 0x7FBF, 0xFF9F, 0x7FB3, 0x7F96,
- 0x7F0B, 0x7EF5, 0x3E85, 0x3E4E, 0x1EB3, 0x1E6E, 0x0F2D, 0x0EBD,
- 0x0E97, 0x0E93, 0x0E86, 0x071A, 0x06E4, 0x06BC, 0x0338, 0x015A,
- 0x0339, 0x06BD, 0x06E5, 0x071B, 0x0E87, 0x0E94, 0x0E98, 0x0EBE,
- 0x0F2E, 0x1E6F, 0x1EB4, 0x3E4F, 0x3E88, 0x7EF4, 0x7F07, 0x7F99,
- 0x7FB7, 0xFF9D, 0x7FA8, 0x7EEB, 0x3F5D, 0x3EB2, 0x3EAA, 0x3E5D,
- 0x3E49, 0x1EFE, 0x1E89, 0x0F16, 0x0F12, 0x0EE0, 0x0E7A, 0x0E6A,
- 0x070E, 0x06FA, 0x06B4, 0x0314, 0x0158, 0x0315, 0x06B5, 0x06FB,
- 0x070F, 0x0E6B, 0x0E7B, 0x0EE1, 0x0F13, 0x0F17, 0x1E8A, 0x1EFF,
- 0x3E4A, 0x3E5E, 0x3EAB, 0x3EB3, 0x3F59, 0x7EEC, 0x7FA2, 0x7F82,
- 0x7F5E, 0x7F28, 0x3EDA, 0x3EC9, 0x3E7A, 0x1ED6, 0x1ECE, 0x0EFC,
- 0x0EF0, 0x0E9A, 0x0E7E, 0x0E66, 0x0E5E, 0x0722, 0x06C0, 0x06A0,
- 0x02FA, 0x00A8, 0x02FB, 0x06A1, 0x06C1, 0x0723, 0x0E5F, 0x0E67,
- 0x0E7F, 0x0E9B, 0x0EF1, 0x0EFD, 0x1ECF, 0x1ED7, 0x3E79, 0x3ECD,
- 0x3EDB, 0x7F26, 0x7F5A, 0x7F83, 0x7F54, 0x7EE8, 0x3F54, 0x3F0E,
- 0x3EFB, 0x3E47, 0x1EC1, 0x1EB9, 0x0EF9, 0x0EF3, 0x0EC1, 0x0E8F,
- 0x0E74, 0x0714, 0x06F4, 0x06B0, 0x0336, 0x030A, 0x009F, 0x030B,
- 0x0337, 0x06B1, 0x06F5, 0x0715, 0x0E75, 0x0E91, 0x0EC3, 0x0EF6,
- 0x0EFB, 0x1EBB, 0x1EC3, 0x3E41, 0x3EF8, 0x3F10, 0x3F4D, 0x7EE9,
- 0x7F52, 0x7F9A, 0x3F3F, 0x3F1F, 0x3F03, 0x3EA0, 0x1F0F, 0x1E72,
- 0x1E62, 0x0EDA, 0x0ED2, 0x0EB2, 0x0E64, 0x0708, 0x06EA, 0x06DA,
- 0x0346, 0x032A, 0x0176, 0x004B, 0x0177, 0x032B, 0x0347, 0x06DB,
- 0x06EB, 0x0709, 0x0E65, 0x0EB3, 0x0ED3, 0x0EDB, 0x1E63, 0x1E6C,
- 0x1F0E, 0x3E9E, 0x3F01, 0x3F1D, 0x3F3D, 0x7F9B, 0x7EDE, 0x3F36,
- 0x3F2E, 0x3F07, 0x3E99, 0x1F0D, 0x1EA1, 0x1E8C, 0x0EB4, 0x0EAC,
- 0x0E5A, 0x0E50, 0x0702, 0x06D4, 0x06C6, 0x032E, 0x0310, 0x0162,
- 0x0046, 0x0163, 0x0311, 0x032F, 0x06C7, 0x06D5, 0x0703, 0x0E51,
- 0x0E5B, 0x0EAD, 0x0EB5, 0x1E8F, 0x1EA7, 0x1F0C, 0x3E9A, 0x3F02,
- 0x3F2D, 0x3F35, 0x7EE0, 0x7F66, 0x3F11, 0x3EE1, 0x3EBC, 0x3E56,
- 0x1EC4, 0x1E64, 0x0F04, 0x0EC7, 0x0E56, 0x0E4C, 0x06EC, 0x06DC,
- 0x069C, 0x0694, 0x0320, 0x016C, 0x0154, 0x0044, 0x0155, 0x016D,
- 0x0321, 0x0695, 0x069D, 0x06DD, 0x06ED, 0x0E4D, 0x0E57, 0x0EC4,
- 0x0F05, 0x1E65, 0x1EC5, 0x3E55, 0x3EB7, 0x3EE3, 0x3F13, 0x7F67,
- 0x7FA7, 0x3F49, 0x3F22, 0x3EE5, 0x1EF6, 0x1EE5, 0x1E9C, 0x1E78,
- 0x0EA4, 0x06F6, 0x06DE, 0x06CE, 0x06AA, 0x0340, 0x0318, 0x02FE,
- 0x015E, 0x009A, 0x001C, 0x009B, 0x015F, 0x02FF, 0x0319, 0x0341,
- 0x06AB, 0x06CF, 0x06DF, 0x06F7, 0x0EA5, 0x1E79, 0x1E9D, 0x1EE7,
- 0x1EF7, 0x3EE6, 0x3F23, 0x3F4B, 0x7FA3, 0x7F49, 0x3F14, 0x3E8D,
- 0x3E6B, 0x1F17, 0x1EF8, 0x0F24, 0x0ECC, 0x06FE, 0x06CA, 0x06A4,
- 0x0698, 0x030C, 0x0302, 0x0170, 0x0168, 0x00A0, 0x001E, 0x0004,
- 0x001F, 0x00A1, 0x0169, 0x0171, 0x0303, 0x030D, 0x0699, 0x06A5,
- 0x06CB, 0x06FF, 0x0ECD, 0x0F25, 0x1EF9, 0x1F18, 0x3E6C, 0x3E8E,
- 0x3F15, 0x7F46, 0x1EF0, 0x1EDE, 0x1EC8, 0x0F1A, 0x0F00, 0x0E9E,
- 0x0E54, 0x06C4, 0x031E, 0x031C, 0x0306, 0x02F8, 0x017A, 0x0166,
- 0x00A6, 0x00A4, 0x0048, 0x000C, 0x0000, 0x000D, 0x0049, 0x00A5,
- 0x00A7, 0x0167, 0x017B, 0x02F9, 0x0307, 0x031D, 0x031F, 0x06C5,
- 0x0E55, 0x0E9F, 0x0F01, 0x0F1B, 0x1EC9, 0x1EDF, 0x1EF1, 0x7F47,
- 0x3F12, 0x3E8F, 0x3E6D, 0x1F1B, 0x1EFA, 0x0F26, 0x0ECE, 0x0700,
- 0x06CC, 0x06A6, 0x069A, 0x030E, 0x0304, 0x0172, 0x016A, 0x00A2,
- 0x0020, 0x0005, 0x0021, 0x00A3, 0x016B, 0x0173, 0x0305, 0x030F,
- 0x069B, 0x06A7, 0x06CD, 0x0701, 0x0ECF, 0x0F27, 0x1EFB, 0x1F1D,
- 0x3E6E, 0x3E90, 0x3F17, 0x7F48, 0x7FA9, 0x3F50, 0x3F24, 0x3EE7,
- 0x1EFC, 0x1EE9, 0x1E9E, 0x1E7A, 0x0EA6, 0x06F8, 0x06E0, 0x06D0,
- 0x06AC, 0x0342, 0x031A, 0x0300, 0x0160, 0x009C, 0x001D, 0x009D,
- 0x0161, 0x0301, 0x031B, 0x0343, 0x06AD, 0x06D1, 0x06E1, 0x06F9,
- 0x0EA7, 0x1E7B, 0x1E9F, 0x1EEA, 0x1EFD, 0x3EE8, 0x3F21, 0x3F52,
- 0x7F9E, 0x7F68, 0x3F16, 0x3EE2, 0x3EBA, 0x3E57, 0x1EC6, 0x1E66,
- 0x0F08, 0x0EC5, 0x0E58, 0x0E4E, 0x06EE, 0x06E2, 0x069E, 0x0696,
- 0x0322, 0x016E, 0x0156, 0x0045, 0x0157, 0x016F, 0x0323, 0x0697,
- 0x069F, 0x06E3, 0x06EF, 0x0E4F, 0x0E59, 0x0EC6, 0x0F09, 0x1E67,
- 0x1EC7, 0x3E58, 0x3EB8, 0x3EE4, 0x3F18, 0x7F69, 0x7EE2, 0x3F38,
- 0x3F33, 0x3F04, 0x3E9C, 0x1F0A, 0x1EA5, 0x1E8D, 0x0EB6, 0x0EAE,
- 0x0E5C, 0x0E52, 0x0704, 0x06D6, 0x06C8, 0x0330, 0x0312, 0x0164,
- 0x0047, 0x0165, 0x0313, 0x0331, 0x06C9, 0x06D7, 0x0705, 0x0E53,
- 0x0E5D, 0x0EAF, 0x0EB7, 0x1E8E, 0x1EA6, 0x1F0B, 0x3E9B, 0x3F05,
- 0x3F31, 0x3F39, 0x7EE1, 0x7F9C, 0x3F40, 0x3F1E, 0x3F06, 0x3E9D,
- 0x1F10, 0x1E70, 0x1E60, 0x0ED8, 0x0ED0, 0x0EB0, 0x0E62, 0x0706,
- 0x06E8, 0x06D8, 0x0344, 0x0328, 0x0174, 0x004A, 0x0175, 0x0329,
- 0x0345, 0x06D9, 0x06E9, 0x0707, 0x0E63, 0x0EB1, 0x0ED1, 0x0ED9,
- 0x1E61, 0x1E71, 0x1F11, 0x3E9F, 0x3F08, 0x3F20, 0x3F3E, 0x7F9D,
- 0x7F4F, 0x7EE6, 0x3F53, 0x3F0D, 0x3EFA, 0x3E46, 0x1EC0, 0x1EB8,
- 0x0EF8, 0x0EF2, 0x0EC0, 0x0E8E, 0x0E72, 0x0712, 0x06F2, 0x06AE,
- 0x0334, 0x0308, 0x009E, 0x0309, 0x0335, 0x06AF, 0x06F3, 0x0713,
- 0x0E73, 0x0E90, 0x0EC2, 0x0EF4, 0x0EFA, 0x1EBA, 0x1EC2, 0x3E48,
- 0x3EFC, 0x3F0B, 0x3F51, 0x7EE7, 0x7F51, 0x7F84, 0x7F61, 0x7F27,
- 0x3EDC, 0x3EC5, 0x3E7C, 0x1ED8, 0x1ED0, 0x0EFE, 0x0EF5, 0x0E9C,
- 0x0E80, 0x0E68, 0x0E60, 0x0724, 0x06C2, 0x06A2, 0x02FC, 0x00A9,
- 0x02FD, 0x06A3, 0x06C3, 0x0725, 0x0E61, 0x0E69, 0x0E81, 0x0E9D,
- 0x0EF7, 0x0EFF, 0x1ED1, 0x1ED9, 0x3E7B, 0x3ECF, 0x3ED9, 0x7F29,
- 0x7F65, 0x7F85, 0x7FA0, 0x7EEA, 0x3F60, 0x3EB4, 0x3EAC, 0x3E5F,
- 0x3E4B, 0x1F00, 0x1E8B, 0x0F18, 0x0F14, 0x0EE2, 0x0E7C, 0x0E6C,
- 0x0710, 0x06FC, 0x06B6, 0x0316, 0x0159, 0x0317, 0x06B7, 0x06FD,
- 0x0711, 0x0E6D, 0x0E7D, 0x0EE3, 0x0F15, 0x0F19, 0x1E88, 0x1F01,
- 0x3E4C, 0x3E60, 0x3EA9, 0x3EB1, 0x3F5B, 0x7EED, 0x7FA5, 0xFF9E,
- 0x7FBE, 0x7F98, 0x7F0D, 0x7EF3, 0x3E8C, 0x3E50, 0x1EB7, 0x1E73,
- 0x0F2F, 0x0EBF, 0x0E99, 0x0E95, 0x0E88, 0x071C, 0x06E6, 0x06BE,
- 0x033A, 0x015B, 0x033B, 0x06BF, 0x06E7, 0x071D, 0x0E89, 0x0E92,
- 0x0E96, 0x0EBC, 0x0F2C, 0x1E6D, 0x1EB0, 0x3E4D, 0x3E8B, 0x7EF2,
- 0x7F08, 0x7F97, 0x7FB0, 0xFF9C, 0x7FB2, 0x7F23, 0x7EFA, 0x3F0F,
- 0x3EBD, 0x3EAD, 0x1EA0, 0x1E87, 0x0F0A, 0x0F02, 0x0EED, 0x0EE4,
- 0x0EC8, 0x0EA0, 0x0E76, 0x071E, 0x06B8, 0x0324, 0x015C, 0x0325,
- 0x06B9, 0x071F, 0x0E77, 0x0EA1, 0x0EC9, 0x0EE5, 0x0EEC, 0x0F03,
- 0x0F0B, 0x1E84, 0x1EA2, 0x3EB0, 0x3EC4, 0x3F09, 0x7EF7, 0x7F1D,
- 0x7FBC, 0x7FCD, 0x7F81, 0x7F50, 0x7F34, 0x3F65, 0x3EED, 0x3E67,
- 0x1EDB, 0x1ED2, 0x1E99, 0x1E77, 0x0F21, 0x0F1C, 0x0EE8, 0x0EA8,
- 0x0E6E, 0x0716, 0x033C, 0x0178, 0x033D, 0x0717, 0x0E6F, 0x0EAA,
- 0x0EEB, 0x0F1E, 0x0F23, 0x1E75, 0x1E9A, 0x1ED4, 0x1EDC, 0x3E66,
- 0x3EEE, 0x3F6B, 0x7F35, 0x7F55, 0x7F7A, 0x7FCA, 0x7FB6, 0x7FB8,
- 0x7F37, 0x7F1F, 0x3F61, 0x3F37, 0x3F1A, 0x3EB5, 0x3E62, 0x3E5A,
- 0x1F1E, 0x1F13, 0x1EF2, 0x1EE6, 0x1EBC, 0x1E91, 0x1E68, 0x070A,
- 0x032C, 0x070B, 0x1E69, 0x1E90, 0x1EBD, 0x1EE4, 0x1EF4, 0x1F12,
- 0x3E3E, 0x3E59, 0x3E61, 0x3EB6, 0x3F19, 0x3F3B, 0x3F64, 0x7F1C,
- 0x7F3D, 0x7FB4, 0x7FB9, 0xFFC5, 0xFFB6, 0xFFAD, 0x7FA4, 0x7F2C,
- 0x7F20, 0x7F09, 0x3EF5, 0x3E93, 0x3E82, 0x3E7E, 0x1F02, 0x1EE3,
- 0x1ECA, 0x1EAD, 0x1E7C, 0x0EB8, 0x0E8A, 0x0332, 0x0E8B, 0x0EB9,
- 0x1E7D, 0x1EAC, 0x1ECD, 0x1EE0, 0x1F03, 0x3E7D, 0x3E81, 0x3E91,
- 0x3EF7, 0x7F0C, 0x7F1A, 0x7F2E, 0x7FA6, 0xFFA4, 0xFFB7, 0xFFC4,
- 0xFFD4, 0xFFCC, 0x7FC5, 0x7F8A, 0x7F3C, 0x7EFF, 0x3F5E, 0x3F4E,
- 0x3F2F, 0x3EFD, 0x3EEF, 0x3EEB, 0x3E92, 0x3E71, 0x3E42, 0x1F09,
- 0x1E83, 0x0E82, 0x0348, 0x0E83, 0x1E80, 0x1F06, 0x3E44, 0x3E72,
- 0x3E94, 0x3EEC, 0x3EF2, 0x3EFE, 0x3F34, 0x3F4C, 0x3F5F, 0x7EFE,
- 0x7F3A, 0x7F86, 0x7FC4, 0xFFD2, 0xFFD5, 0xFFFA, 0xFFCD, 0xFFBA,
- 0x7FAB, 0x7F92, 0x7F87, 0x7F63, 0x7F4C, 0x7F03, 0x7EF0, 0x3F42,
- 0x3EA1, 0x3E76, 0x3E6A, 0x3E52, 0x1EEE, 0x1EAB, 0x0ED6, 0x06A9,
- 0x0ED7, 0x1EAA, 0x1EED, 0x3E53, 0x3E70, 0x3E77, 0x3EA2, 0x3F41,
- 0x7EEF, 0x7F00, 0x7F4D, 0x7F60, 0x7F88, 0x7F93, 0x7FAD, 0xFFB8,
- 0xFFCB, 0xFFFB, 0xFFFC, 0xFFE1, 0xFFBF, 0x7FBA, 0x7F73, 0x7F6C,
- 0x7F57, 0x7EFC, 0x7EDD, 0x3F6A, 0x3F2A, 0x3F25, 0x3EDD, 0x3ED3,
- 0x3EC2, 0x3EA7, 0x3E86, 0x0F11, 0x06B2, 0x0F0E, 0x3E8A, 0x3EA5,
- 0x3EC0, 0x3ED1, 0x3EDE, 0x3F2C, 0x3F29, 0x3F69, 0x7EDB, 0x7EFD,
- 0x7F59, 0x7F6D, 0x7F74, 0x7FC0, 0xFFC3, 0xFFE3, 0xFFFD, 0xFFF0,
- 0xFFE9, 0xFFE7, 0xFFC9, 0xFFBD, 0xFFAE, 0x7F71, 0x7F5F, 0x7F42,
- 0x7F41, 0x7F30, 0x7F17, 0x7EE4, 0x3ED7, 0x3EC7, 0x3ECB, 0x1EB1,
- 0x0EDC, 0x06D2, 0x0EDD, 0x1EB2, 0x3EC6, 0x3EC8, 0x3ED4, 0x7EE3,
- 0x7F18, 0x7F2B, 0x7F3F, 0x7F43, 0x7F64, 0x7F6E, 0xFFAB, 0xFFC2,
- 0xFFD0, 0xFFE6, 0xFFEF, 0xFFF3, 0xFFF7, 0xFFEB, 0xFFDE, 0xFFDA,
- 0xFFB3, 0xFFAC, 0xFFA3, 0x7FC9, 0x7F8F, 0x7F7C, 0x7F79, 0x7F0F,
- 0x7F10, 0x3F55, 0x3F45, 0x1F1A, 0x1E95, 0x0F2B, 0x06F1, 0x0F29,
- 0x1E97, 0x1F19, 0x3F47, 0x3F57, 0x7F14, 0x7F12, 0x7F78, 0x7F7E,
- 0x7F91, 0x7FC7, 0xFFA1, 0xFFA5, 0xFFB2, 0xFFDB, 0xFFDF, 0xFFED,
- 0xFFF4, 0x004C,
-];
-const CLV_MVY_3_SYMS: &[u16] = &[
- 0xEEEE, 0xEFEE, 0xF0EE, 0xF1EE, 0xF2EE, 0xF3EE, 0xF4EE, 0xF5EE,
- 0xF6EE, 0xF7EE, 0xF8EE, 0xF9EE, 0xFAEE, 0xFBEE, 0xFCEE, 0xFDEE,
- 0xFEEE, 0xFFEE, 0x00EE, 0x01EE, 0x02EE, 0x03EE, 0x04EE, 0x05EE,
- 0x06EE, 0x07EE, 0x08EE, 0x09EE, 0x0AEE, 0x0BEE, 0x0CEE, 0x0DEE,
- 0x0EEE, 0x0FEE, 0x10EE, 0x11EE, 0x12EE, 0xEEEF, 0xEFEF, 0xF0EF,
- 0xF1EF, 0xF2EF, 0xF3EF, 0xF4EF, 0xF5EF, 0xF6EF, 0xF7EF, 0xF8EF,
- 0xF9EF, 0xFAEF, 0xFBEF, 0xFCEF, 0xFDEF, 0xFEEF, 0xFFEF, 0x00EF,
- 0x01EF, 0x02EF, 0x03EF, 0x04EF, 0x05EF, 0x06EF, 0x07EF, 0x08EF,
- 0x09EF, 0x0AEF, 0x0BEF, 0x0CEF, 0x0DEF, 0x0EEF, 0x0FEF, 0x10EF,
- 0x11EF, 0x12EF, 0xEEF0, 0xEFF0, 0xF0F0, 0xF1F0, 0xF2F0, 0xF3F0,
- 0xF4F0, 0xF5F0, 0xF6F0, 0xF7F0, 0xF8F0, 0xF9F0, 0xFAF0, 0xFBF0,
- 0xFCF0, 0xFDF0, 0xFEF0, 0xFFF0, 0x00F0, 0x01F0, 0x02F0, 0x03F0,
- 0x04F0, 0x05F0, 0x06F0, 0x07F0, 0x08F0, 0x09F0, 0x0AF0, 0x0BF0,
- 0x0CF0, 0x0DF0, 0x0EF0, 0x0FF0, 0x10F0, 0x11F0, 0x12F0, 0xEEF1,
- 0xEFF1, 0xF0F1, 0xF1F1, 0xF2F1, 0xF3F1, 0xF4F1, 0xF5F1, 0xF6F1,
- 0xF7F1, 0xF8F1, 0xF9F1, 0xFAF1, 0xFBF1, 0xFCF1, 0xFDF1, 0xFEF1,
- 0xFFF1, 0x00F1, 0x01F1, 0x02F1, 0x03F1, 0x04F1, 0x05F1, 0x06F1,
- 0x07F1, 0x08F1, 0x09F1, 0x0AF1, 0x0BF1, 0x0CF1, 0x0DF1, 0x0EF1,
- 0x0FF1, 0x10F1, 0x11F1, 0x12F1, 0xEEF2, 0xEFF2, 0xF0F2, 0xF1F2,
- 0xF2F2, 0xF3F2, 0xF4F2, 0xF5F2, 0xF6F2, 0xF7F2, 0xF8F2, 0xF9F2,
- 0xFAF2, 0xFBF2, 0xFCF2, 0xFDF2, 0xFEF2, 0xFFF2, 0x00F2, 0x01F2,
- 0x02F2, 0x03F2, 0x04F2, 0x05F2, 0x06F2, 0x07F2, 0x08F2, 0x09F2,
- 0x0AF2, 0x0BF2, 0x0CF2, 0x0DF2, 0x0EF2, 0x0FF2, 0x10F2, 0x11F2,
- 0x12F2, 0xEEF3, 0xEFF3, 0xF0F3, 0xF1F3, 0xF2F3, 0xF3F3, 0xF4F3,
- 0xF5F3, 0xF6F3, 0xF7F3, 0xF8F3, 0xF9F3, 0xFAF3, 0xFBF3, 0xFCF3,
- 0xFDF3, 0xFEF3, 0xFFF3, 0x00F3, 0x01F3, 0x02F3, 0x03F3, 0x04F3,
- 0x05F3, 0x06F3, 0x07F3, 0x08F3, 0x09F3, 0x0AF3, 0x0BF3, 0x0CF3,
- 0x0DF3, 0x0EF3, 0x0FF3, 0x10F3, 0x11F3, 0x12F3, 0xEEF4, 0xEFF4,
- 0xF0F4, 0xF1F4, 0xF2F4, 0xF3F4, 0xF4F4, 0xF5F4, 0xF6F4, 0xF7F4,
- 0xF8F4, 0xF9F4, 0xFAF4, 0xFBF4, 0xFCF4, 0xFDF4, 0xFEF4, 0xFFF4,
- 0x00F4, 0x01F4, 0x02F4, 0x03F4, 0x04F4, 0x05F4, 0x06F4, 0x07F4,
- 0x08F4, 0x09F4, 0x0AF4, 0x0BF4, 0x0CF4, 0x0DF4, 0x0EF4, 0x0FF4,
- 0x10F4, 0x11F4, 0x12F4, 0xEEF5, 0xEFF5, 0xF0F5, 0xF1F5, 0xF2F5,
- 0xF3F5, 0xF4F5, 0xF5F5, 0xF6F5, 0xF7F5, 0xF8F5, 0xF9F5, 0xFAF5,
- 0xFBF5, 0xFCF5, 0xFDF5, 0xFEF5, 0xFFF5, 0x00F5, 0x01F5, 0x02F5,
- 0x03F5, 0x04F5, 0x05F5, 0x06F5, 0x07F5, 0x08F5, 0x09F5, 0x0AF5,
- 0x0BF5, 0x0CF5, 0x0DF5, 0x0EF5, 0x0FF5, 0x10F5, 0x11F5, 0x12F5,
- 0xEEF6, 0xEFF6, 0xF0F6, 0xF1F6, 0xF2F6, 0xF3F6, 0xF4F6, 0xF5F6,
- 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6,
- 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6,
- 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0x0BF6, 0x0CF6, 0x0DF6,
- 0x0EF6, 0x0FF6, 0x10F6, 0x11F6, 0x12F6, 0xEEF7, 0xEFF7, 0xF0F7,
- 0xF1F7, 0xF2F7, 0xF3F7, 0xF4F7, 0xF5F7, 0xF6F7, 0xF7F7, 0xF8F7,
- 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, 0xFFF7, 0x00F7,
- 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, 0x07F7, 0x08F7,
- 0x09F7, 0x0AF7, 0x0BF7, 0x0CF7, 0x0DF7, 0x0EF7, 0x0FF7, 0x10F7,
- 0x11F7, 0x12F7, 0xEEF8, 0xEFF8, 0xF0F8, 0xF1F8, 0xF2F8, 0xF3F8,
- 0xF4F8, 0xF5F8, 0xF6F8, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8,
- 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8,
- 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0x0AF8, 0x0BF8,
- 0x0CF8, 0x0DF8, 0x0EF8, 0x0FF8, 0x10F8, 0x11F8, 0x12F8, 0xEEF9,
- 0xEFF9, 0xF0F9, 0xF1F9, 0xF2F9, 0xF3F9, 0xF4F9, 0xF5F9, 0xF6F9,
- 0xF7F9, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9,
- 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9,
- 0x07F9, 0x08F9, 0x09F9, 0x0AF9, 0x0BF9, 0x0CF9, 0x0DF9, 0x0EF9,
- 0x0FF9, 0x10F9, 0x11F9, 0x12F9, 0xEEFA, 0xEFFA, 0xF0FA, 0xF1FA,
- 0xF2FA, 0xF3FA, 0xF4FA, 0xF5FA, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA,
- 0x0AFA, 0x0BFA, 0x0CFA, 0x0DFA, 0x0EFA, 0x0FFA, 0x10FA, 0x11FA,
- 0x12FA, 0xEEFB, 0xEFFB, 0xF0FB, 0xF1FB, 0xF2FB, 0xF3FB, 0xF4FB,
- 0xF5FB, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB,
- 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB,
- 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, 0x0BFB, 0x0CFB,
- 0x0DFB, 0x0EFB, 0x0FFB, 0x10FB, 0x11FB, 0x12FB, 0xEEFC, 0xEFFC,
- 0xF0FC, 0xF1FC, 0xF2FC, 0xF3FC, 0xF4FC, 0xF5FC, 0xF6FC, 0xF7FC,
- 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC,
- 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC,
- 0x08FC, 0x09FC, 0x0AFC, 0x0BFC, 0x0CFC, 0x0DFC, 0x0EFC, 0x0FFC,
- 0x10FC, 0x11FC, 0x12FC, 0xEEFD, 0xEFFD, 0xF0FD, 0xF1FD, 0xF2FD,
- 0xF3FD, 0xF4FD, 0xF5FD, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD,
- 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD,
- 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD,
- 0x0BFD, 0x0CFD, 0x0DFD, 0x0EFD, 0x0FFD, 0x10FD, 0x11FD, 0x12FD,
- 0xEEFE, 0xEFFE, 0xF0FE, 0xF1FE, 0xF2FE, 0xF3FE, 0xF4FE, 0xF5FE,
- 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0x0BFE, 0x0CFE, 0x0DFE,
- 0x0EFE, 0x0FFE, 0x10FE, 0x11FE, 0x12FE, 0xEEFF, 0xEFFF, 0xF0FF,
- 0xF1FF, 0xF2FF, 0xF3FF, 0xF4FF, 0xF5FF, 0xF6FF, 0xF7FF, 0xF8FF,
- 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF,
- 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF,
- 0x09FF, 0x0AFF, 0x0BFF, 0x0CFF, 0x0DFF, 0x0EFF, 0x0FFF, 0x10FF,
- 0x11FF, 0x12FF, 0xEE00, 0xEF00, 0xF000, 0xF100, 0xF200, 0xF300,
- 0xF400, 0xF500, 0xF600, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00,
- 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300,
- 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0x0A00, 0x0B00,
- 0x0C00, 0x0D00, 0x0E00, 0x0F00, 0x1000, 0x1100, 0x1200, 0xEE01,
- 0xEF01, 0xF001, 0xF101, 0xF201, 0xF301, 0xF401, 0xF501, 0xF601,
- 0xF701, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01,
- 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601,
- 0x0701, 0x0801, 0x0901, 0x0A01, 0x0B01, 0x0C01, 0x0D01, 0x0E01,
- 0x0F01, 0x1001, 0x1101, 0x1201, 0xEE02, 0xEF02, 0xF002, 0xF102,
- 0xF202, 0xF302, 0xF402, 0xF502, 0xF602, 0xF702, 0xF802, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902,
- 0x0A02, 0x0B02, 0x0C02, 0x0D02, 0x0E02, 0x0F02, 0x1002, 0x1102,
- 0x1202, 0xEE03, 0xEF03, 0xF003, 0xF103, 0xF203, 0xF303, 0xF403,
- 0xF503, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03,
- 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403,
- 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, 0x0B03, 0x0C03,
- 0x0D03, 0x0E03, 0x0F03, 0x1003, 0x1103, 0x1203, 0xEE04, 0xEF04,
- 0xF004, 0xF104, 0xF204, 0xF304, 0xF404, 0xF504, 0xF604, 0xF704,
- 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04,
- 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704,
- 0x0804, 0x0904, 0x0A04, 0x0B04, 0x0C04, 0x0D04, 0x0E04, 0x0F04,
- 0x1004, 0x1104, 0x1204, 0xEE05, 0xEF05, 0xF005, 0xF105, 0xF205,
- 0xF305, 0xF405, 0xF505, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05,
- 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205,
- 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05,
- 0x0B05, 0x0C05, 0x0D05, 0x0E05, 0x0F05, 0x1005, 0x1105, 0x1205,
- 0xEE06, 0xEF06, 0xF006, 0xF106, 0xF206, 0xF306, 0xF406, 0xF506,
- 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0x0B06, 0x0C06, 0x0D06,
- 0x0E06, 0x0F06, 0x1006, 0x1106, 0x1206, 0xEE07, 0xEF07, 0xF007,
- 0xF107, 0xF207, 0xF307, 0xF407, 0xF507, 0xF607, 0xF707, 0xF807,
- 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007,
- 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807,
- 0x0907, 0x0A07, 0x0B07, 0x0C07, 0x0D07, 0x0E07, 0x0F07, 0x1007,
- 0x1107, 0x1207, 0xEE08, 0xEF08, 0xF008, 0xF108, 0xF208, 0xF308,
- 0xF408, 0xF508, 0xF608, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08,
- 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308,
- 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0x0A08, 0x0B08,
- 0x0C08, 0x0D08, 0x0E08, 0x0F08, 0x1008, 0x1108, 0x1208, 0xEE09,
- 0xEF09, 0xF009, 0xF109, 0xF209, 0xF309, 0xF409, 0xF509, 0xF609,
- 0xF709, 0xF809, 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09,
- 0xFF09, 0x0009, 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609,
- 0x0709, 0x0809, 0x0909, 0x0A09, 0x0B09, 0x0C09, 0x0D09, 0x0E09,
- 0x0F09, 0x1009, 0x1109, 0x1209, 0xEE0A, 0xEF0A, 0xF00A, 0xF10A,
- 0xF20A, 0xF30A, 0xF40A, 0xF50A, 0xF60A, 0xF70A, 0xF80A, 0xF90A,
- 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A,
- 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A,
- 0x0A0A, 0x0B0A, 0x0C0A, 0x0D0A, 0x0E0A, 0x0F0A, 0x100A, 0x110A,
- 0x120A, 0xEE0B, 0xEF0B, 0xF00B, 0xF10B, 0xF20B, 0xF30B, 0xF40B,
- 0xF50B, 0xF60B, 0xF70B, 0xF80B, 0xF90B, 0xFA0B, 0xFB0B, 0xFC0B,
- 0xFD0B, 0xFE0B, 0xFF0B, 0x000B, 0x010B, 0x020B, 0x030B, 0x040B,
- 0x050B, 0x060B, 0x070B, 0x080B, 0x090B, 0x0A0B, 0x0B0B, 0x0C0B,
- 0x0D0B, 0x0E0B, 0x0F0B, 0x100B, 0x110B, 0x120B, 0xEE0C, 0xEF0C,
- 0xF00C, 0xF10C, 0xF20C, 0xF30C, 0xF40C, 0xF50C, 0xF60C, 0xF70C,
- 0xF80C, 0xF90C, 0xFA0C, 0xFB0C, 0xFC0C, 0xFD0C, 0xFE0C, 0xFF0C,
- 0x000C, 0x010C, 0x020C, 0x030C, 0x040C, 0x050C, 0x060C, 0x070C,
- 0x080C, 0x090C, 0x0A0C, 0x0B0C, 0x0C0C, 0x0D0C, 0x0E0C, 0x0F0C,
- 0x100C, 0x110C, 0x120C, 0xEE0D, 0xEF0D, 0xF00D, 0xF10D, 0xF20D,
- 0xF30D, 0xF40D, 0xF50D, 0xF60D, 0xF70D, 0xF80D, 0xF90D, 0xFA0D,
- 0xFB0D, 0xFC0D, 0xFD0D, 0xFE0D, 0xFF0D, 0x000D, 0x010D, 0x020D,
- 0x030D, 0x040D, 0x050D, 0x060D, 0x070D, 0x080D, 0x090D, 0x0A0D,
- 0x0B0D, 0x0C0D, 0x0D0D, 0x0E0D, 0x0F0D, 0x100D, 0x110D, 0x120D,
- 0xEE0E, 0xEF0E, 0xF00E, 0xF10E, 0xF20E, 0xF30E, 0xF40E, 0xF50E,
- 0xF60E, 0xF70E, 0xF80E, 0xF90E, 0xFA0E, 0xFB0E, 0xFC0E, 0xFD0E,
- 0xFE0E, 0xFF0E, 0x000E, 0x010E, 0x020E, 0x030E, 0x040E, 0x050E,
- 0x060E, 0x070E, 0x080E, 0x090E, 0x0A0E, 0x0B0E, 0x0C0E, 0x0D0E,
- 0x0E0E, 0x0F0E, 0x100E, 0x110E, 0x120E, 0xEE0F, 0xEF0F, 0xF00F,
- 0xF10F, 0xF20F, 0xF30F, 0xF40F, 0xF50F, 0xF60F, 0xF70F, 0xF80F,
- 0xF90F, 0xFA0F, 0xFB0F, 0xFC0F, 0xFD0F, 0xFE0F, 0xFF0F, 0x000F,
- 0x010F, 0x020F, 0x030F, 0x040F, 0x050F, 0x060F, 0x070F, 0x080F,
- 0x090F, 0x0A0F, 0x0B0F, 0x0C0F, 0x0D0F, 0x0E0F, 0x0F0F, 0x100F,
- 0x110F, 0x120F, 0xEE10, 0xEF10, 0xF010, 0xF110, 0xF210, 0xF310,
- 0xF410, 0xF510, 0xF610, 0xF710, 0xF810, 0xF910, 0xFA10, 0xFB10,
- 0xFC10, 0xFD10, 0xFE10, 0xFF10, 0x0010, 0x0110, 0x0210, 0x0310,
- 0x0410, 0x0510, 0x0610, 0x0710, 0x0810, 0x0910, 0x0A10, 0x0B10,
- 0x0C10, 0x0D10, 0x0E10, 0x0F10, 0x1010, 0x1110, 0x1210, 0xEE11,
- 0xEF11, 0xF011, 0xF111, 0xF211, 0xF311, 0xF411, 0xF511, 0xF611,
- 0xF711, 0xF811, 0xF911, 0xFA11, 0xFB11, 0xFC11, 0xFD11, 0xFE11,
- 0xFF11, 0x0011, 0x0111, 0x0211, 0x0311, 0x0411, 0x0511, 0x0611,
- 0x0711, 0x0811, 0x0911, 0x0A11, 0x0B11, 0x0C11, 0x0D11, 0x0E11,
- 0x0F11, 0x1011, 0x1111, 0x1211, 0xEE12, 0xEF12, 0xF012, 0xF112,
- 0xF212, 0xF312, 0xF412, 0xF512, 0xF612, 0xF712, 0xF812, 0xF912,
- 0xFA12, 0xFB12, 0xFC12, 0xFD12, 0xFE12, 0xFF12, 0x0012, 0x0112,
- 0x0212, 0x0312, 0x0412, 0x0512, 0x0612, 0x0712, 0x0812, 0x0912,
- 0x0A12, 0x0B12, 0x0C12, 0x0D12, 0x0E12, 0x0F12, 0x1012, 0x1112,
- 0x1212, 0x1313,
-];
-const CLV_MVY_3_ESCAPE: u16 = 0x1313;
-
-const CLV_BIASY_3_BITS: &[u8] = &[
- 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14,
- 14, 14, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10,
- 10, 9, 9, 9, 9, 8, 8, 7, 7, 6, 5, 4, 4, 2, 2, 3,
- 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10,
- 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 15,
-];
-const CLV_BIASY_3_CODES: &[u16] = &[
- 0xFFFF, 0xFFFC, 0xFFFA, 0x7FFC, 0x7FF9, 0x7FF6, 0x7FF4, 0x7FF2,
- 0x7FF1, 0x7FEF, 0x7FEC, 0x7FEB, 0x7FE9, 0x3FF3, 0x3FF0, 0x3FEE,
- 0x3FED, 0x3FEA, 0x1FF3, 0x1FF2, 0x1FF0, 0x1FEE, 0x0FF4, 0x0FF3,
- 0x0FF1, 0x07F7, 0x07F5, 0x07F3, 0x07F1, 0x03F7, 0x03F4, 0x03F2,
- 0x03F0, 0x01F6, 0x01F4, 0x01F2, 0x01F0, 0x00F6, 0x00F4, 0x0078,
- 0x0076, 0x0039, 0x001B, 0x000C, 0x000A, 0x0001, 0x0000, 0x0004,
- 0x000B, 0x001A, 0x0038, 0x003A, 0x0077, 0x0079, 0x00F5, 0x00F7,
- 0x01F1, 0x01F3, 0x01F5, 0x01F7, 0x03F1, 0x03F3, 0x03F5, 0x03F6,
- 0x07F0, 0x07F2, 0x07F4, 0x07F6, 0x0FF0, 0x0FF2, 0x0FF5, 0x0FF6,
- 0x1FEF, 0x1FF1, 0x1FF4, 0x3FEB, 0x3FEC, 0x3FEF, 0x3FF1, 0x3FF2,
- 0x7FE8, 0x7FEA, 0x7FED, 0x7FEE, 0x7FF0, 0x7FF3, 0x7FF5, 0x7FF7,
- 0x7FFA, 0x7FFB, 0xFFFB, 0xFFFD, 0xFFFE, 0x7FF8,
-];
-const CLV_BIASY_3_SYMS: &[u16] = &[
- 0xFF48, 0xFF4C, 0xFF50, 0xFF54, 0xFF58, 0xFF5C, 0xFF60, 0xFF64,
- 0xFF68, 0xFF6C, 0xFF70, 0xFF74, 0xFF78, 0xFF7C, 0xFF80, 0xFF84,
- 0xFF88, 0xFF8C, 0xFF90, 0xFF94, 0xFF98, 0xFF9C, 0xFFA0, 0xFFA4,
- 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4,
- 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4,
- 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004,
- 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024,
- 0x0028, 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044,
- 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, 0x0060, 0x0064,
- 0x0068, 0x006C, 0x0070, 0x0074, 0x0078, 0x007C, 0x0080, 0x0084,
- 0x0088, 0x008C, 0x0090, 0x0094, 0x0098, 0x009C, 0x00A0, 0x00A4,
- 0x00A8, 0x00AC, 0x00B0, 0x00B4, 0x00B8, 0x0100,
-];
-
-const CLV_FLAGSU_0_BITS: &[u8] = &[
- 1, 4, 4, 4, 5, 5, 9, 7, 5, 9, 4, 7, 4, 8, 7, 4,
-];
-const CLV_FLAGSU_0_CODES: &[u16] = &[
- 0x0000, 0x000B, 0x000D, 0x0009, 0x001D, 0x001C, 0x01FF, 0x007D,
- 0x001E, 0x01FE, 0x000C, 0x007C, 0x000A, 0x00FE, 0x007E, 0x0008,
-];
-
-const CLV_MVU_1_BITS: &[u8] = &[
- 16, 14, 14, 14, 13, 12, 12, 10, 12, 12, 13, 14, 14, 14, 16, 15,
- 13, 13, 12, 12, 11, 11, 7, 11, 11, 12, 12, 13, 13, 15, 16, 16,
- 16, 13, 12, 10, 10, 6, 10, 10, 12, 13, 16, 16, 16, 14, 14, 11,
- 11, 11, 11, 9, 7, 9, 11, 11, 11, 11, 14, 14, 15, 13, 13, 12,
- 9, 8, 8, 4, 8, 8, 9, 12, 13, 13, 15, 14, 14, 11, 11, 10,
- 9, 8, 4, 8, 9, 10, 11, 12, 14, 14, 12, 12, 11, 10, 10, 8,
- 6, 3, 6, 8, 10, 10, 11, 12, 12, 11, 10, 9, 6, 6, 6, 5,
- 4, 5, 6, 6, 6, 9, 10, 11, 12, 12, 11, 10, 10, 8, 6, 3,
- 6, 7, 10, 10, 11, 12, 12, 14, 14, 11, 11, 10, 9, 8, 4, 8,
- 9, 10, 11, 11, 14, 14, 15, 13, 13, 12, 9, 8, 8, 4, 8, 8,
- 9, 12, 13, 13, 15, 14, 14, 11, 11, 11, 11, 9, 7, 9, 11, 11,
- 11, 11, 14, 14, 16, 16, 16, 13, 12, 10, 10, 6, 10, 10, 12, 13,
- 16, 16, 16, 15, 13, 13, 12, 12, 11, 11, 7, 11, 11, 12, 12, 13,
- 13, 15, 16, 14, 14, 14, 13, 12, 12, 10, 12, 12, 13, 14, 14, 14,
- 16, 7,
-];
-const CLV_MVU_1_CODES: &[u16] = &[
- 0xFFFC, 0x3FED, 0x3FE5, 0x3FE3, 0x1FD9, 0x0FD9, 0x0FD6, 0x03CE,
- 0x0FD3, 0x0FD8, 0x1FD6, 0x3FE0, 0x3FE8, 0x3FEC, 0xFFFE, 0x7FF3,
- 0x1FE7, 0x1FDA, 0x0FCF, 0x0FCC, 0x07DD, 0x07CC, 0x006B, 0x07CD,
- 0x07DE, 0x0FCE, 0x0FD2, 0x1FDD, 0x1FEC, 0x7FF0, 0xFFF6, 0xFFFA,
- 0xFFF2, 0x1FDE, 0x0FDB, 0x03D8, 0x03CA, 0x002E, 0x03CB, 0x03D9,
- 0x0FDC, 0x1FDF, 0xFFF3, 0xFFF9, 0xFFF5, 0x3FF3, 0x3FDD, 0x07DA,
- 0x07D2, 0x07CA, 0x07C2, 0x01DE, 0x0069, 0x01DF, 0x07C3, 0x07CB,
- 0x07D3, 0x07DB, 0x3FDF, 0x3FF6, 0x7FF7, 0x1FED, 0x1FE5, 0x0FDF,
- 0x01D8, 0x00E3, 0x00DF, 0x0007, 0x00E0, 0x00E4, 0x01D9, 0x0FE0,
- 0x1FE3, 0x1FE9, 0x7FF4, 0x3FF5, 0x3FE7, 0x07E4, 0x07C6, 0x03D2,
- 0x01E2, 0x00E9, 0x0006, 0x00EA, 0x01E3, 0x03D3, 0x07C7, 0x0FCA,
- 0x3FE9, 0x3FF0, 0x0FE8, 0x0FE5, 0x07D5, 0x03DD, 0x03D5, 0x00DC,
- 0x002B, 0x0001, 0x002C, 0x00DD, 0x03D6, 0x03DE, 0x07D6, 0x0FE4,
- 0x0FE9, 0x07E0, 0x03C8, 0x01D6, 0x0032, 0x0030, 0x0028, 0x0012,
- 0x0004, 0x0013, 0x0029, 0x0031, 0x0033, 0x01D7, 0x03C9, 0x07E1,
- 0x0FEA, 0x0FE6, 0x07D7, 0x03DF, 0x03D7, 0x00DE, 0x002D, 0x0000,
- 0x002A, 0x006D, 0x03D4, 0x03DC, 0x07D4, 0x0FE3, 0x0FE7, 0x3FF1,
- 0x3FE4, 0x07E2, 0x07C4, 0x03D0, 0x01E0, 0x00E7, 0x0005, 0x00E8,
- 0x01E1, 0x03D1, 0x07C5, 0x07E3, 0x3FEA, 0x3FF7, 0x7FF6, 0x1FE6,
- 0x1FE4, 0x0FE1, 0x01DA, 0x00E5, 0x00E1, 0x0008, 0x00E2, 0x00E6,
- 0x01DB, 0x0FE2, 0x1FE2, 0x1FEB, 0x7FF5, 0x3FF4, 0x3FDC, 0x07D9,
- 0x07D0, 0x07C8, 0x07C0, 0x01DC, 0x0068, 0x01DD, 0x07C1, 0x07C9,
- 0x07D1, 0x07D8, 0x3FDE, 0x3FF2, 0xFFFB, 0xFFF4, 0xFFF0, 0x1FE1,
- 0x0FDD, 0x03DA, 0x03CC, 0x002F, 0x03CD, 0x03DB, 0x0FDE, 0x1FE0,
- 0xFFF1, 0xFFF7, 0xFFF8, 0x7FF2, 0x1FEA, 0x1FDC, 0x0FD1, 0x0FCD,
- 0x07DC, 0x07CF, 0x006C, 0x07CE, 0x07DF, 0x0FCB, 0x0FD0, 0x1FDB,
- 0x1FE8, 0x7FF1, 0xFFFD, 0x3FEE, 0x3FEB, 0x3FE1, 0x1FD7, 0x0FD7,
- 0x0FD5, 0x03CF, 0x0FD4, 0x0FDA, 0x1FD8, 0x3FE2, 0x3FE6, 0x3FEF,
- 0xFFFF, 0x006A,
-];
-const CLV_MVU_1_SYMS: &[u16] = &[
- 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9,
- 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0xF9FB, 0xFAFB,
- 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB,
- 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0xF9FC, 0xFAFC, 0xFBFC,
- 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC,
- 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD,
- 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD,
- 0x05FD, 0x06FD, 0x07FD, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF,
- 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF,
- 0x07FF, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00,
- 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
- 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001,
- 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0xF903, 0xFA03,
- 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203,
- 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0xF904, 0xFA04, 0xFB04,
- 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304,
- 0x0404, 0x0504, 0x0604, 0x0704, 0xF905, 0xFA05, 0xFB05, 0xFC05,
- 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405,
- 0x0505, 0x0605, 0x0705, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07,
- 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607,
- 0x0707, 0x0808,
-];
-const CLV_MVU_1_ESCAPE: u16 = 0x0808;
-
-const CLV_BIASU_1_BITS: &[u8] = &[
- 16, 15, 14, 13, 13, 13, 12, 12, 12, 12, 11, 10, 10, 9, 9, 8,
- 7, 6, 5, 2, 1, 3, 5, 7, 7, 8, 9, 9, 10, 10, 11, 12,
- 12, 12, 12, 13, 13, 13, 14, 15, 15, 16,
-];
-const CLV_BIASU_1_CODES: &[u16] = &[
- 0xFFFE, 0x7FFC, 0x3FFC, 0x1FFC, 0x1FFA, 0x1FF9, 0x0FFA, 0x0FF7,
- 0x0FF8, 0x0FF5, 0x07F8, 0x03FA, 0x03F8, 0x01FA, 0x01F9, 0x00FA,
- 0x007B, 0x003C, 0x001C, 0x0002, 0x0000, 0x0006, 0x001D, 0x007A,
- 0x007C, 0x00FB, 0x01F8, 0x01FB, 0x03F9, 0x03FB, 0x07F9, 0x0FF4,
- 0x0FF6, 0x0FF9, 0x0FFB, 0x1FF8, 0x1FFB, 0x1FFD, 0x3FFD, 0x7FFD,
- 0x7FFE, 0xFFFF,
-];
-const CLV_BIASU_1_SYMS: &[u16] = &[
- 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC,
- 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC,
- 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, 0x000C,
- 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, 0x002C,
- 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C,
- 0x0050, 0x0100,
-];
-
-const CLV_FLAGSU_1_BITS: &[u8] = &[
- 1, 4, 4, 4, 4, 4, 8, 6, 4, 8, 5, 8, 4, 10, 9, 10,
-];
-const CLV_FLAGSU_1_CODES: &[u16] = &[
- 0x0000, 0x000C, 0x0008, 0x000A, 0x000B, 0x000E, 0x00FD, 0x003E,
- 0x000D, 0x00FC, 0x001E, 0x00FE, 0x0009, 0x03FE, 0x01FE, 0x03FF,
-];
-
-const CLV_MVU_2_BITS: &[u8] = &[
- 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 15, 15,
- 15, 15, 16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13,
- 13, 14, 14, 14, 14, 14, 15, 15, 15, 16, 16, 15, 15, 14, 14, 14,
- 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 16, 16,
- 15, 15, 14, 13, 13, 13, 13, 13, 12, 12, 12, 13, 13, 13, 13, 13,
- 14, 15, 15, 16, 14, 14, 14, 14, 13, 12, 12, 12, 12, 11, 10, 11,
- 12, 12, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14, 13, 12, 12, 12,
- 12, 11, 10, 9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 14,
- 13, 13, 12, 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13,
- 13, 14, 15, 14, 14, 14, 13, 12, 12, 11, 11, 10, 9, 7, 9, 10,
- 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 13, 12, 12, 11, 11, 10,
- 9, 8, 7, 8, 9, 10, 11, 11, 12, 12, 13, 14, 14, 14, 13, 13,
- 12, 11, 9, 9, 8, 7, 6, 5, 6, 7, 8, 9, 9, 11, 12, 13,
- 13, 14, 14, 13, 13, 13, 11, 11, 10, 8, 7, 4, 1, 4, 7, 8,
- 10, 11, 11, 13, 13, 13, 14, 14, 13, 13, 12, 11, 9, 9, 8, 7,
- 6, 5, 6, 7, 8, 9, 9, 11, 12, 13, 13, 14, 14, 14, 13, 12,
- 11, 11, 11, 9, 9, 8, 7, 8, 9, 10, 11, 11, 12, 12, 13, 14,
- 14, 14, 14, 14, 13, 12, 12, 11, 11, 10, 9, 7, 9, 10, 11, 11,
- 12, 12, 13, 14, 14, 14, 15, 14, 13, 13, 12, 12, 12, 12, 11, 10,
- 9, 10, 11, 12, 12, 12, 12, 13, 13, 14, 15, 14, 14, 14, 13, 12,
- 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14,
- 14, 14, 14, 14, 13, 12, 12, 12, 12, 11, 10, 11, 12, 12, 12, 12,
- 13, 14, 14, 14, 14, 16, 15, 15, 14, 13, 13, 13, 13, 13, 12, 12,
- 12, 13, 13, 13, 13, 13, 14, 15, 15, 16, 16, 15, 15, 14, 14, 14,
- 14, 14, 14, 13, 12, 13, 14, 14, 14, 14, 14, 14, 15, 15, 16, 16,
- 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14,
- 15, 15, 15, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14,
- 14, 14, 15, 15, 15, 15, 16, 16, 16, 6,
-];
-const CLV_MVU_2_CODES: &[u16] = &[
- 0xFFF2, 0xFFEF, 0xFFEA, 0x7FEC, 0x7FD5, 0x7FC5, 0x7FCF, 0x3FD3,
- 0x3FC9, 0x3FB4, 0x3F72, 0x3FAE, 0x3FDC, 0x3FE1, 0x7FC4, 0x7FC8,
- 0x7FD7, 0x7FF0, 0xFFE9, 0xFFEC, 0xFFF8, 0xFFF4, 0x7FF3, 0x7FDE,
- 0x7FD3, 0x3FC0, 0x3F99, 0x3FA8, 0x3FAC, 0x3F8E, 0x1FA8, 0x1F79,
- 0x1FA2, 0x3F89, 0x3F93, 0x3F95, 0x3F9C, 0x3FB8, 0x7FD2, 0x7FE6,
- 0x7FDA, 0xFFF7, 0xFFFE, 0x7FED, 0x7FE2, 0x3FD5, 0x3FD7, 0x3FB3,
- 0x3FA2, 0x3F80, 0x3F7A, 0x1F88, 0x1F70, 0x1F8A, 0x3F83, 0x3F84,
- 0x3FAA, 0x3FC4, 0x3FDA, 0x3FDF, 0x7FDB, 0x7FE3, 0xFFF1, 0xFFFB,
- 0x7FE1, 0x7FC7, 0x3FB0, 0x1FAA, 0x1FAB, 0x1FA3, 0x1F8E, 0x1F81,
- 0x0FA7, 0x0F7F, 0x0FA8, 0x1F82, 0x1F8F, 0x1FA4, 0x1FAC, 0x1FAD,
- 0x3FB5, 0x7FC6, 0x7FDD, 0xFFF3, 0x3FDD, 0x3FBE, 0x3FB9, 0x3F7C,
- 0x1F77, 0x0FB5, 0x0F9D, 0x0F99, 0x0F90, 0x0794, 0x03BE, 0x0795,
- 0x0F92, 0x0F9A, 0x0F9E, 0x0FB6, 0x1F78, 0x3F78, 0x3FB2, 0x3FBF,
- 0x3FD2, 0x3FA7, 0x3F8C, 0x3F75, 0x1F9E, 0x0F93, 0x0F94, 0x0F7B,
- 0x0F73, 0x07B4, 0x03BB, 0x01D9, 0x03BC, 0x07B5, 0x0F74, 0x0F7C,
- 0x0F95, 0x0F96, 0x1FA0, 0x3F76, 0x3F8F, 0x3FA5, 0x7FE5, 0x3FC7,
- 0x1F95, 0x1F71, 0x0FAB, 0x0FAC, 0x0F9F, 0x0F7D, 0x0796, 0x03BF,
- 0x00DE, 0x03C0, 0x0797, 0x0F7E, 0x0FA0, 0x0FAD, 0x0FAE, 0x1F72,
- 0x1F97, 0x3FD1, 0x7FD8, 0x3FA9, 0x3FA0, 0x3F6D, 0x1F99, 0x0F87,
- 0x0F77, 0x07A8, 0x079C, 0x03C5, 0x01CA, 0x0067, 0x01CB, 0x03C6,
- 0x079D, 0x07A9, 0x0F78, 0x0F8A, 0x1F9F, 0x3F6E, 0x3F98, 0x3F9A,
- 0x3FCA, 0x3F70, 0x1FAF, 0x0F8D, 0x0F6F, 0x07AC, 0x07A0, 0x03B7,
- 0x01CE, 0x00DA, 0x0063, 0x00DB, 0x01CF, 0x03B8, 0x07A1, 0x07AD,
- 0x0F70, 0x0F91, 0x1FB2, 0x3F73, 0x3FD6, 0x3F7D, 0x1F91, 0x1F85,
- 0x0FA3, 0x07A2, 0x01D4, 0x01D0, 0x00E0, 0x0068, 0x002C, 0x0014,
- 0x002D, 0x0069, 0x00E1, 0x01D1, 0x01D5, 0x07A3, 0x0FA4, 0x1F89,
- 0x1F92, 0x3F81, 0x3FA6, 0x1F7B, 0x1F7C, 0x1F7D, 0x07B0, 0x07AE,
- 0x03C7, 0x00DC, 0x0064, 0x0008, 0x0000, 0x0009, 0x0065, 0x00DD,
- 0x03C8, 0x07AF, 0x07B1, 0x1F7E, 0x1F7F, 0x1F80, 0x3F9E, 0x3F85,
- 0x1F93, 0x1F8B, 0x0FA5, 0x07A4, 0x01D6, 0x01D2, 0x00E2, 0x006A,
- 0x002E, 0x0015, 0x002F, 0x006B, 0x00E3, 0x01D3, 0x01D7, 0x07A5,
- 0x0FA6, 0x1F8C, 0x1F94, 0x3F87, 0x3FCE, 0x3F77, 0x1FB4, 0x0F83,
- 0x07B6, 0x07AA, 0x079E, 0x01DA, 0x01CC, 0x00D8, 0x0062, 0x00D9,
- 0x01CD, 0x03B6, 0x079F, 0x07AB, 0x0F6E, 0x0F84, 0x1FA9, 0x3F6A,
- 0x3FCD, 0x3F90, 0x3F92, 0x3F6B, 0x1F96, 0x0F85, 0x0F75, 0x07A6,
- 0x079A, 0x03C3, 0x01C8, 0x0066, 0x01C9, 0x03C4, 0x079B, 0x07A7,
- 0x0F76, 0x0F86, 0x1F9D, 0x3F6C, 0x3F96, 0x3F97, 0x7FE9, 0x3FD8,
- 0x1F98, 0x1F73, 0x0FAF, 0x0FB0, 0x0FA1, 0x0F80, 0x0798, 0x03C1,
- 0x01D8, 0x03C2, 0x0799, 0x0F81, 0x0FA2, 0x0FB1, 0x0FB2, 0x1F74,
- 0x1F9A, 0x3FE0, 0x7FEE, 0x3F94, 0x3F8B, 0x3F6F, 0x1F9B, 0x0F88,
- 0x0F89, 0x0F79, 0x0F71, 0x07B2, 0x03B9, 0x00DF, 0x03BA, 0x07B3,
- 0x0F72, 0x0F7A, 0x0F8B, 0x0F8C, 0x1F9C, 0x3F71, 0x3F8A, 0x3F9B,
- 0x3FC8, 0x3FBD, 0x3FC5, 0x3F79, 0x1F75, 0x0FB3, 0x0F9C, 0x0F97,
- 0x0F8E, 0x0792, 0x03BD, 0x0793, 0x0F8F, 0x0F98, 0x0F9B, 0x0FB4,
- 0x1F76, 0x3F82, 0x3FC3, 0x3FBA, 0x3FC6, 0xFFFD, 0x7FDF, 0x7FCC,
- 0x3FBB, 0x1FB0, 0x1FAE, 0x1FA1, 0x1F90, 0x1F83, 0x0FAA, 0x0F82,
- 0x0FA9, 0x1F84, 0x1F8D, 0x1FA5, 0x1FB1, 0x1FB3, 0x3FC2, 0x7FCA,
- 0x7FE8, 0xFFF5, 0xFFFF, 0x7FDC, 0x7FD9, 0x3FCC, 0x3FD9, 0x3FB7,
- 0x3F9F, 0x3F7E, 0x3F86, 0x1F86, 0x0FB7, 0x1F87, 0x3F7B, 0x3F7F,
- 0x3FA1, 0x3FBC, 0x3FCB, 0x3FD4, 0x7FF1, 0x7FF2, 0xFFFA, 0xFFFC,
- 0x7FE4, 0x7FE7, 0x7FD4, 0x3FAF, 0x3FA3, 0x3F91, 0x3F9D, 0x3F88,
- 0x1FA6, 0x1F7A, 0x1FA7, 0x3F8D, 0x3FAB, 0x3FAD, 0x3FA4, 0x3FB6,
- 0x7FD0, 0x7FE0, 0x7FEB, 0xFFF0, 0xFFF9, 0xFFEB, 0xFFED, 0x7FEA,
- 0x7FD6, 0x7FC9, 0x7FCB, 0x3FD0, 0x3FDE, 0x3FB1, 0x3F74, 0x3FC1,
- 0x3FCF, 0x3FDB, 0x7FCD, 0x7FCE, 0x7FD1, 0x7FEF, 0xFFE8, 0xFFEE,
- 0xFFF6, 0x0030,
-];
-const CLV_MVU_2_SYMS: &[u16] = &[
- 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6,
- 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6,
- 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0xF6F7, 0xF7F7, 0xF8F7,
- 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, 0xFFF7, 0x00F7,
- 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, 0x07F7, 0x08F7,
- 0x09F7, 0x0AF7, 0xF6F8, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8,
- 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8,
- 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0x0AF8, 0xF6F9,
- 0xF7F9, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9,
- 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9,
- 0x07F9, 0x08F9, 0x09F9, 0x0AF9, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA,
- 0x0AFA, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB,
- 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB,
- 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, 0xF6FC, 0xF7FC,
- 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC,
- 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC,
- 0x08FC, 0x09FC, 0x0AFC, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD,
- 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD,
- 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD,
- 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0xF6FF, 0xF7FF, 0xF8FF,
- 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF,
- 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF,
- 0x09FF, 0x0AFF, 0xF600, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00,
- 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300,
- 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0x0A00, 0xF601,
- 0xF701, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01,
- 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601,
- 0x0701, 0x0801, 0x0901, 0x0A01, 0xF602, 0xF702, 0xF802, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902,
- 0x0A02, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03,
- 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403,
- 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, 0xF604, 0xF704,
- 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04,
- 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704,
- 0x0804, 0x0904, 0x0A04, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05,
- 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205,
- 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05,
- 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0xF607, 0xF707, 0xF807,
- 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007,
- 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807,
- 0x0907, 0x0A07, 0xF608, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08,
- 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308,
- 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0x0A08, 0xF609,
- 0xF709, 0xF809, 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09,
- 0xFF09, 0x0009, 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609,
- 0x0709, 0x0809, 0x0909, 0x0A09, 0xF60A, 0xF70A, 0xF80A, 0xF90A,
- 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A,
- 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A,
- 0x0A0A, 0x0B0B,
-];
-const CLV_MVU_2_ESCAPE: u16 = 0x0B0B;
-
-const CLV_BIASU_2_BITS: &[u8] = &[
- 16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 12, 12, 11, 11, 10,
- 10, 9, 9, 8, 8, 7, 6, 5, 4, 3, 1, 3, 4, 6, 6, 7,
- 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 14, 14, 15, 15,
- 15, 16, 16, 16, 16, 14,
-];
-const CLV_BIASU_2_CODES: &[u16] = &[
- 0xFFFC, 0xFFF8, 0xFFFA, 0xFFFD, 0x7FF8, 0x7FFA, 0x7FF7, 0x3FF6,
- 0x3FF7, 0x3FF4, 0x1FF9, 0x0FFB, 0x0FF9, 0x07FB, 0x07F9, 0x03FA,
- 0x03F8, 0x01FA, 0x01F9, 0x00FB, 0x00F9, 0x007B, 0x003B, 0x001C,
- 0x000C, 0x0004, 0x0000, 0x0005, 0x000D, 0x003A, 0x003C, 0x007A,
- 0x00F8, 0x00FA, 0x01F8, 0x01FB, 0x03F9, 0x03FB, 0x07F8, 0x07FA,
- 0x0FF8, 0x0FFA, 0x1FF8, 0x3FF5, 0x3FF8, 0x3FF9, 0x7FFB, 0x7FF9,
- 0x7FF6, 0xFFF9, 0xFFFF, 0xFFFE, 0xFFFB, 0x3FFA,
-];
-const CLV_BIASU_2_SYMS: &[u16] = &[
- 0xFF98, 0xFF9C, 0xFFA0, 0xFFA4, 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4,
- 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4,
- 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4,
- 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014,
- 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, 0x002C, 0x0030, 0x0034,
- 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C, 0x0050, 0x0054,
- 0x0058, 0x005C, 0x0060, 0x0064, 0x0068, 0x0100,
-];
-
-const CLV_FLAGSV_0_BITS: &[u8] = &[
- 1, 4, 5, 4, 5, 5, 8, 10, 5, 9, 5, 6, 4, 10, 7, 3,
-];
-const CLV_FLAGSV_0_CODES: &[u16] = &[
- 0x0000, 0x000A, 0x001B, 0x000C, 0x001E, 0x001C, 0x00FE, 0x03FE,
- 0x001D, 0x01FE, 0x001A, 0x003E, 0x000B, 0x03FF, 0x007E, 0x0004,
-];
-
-const CLV_MVV_1_BITS: &[u8] = &[
- 16, 15, 13, 13, 13, 12, 10, 10, 10, 12, 13, 13, 13, 15, 16, 16,
- 15, 14, 13, 12, 11, 10, 9, 10, 11, 12, 13, 14, 15, 16, 15, 14,
- 13, 13, 11, 10, 10, 5, 10, 10, 11, 13, 13, 14, 15, 12, 12, 12,
- 11, 10, 10, 9, 5, 9, 10, 10, 11, 12, 12, 12, 14, 12, 12, 12,
- 11, 9, 8, 5, 8, 9, 11, 12, 12, 12, 14, 14, 11, 11, 9, 9,
- 9, 7, 5, 7, 9, 9, 9, 11, 11, 14, 13, 12, 11, 10, 10, 8,
- 6, 3, 6, 8, 10, 10, 11, 12, 13, 11, 10, 9, 7, 6, 6, 4,
- 4, 4, 6, 7, 7, 10, 10, 11, 13, 12, 11, 10, 10, 8, 6, 3,
- 6, 8, 10, 10, 11, 12, 13, 14, 11, 11, 9, 9, 9, 7, 5, 7,
- 9, 9, 9, 11, 11, 14, 14, 12, 12, 12, 11, 9, 8, 5, 8, 9,
- 11, 12, 12, 12, 14, 12, 12, 12, 11, 10, 10, 9, 5, 9, 10, 10,
- 11, 12, 12, 12, 15, 14, 13, 13, 11, 10, 10, 5, 10, 10, 11, 13,
- 13, 14, 15, 16, 15, 14, 13, 12, 11, 10, 9, 10, 11, 12, 13, 14,
- 15, 16, 16, 15, 13, 13, 13, 12, 10, 10, 10, 12, 13, 13, 13, 15,
- 16, 7,
-];
-const CLV_MVV_1_CODES: &[u16] = &[
- 0xFFFD, 0x7FF8, 0x1FF2, 0x1FDC, 0x1FDB, 0x0FD2, 0x03D6, 0x03BF,
- 0x03D3, 0x0FD0, 0x1FDA, 0x1FDE, 0x1FF0, 0x7FF9, 0xFFFE, 0xFFFA,
- 0x7FFB, 0x3FF3, 0x1FE9, 0x0FD6, 0x07CB, 0x03E1, 0x01C8, 0x03E2,
- 0x07CC, 0x0FD9, 0x1FE8, 0x3FF6, 0x7FFA, 0xFFF9, 0x7FF1, 0x3FEE,
- 0x1FE4, 0x1FE0, 0x07D4, 0x03DB, 0x03CB, 0x0014, 0x03CC, 0x03DC,
- 0x07D6, 0x1FE3, 0x1FE7, 0x3FEC, 0x7FF3, 0x0FEA, 0x0FE0, 0x0FDE,
- 0x07DE, 0x03C9, 0x03C3, 0x01DC, 0x0013, 0x01DD, 0x03C4, 0x03CA,
- 0x07DF, 0x0FDF, 0x0FE3, 0x0FEB, 0x3FF1, 0x0FE7, 0x0FCF, 0x0FC8,
- 0x07D8, 0x01D2, 0x00E0, 0x0010, 0x00E1, 0x01D4, 0x07D9, 0x0FC9,
- 0x0FCC, 0x0FE6, 0x3FF5, 0x3FEA, 0x07E2, 0x07D2, 0x01D7, 0x01D0,
- 0x01CC, 0x006A, 0x000F, 0x006B, 0x01CD, 0x01D1, 0x01D9, 0x07D3,
- 0x07E3, 0x3FEB, 0x1FEE, 0x0FD5, 0x07C7, 0x03D8, 0x03D0, 0x00DD,
- 0x002D, 0x0001, 0x002E, 0x00DE, 0x03D1, 0x03D9, 0x07C8, 0x0FD8,
- 0x1FEF, 0x07CE, 0x03C5, 0x01DE, 0x006C, 0x0032, 0x0030, 0x0005,
- 0x0004, 0x0006, 0x0031, 0x0066, 0x006D, 0x03BE, 0x03C6, 0x07CF,
- 0x1FEC, 0x0FDA, 0x07C9, 0x03DA, 0x03D2, 0x00DF, 0x002F, 0x0000,
- 0x002C, 0x00DC, 0x03CF, 0x03D7, 0x07C6, 0x0FD4, 0x1FED, 0x3FE9,
- 0x07E0, 0x07D0, 0x01D3, 0x01CE, 0x01CA, 0x0068, 0x000E, 0x0069,
- 0x01CB, 0x01CF, 0x01D5, 0x07D1, 0x07E1, 0x3FE8, 0x3FF4, 0x0FE4,
- 0x0FCD, 0x0FCB, 0x07DA, 0x01D6, 0x00E2, 0x0011, 0x00E3, 0x01D8,
- 0x07DB, 0x0FCA, 0x0FCE, 0x0FE5, 0x3FF7, 0x0FE8, 0x0FE1, 0x0FDD,
- 0x07DD, 0x03C7, 0x03C1, 0x01DA, 0x0012, 0x01DB, 0x03C2, 0x03C8,
- 0x07DC, 0x0FDC, 0x0FE2, 0x0FE9, 0x7FF0, 0x3FEF, 0x1FE5, 0x1FE1,
- 0x07D7, 0x03DD, 0x03CD, 0x0015, 0x03CE, 0x03DE, 0x07D5, 0x1FE2,
- 0x1FE6, 0x3FED, 0x7FF2, 0xFFF8, 0x7FF4, 0x3FF2, 0x1FEB, 0x0FD7,
- 0x07CD, 0x03DF, 0x01C9, 0x03E0, 0x07CA, 0x0FDB, 0x1FEA, 0x3FF0,
- 0x7FF5, 0xFFFB, 0xFFFC, 0x7FF6, 0x1FF3, 0x1FDD, 0x1FD9, 0x0FD1,
- 0x03D5, 0x03C0, 0x03D4, 0x0FD3, 0x1FD8, 0x1FDF, 0x1FF1, 0x7FF7,
- 0xFFFF, 0x0067,
-];
-const CLV_MVV_1_SYMS: &[u16] = &[
- 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9,
- 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0xF9FB, 0xFAFB,
- 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB,
- 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0xF9FC, 0xFAFC, 0xFBFC,
- 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC,
- 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD,
- 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD,
- 0x05FD, 0x06FD, 0x07FD, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF,
- 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF,
- 0x07FF, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00,
- 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
- 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001,
- 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0xF903, 0xFA03,
- 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203,
- 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0xF904, 0xFA04, 0xFB04,
- 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304,
- 0x0404, 0x0504, 0x0604, 0x0704, 0xF905, 0xFA05, 0xFB05, 0xFC05,
- 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405,
- 0x0505, 0x0605, 0x0705, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07,
- 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607,
- 0x0707, 0x0808,
-];
-const CLV_MVV_1_ESCAPE: u16 = 0x0808;
-
-const CLV_BIASV_1_BITS: &[u8] = &[
- 16, 15, 14, 14, 14, 13, 13, 13, 12, 12, 11, 11, 10, 10, 9, 8,
- 7, 6, 5, 2, 1, 3, 5, 6, 8, 8, 9, 10, 10, 11, 12, 12,
- 12, 13, 13, 13, 14, 14, 15, 15, 16, 14,
-];
-const CLV_BIASV_1_CODES: &[u16] = &[
- 0xFFFF, 0x7FFD, 0x3FFD, 0x3FFB, 0x3FF9, 0x1FFB, 0x1FF8, 0x1FF6,
- 0x0FFA, 0x0FF8, 0x07FA, 0x07F8, 0x03FA, 0x03F8, 0x01FB, 0x00FB,
- 0x007C, 0x003C, 0x001C, 0x0002, 0x0000, 0x0006, 0x001D, 0x003D,
- 0x00FA, 0x00FC, 0x01FA, 0x03F9, 0x03FB, 0x07F9, 0x0FF6, 0x0FF7,
- 0x0FF9, 0x1FF7, 0x1FF9, 0x1FFA, 0x3FFA, 0x3FFC, 0x7FFC, 0x7FFE,
- 0xFFFE, 0x3FF8,
-];
-const CLV_BIASV_1_SYMS: &[u16] = &[
- 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC,
- 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC,
- 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, 0x000C,
- 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, 0x002C,
- 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C,
- 0x0050, 0x0100,
-];
-
-const CLV_FLAGSV_1_BITS: &[u8] = &[
- 1, 4, 4, 4, 4, 5, 8, 6, 3, 7, 5, 10, 5, 11, 9, 11,
-];
-const CLV_FLAGSV_1_CODES: &[u16] = &[
- 0x0000, 0x000D, 0x000C, 0x000A, 0x000B, 0x001D, 0x00FE, 0x003E,
- 0x0004, 0x007E, 0x001E, 0x03FE, 0x001C, 0x07FE, 0x01FE, 0x07FF,
-];
-
-const CLV_MVV_2_BITS: &[u8] = &[
- 16, 15, 15, 15, 15, 15, 14, 14, 14, 13, 12, 13, 14, 14, 14, 15,
- 15, 15, 15, 15, 16, 16, 16, 16, 15, 15, 14, 14, 14, 13, 13, 12,
- 12, 13, 14, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 14, 14, 14,
- 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 16, 16, 16, 15,
- 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 13, 13, 13, 13, 14,
- 14, 14, 15, 15, 16, 14, 14, 14, 13, 12, 12, 12, 10, 10, 10, 10,
- 10, 12, 12, 12, 13, 14, 14, 14, 16, 14, 14, 14, 13, 13, 12, 12,
- 12, 10, 10, 7, 10, 10, 12, 12, 12, 13, 13, 14, 14, 14, 14, 14,
- 13, 12, 12, 12, 12, 10, 9, 8, 7, 8, 9, 10, 12, 12, 12, 12,
- 13, 14, 14, 14, 14, 13, 12, 12, 12, 12, 10, 9, 8, 7, 8, 9,
- 10, 12, 12, 12, 12, 13, 14, 14, 14, 14, 13, 13, 12, 12, 11, 10,
- 9, 8, 7, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 13, 13,
- 12, 10, 10, 9, 8, 7, 6, 5, 6, 7, 8, 9, 10, 10, 12, 13,
- 13, 14, 13, 13, 13, 13, 11, 10, 9, 8, 7, 5, 1, 5, 7, 8,
- 9, 10, 11, 13, 13, 13, 13, 14, 13, 13, 12, 10, 10, 9, 8, 7,
- 6, 5, 6, 7, 8, 9, 10, 10, 12, 13, 13, 14, 14, 14, 13, 13,
- 12, 12, 11, 9, 9, 8, 7, 8, 9, 9, 11, 12, 12, 13, 13, 14,
- 14, 14, 14, 13, 12, 12, 12, 12, 10, 9, 8, 7, 8, 9, 10, 12,
- 12, 12, 12, 13, 14, 14, 14, 14, 13, 12, 12, 12, 12, 10, 9, 8,
- 7, 8, 9, 10, 12, 12, 12, 12, 13, 14, 14, 14, 14, 14, 13, 13,
- 12, 12, 12, 10, 10, 7, 10, 10, 12, 12, 12, 13, 13, 14, 14, 14,
- 16, 14, 14, 14, 13, 12, 12, 12, 10, 10, 10, 10, 10, 12, 12, 12,
- 13, 14, 14, 14, 16, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12,
- 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 14, 14, 14,
- 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 16, 16, 16, 16,
- 16, 16, 15, 15, 14, 14, 14, 13, 12, 12, 12, 13, 14, 14, 14, 15,
- 15, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 13, 10, 13,
- 14, 14, 14, 15, 15, 15, 15, 15, 16, 6,
-];
-const CLV_MVV_2_CODES: &[u16] = &[
- 0xFFFF, 0x7FE7, 0x7FD9, 0x7FE6, 0x7FE5, 0x7FCE, 0x3FD6, 0x3FD3,
- 0x3F9C, 0x1FB2, 0x0F7A, 0x1FB5, 0x3FA8, 0x3FDD, 0x3FE5, 0x7FD0,
- 0x7FEA, 0x7FEC, 0x7FEF, 0x7FDB, 0xFFF3, 0xFFF5, 0xFFE2, 0xFFEB,
- 0x7FEB, 0x7FE0, 0x3FA7, 0x3F84, 0x3F79, 0x1FAE, 0x1F70, 0x0F78,
- 0x0FAA, 0x1FAA, 0x3F76, 0x3F7E, 0x3FAC, 0x7FE1, 0x7FDD, 0xFFEC,
- 0xFFEE, 0xFFF8, 0xFFF9, 0xFFEA, 0xFFE4, 0x3FE1, 0x3FBA, 0x3FC5,
- 0x3FB9, 0x3FA1, 0x3FAA, 0x1F8B, 0x1F8D, 0x1F8E, 0x3FA6, 0x3FA9,
- 0x3FC4, 0x3FBC, 0x3FC6, 0x3FDB, 0xFFE3, 0xFFE1, 0xFFFB, 0x7FD4,
- 0x7FCC, 0x3FCD, 0x3F88, 0x3F7C, 0x1FA1, 0x1FA2, 0x1F95, 0x1F77,
- 0x0F95, 0x0F79, 0x0F97, 0x1F78, 0x1F96, 0x1FA3, 0x1FA4, 0x3F7F,
- 0x3F8B, 0x3FCB, 0x7FCF, 0x7FD5, 0xFFF6, 0x3FD7, 0x3FE0, 0x3F91,
- 0x1F7B, 0x0FB4, 0x0FA5, 0x0FA6, 0x03D5, 0x03CB, 0x03BF, 0x03CC,
- 0x03D6, 0x0FA7, 0x0FA8, 0x0FB5, 0x1F7D, 0x3F87, 0x3FD2, 0x3FDF,
- 0xFFF0, 0x3F95, 0x3F8A, 0x3F96, 0x1FB7, 0x1F9F, 0x0F9F, 0x0F8F,
- 0x0F76, 0x03D1, 0x03BC, 0x0067, 0x03BD, 0x03D2, 0x0F77, 0x0F90,
- 0x0FA0, 0x1FA0, 0x1FB9, 0x3F97, 0x3F98, 0x3F99, 0x3FC3, 0x3FAF,
- 0x1F81, 0x0FA9, 0x0F91, 0x0F7E, 0x0F68, 0x03B2, 0x01C6, 0x00D4,
- 0x0062, 0x00D5, 0x01C7, 0x03B3, 0x0F6A, 0x0F81, 0x0F93, 0x0FAC,
- 0x1F83, 0x3FB3, 0x3FB4, 0x3FC7, 0x3FBB, 0x1F86, 0x0FAF, 0x0F98,
- 0x0F84, 0x0F6D, 0x03B8, 0x01CC, 0x00DA, 0x0065, 0x00DB, 0x01CD,
- 0x03B9, 0x0F6F, 0x0F86, 0x0F9B, 0x0FB1, 0x1F88, 0x3FB8, 0x3FC9,
- 0x3FDC, 0x3F80, 0x1FB3, 0x1F93, 0x0F87, 0x0F72, 0x07B0, 0x03B0,
- 0x01D4, 0x00E0, 0x0061, 0x00E1, 0x01D5, 0x03B1, 0x07B1, 0x0F73,
- 0x0F88, 0x1F94, 0x1FB4, 0x3F81, 0x3FD4, 0x3F9E, 0x1F99, 0x1F73,
- 0x0F89, 0x03C4, 0x03C0, 0x01CE, 0x00D0, 0x005C, 0x0028, 0x0010,
- 0x0029, 0x005D, 0x00D1, 0x01CF, 0x03C1, 0x03C5, 0x0F8A, 0x1F74,
- 0x1F9A, 0x3FA4, 0x1FAC, 0x1F8C, 0x1F7E, 0x1F71, 0x07B2, 0x03CF,
- 0x01C4, 0x00DC, 0x005A, 0x0012, 0x0000, 0x0013, 0x005B, 0x00DD,
- 0x01C5, 0x03D0, 0x07B3, 0x1F72, 0x1F7F, 0x1F8F, 0x1FAD, 0x3FAB,
- 0x1F9B, 0x1F75, 0x0F8B, 0x03C6, 0x03C2, 0x01D0, 0x00D2, 0x005E,
- 0x002A, 0x0011, 0x002B, 0x005F, 0x00D3, 0x01D1, 0x03C3, 0x03C7,
- 0x0F8C, 0x1F76, 0x1F9C, 0x3FAD, 0x3FCF, 0x3F85, 0x1FBA, 0x1F91,
- 0x0F7D, 0x0F70, 0x07AE, 0x01D6, 0x01D2, 0x00DE, 0x0060, 0x00DF,
- 0x01D3, 0x01D7, 0x07AF, 0x0F71, 0x0F7F, 0x1F92, 0x1FAF, 0x3F7B,
- 0x3FD0, 0x3FC0, 0x3FB1, 0x1F82, 0x0FAB, 0x0F92, 0x0F80, 0x0F69,
- 0x03B4, 0x01C8, 0x00D6, 0x0063, 0x00D7, 0x01C9, 0x03B5, 0x0F6B,
- 0x0F82, 0x0F94, 0x0FAD, 0x1F84, 0x3FB5, 0x3FC2, 0x3FB6, 0x3FBF,
- 0x1F85, 0x0FAE, 0x0F96, 0x0F83, 0x0F6C, 0x03B6, 0x01CA, 0x00D8,
- 0x0064, 0x00D9, 0x01CB, 0x03B7, 0x0F6E, 0x0F85, 0x0F99, 0x0FB0,
- 0x1F87, 0x3FB0, 0x3FB2, 0x3F93, 0x3F86, 0x3F8E, 0x1FB1, 0x1F9D,
- 0x0F9A, 0x0F8D, 0x0F74, 0x03CD, 0x03BA, 0x0066, 0x03BB, 0x03CE,
- 0x0F75, 0x0F8E, 0x0F9C, 0x1F9E, 0x1FB0, 0x3F8C, 0x3F94, 0x3F8D,
- 0xFFFC, 0x3FCA, 0x3FD5, 0x3F8F, 0x1F79, 0x0FB2, 0x0FA1, 0x0FA2,
- 0x03D3, 0x03C9, 0x03BE, 0x03CA, 0x03D4, 0x0FA3, 0x0FA4, 0x0FB3,
- 0x1F7A, 0x3F90, 0x3FE3, 0x3FD8, 0xFFF2, 0x7FD7, 0x7FCD, 0x3FE4,
- 0x3F92, 0x3F82, 0x1FA6, 0x1FA8, 0x1F98, 0x1F7C, 0x0F9D, 0x0F7B,
- 0x0F9E, 0x1F80, 0x1F97, 0x1FA7, 0x1FA5, 0x3F7A, 0x3F89, 0x3FDA,
- 0x7FD2, 0x7FD6, 0xFFFE, 0xFFED, 0xFFE8, 0x3FCC, 0x3FBD, 0x3FAE,
- 0x3FC1, 0x3F9F, 0x3F9A, 0x1F89, 0x1F90, 0x1F8A, 0x3FA3, 0x3FA0,
- 0x3FC8, 0x3FBE, 0x3FB7, 0x3FD1, 0xFFE7, 0xFFE9, 0xFFFD, 0xFFF4,
- 0xFFE5, 0xFFEF, 0x7FD8, 0x7FDC, 0x3FA2, 0x3F83, 0x3F78, 0x1FA9,
- 0x0FB6, 0x0F7C, 0x0FB7, 0x1FAB, 0x3F77, 0x3F7D, 0x3F9B, 0x7FDE,
- 0x7FED, 0xFFE6, 0xFFE0, 0xFFF7, 0xFFF1, 0x7FDA, 0x7FE9, 0x7FE2,
- 0x7FE3, 0x7FD1, 0x3FD9, 0x3FE2, 0x3FA5, 0x1FB8, 0x03C8, 0x1FB6,
- 0x3F9D, 0x3FDE, 0x3FCE, 0x7FD3, 0x7FEE, 0x7FDF, 0x7FE8, 0x7FE4,
- 0xFFFA, 0x002C,
-];
-const CLV_MVV_2_SYMS: &[u16] = &[
- 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6,
- 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6,
- 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0xF6F7, 0xF7F7, 0xF8F7,
- 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, 0xFFF7, 0x00F7,
- 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, 0x07F7, 0x08F7,
- 0x09F7, 0x0AF7, 0xF6F8, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8,
- 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8,
- 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0x0AF8, 0xF6F9,
- 0xF7F9, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9,
- 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9,
- 0x07F9, 0x08F9, 0x09F9, 0x0AF9, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA,
- 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA,
- 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA,
- 0x0AFA, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB,
- 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB,
- 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, 0xF6FC, 0xF7FC,
- 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC,
- 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC,
- 0x08FC, 0x09FC, 0x0AFC, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD,
- 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD,
- 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD,
- 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE,
- 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE,
- 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0xF6FF, 0xF7FF, 0xF8FF,
- 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF,
- 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF,
- 0x09FF, 0x0AFF, 0xF600, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00,
- 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300,
- 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0x0A00, 0xF601,
- 0xF701, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01,
- 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601,
- 0x0701, 0x0801, 0x0901, 0x0A01, 0xF602, 0xF702, 0xF802, 0xF902,
- 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102,
- 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902,
- 0x0A02, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03,
- 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403,
- 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, 0xF604, 0xF704,
- 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04,
- 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704,
- 0x0804, 0x0904, 0x0A04, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05,
- 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205,
- 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05,
- 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06,
- 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506,
- 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0xF607, 0xF707, 0xF807,
- 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007,
- 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807,
- 0x0907, 0x0A07, 0xF608, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08,
- 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308,
- 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0x0A08, 0xF609,
- 0xF709, 0xF809, 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09,
- 0xFF09, 0x0009, 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609,
- 0x0709, 0x0809, 0x0909, 0x0A09, 0xF60A, 0xF70A, 0xF80A, 0xF90A,
- 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A,
- 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A,
- 0x0A0A, 0x0B0B,
-];
-const CLV_MVV_2_ESCAPE: u16 = 0x0B0B;
-
-const CLV_BIASV_2_BITS: &[u8] = &[
- 16, 15, 14, 13, 13, 13, 13, 13, 12, 12, 11, 10, 10, 9, 9, 8,
- 7, 6, 5, 4, 3, 1, 3, 4, 5, 7, 7, 8, 9, 9, 10, 10,
- 10, 12, 12, 13, 13, 13, 13, 13, 14, 16, 15, 15,
-];
-const CLV_BIASV_2_CODES: &[u16] = &[
- 0xFFFE, 0x7FFD, 0x3FFC, 0x1FFC, 0x1FFB, 0x1FF8, 0x1FF7, 0x1FF4,
- 0x0FF8, 0x0FF7, 0x07FA, 0x03FB, 0x03F8, 0x01FA, 0x01F9, 0x00FA,
- 0x007B, 0x003C, 0x001C, 0x000C, 0x0004, 0x0000, 0x0005, 0x000D,
- 0x001D, 0x007A, 0x007C, 0x00FB, 0x01F8, 0x01FB, 0x03F9, 0x03FA,
- 0x03FC, 0x0FF6, 0x0FF9, 0x1FF5, 0x1FF9, 0x1FF6, 0x1FFA, 0x1FFD,
- 0x3FFD, 0xFFFF, 0x7FFE, 0x7FFC,
-];
-const CLV_BIASV_2_SYMS: &[u16] = &[
- 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8,
- 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8,
- 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008,
- 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, 0x0028,
- 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, 0x0048,
- 0x004C, 0x0050, 0x0054, 0x0100,
-];
-
diff --git a/src/codecs/gremlinvideo.rs b/src/codecs/gremlinvideo.rs
deleted file mode 100644
index 28663a4..0000000
--- a/src/codecs/gremlinvideo.rs
+++ /dev/null
@@ -1,566 +0,0 @@
-use crate::formats;
-use crate::formats::{NAChannelType, NAChannelMap};
-use super::*;
-use crate::io::byteio::*;
-
-struct GremlinVideoDecoder {
- info: Rc<NACodecInfo>,
- pal: [u8; 768],
- frame: Vec<u8>,
- scale_v: bool,
- scale_h: bool,
-}
-
-struct Bits8 {
- queue: u8,
- fill: u8,
-}
-
-struct Bits32 {
- queue: u32,
- fill: u8,
-}
-
-const PREAMBLE_SIZE: usize = 4096;
-
-impl Bits8 {
- fn new() -> Self { Bits8 { queue: 0, fill: 0 } }
- fn read_2bits(&mut self, br: &mut ByteReader) -> ByteIOResult<u8> {
- if self.fill == 0 {
- self.queue = br.read_byte()?;
- self.fill += 8;
- }
- let res = self.queue >> 6;
- self.queue <<= 2;
- self.fill -= 2;
- Ok(res)
- }
-}
-
-impl Bits32 {
- fn new() -> Self { Bits32 { queue: 0, fill: 0 } }
- fn fill(&mut self, br: &mut ByteReader) -> ByteIOResult<()> {
- self.queue = br.read_u32le()?;
- self.fill = 32;
- Ok(())
- }
- fn read_bits(&mut self, br: &mut ByteReader, nbits: u8) -> ByteIOResult<u32> {
- let res = self.queue & ((1 << nbits) - 1);
- self.queue >>= nbits;
- self.fill -= nbits;
- if self.fill <= 16 {
- self.queue |= (br.read_u16le()? as u32) << self.fill;
- self.fill += 16;
- }
- Ok(res)
- }
-}
-
-impl GremlinVideoDecoder {
- fn new() -> Self {
- let dummy_info = Rc::new(DUMMY_CODEC_INFO);
- GremlinVideoDecoder {
- info: dummy_info, pal: [0; 768], frame: Vec::new(),
- scale_v: false, scale_h: false
- }
- }
-
- fn lz_copy(&mut self, idx: usize, offset: isize, len: usize) -> DecoderResult<()> {
- if idx + len > self.frame.len() { return Err(DecoderError::InvalidData); }
- if offset == -1 {
- let c = self.frame[idx - 1];
- for i in 0..len { self.frame[idx + i] = c; }
- } else if offset < 0 {
- let start = idx - (-offset as usize);
- for i in 0..len { self.frame[idx + i] = self.frame[start + i]; }
- } else {
- if idx + (offset as usize) + len > self.frame.len() { return Err(DecoderError::InvalidData); }
- let start = idx + (offset as usize);
- for i in 0..len { self.frame[idx + i] = self.frame[start + i]; }
- }
- Ok(())
- }
-
- fn rescale(&mut self, w: usize, h: usize, scale_v: bool, scale_h: bool) {
- if (self.scale_v == scale_v) && (self.scale_h == scale_h) { return; }
-
- if self.scale_h && self.scale_v {
- for j in 0..h {
- let y = h - j - 1;
- for i in 0..w {
- let x = w - i - 1;
- self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x/2 + (y/2) * (w/2)];
- }
- }
- } else if self.scale_h {
- for j in 0..h {
- let y = h - j - 1;
- for x in 0..w {
- self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x + (y/2) * w];
- }
- }
- } else if self.scale_v {
- for j in 0..h {
- let y = h - j - 1;
- for i in 0..w {
- let x = w - i - 1;
- self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x/2 + y * (w/2)];
- }
- }
- }
-
- if scale_h && scale_v {
- for y in 0..h/2 {
- for x in 0..w/2 {
- self.frame[PREAMBLE_SIZE + x + y * (w/2)] = self.frame[PREAMBLE_SIZE + x*2 + y*2 * w];
- }
- }
- } else if scale_h {
- for y in 0..h/2 {
- for x in 0..w {
- self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x + y*2 * w];
- }
- }
- } else if scale_v {
- for y in 0..h {
- for x in 0..w/2 {
- self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x*2 + y * w];
- }
- }
- }
-
- self.scale_v = scale_v;
- self.scale_h = scale_h;
- }
-
- fn output_frame(&mut self, bufinfo: &mut NABufferType, w: usize, h: usize) {
- let bufo = bufinfo.get_vbuf();
- let mut buf = bufo.unwrap();
- let paloff = buf.get_offset(1);
- let stride = buf.get_stride(0);
- let mut data = buf.get_data_mut();
- let dst = data.as_mut_slice();
- let mut sidx = PREAMBLE_SIZE;
- let mut didx = 0;
-
- for i in 0..768 { dst[paloff + i] = self.pal[i]; }
- if !self.scale_v && !self.scale_h {
- for _ in 0..h {
- for x in 0..w { dst[didx + x] = self.frame[sidx + x]; }
- sidx += w;
- didx += stride;
- }
- } else {
- for y in 0..h {
- if !self.scale_v {
- for x in 0..w { dst[didx + x] = self.frame[sidx + x]; }
- } else {
- for x in 0..w { dst[didx + x] = self.frame[sidx + x/2]; }
- }
- if !self.scale_h || ((y & 1) == 1) {
- sidx += if !self.scale_v { w } else { w/2 };
- }
- didx += stride;
- }
- }
- }
-
- fn decode_method2(&mut self, br: &mut ByteReader) -> DecoderResult<()> {
- let mut bits = Bits8::new();
-
- let mut size = self.info.get_properties().get_video_info().unwrap().get_width() *
- self.info.get_properties().get_video_info().unwrap().get_height();
- let mut idx = PREAMBLE_SIZE;
- if self.frame[8] != 0 {
- for c in 0..256 {
- for i in 0..16 { self.frame[c * 16 + i] = c as u8; }
- }
- }
- while size > 0 {
- let tag = bits.read_2bits(br)?;
- if tag == 0 {
- self.frame[idx] = br.read_byte()?;
- size -= 1;
- idx += 1;
- } else if tag == 1 {
- let b = br.read_byte()?;
- let len = ((b & 0xF) as usize) + 3;
- let bot = (b >> 4) as isize;
- let off = ((br.read_byte()? as isize) << 4) + bot - 4096;
- validate!(len <= size);
- size -= len;
- self.lz_copy(idx, off, len)?;
- idx += len;
- } else if tag == 2 {
- let len = (br.read_byte()? as usize) + 2;
- validate!(len <= size);
- size -= len;
- idx += len;
- } else {
- break;
- }
- }
- Ok(())
- }
-
- fn decode_method5(&mut self, br: &mut ByteReader, skip: usize) -> DecoderResult<()> {
- let mut bits = Bits8::new();
-
- let mut size = self.info.get_properties().get_video_info().unwrap().get_width() *
- self.info.get_properties().get_video_info().unwrap().get_height();
- let mut idx = PREAMBLE_SIZE;
- validate!(size >= skip);
- size -= skip;
- idx += skip;
- while size > 0 {
- let tag = bits.read_2bits(br)?;
- if tag == 0 {
- self.frame[idx] = br.read_byte()?;
- size -= 1;
- idx += 1;
- } else if tag == 1 {
- let b = br.read_byte()?;
- let len = ((b & 0xF) as usize) + 3;
- let bot = (b >> 4) as isize;
- let off = ((br.read_byte()? as isize) << 4) + bot - 4096;
- validate!(len <= size);
- size -= len;
- self.lz_copy(idx, off, len)?;
- idx += len;
- } else if tag == 2 {
- let b = br.read_byte()?;
- if b == 0 { break; }
- let len: usize = (if b != 0xFF { b as usize } else { br.read_u16le()? as usize }) + 1;
- validate!(len <= size);
- size -= len;
- idx += len;
- } else {
- let b = br.read_byte()?;
- let len = ((b & 0x3) as usize) + 2;
- let off = -((b >> 2) as isize) - 1;
- validate!(len <= size);
- size -= len;
- self.lz_copy(idx, off, len)?;
- idx += len;
- }
- }
- Ok(())
- }
-
- fn decode_method68(&mut self, br: &mut ByteReader,
- skip: usize, use8: bool) -> DecoderResult<()> {
- let mut bits = Bits32::new();
-
- let mut size = self.info.get_properties().get_video_info().unwrap().get_width() *
- self.info.get_properties().get_video_info().unwrap().get_height();
- let mut idx = PREAMBLE_SIZE;
- validate!(size >= skip);
- size -= skip;
- idx += skip;
- bits.fill(br)?;
- while size > 0 {
- let tag = bits.read_bits(br, 2)?;
- if tag == 0 { //draw
- let b = bits.read_bits(br, 1)?;
- if b == 0 {
- self.frame[idx] = br.read_byte()?;
- size -= 1;
- idx += 1;
- } else {
- let mut len: usize = 2;
- let mut lbits = 0;
- loop {
- lbits += 1;
- let val = bits.read_bits(br, lbits)?;
- len += val as usize;
- if val != ((1 << lbits) - 1) { break; }
- validate!(lbits < 16);
- }
- validate!(len <= size);
- for i in 0..len { self.frame[idx + i] = br.read_byte()?; }
- size -= len;
- idx += len;
- }
- } else if tag == 1 { //skip
- let b = bits.read_bits(br, 1)?;
- let len: usize;
- if b == 0 {
- len = (bits.read_bits(br, 4)? as usize) + 2;
- } else {
- let bb = br.read_byte()?;
- if (bb & 0x80) == 0 {
- len = (bb as usize) + 18;
- } else {
- let top = ((bb & 0x7F) as usize) << 8;
- len = top + (br.read_byte()? as usize) + 146;
- }
- }
- validate!(len <= size);
- size -= len;
- idx += len;
- } else if tag == 2 {
- let subtag = bits.read_bits(br, 2)? as usize;
- if subtag != 3 {
- let top = (bits.read_bits(br, 4)? as usize) << 8;
- let offs = top + (br.read_byte()? as usize);
- if (subtag != 0) || (offs <= 0xF80) {
- let len = (subtag as usize) + 3;
- self.lz_copy(idx, (offs as isize) - 4096, len)?;
- idx += len;
- } else {
- if offs == 0xFFF { return Ok(()); }
- let real_off = ((offs >> 4) & 0x7) + 1;
- let len = ((offs & 0xF) + 2) * 2;
- validate!(len <= size);
- size -= len;
- let c1 = self.frame[idx - real_off];
- let c2 = self.frame[idx - real_off + 1];
- for i in 0..len/2 {
- self.frame[idx + i*2 + 0] = c1;
- self.frame[idx + i*2 + 1] = c2;
- }
- idx += len;
- }
- } else {
- let b = br.read_byte()?;
- let off = ((b & 0x7F) as usize) + 1;
- let len = if (b & 0x80) == 0 { 2 } else { 3 };
- validate!(len <= size);
- size -= len;
- self.lz_copy(idx, -(off as isize), len)?;
- idx += len;
- }
- } else {
- let len: usize;
- let off: isize;
- if use8 {
- let b = br.read_byte()?;
- if (b & 0xC0) == 0xC0 {
- len = ((b & 0x3F) as usize) + 8;
- let q = bits.read_bits(br, 4)? as isize;
- off = (q << 8) + (br.read_byte()? as isize) + 1;
- } else {
- let ofs1: isize;
- if (b & 0x80) == 0 {
- len = ((b >> 4) as usize) + 6;
- ofs1 = (b & 0xF) as isize;
- } else {
- len = ((b & 0x3F) as usize) + 14;
- ofs1 = bits.read_bits(br, 4)? as isize;
- }
- off = (ofs1 << 8) + (br.read_byte()? as isize) - 4096;
- }
- } else {
- let b = br.read_byte()?;
- if (b >> 4) == 0xF {
- len = (br.read_byte()? as usize) + 21;
- } else {
- len = ((b >> 4) as usize) + 6;
- }
- let ofs1 = (b & 0xF) as isize;
- off = (ofs1 << 8) + (br.read_byte()? as isize) - 4096;
- }
- validate!(len <= size);
- size -= len;
- self.lz_copy(idx, off, len)?;
- idx += len;
- }
- }
- Ok(())
- }
-}
-
-impl NADecoder for GremlinVideoDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- if !vinfo.get_format().is_paletted() { return Err(DecoderError::NotImplemented); }
- let fmt = formats::PAL8_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
-
- self.frame.resize(PREAMBLE_SIZE + w * h, 0);
- for i in 0..2 {
- for j in 0..256 {
- for k in 0..8 {
- self.frame[i * 2048 + j * 8 + k] = j as u8;
- }
- }
- }
- let edata = info.get_extradata().unwrap();
- validate!(edata.len() == 768);
- for c in 0..256 {
- for i in 0..3 {
- let cc = edata[c * 3 + i];
- self.pal[c * 3 + (2 - i)] = (cc << 2) | (cc >> 4);
- }
- }
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
- let mut mr = MemoryReader::new_read(&src);
- let mut br = ByteReader::new(&mut mr);
- let flags = br.read_u32le()?;
- let w = self.info.get_properties().get_video_info().unwrap().get_width();
- let h = self.info.get_properties().get_video_info().unwrap().get_height();
-
- let cmethod = flags & 0xF;
- let is_intra = (flags & 0x40) != 0;
- let scale_v = (flags & 0x10) != 0;
- let scale_h = (flags & 0x20) != 0;
-
- self.rescale(w, h, scale_v, scale_h);
-
- if (cmethod == 0) || (cmethod == 1) {
- for c in 0..256 {
- for i in 0..3 {
- let b = br.read_byte()?;
- self.pal[c * 3 + (2 - i)] = (b << 2) | (b >> 4);
- }
- }
- if cmethod == 1 {
- for i in PREAMBLE_SIZE..self.frame.len() { self.frame[i] = 0x00; }
- }
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None);
- frm.set_keyframe(false);
- frm.set_frame_type(FrameType::Skip);
- return Ok(Rc::new(RefCell::new(frm)))
- } else if cmethod == 3 {
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None);
- frm.set_keyframe(false);
- frm.set_frame_type(FrameType::Skip);
- return Ok(Rc::new(RefCell::new(frm)))
- } else if cmethod == 2 {
- self.decode_method2(&mut br)?;
- } else if cmethod == 5 {
- self.decode_method5(&mut br, (flags >> 8) as usize)?;
- } else if cmethod == 6 {
- self.decode_method68(&mut br, (flags >> 8) as usize, false)?;
- } else if cmethod == 8 {
- self.decode_method68(&mut br, (flags >> 8) as usize, true)?;
- } else {
- return Err(DecoderError::NotImplemented);
- }
-
- let bufret = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 0);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let mut bufinfo = bufret.unwrap();
-
- self.output_frame(&mut bufinfo, w, h);
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(is_intra);
- frm.set_frame_type(if is_intra { FrameType::I } else { FrameType::P });
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder_video() -> Box<NADecoder> {
- Box::new(GremlinVideoDecoder::new())
-}
-
-struct GremlinAudioDecoder {
- ainfo: NAAudioInfo,
- chmap: NAChannelMap,
- delta_tab: [i16; 256],
- state0: i16,
- state1: i16,
-}
-
-impl GremlinAudioDecoder {
- fn new() -> Self {
- let mut delta_tab: [i16; 256] = [0; 256];
- let mut delta = 0;
- let mut code = 64;
- let mut step = 45;
- for i in 0..127 {
- delta += code >> 5;
- code += step;
- step += 2;
- delta_tab[i * 2 + 1] = delta;
- delta_tab[i * 2 + 2] = -delta;
- }
- delta_tab[255] = 32767;//delta + (code >> 5);
- GremlinAudioDecoder {
- ainfo: NAAudioInfo::new(0, 1, formats::SND_S16_FORMAT, 0),
- chmap: NAChannelMap::new(),
- delta_tab,
- state0: 0,
- state1: 0,
- }
- }
-}
-
-const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
-const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R];
-
-fn get_default_chmap(nch: u8) -> NAChannelMap {
- let mut chmap = NAChannelMap::new();
- match nch {
- 1 => chmap.add_channels(&CHMAP_MONO),
- 2 => chmap.add_channels(&CHMAP_STEREO),
- _ => (),
- }
- chmap
-}
-
-impl NADecoder for GremlinAudioDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), ainfo.get_channels(), formats::SND_S16P_FORMAT, ainfo.get_block_len());
- self.chmap = get_default_chmap(ainfo.get_channels());
- if self.chmap.num_channels() == 0 { return Err(DecoderError::InvalidData); }
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- if let NACodecTypeInfo::Audio(_) = info.get_properties() {
- let pktbuf = pkt.get_buffer();
- let samples = pktbuf.len() / self.chmap.num_channels();
- let mut abuf = alloc_audio_buffer(self.ainfo, samples, self.chmap.clone())?;
- let mut adata = abuf.get_abuf_i16().unwrap();
- let off1 = adata.get_offset(1);
- let mut buf = adata.get_data_mut();
- if self.chmap.num_channels() == 2 {
- for (i, e) in pktbuf.chunks(2).enumerate() {
- self.state0 = self.state0.wrapping_add(self.delta_tab[e[0] as usize]);
- buf[i] = self.state0;
- self.state1 = self.state1.wrapping_add(self.delta_tab[e[1] as usize]);
- buf[off1 + i] = self.state1;
- }
- } else {
- for (i, e) in pktbuf.iter().enumerate() {
- self.state0 += self.delta_tab[*e as usize];
- buf[i] = self.state0;
- }
- }
- let mut frm = NAFrame::new_from_pkt(pkt, info, abuf);
- frm.set_duration(Some(samples as u64));
- frm.set_keyframe(false);
- Ok(Rc::new(RefCell::new(frm)))
- } else {
- Err(DecoderError::InvalidData)
- }
- }
-}
-
-pub fn get_decoder_audio() -> Box<NADecoder> {
- Box::new(GremlinAudioDecoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_gdv() {
- test_file_decoding("gdv", "assets/intro1.gdv", Some(10), true, false, None);
- }
-}
diff --git a/src/codecs/h263/code.rs b/src/codecs/h263/code.rs
deleted file mode 100644
index dd1279e..0000000
--- a/src/codecs/h263/code.rs
+++ /dev/null
@@ -1,497 +0,0 @@
-use crate::frame::NAVideoBuffer;
-use super::{BlockDSP, CBPInfo, MV};
-use super::super::blockdsp;
-//use super::h263data::*;
-
-/*const W1: i32 = 22725;
-const W2: i32 = 21407;
-const W3: i32 = 19266;
-const W4: i32 = 16383;
-const W5: i32 = 12873;
-const W6: i32 = 8867;
-const W7: i32 = 4520;
-
-const ROW_SHIFT: u8 = 11;
-const COL_SHIFT: u8 = 20;
-
-fn idct_row(row: &mut [i16]) {
- let in0 = row[0] as i32;
- let in1 = row[1] as i32;
- let in2 = row[2] as i32;
- let in3 = row[3] as i32;
- let in4 = row[4] as i32;
- let in5 = row[5] as i32;
- let in6 = row[6] as i32;
- let in7 = row[7] as i32;
-
- let mut a0 = in0 * W1 + (1 << (ROW_SHIFT - 1));
- let mut a1 = a0;
- let mut a2 = a0;
- let mut a3 = a0;
-
- a0 += W2 * in2;
- a1 += W6 * in2;
- a2 -= W6 * in2;
- a3 -= W2 * in2;
-
- let mut b0 = W1 * in1 + W3 * in3;
- let mut b1 = W3 * in1 - W7 * in3;
- let mut b2 = W5 * in1 - W1 * in3;
- let mut b3 = W7 * in1 - W5 * in3;
-
- a0 += W4 * in4 + W6 * in6;
- a1 -= W4 * in4 + W2 * in6;
- a2 -= W4 * in4 - W2 * in6;
- a3 += W4 * in4 - W6 * in6;
-
- b0 += W5 * in5 + W7 * in7;
- b1 -= W1 * in5 + W5 * in7;
- b2 += W7 * in5 + W3 * in7;
- b3 += W3 * in5 - W1 * in7;
-
- row[0] = ((a0 + b0) >> ROW_SHIFT) as i16;
- row[7] = ((a0 - b0) >> ROW_SHIFT) as i16;
- row[1] = ((a1 + b1) >> ROW_SHIFT) as i16;
- row[6] = ((a1 - b1) >> ROW_SHIFT) as i16;
- row[2] = ((a2 + b2) >> ROW_SHIFT) as i16;
- row[5] = ((a2 - b2) >> ROW_SHIFT) as i16;
- row[3] = ((a3 + b3) >> ROW_SHIFT) as i16;
- row[4] = ((a3 - b3) >> ROW_SHIFT) as i16;
-}
-
-fn idct_col(blk: &mut [i16; 64], off: usize) {
- let in0 = blk[off + 0*8] as i32;
- let in1 = blk[off + 1*8] as i32;
- let in2 = blk[off + 2*8] as i32;
- let in3 = blk[off + 3*8] as i32;
- let in4 = blk[off + 4*8] as i32;
- let in5 = blk[off + 5*8] as i32;
- let in6 = blk[off + 6*8] as i32;
- let in7 = blk[off + 7*8] as i32;
-
- let mut a0 = in0 * W1 + (1 << (COL_SHIFT - 1));
- let mut a1 = a0;
- let mut a2 = a0;
- let mut a3 = a0;
-
- a0 += W2 * in2;
- a1 += W6 * in2;
- a2 -= W6 * in2;
- a3 -= W2 * in2;
-
- let mut b0 = W1 * in1 + W3 * in3;
- let mut b1 = W3 * in1 - W7 * in3;
- let mut b2 = W5 * in1 - W1 * in3;
- let mut b3 = W7 * in1 - W5 * in3;
-
- a0 += W4 * in4 + W6 * in6;
- a1 -= W4 * in4 + W2 * in6;
- a2 -= W4 * in4 - W2 * in6;
- a3 += W4 * in4 - W6 * in6;
-
- b0 += W5 * in5 + W7 * in7;
- b1 -= W1 * in5 + W5 * in7;
- b2 += W7 * in5 + W3 * in7;
- b3 += W3 * in5 - W1 * in7;
-
- blk[off + 0*8] = ((a0 + b0) >> COL_SHIFT) as i16;
- blk[off + 7*8] = ((a0 - b0) >> COL_SHIFT) as i16;
- blk[off + 1*8] = ((a1 + b1) >> COL_SHIFT) as i16;
- blk[off + 6*8] = ((a1 - b1) >> COL_SHIFT) as i16;
- blk[off + 2*8] = ((a2 + b2) >> COL_SHIFT) as i16;
- blk[off + 5*8] = ((a2 - b2) >> COL_SHIFT) as i16;
- blk[off + 3*8] = ((a3 + b3) >> COL_SHIFT) as i16;
- blk[off + 4*8] = ((a3 - b3) >> COL_SHIFT) as i16;
-}
-
-#[allow(dead_code)]
-pub fn h263_idct(blk: &mut [i16; 64]) {
- for i in 0..8 { idct_row(&mut blk[i*8..(i+1)*8]); }
- for i in 0..8 { idct_col(blk, i); }
-}*/
-
-const W1: i32 = 2841;
-const W2: i32 = 2676;
-const W3: i32 = 2408;
-const W5: i32 = 1609;
-const W6: i32 = 1108;
-const W7: i32 = 565;
-const W8: i32 = 181;
-
-const ROW_SHIFT: u8 = 8;
-const COL_SHIFT: u8 = 14;
-
-fn idct_row(row: &mut [i16]) {
- let in0 = ((row[0] as i32) << 11) + (1 << (ROW_SHIFT - 1));
- let in1 = (row[4] as i32) << 11;
- let in2 = row[6] as i32;
- let in3 = row[2] as i32;
- let in4 = row[1] as i32;
- let in5 = row[7] as i32;
- let in6 = row[5] as i32;
- let in7 = row[3] as i32;
-
- let tmp = W7 * (in4 + in5);
- let a4 = tmp + (W1 - W7) * in4;
- let a5 = tmp - (W1 + W7) * in5;
-
- let tmp = W3 * (in6 + in7);
- let a6 = tmp - (W3 - W5) * in6;
- let a7 = tmp - (W3 + W5) * in7;
-
- let tmp = in0 + in1;
-
- let a0 = in0 - in1;
- let t1 = W6 * (in2 + in3);
- let a2 = t1 - (W2 + W6) * in2;
- let a3 = t1 + (W2 - W6) * in3;
- let b1 = a4 + a6;
-
- let b4 = a4 - a6;
- let t2 = a5 - a7;
- let b6 = a5 + a7;
- let b7 = tmp + a3;
- let b5 = tmp - a3;
- let b3 = a0 + a2;
- let b0 = a0 - a2;
- let b2 = (W8 * (b4 + t2) + 128) >> 8;
- let b4 = (W8 * (b4 - t2) + 128) >> 8;
-
- row[0] = ((b7 + b1) >> ROW_SHIFT) as i16;
- row[7] = ((b7 - b1) >> ROW_SHIFT) as i16;
- row[1] = ((b3 + b2) >> ROW_SHIFT) as i16;
- row[6] = ((b3 - b2) >> ROW_SHIFT) as i16;
- row[2] = ((b0 + b4) >> ROW_SHIFT) as i16;
- row[5] = ((b0 - b4) >> ROW_SHIFT) as i16;
- row[3] = ((b5 + b6) >> ROW_SHIFT) as i16;
- row[4] = ((b5 - b6) >> ROW_SHIFT) as i16;
-}
-
-fn idct_col(blk: &mut [i16; 64], off: usize) {
- let in0 = ((blk[off + 0*8] as i32) << 8) + (1 << (COL_SHIFT - 1));
- let in1 = (blk[off + 4*8] as i32) << 8;
- let in2 = blk[off + 6*8] as i32;
- let in3 = blk[off + 2*8] as i32;
- let in4 = blk[off + 1*8] as i32;
- let in5 = blk[off + 7*8] as i32;
- let in6 = blk[off + 5*8] as i32;
- let in7 = blk[off + 3*8] as i32;
-
- let tmp = W7 * (in4 + in5);
- let a4 = (tmp + (W1 - W7) * in4) >> 3;
- let a5 = (tmp - (W1 + W7) * in5) >> 3;
-
- let tmp = W3 * (in6 + in7);
- let a6 = (tmp - (W3 - W5) * in6) >> 3;
- let a7 = (tmp - (W3 + W5) * in7) >> 3;
-
- let tmp = in0 + in1;
-
- let a0 = in0 - in1;
- let t1 = W6 * (in2 + in3);
- let a2 = (t1 - (W2 + W6) * in2) >> 3;
- let a3 = (t1 + (W2 - W6) * in3) >> 3;
- let b1 = a4 + a6;
-
- let b4 = a4 - a6;
- let t2 = a5 - a7;
- let b6 = a5 + a7;
- let b7 = tmp + a3;
- let b5 = tmp - a3;
- let b3 = a0 + a2;
- let b0 = a0 - a2;
- let b2 = (W8 * (b4 + t2) + 128) >> 8;
- let b4 = (W8 * (b4 - t2) + 128) >> 8;
-
- blk[off + 0*8] = ((b7 + b1) >> COL_SHIFT) as i16;
- blk[off + 7*8] = ((b7 - b1) >> COL_SHIFT) as i16;
- blk[off + 1*8] = ((b3 + b2) >> COL_SHIFT) as i16;
- blk[off + 6*8] = ((b3 - b2) >> COL_SHIFT) as i16;
- blk[off + 2*8] = ((b0 + b4) >> COL_SHIFT) as i16;
- blk[off + 5*8] = ((b0 - b4) >> COL_SHIFT) as i16;
- blk[off + 3*8] = ((b5 + b6) >> COL_SHIFT) as i16;
- blk[off + 4*8] = ((b5 - b6) >> COL_SHIFT) as i16;
-}
-
-#[allow(dead_code)]
-pub fn h263_idct(blk: &mut [i16; 64]) {
- for i in 0..8 { idct_row(&mut blk[i*8..(i+1)*8]); }
- for i in 0..8 { idct_col(blk, i); }
-}
-
-fn h263_interp00(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
-{
- let mut didx = 0;
- let mut sidx = 0;
- for _ in 0..bh {
- for x in 0..bw { dst[didx + x] = src[sidx + x]; }
- didx += dstride;
- sidx += sstride;
- }
-}
-
-fn h263_interp01(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
-{
- let mut didx = 0;
- let mut sidx = 0;
- for _ in 0..bh {
- for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + 1] as u16) + 1) >> 1) as u8; }
- didx += dstride;
- sidx += sstride;
- }
-}
-
-fn h263_interp10(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
-{
- let mut didx = 0;
- let mut sidx = 0;
- for _ in 0..bh {
- for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + sstride] as u16) + 1) >> 1) as u8; }
- didx += dstride;
- sidx += sstride;
- }
-}
-
-fn h263_interp11(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
-{
- let mut didx = 0;
- let mut sidx = 0;
- for _ in 0..bh {
- for x in 0..bw {
- dst[didx + x] = (((src[sidx + x] as u16) +
- (src[sidx + x + 1] as u16) +
- (src[sidx + x + sstride] as u16) +
- (src[sidx + x + sstride + 1] as u16) + 2) >> 2) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
-}
-
-pub const H263_INTERP_FUNCS: &[fn(&mut [u8], usize, &[u8], usize, usize, usize)] = &[
- h263_interp00, h263_interp01, h263_interp10, h263_interp11 ];
-
-fn h263_interp00_avg(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
-{
- let mut didx = 0;
- let mut sidx = 0;
- for _ in 0..bh {
- for x in 0..bw {
- let a = dst[didx + x] as u16;
- let b = src[sidx + x] as u16;
- dst[didx + x] = ((a + b + 1) >> 1) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
-}
-
-fn h263_interp01_avg(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
-{
- let mut didx = 0;
- let mut sidx = 0;
- for _ in 0..bh {
- for x in 0..bw {
- let a = dst[didx + x] as u16;
- let b = ((src[sidx + x] as u16) + (src[sidx + x + 1] as u16) + 1) >> 1;
- dst[didx + x] = ((a + b + 1) >> 1) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
-}
-
-fn h263_interp10_avg(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
-{
- let mut didx = 0;
- let mut sidx = 0;
- for _ in 0..bh {
- for x in 0..bw {
- let a = dst[didx + x] as u16;
- let b = ((src[sidx + x] as u16) + (src[sidx + x + sstride] as u16) + 1) >> 1;
- dst[didx + x] = ((a + b + 1) >> 1) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
-}
-
-fn h263_interp11_avg(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
-{
- let mut didx = 0;
- let mut sidx = 0;
- for _ in 0..bh {
- for x in 0..bw {
- let a = dst[didx + x] as u16;
- let b = ((src[sidx + x] as u16) +
- (src[sidx + x + 1] as u16) +
- (src[sidx + x + sstride] as u16) +
- (src[sidx + x + sstride + 1] as u16) + 2) >> 2;
- dst[didx + x] = ((a + b + 1) >> 1) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
-}
-
-pub const H263_INTERP_AVG_FUNCS: &[fn(&mut [u8], usize, &[u8], usize, usize, usize)] = &[
- h263_interp00_avg, h263_interp01_avg, h263_interp10_avg, h263_interp11_avg ];
-
-pub struct H263BlockDSP { }
-
-impl H263BlockDSP {
- pub fn new() -> Self {
- H263BlockDSP { }
- }
-}
-
-fn deblock_hor(buf: &mut NAVideoBuffer<u8>, comp: usize, q: u8, off: usize) {
- let stride = buf.get_stride(comp);
- let mut dptr = buf.get_data_mut();
- let buf = dptr.as_mut_slice();
- for x in 0..8 {
- let a = buf[off - 2 * stride + x] as i16;
- let b = buf[off - 1 * stride + x] as i16;
- let c = buf[off + 0 * stride + x] as i16;
- let d = buf[off + 1 * stride + x] as i16;
- let diff = ((a - d) * 3 + (c - b) * 8) >> 4;
- if (diff != 0) && (diff >= -32) && (diff < 32) {
- let d0 = diff.abs() * 2 - (q as i16);
- let d1 = if d0 < 0 { 0 } else { d0 };
- let d2 = diff.abs() - d1;
- let d3 = if d2 < 0 { 0 } else { d2 };
-
- let delta = if diff < 0 { -d3 } else { d3 };
-
- let b1 = b + delta;
- if b1 < 0 { buf[off - 1 * stride + x] = 0; }
- else if b1 > 255 { buf[off - 1 * stride + x] = 0xFF; }
- else { buf[off - 1 * stride + x] = b1 as u8; }
- let c1 = c - delta;
- if c1 < 0 { buf[off + x] = 0; }
- else if c1 > 255 { buf[off + x] = 0xFF; }
- else { buf[off + x] = c1 as u8; }
- }
- }
-}
-
-fn deblock_ver(buf: &mut NAVideoBuffer<u8>, comp: usize, q: u8, off: usize) {
- let stride = buf.get_stride(comp);
- let mut dptr = buf.get_data_mut();
- let buf = dptr.as_mut_slice();
- for y in 0..8 {
- let a = buf[off - 2 + y * stride] as i16;
- let b = buf[off - 1 + y * stride] as i16;
- let c = buf[off + 0 + y * stride] as i16;
- let d = buf[off + 1 + y * stride] as i16;
- let diff = ((a - d) * 3 + (c - b) * 8) >> 4;
- if (diff != 0) && (diff >= -32) && (diff < 32) {
- let d0 = diff.abs() * 2 - (q as i16);
- let d1 = if d0 < 0 { 0 } else { d0 };
- let d2 = diff.abs() - d1;
- let d3 = if d2 < 0 { 0 } else { d2 };
-
- let delta = if diff < 0 { -d3 } else { d3 };
-
- let b1 = b + delta;
- if b1 < 0 { buf[off - 1 + y * stride] = 0; }
- else if b1 > 255 { buf[off - 1 + y * stride] = 0xFF; }
- else { buf[off - 1 + y * stride] = b1 as u8; }
- let c1 = c - delta;
- if c1 < 0 { buf[off + y * stride] = 0; }
- else if c1 > 255 { buf[off + y * stride] = 0xFF; }
- else { buf[off + y * stride] = c1 as u8; }
- }
- }
-}
-
-pub fn h263_filter_row(buf: &mut NAVideoBuffer<u8>, mb_y: usize, mb_w: usize, cbpi: &CBPInfo) {
- let stride = buf.get_stride(0);
- let mut off = buf.get_offset(0) + mb_y * 16 * stride;
- for mb_x in 0..mb_w {
- let coff = off;
- let coded0 = cbpi.is_coded(mb_x, 0);
- let coded1 = cbpi.is_coded(mb_x, 1);
- let q = cbpi.get_q(mb_w + mb_x);
- if mb_y != 0 {
- if coded0 && cbpi.is_coded_top(mb_x, 0) { deblock_hor(buf, 0, q, coff); }
- if coded1 && cbpi.is_coded_top(mb_x, 1) { deblock_hor(buf, 0, q, coff + 8); }
- }
- let coff = off + 8 * stride;
- if cbpi.is_coded(mb_x, 2) && coded0 { deblock_hor(buf, 0, q, coff); }
- if cbpi.is_coded(mb_x, 3) && coded1 { deblock_hor(buf, 0, q, coff + 8); }
- off += 16;
- }
- let mut leftt = false;
- let mut leftc = false;
- let mut off = buf.get_offset(0) + mb_y * 16 * stride;
- for mb_x in 0..mb_w {
- let ctop0 = cbpi.is_coded_top(mb_x, 0);
- let ctop1 = cbpi.is_coded_top(mb_x, 0);
- let ccur0 = cbpi.is_coded(mb_x, 0);
- let ccur1 = cbpi.is_coded(mb_x, 1);
- let q = cbpi.get_q(mb_w + mb_x);
- if mb_y != 0 {
- let coff = off - 8 * stride;
- let qtop = cbpi.get_q(mb_x);
- if leftt && ctop0 { deblock_ver(buf, 0, qtop, coff); }
- if ctop0 && ctop1 { deblock_ver(buf, 0, qtop, coff + 8); }
- }
- if leftc && ccur0 { deblock_ver(buf, 0, q, off); }
- if ccur0 && ccur1 { deblock_ver(buf, 0, q, off + 8); }
- leftt = ctop1;
- leftc = ccur1;
- off += 16;
- }
- let strideu = buf.get_stride(1);
- let stridev = buf.get_stride(2);
- let offu = buf.get_offset(1) + mb_y * 8 * strideu;
- let offv = buf.get_offset(2) + mb_y * 8 * stridev;
- if mb_y != 0 {
- for mb_x in 0..mb_w {
- let ctu = cbpi.is_coded_top(mb_x, 4);
- let ccu = cbpi.is_coded(mb_x, 4);
- let ctv = cbpi.is_coded_top(mb_x, 5);
- let ccv = cbpi.is_coded(mb_x, 5);
- let q = cbpi.get_q(mb_w + mb_x);
- if ctu && ccu { deblock_hor(buf, 1, q, offu + mb_x * 8); }
- if ctv && ccv { deblock_hor(buf, 2, q, offv + mb_x * 8); }
- }
- let mut leftu = false;
- let mut leftv = false;
- let offu = buf.get_offset(1) + (mb_y - 1) * 8 * strideu;
- let offv = buf.get_offset(2) + (mb_y - 1) * 8 * stridev;
- for mb_x in 0..mb_w {
- let ctu = cbpi.is_coded_top(mb_x, 4);
- let ctv = cbpi.is_coded_top(mb_x, 5);
- let qt = cbpi.get_q(mb_x);
- if leftu && ctu { deblock_ver(buf, 1, qt, offu + mb_x * 8); }
- if leftv && ctv { deblock_ver(buf, 2, qt, offv + mb_x * 8); }
- leftu = ctu;
- leftv = ctv;
- }
- }
-}
-
-impl BlockDSP for H263BlockDSP {
- fn idct(&self, blk: &mut [i16; 64]) {
- h263_idct(blk)
- }
- fn copy_blocks(&self, dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, xpos: usize, ypos: usize, w: usize, h: usize, mv: MV) {
- let srcx = ((mv.x >> 1) as isize) + (xpos as isize);
- let srcy = ((mv.y >> 1) as isize) + (ypos as isize);
- let mode = ((mv.x & 1) + (mv.y & 1) * 2) as usize;
-
- blockdsp::copy_blocks(dst, src, xpos, ypos, srcx, srcy, w, h, 0, 1, mode, H263_INTERP_FUNCS);
- }
- fn avg_blocks(&self, dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, xpos: usize, ypos: usize, w: usize, h: usize, mv: MV) {
- let srcx = ((mv.x >> 1) as isize) + (xpos as isize);
- let srcy = ((mv.y >> 1) as isize) + (ypos as isize);
- let mode = ((mv.x & 1) + (mv.y & 1) * 2) as usize;
-
- blockdsp::copy_blocks(dst, src, xpos, ypos, srcx, srcy, w, h, 0, 1, mode, H263_INTERP_AVG_FUNCS);
- }
- fn filter_row(&self, buf: &mut NAVideoBuffer<u8>, mb_y: usize, mb_w: usize, cbpi: &CBPInfo) {
- h263_filter_row(buf, mb_y, mb_w, cbpi)
- }
-}
diff --git a/src/codecs/h263/data.rs b/src/codecs/h263/data.rs
deleted file mode 100644
index 029c5bb..0000000
--- a/src/codecs/h263/data.rs
+++ /dev/null
@@ -1,214 +0,0 @@
-use crate::io::codebook::CodebookDescReader;
-
-#[allow(dead_code)]
-pub const H263_SCALES: &[u8] = &[
- 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15 ];
-
-#[allow(dead_code)]
-pub const H263_DC_SCALES: &[u8] = &[
- 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62 ];
-
-pub const H263_ZIGZAG: &[usize] = &[
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63
-];
-
-pub const H263_SCAN_H: &[usize] = &[
- 0, 1, 2, 3, 8, 9, 16, 17,
- 10, 11, 4, 5, 6, 7, 15, 14,
- 13, 12, 19, 18, 24, 25, 32, 33,
- 26, 27, 20, 21, 22, 23, 28, 29,
- 30, 31, 34, 35, 40, 41, 48, 49,
- 42, 43, 36, 37, 38, 39, 44, 45,
- 46, 47, 50, 51, 56, 57, 58, 59,
- 52, 53, 54, 55, 60, 61, 62, 63
-];
-
-pub const H263_SCAN_V: &[usize] = &[
- 0, 8, 16, 24, 1, 9, 2, 10,
- 17, 25, 32, 40, 48, 56, 57, 49,
- 41, 33, 26, 18, 3, 11, 4, 12,
- 19, 27, 34, 42, 50, 58, 35, 43,
- 51, 59, 20, 28, 5, 13, 6, 14,
- 21, 29, 36, 44, 52, 60, 37, 45,
- 53, 61, 22, 30, 7, 15, 23, 31,
- 38, 46, 54, 62, 39, 47, 55, 63
-];
-
-pub const H263_SIZES: &[(usize, usize)] = &[
- (0, 0), (128, 96), (176, 144), (352, 288), (704, 576), (1408, 1152)
-];
-
-pub const H263_INTRA_MCBPC: &[(u8, u8)] = &[
- (1, 1), (1, 3), (2, 3), (3, 3), (1, 4), (1, 6), (2, 6), (3, 6), (1, 9)
-];
-
-pub const H263_INTER_MCBPC: &[(u8, u8)] = &[
- (1, 1), (3, 4), (2, 4), (5, 6), (3, 5), (4, 8), (3, 8), (3, 7),
- (3, 3), (7, 7), (6, 7), (5, 9), (4, 6), (4, 9), (3, 9), (2, 9),
- (2, 3), (5, 7), (4, 7), (5, 8), (1, 9), (0, 0), (0, 0), (0, 0),
- (2, 11), (12, 13), (14, 13), (15, 13)
-];
-
-pub const H263_CBPY: &[(u8, u8)] = &[
- ( 3, 4), ( 5, 5), ( 4, 5), ( 9, 4), ( 3, 5), ( 7, 4), ( 2, 6), (11, 4),
- ( 2, 5), ( 3, 6), ( 5, 4), (10, 4), ( 4, 4), ( 8, 4), ( 6, 4), ( 3, 2)
-];
-
-pub const H263_MV: &[(u8, u8)] = &[
- ( 1, 1), ( 1, 2), ( 1, 3), ( 1, 4), ( 3, 6), ( 5, 7), ( 4, 7), ( 3, 7),
- (11, 9), (10, 9), ( 9, 9), (17, 10), (16, 10), (15, 10), (14, 10), (13, 10),
- (12, 10), (11, 10), (10, 10), ( 9, 10), ( 8, 10), ( 7, 10), ( 6, 10), ( 5, 10),
- ( 4, 10), ( 7, 11), ( 6, 11), ( 5, 11), ( 4, 11), ( 3, 11), ( 2, 11), ( 3, 12),
- ( 2, 12)
-];
-
-pub const H263_MBTYPE_B: &[(u8, u8)] = &[
- (1, 1), (3, 3), (1, 5), (4, 4), (5, 4), (6, 6), (2, 4), (3, 4),
- (7, 6), (4, 6), (5, 6), (1, 6), (1, 7), (1, 8), (1, 10)
-];
-
-// 0x1 - direct, 0x2 - has quant, 0x4 - has CBP, 0x8 - has dquant, 0x10 - has fwd, 0x20 - has bwd, 0x40 - intra
-
-pub const H263_MBB_CAP_CODED: u8 = 0x2;
-pub const H263_MBB_CAP_DQUANT: u8 = 0x4;
-pub const H263_MBB_CAP_FORWARD: u8 = 0x10;
-pub const H263_MBB_CAP_BACKWARD: u8 = 0x20;
-pub const H263_MBB_CAP_INTRA: u8 = 0x80;
-
-pub const H263_MBTYPE_B_CAPS: &[u8] = &[
- 0x00, 0x02, 0x06, // skipped, direct, direct+dq
- 0x10, 0x12, 0x16, // forward, coded forward, forward+dq
- 0x20, 0x22, 0x26, // backward, coded backward, backward+dq
- 0x30, 0x32, 0x36, // bidir, coded bidir, bidir+dq
- 0x82, 0x86 // intra, intra+dq
-];
-
-pub const H263_CBPC_B: &[(u8, u8)] = &[
- (0, 1), (2, 2), (7, 3), (6, 3)
-];
-
-pub const H263_DQUANT_TAB: &[i8] = &[-1, -2, 1, 2];
-
-pub const H263_MODIFIED_QUANT: [[u8; 32]; 2] = [
- [
- 0, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13,
- 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28
- ], [
- 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17,
- 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 31, 31, 26
- ]
-];
-
-pub const H263_CHROMA_QUANT: [u8; 32] = [
- 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11,
- 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15
-];
-
-pub struct H263ShortCodeReader { tab: &'static [(u8, u8)] }
-
-impl H263ShortCodeReader {
- pub fn new(tab: &'static [(u8, u8)]) -> Self { H263ShortCodeReader { tab: tab } }
-}
-
-impl CodebookDescReader<u8> for H263ShortCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { let (_, bits) = self.tab[idx]; bits }
- fn code(&mut self, idx: usize) -> u32 { let (code, _) = self.tab[idx]; code as u32 }
- fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
- fn len(&mut self) -> usize { self.tab.len() }
-}
-
-#[derive(Clone,Copy)]
-pub struct H263RLSym { run: u8, level: i8 }
-impl H263RLSym {
- pub fn get_run(&self) -> u8 { self.run }
- pub fn is_last(&self) -> bool { self.level < 0 }
- pub fn is_escape(&self) -> bool { (self.run == 0) && (self.level == 0) }
- pub fn get_level(&self) -> i16 { if self.level < 0 { -self.level as i16 } else { self.level as i16 } }
-}
-
-pub struct H263RLCodeDesc { code: u8, bits: u8, sym: H263RLSym }
-
-macro_rules! rlcodes{
- ($(($c:expr, $b:expr, $r:expr, $l:expr)),*) => {
- &[$(H263RLCodeDesc{ code: $c, bits: $b, sym: H263RLSym{ run: $r, level: $l }}),*]
- }
-}
-
-pub const H263_RL_CODES: &[H263RLCodeDesc] = rlcodes!(
- (0x02, 2, 0, 1), (0x0F, 4, 0, 2), (0x15, 6, 0, 3), (0x17, 7, 0, 4),
- (0x1F, 8, 0, 5), (0x25, 9, 0, 6), (0x24, 9, 0, 7), (0x21, 10, 0, 8),
- (0x20, 10, 0, 9), (0x07, 11, 0, 10), (0x06, 11, 0, 11), (0x20, 11, 0, 12),
- (0x06, 3, 1, 1), (0x14, 6, 1, 2), (0x1E, 8, 1, 3), (0x0F, 10, 1, 4),
- (0x21, 11, 1, 5), (0x50, 12, 1, 6), (0x0E, 4, 2, 1), (0x1D, 8, 2, 2),
- (0x0E, 10, 2, 3), (0x51, 12, 2, 4), (0x0D, 5, 3, 1), (0x23, 9, 3, 2),
- (0x0D, 10, 3, 3), (0x0C, 5, 4, 1), (0x22, 9, 4, 2), (0x52, 12, 4, 3),
- (0x0B, 5, 5, 1), (0x0C, 10, 5, 2), (0x53, 12, 5, 3), (0x13, 6, 6, 1),
- (0x0B, 10, 6, 2), (0x54, 12, 6, 3), (0x12, 6, 7, 1), (0x0A, 10, 7, 2),
- (0x11, 6, 8, 1), (0x09, 10, 8, 2), (0x10, 6, 9, 1), (0x08, 10, 9, 2),
- (0x16, 7, 10, 1), (0x55, 12, 10, 2), (0x15, 7, 11, 1), (0x14, 7, 12, 1),
- (0x1C, 8, 13, 1), (0x1B, 8, 14, 1), (0x21, 9, 15, 1), (0x20, 9, 16, 1),
- (0x1F, 9, 17, 1), (0x1E, 9, 18, 1), (0x1D, 9, 19, 1), (0x1C, 9, 20, 1),
- (0x1B, 9, 21, 1), (0x1A, 9, 22, 1), (0x22, 11, 23, 1), (0x23, 11, 24, 1),
- (0x56, 12, 25, 1), (0x57, 12, 26, 1), (0x07, 4, 0, -1), (0x19, 9, 0, -2),
- (0x05, 11, 0, -3), (0x0F, 6, 1, -1), (0x04, 11, 1, -2), (0x0E, 6, 2, -1),
- (0x0D, 6, 3, -1), (0x0C, 6, 4, -1), (0x13, 7, 5, -1), (0x12, 7, 6, -1),
- (0x11, 7, 7, -1), (0x10, 7, 8, -1), (0x1A, 8, 9, -1), (0x19, 8, 10, -1),
- (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1), (0x15, 8, 14, -1),
- (0x14, 8, 15, -1), (0x13, 8, 16, -1), (0x18, 9, 17, -1), (0x17, 9, 18, -1),
- (0x16, 9, 19, -1), (0x15, 9, 20, -1), (0x14, 9, 21, -1), (0x13, 9, 22, -1),
- (0x12, 9, 23, -1), (0x11, 9, 24, -1), (0x07, 10, 25, -1), (0x06, 10, 26, -1),
- (0x05, 10, 27, -1), (0x04, 10, 28, -1), (0x24, 11, 29, -1), (0x25, 11, 30, -1),
- (0x26, 11, 31, -1), (0x27, 11, 32, -1), (0x58, 12, 33, -1), (0x59, 12, 34, -1),
- (0x5A, 12, 35, -1), (0x5B, 12, 36, -1), (0x5C, 12, 37, -1), (0x5D, 12, 38, -1),
- (0x5E, 12, 39, -1), (0x5F, 12, 40, -1), (0x03, 7, 0, 0)
-);
-
-pub const H263_RL_CODES_AIC: &[H263RLCodeDesc] = rlcodes!(
- (0x02, 2, 0, 1), (0x06, 3, 0, 2), (0x0E, 4, 0, 3), (0x0C, 5, 0, 4),
- (0x0D, 5, 0, 5), (0x10, 6, 0, 6), (0x11, 6, 0, 7), (0x12, 6, 0, 8),
- (0x16, 7, 0, 9), (0x1B, 8, 0, 10), (0x20, 9, 0, 11), (0x21, 9, 0, 12),
- (0x1A, 9, 0, 13), (0x1B, 9, 0, 14), (0x1C, 9, 0, 15), (0x1D, 9, 0, 16),
- (0x1E, 9, 0, 17), (0x1F, 9, 0, 18), (0x23, 11, 0, 19), (0x22, 11, 0, 20),
- (0x57, 12, 0, 21), (0x56, 12, 0, 22), (0x55, 12, 0, 23), (0x54, 12, 0, 24),
- (0x53, 12, 0, 25), (0x0F, 4, 1, 1), (0x14, 6, 1, 2), (0x14, 7, 1, 3),
- (0x1E, 8, 1, 4), (0x0F, 10, 1, 5), (0x21, 11, 1, 6), (0x50, 12, 1, 7),
- (0x0B, 5, 2, 1), (0x15, 7, 2, 2), (0x0E, 10, 2, 3), (0x09, 10, 2, 4),
- (0x15, 6, 3, 1), (0x1D, 8, 3, 2), (0x0D, 10, 3, 3), (0x51, 12, 3, 4),
- (0x13, 6, 4, 1), (0x23, 9, 4, 2), (0x07, 11, 4, 3), (0x17, 7, 5, 1),
- (0x22, 9, 5, 2), (0x52, 12, 5, 3), (0x1C, 8, 6, 1), (0x0C, 10, 6, 2),
- (0x1F, 8, 7, 1), (0x0B, 10, 7, 2), (0x25, 9, 8, 1), (0x0A, 10, 8, 2),
- (0x24, 9, 9, 1), (0x06, 11, 9, 2), (0x21, 10, 10, 1), (0x20, 10, 11, 1),
- (0x08, 10, 12, 1), (0x20, 11, 13, 1), (0x07, 4, 0, -1), (0x0C, 6, 0, -2),
- (0x10, 7, 0, -3), (0x13, 8, 0, -4), (0x11, 9, 0, -5), (0x12, 9, 0, -6),
- (0x04, 10, 0, -7), (0x27, 11, 0, -8), (0x26, 11, 0, -9), (0x5F, 12, 0,-10),
- (0x0F, 6, 1, -1), (0x13, 9, 1, -2), (0x05, 10, 1, -3), (0x25, 11, 1, -4),
- (0x0E, 6, 2, -1), (0x14, 9, 2, -2), (0x24, 11, 2, -3), (0x0D, 6, 3, -1),
- (0x06, 10, 3, -2), (0x5E, 12, 3, -3), (0x11, 7, 4, -1), (0x07, 10, 4, -2),
- (0x13, 7, 5, -1), (0x5D, 12, 5, -2), (0x12, 7, 6, -1), (0x5C, 12, 6, -2),
- (0x14, 8, 7, -1), (0x5B, 12, 7, -2), (0x15, 8, 8, -1), (0x1A, 8, 9, -1),
- (0x19, 8, 10, -1), (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1),
- (0x19, 9, 14, -1), (0x15, 9, 15, -1), (0x16, 9, 16, -1), (0x18, 9, 17, -1),
- (0x17, 9, 18, -1), (0x04, 11, 19, -1), (0x05, 11, 20, -1), (0x58, 12, 21, -1),
- (0x59, 12, 22, -1), (0x5A, 12, 23, -1), (0x03, 7, 0, 0)
-);
-
-pub struct H263RLCodeReader { tab: &'static [H263RLCodeDesc] }
-
-impl H263RLCodeReader {
- pub fn new(tab: &'static [H263RLCodeDesc]) -> Self { H263RLCodeReader { tab: tab } }
-}
-
-impl CodebookDescReader<H263RLSym> for H263RLCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { self.tab[idx].bits }
- fn code(&mut self, idx: usize) -> u32 { self.tab[idx].code as u32 }
- fn sym (&mut self, idx: usize) -> H263RLSym { self.tab[idx].sym }
- fn len(&mut self) -> usize { self.tab.len() }
-}
-
diff --git a/src/codecs/h263/decoder.rs b/src/codecs/h263/decoder.rs
deleted file mode 100644
index fd828fe..0000000
--- a/src/codecs/h263/decoder.rs
+++ /dev/null
@@ -1,581 +0,0 @@
-//use std::mem;
-use crate::frame::*;
-use super::super::*;
-use super::super::blockdsp;
-use super::*;
-//use super::code::*;
-use crate::formats;
-
-#[allow(dead_code)]
-struct MVInfo {
- mv: Vec<MV>,
- mb_w: usize,
- mb_stride: usize,
- mb_start: usize,
- top: bool,
- mvmode: MVMode,
-}
-
-impl MVInfo {
- fn new() -> Self { MVInfo{ mv: Vec::new(), mb_w: 0, mb_stride: 0, mb_start: 0, top: true, mvmode: MVMode::Old } }
- fn reset(&mut self, mb_w: usize, mb_start: usize, mvmode: MVMode) {
- self.mb_start = mb_start;
- self.mb_w = mb_w;
- self.mb_stride = mb_w * 2;
- self.mv.resize(self.mb_stride * 3, ZERO_MV);
- self.mvmode = mvmode;
- }
- fn update_row(&mut self) {
- self.mb_start = self.mb_w + 1;
- self.top = false;
- for i in 0..self.mb_stride {
- self.mv[i] = self.mv[self.mb_stride * 2 + i];
- }
- }
- #[allow(non_snake_case)]
- fn predict(&mut self, mb_x: usize, blk_no: usize, use4: bool, diff: MV, first_line: bool, first_mb: bool) -> MV {
- let A;
- let B;
- let C;
- let last = mb_x == self.mb_w - 1;
- match blk_no {
- 0 => {
- if mb_x != self.mb_start {
- A = if !first_mb { self.mv[self.mb_stride + mb_x * 2 - 1] } else { ZERO_MV };
- B = if !first_line { self.mv[ mb_x * 2] } else { A };
- C = if !first_line && !last { self.mv[mb_x * 2 + 2] } else { ZERO_MV };
- } else {
- A = ZERO_MV; B = ZERO_MV; C = ZERO_MV;
- }
- },
- 1 => {
- A = self.mv[self.mb_stride + mb_x * 2];
- B = if !first_line { self.mv[mb_x * 2 + 1] } else { A };
- C = if !first_line && !last { self.mv[mb_x * 2 + 2] } else { ZERO_MV/*A*/ };
- },
- 2 => {
- A = if mb_x != self.mb_start { self.mv[self.mb_stride * 2 + mb_x * 2 - 1] } else { ZERO_MV };
- B = self.mv[self.mb_stride + mb_x * 2];
- C = self.mv[self.mb_stride + mb_x * 2 + 1];
- },
- 3 => {
- A = self.mv[self.mb_stride * 2 + mb_x * 2];
- B = self.mv[self.mb_stride * 1 + mb_x * 2 + 1];
- C = self.mv[self.mb_stride * 1 + mb_x * 2];
- },
- _ => { return ZERO_MV; }
- }
- let pred_mv = MV::pred(A, B, C);
- let new_mv = MV::add_umv(pred_mv, diff, self.mvmode);
- if !use4 {
- self.mv[self.mb_stride * 1 + mb_x * 2 + 0] = new_mv;
- self.mv[self.mb_stride * 1 + mb_x * 2 + 1] = new_mv;
- self.mv[self.mb_stride * 2 + mb_x * 2 + 0] = new_mv;
- self.mv[self.mb_stride * 2 + mb_x * 2 + 1] = new_mv;
- } else {
- match blk_no {
- 0 => { self.mv[self.mb_stride * 1 + mb_x * 2 + 0] = new_mv; },
- 1 => { self.mv[self.mb_stride * 1 + mb_x * 2 + 1] = new_mv; },
- 2 => { self.mv[self.mb_stride * 2 + mb_x * 2 + 0] = new_mv; },
- 3 => { self.mv[self.mb_stride * 2 + mb_x * 2 + 1] = new_mv; },
- _ => {},
- };
- }
-
- new_mv
- }
- fn set_zero_mv(&mut self, mb_x: usize) {
- self.mv[self.mb_stride * 1 + mb_x * 2 + 0] = ZERO_MV;
- self.mv[self.mb_stride * 1 + mb_x * 2 + 1] = ZERO_MV;
- self.mv[self.mb_stride * 2 + mb_x * 2 + 0] = ZERO_MV;
- self.mv[self.mb_stride * 2 + mb_x * 2 + 1] = ZERO_MV;
- }
- fn get_mv(&self, mb_x: usize, blk_no: usize) -> MV {
- self.mv[self.mb_stride + mb_x * 2 + (blk_no & 1) + (blk_no >> 1) * self.mb_stride]
- }
-}
-
-#[allow(dead_code)]
-#[derive(Clone,Copy)]
-struct BMB {
- num_mv: usize,
- mv_f: [MV; 4],
- mv_b: [MV; 4],
- fwd: bool,
- blk: [[i16; 64]; 6],
- cbp: u8,
-}
-
-impl BMB {
- fn new() -> Self { BMB {blk: [[0; 64]; 6], cbp: 0, fwd: false, mv_f: [ZERO_MV; 4], mv_b: [ZERO_MV; 4], num_mv: 0} }
-}
-
-#[derive(Clone,Copy)]
-struct PredCoeffs {
- hor: [[i16; 8]; 6],
- ver: [[i16; 8]; 6],
-}
-
-const ZERO_PRED_COEFFS: PredCoeffs = PredCoeffs { hor: [[0; 8]; 6], ver: [[0; 8]; 6] };
-
-pub struct H263BaseDecoder {
- w: usize,
- h: usize,
- mb_w: usize,
- mb_h: usize,
- num_mb: usize,
- ftype: Type,
- ipbs: IPBShuffler,
- next_ts: u16,
- last_ts: u16,
- tsdiff: u16,
- has_b: bool,
- b_data: Vec<BMB>,
- pred_coeffs: Vec<PredCoeffs>,
- is_gob: bool,
- slice_reset: bool,
- may_have_b_frames: bool,
- mv_data: Vec<BlockMVInfo>,
-}
-
-#[inline]
-fn clip_dc(dc: i16) -> i16 {
- if dc < 0 { 0 }
- else if dc > 2046 { 2046 }
- else { (dc + 1) & !1 }
-}
-
-#[inline]
-fn clip_ac(ac: i16) -> i16 {
- if ac < -2048 { -2048 }
- else if ac > 2047 { 2047 }
- else { ac }
-}
-
-#[allow(dead_code)]
-impl H263BaseDecoder {
- pub fn new_with_opts(is_gob: bool, slice_reset: bool, may_have_b_frames: bool) -> Self {
- H263BaseDecoder{
- w: 0, h: 0, mb_w: 0, mb_h: 0, num_mb: 0,
- ftype: Type::Special,
- ipbs: IPBShuffler::new(),
- last_ts: 0, next_ts: 0, tsdiff: 0,
- has_b: false, b_data: Vec::new(),
- pred_coeffs: Vec::new(),
- is_gob: is_gob, slice_reset: slice_reset,
- may_have_b_frames: may_have_b_frames,
- mv_data: Vec::new(),
- }
- }
- pub fn new(is_gob: bool) -> Self {
- Self::new_with_opts(is_gob, true, false)
- }
- pub fn new_b_frames(is_gob: bool) -> Self {
- Self::new_with_opts(is_gob, true, true)
- }
-
- pub fn is_intra(&self) -> bool { self.ftype == Type::I }
- pub fn get_frame_type(&self) -> FrameType {
- match self.ftype {
- Type::I => FrameType::I,
- Type::P => FrameType::P,
- Type::B => FrameType::B,
- Type::PB => FrameType::P,
- Type::Skip => FrameType::Skip,
- Type::Special => FrameType::Skip,
- }
- }
- pub fn get_dimensions(&self) -> (usize, usize) { (self.w, self.h) }
-
- pub fn parse_frame(&mut self, bd: &mut BlockDecoder, bdsp: &BlockDSP) -> DecoderResult<NABufferType> {
- let pinfo = bd.decode_pichdr()?;
- let mut mvi = MVInfo::new();
- let mut mvi2 = MVInfo::new();
- let mut cbpi = CBPInfo::new();
-
-//todo handle res change
- self.w = pinfo.w;
- self.h = pinfo.h;
- self.mb_w = (pinfo.w + 15) >> 4;
- self.mb_h = (pinfo.h + 15) >> 4;
- self.num_mb = self.mb_w * self.mb_h;
- self.ftype = pinfo.mode;
- self.has_b = pinfo.is_pb();
-
- if self.has_b {
- self.mv_data.truncate(0);
- }
-
- let save_b_data = pinfo.mode.is_ref() && self.may_have_b_frames;
- if save_b_data {
- self.mv_data.truncate(0);
- }
- let is_b = pinfo.mode == Type::B;
-
- let tsdiff = if pinfo.is_pb() { pinfo.ts.wrapping_sub(self.last_ts) >> 1 }
- else { self.last_ts.wrapping_sub(self.next_ts) >> 1 };
- let bsdiff = if pinfo.is_pb() { (pinfo.get_pbinfo().get_trb() as u16) << 7 }
- else { pinfo.ts.wrapping_sub(self.next_ts) >> 1 };
-
- let fmt = formats::YUV420_FORMAT;
- let vinfo = NAVideoInfo::new(self.w, self.h, false, fmt);
- let bufret = alloc_video_buffer(vinfo, 4);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let mut bufinfo = bufret.unwrap();
- let mut buf = bufinfo.get_vbuf().unwrap();
-
- let mut slice = if self.is_gob {
- SliceInfo::get_default_slice(&pinfo)
- } else {
- bd.decode_slice_header(&pinfo)?
- };
- mvi.reset(self.mb_w, 0, pinfo.get_mvmode());
- if is_b || pinfo.is_pb() {
- mvi2.reset(self.mb_w, 0, pinfo.get_mvmode());
- }
- cbpi.reset(self.mb_w);
-
- let mut blk: [[i16; 64]; 6] = [[0; 64]; 6];
- let mut sstate = SliceState::new(pinfo.mode == Type::I);
- let mut mb_pos = 0;
- let apply_acpred = (pinfo.mode == Type::I) && pinfo.plusinfo.is_some() && pinfo.plusinfo.unwrap().aic;
- if apply_acpred {
- self.pred_coeffs.truncate(0);
- self.pred_coeffs.resize(self.mb_w * self.mb_h, ZERO_PRED_COEFFS);
- }
- sstate.quant = slice.quant;
- for mb_y in 0..self.mb_h {
- for mb_x in 0..self.mb_w {
- for i in 0..6 { for j in 0..64 { blk[i][j] = 0; } }
-
- if slice.is_at_end(mb_pos) || (slice.needs_check() && mb_pos > 0 && bd.is_slice_end()) {
- slice = bd.decode_slice_header(&pinfo)?;
- if !self.is_gob && self.slice_reset {
- mvi.reset(self.mb_w, mb_x, pinfo.get_mvmode());
- if is_b || pinfo.is_pb() {
- mvi2.reset(self.mb_w, mb_x, pinfo.get_mvmode());
- }
- cbpi.reset(self.mb_w);
- sstate.reset_slice(mb_x, mb_y);
- sstate.quant = slice.quant;
- }
- }
-
- let binfo = bd.decode_block_header(&pinfo, &slice, &sstate)?;
- let cbp = binfo.get_cbp();
- cbpi.set_cbp(mb_x, cbp);
- cbpi.set_q(mb_x, binfo.get_q());
- sstate.quant = binfo.get_q();
- if binfo.is_intra() {
- if save_b_data {
- self.mv_data.push(BlockMVInfo::Intra);
- }
- for i in 0..6 {
- bd.decode_block_intra(&binfo, &sstate, binfo.get_q(), i, (cbp & (1 << (5 - i))) != 0, &mut blk[i])?;
- if apply_acpred && (binfo.acpred != ACPredMode::None) {
- let has_b = (i == 1) || (i == 3) || !sstate.first_mb;
- let has_a = (i == 2) || (i == 3) || !sstate.first_line;
- let (b_mb, b_blk) = if has_b {
- if (i == 1) || (i == 3) {
- (mb_pos, i - 1)
- } else if i < 4 {
- (mb_pos - 1, i + 1)
- } else {
- (mb_pos - 1, i)
- }
- } else { (0, 0) };
- let (a_mb, a_blk) = if has_a {
- if (i == 2) || (i == 3) {
- (mb_pos, i - 2)
- } else if i < 4 {
- (mb_pos - self.mb_w, i + 2)
- } else {
- (mb_pos - self.mb_w, i)
- }
- } else { (0, 0) };
- match binfo.acpred {
- ACPredMode::DC => {
- let dc;
- if has_a && has_b {
- dc = (self.pred_coeffs[b_mb].hor[b_blk][0] + self.pred_coeffs[a_mb].ver[a_blk][0]) / 2;
- } else if has_a {
- dc = self.pred_coeffs[a_mb].ver[a_blk][0];
- } else if has_b {
- dc = self.pred_coeffs[b_mb].hor[b_blk][0];
- } else {
- dc = 1024;
- }
- blk[i][0] = clip_dc(blk[i][0] + dc);
- },
- ACPredMode::Hor => {
- if has_b {
- for k in 0..8 {
- blk[i][k * 8] += self.pred_coeffs[b_mb].hor[b_blk][k];
- }
- for k in 1..8 {
- blk[i][k * 8] = clip_ac(blk[i][k * 8]);
- }
- } else {
- blk[i][0] += 1024;
- }
- blk[i][0] = clip_dc(blk[i][0]);
- },
- ACPredMode::Ver => {
- if has_a {
- for k in 0..8 {
- blk[i][k] += self.pred_coeffs[a_mb].ver[a_blk][k];
- }
- for k in 1..8 {
- blk[i][k] = clip_ac(blk[i][k]);
- }
- } else {
- blk[i][0] += 1024;
- }
- blk[i][0] = clip_dc(blk[i][0]);
- },
- ACPredMode::None => {},
- };
- for t in 0..8 { self.pred_coeffs[mb_pos].hor[i][t] = blk[i][t * 8]; }
- for t in 0..8 { self.pred_coeffs[mb_pos].ver[i][t] = blk[i][t]; }
- }
- bdsp.idct(&mut blk[i]);
- }
- blockdsp::put_blocks(&mut buf, mb_x, mb_y, &blk);
- mvi.set_zero_mv(mb_x);
- if is_b {
- mvi2.set_zero_mv(mb_x);
- } else if pinfo.is_pb() {
- mvi2.predict(mb_x, 0, false, binfo.get_mv2(0), sstate.first_line, sstate.first_mb);
- }
- } else if (binfo.mode != Type::B) && !binfo.is_skipped() {
- if binfo.get_num_mvs() == 1 {
- let mv = mvi.predict(mb_x, 0, false, binfo.get_mv(0), sstate.first_line, sstate.first_mb);
- if save_b_data {
- self.mv_data.push(BlockMVInfo::Inter_1MV(mv));
- }
- if let Some(ref srcbuf) = self.ipbs.get_lastref() {
- bdsp.copy_blocks(&mut buf, srcbuf, mb_x * 16, mb_y * 16, 16, 16, mv);
- }
- if pinfo.is_pb() {
- mvi2.predict(mb_x, 0, false, binfo.get_mv(0), sstate.first_line, sstate.first_mb);
- }
- } else {
- let mut mv: [MV; 4] = [ZERO_MV, ZERO_MV, ZERO_MV, ZERO_MV];
- for blk_no in 0..4 {
- mv[blk_no] = mvi.predict(mb_x, blk_no, true, binfo.get_mv(blk_no), sstate.first_line, sstate.first_mb);
- if let Some(ref srcbuf) = self.ipbs.get_lastref() {
- bdsp.copy_blocks(&mut buf, srcbuf,
- mb_x * 16 + (blk_no & 1) * 8,
- mb_y * 16 + (blk_no & 2) * 4, 8, 8, mv[blk_no]);
- }
- }
- if pinfo.is_pb() {
- for blk_no in 0..4 {
- mvi2.predict(mb_x, blk_no, true, binfo.get_mv(blk_no), sstate.first_line, sstate.first_mb);
- }
- }
- if save_b_data {
- self.mv_data.push(BlockMVInfo::Inter_4MV(mv));
- }
- }
- for i in 0..6 {
- bd.decode_block_inter(&binfo, &sstate, binfo.get_q(), i, ((cbp >> (5 - i)) & 1) != 0, &mut blk[i])?;
- bdsp.idct(&mut blk[i]);
- }
- blockdsp::add_blocks(&mut buf, mb_x, mb_y, &blk);
- if is_b && !pinfo.is_pb() {
- mvi2.set_zero_mv(mb_x);
- }
- } else if binfo.mode != Type::B {
- self.mv_data.push(BlockMVInfo::Inter_1MV(ZERO_MV));
- mvi.set_zero_mv(mb_x);
- if is_b || pinfo.is_pb() {
- mvi2.set_zero_mv(mb_x);
- }
- if let Some(ref srcbuf) = self.ipbs.get_lastref() {
- bdsp.copy_blocks(&mut buf, srcbuf, mb_x * 16, mb_y * 16, 16, 16, ZERO_MV);
- }
- } else {
- let ref_mv_info = self.mv_data[mb_pos];
- let has_fwd = binfo.get_num_mvs() > 0;
- let has_bwd = binfo.get_num_mvs2() > 0;
-//todo refactor
- if has_fwd || has_bwd {
- let fwd_mv;
- if has_fwd {
- fwd_mv = mvi.predict(mb_x, 0, false, binfo.get_mv(0), sstate.first_line, sstate.first_mb);
- } else {
- fwd_mv = ZERO_MV;
- mvi.set_zero_mv(mb_x);
- }
- let bwd_mv;
- if has_bwd {
- bwd_mv = mvi2.predict(mb_x, 0, false, binfo.get_mv2(0), sstate.first_line, sstate.first_mb);
- } else {
- bwd_mv = ZERO_MV;
- mvi2.set_zero_mv(mb_x);
- }
- if let (Some(ref fwd_buf), Some(ref bck_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) {
- if has_fwd && has_bwd {
- bdsp.copy_blocks(&mut buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, fwd_mv);
- bdsp.avg_blocks (&mut buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, bwd_mv);
- } else if has_fwd {
- bdsp.copy_blocks(&mut buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, fwd_mv);
- } else {
- bdsp.copy_blocks(&mut buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, bwd_mv);
- }
- }
- } else {
- if let BlockMVInfo::Inter_4MV(mvs) = ref_mv_info {
- for blk_no in 0..4 {
- let ref_mv = mvs[blk_no];
- let ref_mv_fwd = ref_mv.scale(bsdiff, tsdiff);
- let ref_mv_bwd = ref_mv - ref_mv_fwd;
- let xoff = mb_x * 16 + (blk_no & 1) * 8;
- let yoff = mb_y * 16 + (blk_no & 2) * 4;
- if let (Some(ref fwd_buf), Some(ref bck_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) {
- bdsp.copy_blocks(&mut buf, fwd_buf, xoff, yoff, 8, 8, ref_mv_fwd);
- bdsp.avg_blocks (&mut buf, bck_buf, xoff, yoff, 8, 8, ref_mv_bwd);
- }
- }
- } else {
- let ref_mv = if let BlockMVInfo::Inter_1MV(mv_) = ref_mv_info { mv_ } else { ZERO_MV };
- let ref_mv_fwd = ref_mv.scale(bsdiff, tsdiff);
- let ref_mv_bwd = MV::b_sub(ref_mv, ref_mv_fwd, ZERO_MV, bsdiff, tsdiff);
-
- if let (Some(ref fwd_buf), Some(ref bck_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) {
- bdsp.copy_blocks(&mut buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, ref_mv_fwd);
- bdsp.avg_blocks (&mut buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, ref_mv_bwd);
- }
- }
- mvi.set_zero_mv(mb_x);
- mvi2.set_zero_mv(mb_x);
- }
- if cbp != 0 {
- for i in 0..6 {
- bd.decode_block_inter(&binfo, &sstate, binfo.get_q(), i, ((cbp >> (5 - i)) & 1) != 0, &mut blk[i])?;
- bdsp.idct(&mut blk[i]);
- }
- blockdsp::add_blocks(&mut buf, mb_x, mb_y, &blk);
- }
- }
- if pinfo.is_pb() {
- let mut b_mb = BMB::new();
- let cbp = binfo.get_cbp_b();
- let bq = (((pinfo.get_pbinfo().get_dbquant() + 5) as u16) * (binfo.get_q() as u16)) >> 2;
- let bquant;
- if bq < 1 { bquant = 1; }
- else if bq > 31 { bquant = 31; }
- else { bquant = bq as u8; }
-
- b_mb.cbp = cbp;
- for i in 0..6 {
- bd.decode_block_inter(&binfo, &sstate, bquant, i, (cbp & (1 << (5 - i))) != 0, &mut b_mb.blk[i])?;
- bdsp.idct(&mut b_mb.blk[i]);
- }
-
- let is_fwd = binfo.is_b_fwd();
- b_mb.fwd = is_fwd;
- if binfo.get_num_mvs() != 4 {
- let ref_mv = mvi2.get_mv(mb_x, 0);
- let b_mv = if binfo.is_intra() { binfo.get_mv2(1) } else { binfo.get_mv2(0) };
- let src_mv = if is_fwd { ZERO_MV } else { ref_mv.scale(bsdiff, tsdiff) };
- let mv_f = MV::add_umv(src_mv, b_mv, pinfo.get_mvmode());
- let mv_b = MV::b_sub(ref_mv, mv_f, b_mv, bsdiff, tsdiff);
- b_mb.mv_f[0] = mv_f;
- b_mb.mv_b[0] = mv_b;
- b_mb.num_mv = 1;
- } else {
- for blk_no in 0..4 {
- let src_mv = if is_fwd { ZERO_MV } else { mvi2.get_mv(mb_x, blk_no).scale(bsdiff, tsdiff) };
- let mv_f = MV::add_umv(src_mv, binfo.get_mv2(0), pinfo.get_mvmode());
- let mv_b = MV::b_sub(mvi2.get_mv(mb_x, blk_no), mv_f, binfo.get_mv2(0), bsdiff, tsdiff);
- b_mb.mv_f[blk_no] = mv_f;
- b_mb.mv_b[blk_no] = mv_b;
- }
- b_mb.num_mv = 4;
- }
- self.b_data.push(b_mb);
- }
- sstate.next_mb();
- mb_pos += 1;
- }
- if let Some(plusinfo) = pinfo.plusinfo {
- if plusinfo.deblock {
- bdsp.filter_row(&mut buf, mb_y, self.mb_w, &cbpi);
- }
- }
- mvi.update_row();
- if is_b || pinfo.is_pb() {
- mvi2.update_row();
- }
- cbpi.update_row();
- sstate.new_row();
- }
-
- if pinfo.mode.is_ref() {
- self.ipbs.add_frame(buf);
- self.next_ts = self.last_ts;
- self.last_ts = pinfo.ts;
- self.tsdiff = tsdiff;
- }
-
- Ok(bufinfo)
- }
-
- pub fn get_bframe(&mut self, bdsp: &BlockDSP) -> DecoderResult<NABufferType> {
- if !self.has_b || !self.ipbs.get_lastref().is_some() || !self.ipbs.get_nextref().is_some() {
- return Err(DecoderError::MissingReference);
- }
- self.has_b = false;
-
- let fmt = formats::YUV420_FORMAT;
- let vinfo = NAVideoInfo::new(self.w, self.h, false, fmt);
- let bufret = alloc_video_buffer(vinfo, 4);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let mut bufinfo = bufret.unwrap();
- let mut b_buf = bufinfo.get_vbuf().unwrap();
-
- if let (Some(ref bck_buf), Some(ref fwd_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) {
- recon_b_frame(&mut b_buf, fwd_buf, bck_buf, self.mb_w, self.mb_h, &self.b_data, bdsp);
- }
-
- self.b_data.truncate(0);
- Ok(bufinfo)
- }
-}
-
-fn recon_b_frame(b_buf: &mut NAVideoBuffer<u8>, bck_buf: &NAVideoBuffer<u8>, fwd_buf: &NAVideoBuffer<u8>,
- mb_w: usize, mb_h: usize, b_data: &Vec<BMB>, bdsp: &BlockDSP) {
- let mut cbpi = CBPInfo::new();
- let mut cur_mb = 0;
- cbpi.reset(mb_w);
- for mb_y in 0..mb_h {
- for mb_x in 0..mb_w {
- let num_mv = b_data[cur_mb].num_mv;
- let is_fwd = b_data[cur_mb].fwd;
- let cbp = b_data[cur_mb].cbp;
- cbpi.set_cbp(mb_x, cbp);
- if num_mv == 1 {
- bdsp.copy_blocks(b_buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, b_data[cur_mb].mv_b[0]);
- if !is_fwd {
- bdsp.avg_blocks(b_buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, b_data[cur_mb].mv_f[0]);
- }
- } else {
- for blk_no in 0..4 {
- let xpos = mb_x * 16 + (blk_no & 1) * 8;
- let ypos = mb_y * 16 + (blk_no & 2) * 4;
- bdsp.copy_blocks(b_buf, fwd_buf, xpos, ypos, 8, 8, b_data[cur_mb].mv_b[blk_no]);
- if !is_fwd {
- bdsp.avg_blocks(b_buf, bck_buf, xpos, ypos, 8, 8, b_data[cur_mb].mv_f[blk_no]);
- }
- }
- }
- if cbp != 0 {
- blockdsp::add_blocks(b_buf, mb_x, mb_y, &b_data[cur_mb].blk);
- }
- cur_mb += 1;
- }
- cbpi.update_row();
- }
-}
diff --git a/src/codecs/h263/intel263.rs b/src/codecs/h263/intel263.rs
deleted file mode 100644
index 9e36a49..0000000
--- a/src/codecs/h263/intel263.rs
+++ /dev/null
@@ -1,420 +0,0 @@
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use crate::formats;
-use super::super::*;
-use super::*;
-use super::decoder::*;
-use super::data::*;
-use super::code::H263BlockDSP;
-
-#[allow(dead_code)]
-struct Tables {
- intra_mcbpc_cb: Codebook<u8>,
- inter_mcbpc_cb: Codebook<u8>,
- cbpy_cb: Codebook<u8>,
- rl_cb: Codebook<H263RLSym>,
- aic_rl_cb: Codebook<H263RLSym>,
- mv_cb: Codebook<u8>,
-}
-
-struct Intel263Decoder {
- info: Rc<NACodecInfo>,
- dec: H263BaseDecoder,
- tables: Tables,
- bdsp: H263BlockDSP,
-}
-
-struct Intel263BR<'a> {
- br: BitReader<'a>,
- tables: &'a Tables,
- gob_no: usize,
- mb_w: usize,
- is_pb: bool,
- is_ipb: bool,
-}
-
-fn check_marker<'a>(br: &mut BitReader<'a>) -> DecoderResult<()> {
- let mark = br.read(1)?;
- validate!(mark == 1);
- Ok(())
-}
-
-impl<'a> Intel263BR<'a> {
- fn new(src: &'a [u8], tables: &'a Tables) -> Self {
- Intel263BR {
- br: BitReader::new(src, src.len(), BitReaderMode::BE),
- tables: tables,
- gob_no: 0,
- mb_w: 0,
- is_pb: false,
- is_ipb: false,
- }
- }
-
- fn decode_block(&mut self, quant: u8, intra: bool, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> {
- let br = &mut self.br;
- let mut idx = 0;
- if intra {
- let mut dc = br.read(8)?;
- if dc == 255 { dc = 128; }
- blk[0] = (dc as i16) << 3;
- idx = 1;
- }
- if !coded { return Ok(()); }
-
- let rl_cb = &self.tables.rl_cb; // could be aic too
- let q_add = if quant == 0 { 0i16 } else { ((quant - 1) | 1) as i16 };
- let q = (quant * 2) as i16;
- while idx < 64 {
- let code = br.read_cb(rl_cb)?;
- let run;
- let mut level;
- let last;
- if !code.is_escape() {
- run = code.get_run();
- level = code.get_level();
- last = code.is_last();
- if br.read_bool()? { level = -level; }
- level = (level * q) + q_add;
- } else {
- last = br.read_bool()?;
- run = br.read(6)? as u8;
- level = br.read_s(8)? as i16;
- if level == -128 {
- let low = br.read(5)? as i16;
- let top = br.read_s(6)? as i16;
- level = (top << 5) | low;
- }
- level = (level * q) + q_add;
- if level < -2048 { level = -2048; }
- if level > 2047 { level = 2047; }
- }
- idx += run;
- validate!(idx < 64);
- let oidx = H263_ZIGZAG[idx as usize];
- blk[oidx] = level;
- idx += 1;
- if last { break; }
- }
- Ok(())
- }
-}
-
-fn decode_mv_component(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<i16> {
- let code = br.read_cb(mv_cb)? as i16;
- if code == 0 { return Ok(0) }
- if !br.read_bool()? {
- Ok(code)
- } else {
- Ok(-code)
- }
-}
-
-fn decode_mv(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<MV> {
- let xval = decode_mv_component(br, mv_cb)?;
- let yval = decode_mv_component(br, mv_cb)?;
- Ok(MV::new(xval, yval))
-}
-
-fn decode_b_info(br: &mut BitReader, is_pb: bool, is_ipb: bool, is_intra: bool) -> DecoderResult<BBlockInfo> {
- if is_pb { // as improved pb
- if is_ipb {
- let pb_mv_add = if is_intra { 1 } else { 0 };
- if br.read_bool()?{
- if br.read_bool()? {
- let pb_mv_count = 1 - (br.read(1)? as usize);
- let cbpb = br.read(6)? as u8;
- Ok(BBlockInfo::new(true, cbpb, pb_mv_count + pb_mv_add, pb_mv_count == 1))
- } else {
- Ok(BBlockInfo::new(true, 0, 1 + pb_mv_add, true))
- }
- } else {
- Ok(BBlockInfo::new(true, 0, pb_mv_add, false))
- }
- } else {
- let mvdb = br.read_bool()?;
- let cbpb = if mvdb && br.read_bool()? { br.read(6)? as u8 } else { 0 };
- Ok(BBlockInfo::new(true, cbpb, if mvdb { 1 } else { 0 }, false))
- }
- } else {
- Ok(BBlockInfo::new(false, 0, 0, false))
- }
-}
-
-impl<'a> BlockDecoder for Intel263BR<'a> {
-
-#[allow(unused_variables)]
- fn decode_pichdr(&mut self) -> DecoderResult<PicInfo> {
- let br = &mut self.br;
- let syncw = br.read(22)?;
- validate!(syncw == 0x000020);
- let tr = (br.read(8)? << 8) as u16;
- check_marker(br)?;
- let id = br.read(1)?;
- validate!(id == 0);
- br.read(1)?; // split screen indicator
- br.read(1)?; // document camera indicator
- br.read(1)?; // freeze picture release
- let mut sfmt = br.read(3)?;
- validate!((sfmt != 0b000) && (sfmt != 0b110));
- let is_intra = !br.read_bool()?;
- let umv = br.read_bool()?;
- br.read(1)?; // syntax arithmetic coding
- let apm = br.read_bool()?;
- self.is_pb = br.read_bool()?;
- let deblock;
- let pbplus;
- if sfmt == 0b111 {
- sfmt = br.read(3)?;
- validate!((sfmt != 0b000) && (sfmt != 0b111));
- br.read(2)?; // unknown flags
- deblock = br.read_bool()?;
- br.read(1)?; // unknown flag
- pbplus = br.read_bool()?;
- br.read(5)?; // unknown flags
- let marker = br.read(5)?;
- validate!(marker == 1);
- } else {
- deblock = false;
- pbplus = false;
- }
- self.is_ipb = pbplus;
- let w; let h;
- if sfmt == 0b110 {
- let par = br.read(4)?;
- w = ((br.read(9)? + 1) * 4) as usize;
- check_marker(br)?;
- h = ((br.read(9)? + 1) * 4) as usize;
- if par == 0b1111 {
- let pixw = br.read(8)?;
- let pixh = br.read(8)?;
- validate!((pixw != 0) && (pixh != 0));
- }
- } else {
- let (w_, h_) = H263_SIZES[sfmt as usize];
- w = w_;
- h = h_;
- }
- let quant = br.read(5)?;
- let cpm = br.read_bool()?;
- validate!(!cpm);
-
- let pbinfo;
- if self.is_pb {
- let trb = br.read(3)?;
- let dbquant = br.read(2)?;
- pbinfo = Some(PBInfo::new(trb as u8, dbquant as u8, pbplus));
- } else {
- pbinfo = None;
- }
- while br.read_bool()? { // skip PEI
- br.read(8)?;
- }
-//println!("frame {}x{} intra: {} q {} pb {} apm {} umv {} @{}", w, h, is_intra, quant, self.is_pb, apm, umv, br.tell());
- self.gob_no = 0;
- self.mb_w = (w + 15) >> 4;
-
- let ftype = if is_intra { Type::I } else { Type::P };
- let plusinfo = if deblock { Some(PlusInfo::new(false, deblock, false, false)) } else { None };
- let mvmode = if umv { MVMode::UMV } else { MVMode::Old };
- let picinfo = PicInfo::new(w, h, ftype, mvmode, umv, apm, quant as u8, tr, pbinfo, plusinfo);
- Ok(picinfo)
- }
-
- #[allow(unused_variables)]
- fn decode_slice_header(&mut self, info: &PicInfo) -> DecoderResult<SliceInfo> {
- let br = &mut self.br;
- let gbsc = br.read(17)?;
- validate!(gbsc == 1);
- let gn = br.read(5)?;
- let gfid = br.read(2)?;
- let gquant = br.read(5)?;
-//println!("GOB gn {:X} id {} q {}", gn, gfid, gquant);
- let ret = SliceInfo::new_gob(0, self.gob_no, gquant as u8);
- self.gob_no += 1;
- Ok(ret)
- }
-
- #[allow(unused_variables)]
- fn decode_block_header(&mut self, info: &PicInfo, slice: &SliceInfo, sstate: &SliceState) -> DecoderResult<BlockInfo> {
- let br = &mut self.br;
- let mut q = slice.get_quant();
- match info.get_mode() {
- Type::I => {
- let mut cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?;
- while cbpc == 8 { cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; }
- let cbpy = br.read_cb(&self.tables.cbpy_cb)?;
- let cbp = (cbpy << 2) | (cbpc & 3);
- let dquant = (cbpc & 4) != 0;
- if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
- }
- Ok(BlockInfo::new(Type::I, cbp, q))
- },
- Type::P => {
- if br.read_bool()? { return Ok(BlockInfo::new(Type::Skip, 0, info.get_quant())); }
- let mut cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?;
- while cbpc == 20 { cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; }
- let is_intra = (cbpc & 0x04) != 0;
- let dquant = (cbpc & 0x08) != 0;
- let is_4x4 = (cbpc & 0x10) != 0;
- if is_intra {
- let mut mvec: Vec<MV> = Vec::new();
- let bbinfo = decode_b_info(br, self.is_pb, self.is_ipb, true)?;
- let cbpy = br.read_cb(&self.tables.cbpy_cb)?;
- let cbp = (cbpy << 2) | (cbpc & 3);
- if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
- }
- let mut binfo = BlockInfo::new(Type::I, cbp, q);
- binfo.set_bpart(bbinfo);
- if self.is_pb {
- for _ in 0..bbinfo.get_num_mv() {
- mvec.push(decode_mv(br, &self.tables.mv_cb)?);
- }
- binfo.set_b_mv(mvec.as_slice());
- }
- return Ok(binfo);
- }
-
- let bbinfo = decode_b_info(br, self.is_pb, self.is_ipb, false)?;
- let mut cbpy = br.read_cb(&self.tables.cbpy_cb)?;
-// if /* !aiv && */(cbpc & 3) != 3 {
- cbpy ^= 0xF;
-// }
- let cbp = (cbpy << 2) | (cbpc & 3);
- if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
- }
- let mut binfo = BlockInfo::new(Type::P, cbp, q);
- binfo.set_bpart(bbinfo);
- if !is_4x4 {
- let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?];
- binfo.set_mv(&mvec);
- } else {
- let mvec: [MV; 4] = [
- decode_mv(br, &self.tables.mv_cb)?,
- decode_mv(br, &self.tables.mv_cb)?,
- decode_mv(br, &self.tables.mv_cb)?,
- decode_mv(br, &self.tables.mv_cb)?
- ];
- binfo.set_mv(&mvec);
- }
- if self.is_pb {
- let mut mvec: Vec<MV> = Vec::with_capacity(bbinfo.get_num_mv());
- for _ in 0..bbinfo.get_num_mv() {
- let mv = decode_mv(br, &self.tables.mv_cb)?;
- mvec.push(mv);
- }
- binfo.set_b_mv(mvec.as_slice());
- }
- Ok(binfo)
- },
- _ => { Err(DecoderError::InvalidData) },
- }
- }
-
- #[allow(unused_variables)]
- fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> {
- self.decode_block(quant, true, coded, blk)
- }
-
- #[allow(unused_variables)]
- fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> {
- self.decode_block(quant, false, coded, blk)
- }
-
- fn is_slice_end(&mut self) -> bool { self.br.peek(16) == 0 }
-}
-
-impl Intel263Decoder {
- fn new() -> Self {
- let mut coderead = H263ShortCodeReader::new(H263_INTRA_MCBPC);
- let intra_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_INTER_MCBPC);
- let inter_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_CBPY);
- let cbpy_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263RLCodeReader::new(H263_RL_CODES);
- let rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263RLCodeReader::new(H263_RL_CODES_AIC);
- let aic_rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_MV);
- let mv_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let tables = Tables {
- intra_mcbpc_cb: intra_mcbpc_cb,
- inter_mcbpc_cb: inter_mcbpc_cb,
- cbpy_cb: cbpy_cb,
- rl_cb: rl_cb,
- aic_rl_cb: aic_rl_cb,
- mv_cb: mv_cb,
- };
-
- Intel263Decoder{
- info: Rc::new(DUMMY_CODEC_INFO),
- dec: H263BaseDecoder::new(true),
- tables: tables,
- bdsp: H263BlockDSP::new(),
- }
- }
-}
-
-impl NADecoder for Intel263Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- let fmt = formats::YUV420_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
-
- if src.len() == 8 {
- let bret = self.dec.get_bframe(&self.bdsp);
- let buftype;
- let is_skip;
- if let Ok(btype) = bret {
- buftype = btype;
- is_skip = false;
- } else {
- buftype = NABufferType::None;
- is_skip = true;
- }
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), buftype);
- frm.set_keyframe(false);
- frm.set_frame_type(if is_skip { FrameType::Skip } else { FrameType::B });
- return Ok(Rc::new(RefCell::new(frm)));
- }
- let mut ibr = Intel263BR::new(&src, &self.tables);
-
- let bufinfo = self.dec.parse_frame(&mut ibr, &self.bdsp)?;
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(self.dec.is_intra());
- frm.set_frame_type(if self.dec.is_intra() { FrameType::I } else { FrameType::P });
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(Intel263Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_intel263() {
- test_file_decoding("avi", "assets/neal73_saber.avi", Some(16), true, false, None/*Some("i263")*/);
- }
-}
diff --git a/src/codecs/h263/mod.rs b/src/codecs/h263/mod.rs
deleted file mode 100644
index 8718887..0000000
--- a/src/codecs/h263/mod.rs
+++ /dev/null
@@ -1,396 +0,0 @@
-use super::{DecoderResult, MV, ZERO_MV};
-use crate::frame::NAVideoBuffer;
-
-pub mod code;
-pub mod data;
-pub mod decoder;
-
-#[cfg(feature="decoder_intel263")]
-pub mod intel263;
-#[cfg(feature="decoder_realvideo1")]
-pub mod rv10;
-#[cfg(feature="decoder_realvideo2")]
-pub mod rv20;
-
-pub trait BlockDecoder {
- fn decode_pichdr(&mut self) -> DecoderResult<PicInfo>;
- fn decode_slice_header(&mut self, pinfo: &PicInfo) -> DecoderResult<SliceInfo>;
- fn decode_block_header(&mut self, pinfo: &PicInfo, sinfo: &SliceInfo, sstate: &SliceState) -> DecoderResult<BlockInfo>;
- fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()>;
- fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()>;
- fn is_slice_end(&mut self) -> bool;
-}
-
-pub trait BlockDSP {
- fn idct(&self, blk: &mut [i16; 64]);
- fn copy_blocks(&self, dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, xpos: usize, ypos: usize, w: usize, h: usize, mv: MV);
- fn avg_blocks(&self, dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, xpos: usize, ypos: usize, w: usize, h: usize, mv: MV);
- fn filter_row(&self, buf: &mut NAVideoBuffer<u8>, mb_y: usize, mb_w: usize, cbpi: &CBPInfo);
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum Type {
- I, P, PB, Skip, B, Special
-}
-
-impl Type {
- pub fn is_ref(&self) -> bool {
- match *self {
- Type::I | Type::P | Type::PB => true,
- _ => false,
- }
- }
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy)]
-pub struct PBInfo {
- trb: u8,
- dbquant: u8,
- improved: bool,
-}
-
-impl PBInfo {
- pub fn new(trb: u8, dbquant: u8, improved: bool) -> Self {
- PBInfo{ trb: trb, dbquant: dbquant, improved: improved }
- }
- pub fn get_trb(&self) -> u8 { self.trb }
- pub fn get_dbquant(&self) -> u8 { self.dbquant }
- pub fn is_improved(&self) -> bool { self.improved }
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy)]
-pub struct PicInfo {
- pub w: usize,
- pub h: usize,
- pub mode: Type,
- pub mvmode: MVMode,
- pub umv: bool,
- pub apm: bool,
- pub quant: u8,
- pub pb: Option<PBInfo>,
- pub ts: u16,
- pub plusinfo: Option<PlusInfo>,
-}
-
-#[allow(dead_code)]
-impl PicInfo {
- pub fn new(w: usize, h: usize, mode: Type, mvmode: MVMode, umv: bool, apm: bool, quant: u8, ts: u16, pb: Option<PBInfo>, plusinfo: Option<PlusInfo>) -> Self {
- PicInfo {
- w: w, h: h, mode: mode, mvmode: mvmode,
- umv: umv, apm: apm, quant: quant,
- pb: pb, ts: ts, plusinfo: plusinfo
- }
- }
- pub fn get_width(&self) -> usize { self.w }
- pub fn get_height(&self) -> usize { self.h }
- pub fn get_mode(&self) -> Type { self.mode }
- pub fn get_quant(&self) -> u8 { self.quant }
- pub fn get_apm(&self) -> bool { self.apm }
- pub fn is_pb(&self) -> bool { self.pb.is_some() }
- pub fn is_ipb(&self) -> bool {
- if let Some(ref pbi) = self.pb {
- pbi.is_improved()
- } else {
- false
- }
- }
- pub fn get_ts(&self) -> u16 { self.ts }
- pub fn get_pbinfo(&self) -> PBInfo { self.pb.unwrap() }
- pub fn get_plusifo(&self) -> Option<PlusInfo> { self.plusinfo }
- pub fn get_mvmode(&self) -> MVMode { self.mvmode }
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy)]
-pub struct PlusInfo {
- pub aic: bool,
- pub deblock: bool,
- pub aiv_mode: bool,
- pub mq_mode: bool,
-}
-
-impl PlusInfo {
- pub fn new(aic: bool, deblock: bool, aiv_mode: bool, mq_mode: bool) -> Self {
- PlusInfo { aic: aic, deblock: deblock, aiv_mode: aiv_mode, mq_mode: mq_mode }
- }
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy)]
-pub struct SliceInfo {
- pub mb_x: usize,
- pub mb_y: usize,
- pub mb_end: usize,
- pub quant: u8,
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy)]
-pub struct SliceState {
- pub is_iframe: bool,
- pub mb_x: usize,
- pub mb_y: usize,
- pub first_line: bool,
- pub first_mb: bool,
- pub slice_mb_x: usize,
- pub slice_mb_y: usize,
- pub quant: u8,
-}
-
-const SLICE_NO_END: usize = 99999999;
-
-impl SliceInfo {
- pub fn new(mb_x: usize, mb_y: usize, mb_end: usize, quant: u8) -> Self {
- SliceInfo{ mb_x: mb_x, mb_y: mb_y, mb_end: mb_end, quant: quant }
- }
- pub fn new_gob(mb_x: usize, mb_y: usize, quant: u8) -> Self {
- SliceInfo{ mb_x: mb_x, mb_y: mb_y, mb_end: SLICE_NO_END, quant: quant }
- }
- pub fn get_default_slice(pinfo: &PicInfo) -> Self {
- SliceInfo{ mb_x: 0, mb_y: 0, mb_end: SLICE_NO_END, quant: pinfo.get_quant() }
- }
- pub fn get_quant(&self) -> u8 { self.quant }
- pub fn is_at_end(&self, mb_pos: usize) -> bool { self.mb_end == mb_pos }
- pub fn needs_check(&self) -> bool { self.mb_end == SLICE_NO_END }
-}
-
-impl SliceState {
- pub fn new(is_iframe: bool) -> Self {
- SliceState {
- is_iframe: is_iframe, mb_x: 0, mb_y: 0, first_line: true, first_mb: true,
- slice_mb_x: 0, slice_mb_y: 0, quant: 0
- }
- }
- pub fn next_mb(&mut self) {
- self.mb_x += 1; self.first_mb = false;
- if self.mb_x >= self.slice_mb_x && self.mb_y > self.slice_mb_y {
- self.first_line = false;
- }
- }
- pub fn new_row(&mut self) {
- self.mb_x = 0; self.mb_y += 1;
- if self.mb_x >= self.slice_mb_x && self.mb_y > self.slice_mb_y {
- self.first_line = false;
- }
- self.first_mb = true;
- }
- pub fn reset_slice(&mut self, smb_x: usize, smb_y: usize) {
- self.slice_mb_x = smb_x;
- self.slice_mb_y = smb_y;
- self.first_line = true;
- self.first_mb = true;
- }
-}
-
-#[derive(Debug,Clone,Copy)]
-pub struct BlockInfo {
- pub intra: bool,
- pub skip: bool,
- pub mode: Type,
- pub cbp: u8,
- pub q: u8,
- pub mv: [MV; 4],
- pub num_mv: usize,
- pub bpart: bool,
- pub b_cbp: u8,
- pub mv2: [MV; 2],
- pub num_mv2: usize,
- pub fwd: bool,
- pub acpred: ACPredMode,
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy)]
-pub struct BBlockInfo {
- present: bool,
- cbp: u8,
- num_mv: usize,
- fwd: bool,
-}
-
-#[allow(non_camel_case_types)]
-#[derive(Debug,Clone,Copy)]
-pub enum BlockMVInfo {
- Intra,
- Inter_1MV(MV),
- Inter_4MV([MV; 4]),
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum ACPredMode {
- None,
- DC,
- Ver,
- Hor,
-}
-
-#[allow(dead_code)]
-impl BlockInfo {
- pub fn new(mode: Type, cbp: u8, q: u8) -> Self {
- BlockInfo {
- intra: mode == Type::I,
- skip: (cbp == 0) && (mode != Type::I),
- mode: mode,
- cbp: cbp,
- q: q,
- mv: [MV::new(0, 0), MV::new(0, 0), MV::new(0, 0), MV::new(0, 0)],
- num_mv: 0,
- bpart: false,
- b_cbp: 0,
- mv2: [ZERO_MV, ZERO_MV],
- num_mv2: 0,
- fwd: false,
- acpred: ACPredMode::None,
- }
- }
- pub fn is_intra(&self) -> bool { self.intra }
- pub fn is_skipped(&self) -> bool { self.skip }
- pub fn get_mode(&self) -> Type { self.mode }
- pub fn get_cbp(&self) -> u8 { self.cbp }
- pub fn get_q(&self) -> u8 { self.q }
- pub fn get_num_mvs(&self) -> usize { self.num_mv }
- pub fn get_mv(&self, idx: usize) -> MV { self.mv[idx] }
- pub fn has_b_part(&self) -> bool { self.bpart }
- pub fn get_cbp_b(&self) -> u8 { self.b_cbp }
- pub fn get_num_mvs2(&self) -> usize { self.num_mv2 }
- pub fn get_mv2(&self, idx: usize) -> MV { self.mv2[idx] }
- pub fn set_mv(&mut self, mvs: &[MV]) {
- if mvs.len() > 0 { self.skip = false; }
- let mut mv_arr: [MV; 4] = [MV::new(0, 0), MV::new(0, 0), MV::new(0, 0), MV::new(0, 0)];
- for i in 0..mvs.len() { mv_arr[i] = mvs[i]; }
- self.mv = mv_arr;
- self.num_mv = mvs.len();
- }
- pub fn set_bpart(&mut self, bbinfo: BBlockInfo) {
- self.bpart = bbinfo.present;
- self.b_cbp = bbinfo.cbp;
- self.fwd = bbinfo.fwd;
- self.num_mv2 = bbinfo.get_num_mv();
- }
- pub fn set_b_mv(&mut self, mvs: &[MV]) {
- if mvs.len() > 0 { self.skip = false; }
- let mut mv_arr: [MV; 2] = [ZERO_MV, ZERO_MV];
- for i in 0..mvs.len() { mv_arr[i] = mvs[i]; }
- self.mv2 = mv_arr;
- self.num_mv2 = mvs.len();
- }
- pub fn is_b_fwd(&self) -> bool { self.fwd }
- pub fn set_acpred(&mut self, acpred: ACPredMode) { self.acpred = acpred }
- pub fn get_acpred(&self) -> ACPredMode { self.acpred }
-}
-
-impl BBlockInfo {
- pub fn new(present: bool, cbp: u8, num_mv: usize, fwd: bool) -> Self {
- BBlockInfo {
- present: present,
- cbp: cbp,
- num_mv: num_mv,
- fwd: fwd,
- }
- }
- pub fn get_num_mv(&self) -> usize { self.num_mv }
-}
-
-#[derive(Debug,Clone,Copy)]
-pub enum MVMode {
- Old,
- Long,
- UMV,
-}
-
-pub trait H263MVTrait {
- fn add_umv(pred_mv: MV, add: MV, mvmode: MVMode) -> MV;
- fn scale(&self, trb: u16, trd: u16) -> MV;
- fn b_sub(pvec: MV, fwdvec: MV, bvec: MV, trb: u16, trd: u16) -> MV;
-}
-
-impl H263MVTrait for MV {
- fn add_umv(pred_mv: MV, add: MV, mvmode: MVMode) -> MV {
- let mut new_mv = pred_mv + add;
- match mvmode {
- MVMode::Old => {
- if new_mv.x >= 64 { new_mv.x -= 64; }
- else if new_mv.x <= -64 { new_mv.x += 64; }
- if new_mv.y >= 64 { new_mv.y -= 64; }
- else if new_mv.y <= -64 { new_mv.y += 64; }
- },
- MVMode::Long => {
- if new_mv.x > 31 { new_mv.x -= 64; }
- else if new_mv.x < -32 { new_mv.x += 64; }
- if new_mv.y > 31 { new_mv.y -= 64; }
- else if new_mv.y < -32 { new_mv.y += 64; }
- },
- MVMode::UMV => {
- if pred_mv.x > 32 && new_mv.x > 63 { new_mv.x -= 64; }
- if pred_mv.x < -31 && new_mv.x < -63 { new_mv.x += 64; }
- if pred_mv.y > 32 && new_mv.y > 63 { new_mv.y -= 64; }
- if pred_mv.y < -31 && new_mv.y < -63 { new_mv.y += 64; }
- },
- };
- new_mv
- }
- fn scale(&self, trb: u16, trd: u16) -> MV {
- if (trd == 0) || (trb == 0) {
- ZERO_MV
- } else {
- MV { x: (((self.x as i32) * (trb as i32)) / (trd as i32)) as i16, y: (((self.y as i32) * (trb as i32)) / (trd as i32)) as i16 }
- }
- }
- fn b_sub(pvec: MV, fwdvec: MV, bvec: MV, trb: u16, trd: u16) -> MV {
- let bscale = (trb as i32) - (trd as i32);
- let x = if bvec.x != 0 { fwdvec.x - pvec.x } else if trd != 0 { (bscale * (pvec.x as i32) / (trd as i32)) as i16 } else { 0 };
- let y = if bvec.y != 0 { fwdvec.y - pvec.y } else if trd != 0 { (bscale * (pvec.y as i32) / (trd as i32)) as i16 } else { 0 };
- MV { x: x, y: y }
- }
-}
-
-#[allow(dead_code)]
-pub struct CBPInfo {
- cbp: Vec<u8>,
- q: Vec<u8>,
- mb_w: usize,
-}
-
-impl CBPInfo {
- fn new() -> Self { CBPInfo{ cbp: Vec::new(), q: Vec::new(), mb_w: 0 } }
- fn reset(&mut self, mb_w: usize) {
- self.mb_w = mb_w;
- self.cbp.truncate(0);
- self.cbp.resize(self.mb_w * 2, 0);
- self.q.truncate(0);
- self.q.resize(self.mb_w * 2, 0);
- }
- fn update_row(&mut self) {
- for i in 0..self.mb_w {
- self.cbp[i] = self.cbp[self.mb_w + i];
- self.q[i] = self.q[self.mb_w + i];
- }
- }
- fn set_cbp(&mut self, mb_x: usize, cbp: u8) {
- self.cbp[self.mb_w + mb_x] = cbp;
- }
- fn set_q(&mut self, mb_x: usize, q: u8) {
- self.q[self.mb_w + mb_x] = q;
- }
- pub fn get_q(&self, mb_x: usize) -> u8 { self.q[mb_x] }
- pub fn is_coded(&self, mb_x: usize, blk_no: usize) -> bool {
- (self.cbp[self.mb_w + mb_x] & (1 << (5 - blk_no))) != 0
- }
- pub fn is_coded_top(&self, mb_x: usize, blk_no: usize) -> bool {
- let cbp = self.cbp[self.mb_w + mb_x];
- let cbp_top = self.cbp[mb_x];
- match blk_no {
- 0 => { (cbp_top & 0b001000) != 0 },
- 1 => { (cbp_top & 0b000100) != 0 },
- 2 => { (cbp & 0b100000) != 0 },
- 3 => { (cbp & 0b010000) != 0 },
- 4 => { (cbp_top & 0b000010) != 0 },
- _ => { (cbp_top & 0b000001) != 0 },
- }
- }
-}
-
diff --git a/src/codecs/h263/rv10.rs b/src/codecs/h263/rv10.rs
deleted file mode 100644
index 7e41b7a..0000000
--- a/src/codecs/h263/rv10.rs
+++ /dev/null
@@ -1,620 +0,0 @@
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use crate::formats;
-use super::super::*;
-use super::*;
-use super::code::H263BlockDSP;
-use super::decoder::*;
-use super::data::*;
-
-#[allow(dead_code)]
-struct Tables {
- intra_mcbpc_cb: Codebook<u8>,
- inter_mcbpc_cb: Codebook<u8>,
- cbpy_cb: Codebook<u8>,
- rl_cb: Codebook<H263RLSym>,
- aic_rl_cb: Codebook<H263RLSym>,
- mv_cb: Codebook<u8>,
- luma_dc_cb: Codebook<u8>,
- chroma_dc_cb: Codebook<u8>,
-}
-
-struct RealVideo10Decoder {
- info: Rc<NACodecInfo>,
- dec: H263BaseDecoder,
- tables: Tables,
- w: usize,
- h: usize,
- new_ver: bool,
- bdsp: H263BlockDSP,
- mvmode: MVMode,
-}
-
-struct RealVideo10BR<'a> {
- br: BitReader<'a>,
- tables: &'a Tables,
- num_slices: usize,
- slice_no: usize,
- slice_off: Vec<u32>,
- w: usize,
- h: usize,
- mb_w: usize,
- mb_h: usize,
- new_ver: bool,
- dc_coded: [bool; 3],
- last_dc: [i16; 3],
- mvmode: MVMode,
-}
-
-struct RV10SliceInfo {
- is_p: bool,
- qscale: u8,
- mb_x: usize,
- mb_y: usize,
- mb_c: usize,
-}
-
-impl RV10SliceInfo {
- fn new(is_p: bool, qscale: u8, mb_x: usize, mb_y: usize, mb_c: usize) -> Self {
- RV10SliceInfo { is_p: is_p, qscale: qscale, mb_x: mb_x, mb_y: mb_y, mb_c: mb_c }
- }
-}
-
-impl<'a> RealVideo10BR<'a> {
- fn new(src: &'a [u8], tables: &'a Tables, width: usize, height: usize, new_ver: bool, mvmode: MVMode) -> Self {
- let nslices = (src[0] as usize) + 1;
- let mut slice_offs = Vec::with_capacity(nslices);
- {
- let offs = &src[1..][..nslices * 8];
- let mut br = BitReader::new(offs, offs.len(), BitReaderMode::BE);
- for _ in 0..nslices {
- br.skip(32).unwrap();
- let off = br.read(32).unwrap();
- slice_offs.push(off);
- }
- }
- let soff = nslices * 8 + 1;
- RealVideo10BR {
- br: BitReader::new(&src[soff..], src.len() - soff, BitReaderMode::BE),
- tables: tables,
- num_slices: nslices,
- slice_no: 0,
- slice_off: slice_offs,
- w: width,
- h: height,
- mb_w: (width + 15) >> 4,
- mb_h: (height + 15) >> 4,
- new_ver: new_ver,
- dc_coded: [false; 3],
- last_dc: [0; 3],
- mvmode: mvmode,
- }
- }
-
-#[allow(unused_variables)]
- fn decode_block(&mut self, sstate: &SliceState, quant: u8, intra: bool, coded: bool, blk: &mut [i16; 64], plane_no: usize) -> DecoderResult<()> {
- let br = &mut self.br;
- let mut idx = 0;
- if intra {
- let mut dc;
- if !self.new_ver || !sstate.is_iframe {
- dc = br.read(8)? as i16;
- if dc == 255 { dc = 128; }
- } else {
- if self.dc_coded[plane_no] {
- let diff;
- let bits = br.peek(14);
- let ret = if plane_no == 0 {
- br.read_cb(&self.tables.luma_dc_cb)
- } else {
- br.read_cb(&self.tables.chroma_dc_cb)
- };
- if ret.is_err() {
- println!("Illegal {} code {:X}", if plane_no==0{"luma"}else{"chroma"},bits);
- }
- let val = ret.unwrap() as i16;
-
- if val != 0 {
- diff = val - 128;
- } else {
- let code = br.read(2)?;
- match code {
- 0x0 => { diff = ((br.read(7)? + 1) as i8) as i16; },
- 0x1 => { diff = (br.read(7)? as i16) - 128; },
- 0x2 => {
- if plane_no == 0 {
- if br.read_bool()? {
- diff = ((br.read(8)? + 1) as i8) as i16;
- } else {
- diff = (br.read(8)? as i8) as i16;
- }
- } else {
- br.skip(9)?;
- diff = 1;
- }
- },
- _ => {
- if plane_no == 0 {
- br.skip(4)?;
- diff = 1;
- } else {
- return Err(DecoderError::InvalidData);
- }
- },
- };
- }
- dc = (self.last_dc[plane_no] - diff) & 0xFF;
- self.last_dc[plane_no] = dc;
- } else {
- self.dc_coded[plane_no] = true;
- dc = self.last_dc[plane_no];
- }
- }
- blk[0] = dc << 3;
- idx = 1;
- }
- if !coded { return Ok(()); }
-
- let rl_cb = &self.tables.rl_cb; // could be aic too
- let q_add = if quant == 0 { 0i16 } else { ((quant - 1) | 1) as i16 };
- let q = (quant * 2) as i16;
- while idx < 64 {
- let code = br.read_cb(rl_cb)?;
- let run;
- let mut level;
- let last;
- if !code.is_escape() {
- run = code.get_run();
- level = code.get_level();
- last = code.is_last();
- if br.read_bool()? { level = -level; }
- level = (level * q) + q_add;
- } else {
- last = br.read_bool()?;
- run = br.read(6)? as u8;
- level = br.read_s(8)? as i16;
- if level == -128 {
- let low = br.read(5)? as i16;
- let top = br.read_s(6)? as i16;
- level = (top << 5) | low;
- }
- level = (level * q) + q_add;
- if level < -2048 { level = -2048; }
- if level > 2047 { level = 2047; }
- }
- idx += run;
- validate!(idx < 64);
- let oidx = H263_ZIGZAG[idx as usize];
- blk[oidx] = level;
- idx += 1;
- if last { break; }
- }
- Ok(())
- }
-}
-
-fn decode_mv_component(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<i16> {
- let code = br.read_cb(mv_cb)? as i16;
- if code == 0 { return Ok(0) }
- if !br.read_bool()? {
- Ok(code)
- } else {
- Ok(-code)
- }
-}
-
-fn decode_mv(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<MV> {
- let xval = decode_mv_component(br, mv_cb)?;
- let yval = decode_mv_component(br, mv_cb)?;
- Ok(MV::new(xval, yval))
-}
-
-impl<'a> BlockDecoder for RealVideo10BR<'a> {
-
-#[allow(unused_variables)]
- fn decode_pichdr(&mut self) -> DecoderResult<PicInfo> {
- self.slice_no = 0;
- let shdr = self.read_slice_header()?;
- validate!((shdr.mb_x == 0) && (shdr.mb_y == 0));
-
- let mb_end = shdr.mb_x + shdr.mb_y * self.mb_w + shdr.mb_c;
-
- let ftype = if !shdr.is_p { Type::I } else { Type::P };
- let picinfo = PicInfo::new(self.w, self.h, ftype, self.mvmode, false, false, shdr.qscale, 0, None, None);
- Ok(picinfo)
- }
-
- #[allow(unused_variables)]
- fn decode_slice_header(&mut self, info: &PicInfo) -> DecoderResult<SliceInfo> {
- let shdr = self.read_slice_header()?;
- self.slice_no += 1;
- let mb_end = shdr.mb_x + shdr.mb_y * self.mb_w + shdr.mb_c;
- let ret = SliceInfo::new(shdr.mb_x, shdr.mb_y, mb_end, shdr.qscale);
-
- Ok(ret)
- }
-
- fn decode_block_header(&mut self, info: &PicInfo, slice: &SliceInfo, _sstate: &SliceState) -> DecoderResult<BlockInfo> {
- let br = &mut self.br;
- let mut q = slice.get_quant();
- match info.get_mode() {
- Type::I => {
- let mut cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?;
- while cbpc == 8 { cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; }
- let cbpy = br.read_cb(&self.tables.cbpy_cb)?;
- let cbp = (cbpy << 2) | (cbpc & 3);
- let dquant = (cbpc & 4) != 0;
- if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
- }
- Ok(BlockInfo::new(Type::I, cbp, q))
- },
- Type::P => {
- if br.read_bool()? {
- return Ok(BlockInfo::new(Type::Skip, 0, info.get_quant()));
- }
- let mut cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?;
- while cbpc == 20 { cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; }
- let is_intra = (cbpc & 0x04) != 0;
- let dquant = (cbpc & 0x08) != 0;
- let is_4x4 = (cbpc & 0x10) != 0;
- if is_intra {
- let cbpy = br.read_cb(&self.tables.cbpy_cb)?;
- let cbp = (cbpy << 2) | (cbpc & 3);
- if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
- }
- let binfo = BlockInfo::new(Type::I, cbp, q);
- return Ok(binfo);
- }
-
- let mut cbpy = br.read_cb(&self.tables.cbpy_cb)?;
-// if /* !aiv && */(cbpc & 3) != 3 {
- cbpy ^= 0xF;
-// }
- let cbp = (cbpy << 2) | (cbpc & 3);
- if dquant {
- let idx = br.read(2)? as usize;
- q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
- }
- let mut binfo = BlockInfo::new(Type::P, cbp, q);
- if !is_4x4 {
- let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?];
- binfo.set_mv(&mvec);
- } else {
- let mvec: [MV; 4] = [
- decode_mv(br, &self.tables.mv_cb)?,
- decode_mv(br, &self.tables.mv_cb)?,
- decode_mv(br, &self.tables.mv_cb)?,
- decode_mv(br, &self.tables.mv_cb)?
- ];
- binfo.set_mv(&mvec);
- }
- Ok(binfo)
- },
- _ => { println!("wrong info mode"); Err(DecoderError::InvalidData) },
- }
- }
-
- #[allow(unused_variables)]
- fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> {
- self.decode_block(sstate, quant, true, coded, blk, if no < 4 { 0 } else { no - 3 })
- }
-
- #[allow(unused_variables)]
- fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> {
- self.decode_block(sstate, quant, false, coded, blk, if no < 4 { 0 } else { no - 3 })
- }
-
- fn is_slice_end(&mut self) -> bool { false }
-}
-
-impl<'a> RealVideo10BR<'a> {
- fn read_slice_header(&mut self) -> DecoderResult<RV10SliceInfo> {
- validate!(self.slice_no < self.num_slices);
-
- let br = &mut self.br;
- br.seek(self.slice_off[self.slice_no] * 8)?;
-
- let marker = br.read(1)?;
- validate!(marker == 1);
- let is_p = br.read_bool()?;
- let pb_frame = br.read_bool()?;
- validate!(!pb_frame);
- let qscale = br.read(5)? as u8;
- validate!(qscale > 0);
-
- if !is_p && self.new_ver {
- self.last_dc[0] = br.read(8)? as i16;
- self.last_dc[1] = br.read(8)? as i16;
- self.last_dc[2] = br.read(8)? as i16;
- } else {
- self.last_dc[0] = 0;
- self.last_dc[1] = 0;
- self.last_dc[2] = 0;
- }
- self.dc_coded[0] = false;
- self.dc_coded[1] = false;
- self.dc_coded[2] = false;
-
- let mb_x;
- let mb_y;
- let mb_count;
- if (br.peek(12) == 0) || (self.slice_no > 0) {
- mb_x = br.read(6)? as usize;
- mb_y = br.read(6)? as usize;
- mb_count = br.read(12)? as usize;
- } else {
- mb_x = 0;
- mb_y = 0;
- mb_count = self.mb_w * self.mb_h;
- }
- br.skip(3)?;
- validate!(mb_x + mb_y * self.mb_w + mb_count <= self.mb_w * self.mb_h);
-
- Ok(RV10SliceInfo::new(is_p, qscale, mb_x, mb_y, mb_count))
- }
-}
-
-impl RealVideo10Decoder {
- fn new() -> Self {
- let mut coderead = H263ShortCodeReader::new(H263_INTRA_MCBPC);
- let intra_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_INTER_MCBPC);
- let inter_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_CBPY);
- let cbpy_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263RLCodeReader::new(H263_RL_CODES);
- let rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263RLCodeReader::new(H263_RL_CODES_AIC);
- let aic_rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_MV);
- let mv_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = CodeReader::new(RV10_LUMA_DC_CODES, RV10_LUMA_DC_BITS);
- let luma_dc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = CodeReader::new(RV10_CHROMA_DC_CODES, RV10_CHROMA_DC_BITS);
- let chroma_dc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
-
- let tables = Tables {
- intra_mcbpc_cb: intra_mcbpc_cb,
- inter_mcbpc_cb: inter_mcbpc_cb,
- cbpy_cb: cbpy_cb,
- rl_cb: rl_cb,
- aic_rl_cb: aic_rl_cb,
- mv_cb: mv_cb,
- luma_dc_cb: luma_dc_cb,
- chroma_dc_cb: chroma_dc_cb,
- };
-
- RealVideo10Decoder{
- info: Rc::new(DUMMY_CODEC_INFO),
- dec: H263BaseDecoder::new_with_opts(false, false, false),
- tables: tables,
- w: 0,
- h: 0,
- new_ver: false,
- bdsp: H263BlockDSP::new(),
- mvmode: MVMode::Long,
- }
- }
-}
-
-impl NADecoder for RealVideo10Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- let fmt = formats::YUV420_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
- self.w = w;
- self.h = h;
-
- let edata = info.get_extradata().unwrap();
- let src: &[u8] = &edata;
- let ver = ((src[4] as u32) << 12) | ((src[5] as u32) << 4) | ((src[6] as u32) >> 4);
- let maj_ver = ver >> 16;
- let mic_ver = ver & 0xFF;
-println!("ver {:06X} -> {}", ver, mic_ver);
- validate!(maj_ver == 1);
- self.new_ver = mic_ver > 1;
- if (src[3] & 1) != 0 {
- self.mvmode = MVMode::UMV;
- }
-{
-let mut br = BitReader::new(src, src.len(), BitReaderMode::BE);
-println!("edata:");
-println!("{:08X}", br.read(32).unwrap());
-println!("{:08X}", br.read(32).unwrap());
-}
- Ok(())
- } else {
-println!("???");
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
-
-//println!(" decode frame size {}, {} slices", src.len(), src[0]+1);
- let mut ibr = RealVideo10BR::new(&src, &self.tables, self.w, self.h, self.new_ver, self.mvmode);
-
- let bufinfo = self.dec.parse_frame(&mut ibr, &self.bdsp)?;
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(self.dec.is_intra());
- frm.set_frame_type(if self.dec.is_intra() { FrameType::I } else { FrameType::P });
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(RealVideo10Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_rv10() {
- test_file_decoding("realmedia", "assets/RV/rv10_dnet_640x352_realvideo_encoder_4.0.rm", Some(1000), true, false, None/*Some("rv10")*/);
- }
-}
-
-pub struct CodeReader { codes: &'static [u16], bits: &'static [u8] }
-
-impl CodeReader {
- pub fn new(codes: &'static [u16], bits: &'static [u8]) -> Self {
- CodeReader { codes: codes, bits: bits }
- }
-}
-
-impl CodebookDescReader<u8> for CodeReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
- fn len(&mut self) -> usize { self.bits.len() }
-}
-
-const RV10_LUMA_DC_CODES: &[u16] = &[
- 0x001f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
- 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
- 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
- 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
- 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
- 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
- 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
- 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
- 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
- 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
- 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
- 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
- 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
- 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
- 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
- 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
- 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
- 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
- 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
- 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
- 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
- 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
- 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
- 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
- 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
- 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
- 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
- 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
- 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
- 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
- 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
-];
-
-const RV10_LUMA_DC_BITS: &[u8] = &[
- 5, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 7, 7, 7, 7, 7, 7, 7,
- 7, 6, 6, 6, 6, 5, 5, 4,
- 2, 4, 5, 5, 6, 6, 6, 6,
- 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
-];
-
-const RV10_CHROMA_DC_CODES: &[u16] = &[
- 0x003f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
- 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
- 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
- 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
- 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
- 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
- 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
- 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
- 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
- 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
- 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
- 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
- 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
- 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
- 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
- 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
- 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
- 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
- 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
- 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
- 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
- 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
- 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
- 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
- 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
- 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
- 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
- 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
- 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
- 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
-];
-
-const RV10_CHROMA_DC_BITS: &[u8] = &[
- 7, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 8, 8, 8, 8, 8, 8, 8,
- 8, 6, 6, 6, 6, 4, 4, 3,
- 2, 3, 4, 4, 6, 6, 6, 6,
- 8, 8, 8, 8, 8, 8, 8, 8,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14,
-];
diff --git a/src/codecs/h263/rv20.rs b/src/codecs/h263/rv20.rs
deleted file mode 100644
index 11dbe2e..0000000
--- a/src/codecs/h263/rv20.rs
+++ /dev/null
@@ -1,529 +0,0 @@
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use crate::formats;
-use super::super::*;
-use super::*;
-use super::code::H263BlockDSP;
-use super::decoder::*;
-use super::data::*;
-
-#[allow(dead_code)]
-struct Tables {
- intra_mcbpc_cb: Codebook<u8>,
- inter_mcbpc_cb: Codebook<u8>,
- mbtype_b_cb: Codebook<u8>,
- cbpy_cb: Codebook<u8>,
- cbpc_b_cb: Codebook<u8>,
- rl_cb: Codebook<H263RLSym>,
- aic_rl_cb: Codebook<H263RLSym>,
- mv_cb: Codebook<u8>,
-}
-
-#[derive(Clone,Copy)]
-struct RPRInfo {
- present: bool,
- bits: u8,
- widths: [usize; 8],
- heights: [usize; 8],
-}
-
-struct RealVideo20Decoder {
- info: Rc<NACodecInfo>,
- dec: H263BaseDecoder,
- tables: Tables,
- w: usize,
- h: usize,
- minor_ver: u8,
- rpr: RPRInfo,
- bdsp: H263BlockDSP,
-}
-
-struct RealVideo20BR<'a> {
- br: BitReader<'a>,
- tables: &'a Tables,
- num_slices: usize,
- slice_no: usize,
- slice_off: Vec<u32>,
- w: usize,
- h: usize,
- mb_w: usize,
- mb_h: usize,
- mb_pos_bits: u8,
- minor_ver: u8,
- rpr: RPRInfo,
-}
-
-struct RV20SliceInfo {
- ftype: Type,
- seq: u32,
- qscale: u8,
- mb_x: usize,
- mb_y: usize,
- mb_pos: usize,
- w: usize,
- h: usize,
-}
-
-impl RV20SliceInfo {
- fn new(ftype: Type, seq: u32, qscale: u8, mb_x: usize, mb_y: usize, mb_pos: usize, w: usize, h: usize) -> Self {
- RV20SliceInfo { ftype: ftype, seq: seq, qscale: qscale, mb_x: mb_x, mb_y: mb_y, mb_pos: mb_pos, w: w, h: h }
- }
-}
-
-impl<'a> RealVideo20BR<'a> {
- fn new(src: &'a [u8], tables: &'a Tables, width: usize, height: usize, minor_ver: u8, rpr: RPRInfo) -> Self {
- let nslices = (src[0] as usize) + 1;
- let mut slice_offs = Vec::with_capacity(nslices);
- {
- let offs = &src[1..][..nslices * 8];
- let mut br = BitReader::new(offs, offs.len(), BitReaderMode::BE);
- for _ in 0..nslices {
- br.skip(32).unwrap();
- let off = br.read(32).unwrap();
- slice_offs.push(off);
- }
- }
- let soff = nslices * 8 + 1;
- let mb_w = (width + 15) >> 4;
- let mb_h = (height + 15) >> 4;
- let max_pos = mb_w * mb_h - 1;
- let mut mbpb = 0;
- for i in 0..H263_MBB.len() {
- if max_pos <= H263_MBB[i].blocks {
- mbpb = H263_MBB[i].bits;
- break;
- }
- }
- RealVideo20BR {
- br: BitReader::new(&src[soff..], src.len() - soff, BitReaderMode::BE),
- tables: tables,
- num_slices: nslices,
- slice_no: 0,
- slice_off: slice_offs,
- w: width,
- h: height,
- mb_w: mb_w,
- mb_h: mb_h,
- mb_pos_bits: mbpb,
- minor_ver: minor_ver,
- rpr: rpr,
- }
- }
-
-#[allow(unused_variables)]
- fn decode_block(&mut self, sstate: &SliceState, quant: u8, intra: bool, coded: bool, blk: &mut [i16; 64], plane_no: usize, acpred: ACPredMode) -> DecoderResult<()> {
- let br = &mut self.br;
- let mut idx = 0;
- if !sstate.is_iframe && intra {
- let mut dc = br.read(8)? as i16;
- if dc == 255 { dc = 128; }
- blk[0] = dc << 3;
- idx = 1;
- }
- if !coded { return Ok(()); }
- let scan = match acpred {
- ACPredMode::Hor => H263_SCAN_V,
- ACPredMode::Ver => H263_SCAN_H,
- _ => H263_ZIGZAG,
- };
-
- let rl_cb = if sstate.is_iframe { &self.tables.aic_rl_cb } else { &self.tables.rl_cb };
- let q_add = if quant == 0 || sstate.is_iframe { 0i16 } else { ((quant - 1) | 1) as i16 };
- let q = if plane_no == 0 { (quant * 2) as i16 } else { H263_CHROMA_QUANT[quant as usize] as i16 };
- while idx < 64 {
- let code = br.read_cb(rl_cb)?;
- let run;
- let mut level;
- let last;
- if !code.is_escape() {
- run = code.get_run();
- level = code.get_level();
- last = code.is_last();
- if br.read_bool()? { level = -level; }
- level = (level * q) + q_add;
- } else {
- last = br.read_bool()?;
- run = br.read(6)? as u8;
- level = br.read_s(8)? as i16;
- if level == -128 {
- let low = br.read(5)? as i16;
- let top = br.read_s(6)? as i16;
- level = (top << 5) | low;
- }
- level = (level * q) + q_add;
- if level < -2048 { level = -2048; }
- if level > 2047 { level = 2047; }
- }
- idx += run;
- validate!(idx < 64);
- let oidx = scan[idx as usize];
- blk[oidx] = level;
- idx += 1;
- if last { break; }
- }
- Ok(())
- }
-}
-
-fn decode_mv_component(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<i16> {
- let code = br.read_cb(mv_cb)? as i16;
- if code == 0 { return Ok(0) }
- if !br.read_bool()? {
- Ok(code)
- } else {
- Ok(-code)
- }
-}
-
-fn decode_mv(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<MV> {
- let xval = decode_mv_component(br, mv_cb)?;
- let yval = decode_mv_component(br, mv_cb)?;
- Ok(MV::new(xval, yval))
-}
-
-fn read_dquant(br: &mut BitReader, q: u8) -> DecoderResult<u8> {
- if br.read_bool()? {
- Ok(H263_MODIFIED_QUANT[br.read(1)? as usize][q as usize])
- } else {
- Ok(br.read(5)? as u8)
- }
-}
-
-impl<'a> BlockDecoder for RealVideo20BR<'a> {
-
-#[allow(unused_variables)]
- fn decode_pichdr(&mut self) -> DecoderResult<PicInfo> {
- self.slice_no = 0;
- let shdr = self.read_slice_header()?;
-// self.slice_no += 1;
- validate!((shdr.mb_x == 0) && (shdr.mb_y == 0));
-/* let mb_count;
- if self.slice_no < self.num_slices {
- let pos = self.br.tell();
- let shdr2 = self.read_slice_header()?;
- self.br.seek(pos as u32)?;
- mb_count = shdr2.mb_pos - shdr.mb_pos;
- } else {
- mb_count = self.mb_w * self.mb_h;
- }*/
-
- let plusinfo = Some(PlusInfo::new(shdr.ftype == Type::I, false, false, false));
- let picinfo = PicInfo::new(shdr.w, shdr.h, shdr.ftype, MVMode::Long, false, false, shdr.qscale, shdr.seq as u16, None, plusinfo);
- Ok(picinfo)
- }
-
- #[allow(unused_variables)]
- fn decode_slice_header(&mut self, info: &PicInfo) -> DecoderResult<SliceInfo> {
- let shdr = self.read_slice_header()?;
- self.slice_no += 1;
- let mb_count;
- if self.slice_no < self.num_slices {
- let pos = self.br.tell();
- let shdr2 = self.read_slice_header()?;
- mb_count = shdr2.mb_pos - shdr.mb_pos;
- self.br.seek(pos as u32)?;
- } else {
- mb_count = self.mb_w * self.mb_h - shdr.mb_pos;
- }
- let ret = SliceInfo::new(shdr.mb_x, shdr.mb_y, shdr.mb_pos + mb_count, shdr.qscale);
-
- Ok(ret)
- }
-
- fn decode_block_header(&mut self, info: &PicInfo, _slice: &SliceInfo, sstate: &SliceState) -> DecoderResult<BlockInfo> {
- let br = &mut self.br;
- let mut q = sstate.quant;
- match info.get_mode() {
- Type::I => {
- let mut cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?;
- while cbpc == 8 { cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; }
- let mut acpred = ACPredMode::None;
- if let Some(ref pi) = info.plusinfo {
- if pi.aic {
- let acpp = br.read_bool()?;
- acpred = ACPredMode::DC;
- if acpp {
- acpred = if br.read_bool()? { ACPredMode::Hor } else { ACPredMode::Ver };
- }
- }
- }
- let cbpy = br.read_cb(&self.tables.cbpy_cb)?;
- let cbp = (cbpy << 2) | (cbpc & 3);
- let dquant = (cbpc & 4) != 0;
- if dquant {
- q = read_dquant(br, q)?;
- }
- let mut binfo = BlockInfo::new(Type::I, cbp, q);
- binfo.set_acpred(acpred);
- Ok(binfo)
- },
- Type::P => {
- if br.read_bool()? {
- return Ok(BlockInfo::new(Type::Skip, 0, info.get_quant()));
- }
- let mut cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?;
- while cbpc == 20 { cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; }
- let is_intra = (cbpc & 0x04) != 0;
- let dquant = (cbpc & 0x08) != 0;
- let is_4x4 = (cbpc & 0x10) != 0;
- if is_intra {
- let cbpy = br.read_cb(&self.tables.cbpy_cb)?;
- let cbp = (cbpy << 2) | (cbpc & 3);
- if dquant {
- q = read_dquant(br, q)?;
- }
- let binfo = BlockInfo::new(Type::I, cbp, q);
- return Ok(binfo);
- }
-
- let mut cbpy = br.read_cb(&self.tables.cbpy_cb)?;
-// if /* !aiv && */(cbpc & 3) != 3 {
- cbpy ^= 0xF;
-// }
- let cbp = (cbpy << 2) | (cbpc & 3);
- if dquant {
- q = read_dquant(br, q)?;
- }
- let mut binfo = BlockInfo::new(Type::P, cbp, q);
- if !is_4x4 {
- let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?];
- binfo.set_mv(&mvec);
- } else {
- let mvec: [MV; 4] = [
- decode_mv(br, &self.tables.mv_cb)?,
- decode_mv(br, &self.tables.mv_cb)?,
- decode_mv(br, &self.tables.mv_cb)?,
- decode_mv(br, &self.tables.mv_cb)?
- ];
- binfo.set_mv(&mvec);
- }
- Ok(binfo)
- },
- Type::B => { // B
- let mut mbtype = br.read_cb(&self.tables.mbtype_b_cb)? as usize;
- while mbtype == 14 { mbtype = br.read_cb(&self.tables.mbtype_b_cb)? as usize; }
-
- let is_coded = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_CODED) != 0;
- let is_intra = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_INTRA) != 0;
- let dquant = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_DQUANT) != 0;
- let is_fwd = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_FORWARD) != 0;
- let is_bwd = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_BACKWARD) != 0;
-
- let cbp = if is_coded {
- let cbpc = br.read_cb(&self.tables.cbpc_b_cb)?;
- let mut cbpy = br.read_cb(&self.tables.cbpy_cb)?;
- if !is_intra { cbpy ^= 0xF; }
- (cbpy << 2) | (cbpc & 3)
- } else { 0 };
-
- if dquant {
- q = read_dquant(br, q)?;
- }
-
- if is_intra {
- let binfo = BlockInfo::new(Type::I, cbp, q);
- return Ok(binfo);
- }
-
- let mut binfo = BlockInfo::new(Type::B, cbp, q);
- if is_fwd {
- let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?];
- binfo.set_mv(&mvec);
- }
- if is_bwd {
- let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?];
- binfo.set_b_mv(&mvec);
- }
- Ok(binfo)
- },
- _ => { unreachable!(); },
- }
- }
-
- fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> {
- self.decode_block(sstate, quant, true, coded, blk, if no < 4 { 0 } else { no - 3 }, info.get_acpred())
- }
-
- #[allow(unused_variables)]
- fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> {
- self.decode_block(sstate, quant, false, coded, blk, if no < 4 { 0 } else { no - 3 }, ACPredMode::None)
- }
-
- fn is_slice_end(&mut self) -> bool { false }
-}
-
-impl<'a> RealVideo20BR<'a> {
-#[allow(unused_variables)]
- fn read_slice_header(&mut self) -> DecoderResult<RV20SliceInfo> {
- validate!(self.slice_no < self.num_slices);
-
- let br = &mut self.br;
- br.seek(self.slice_off[self.slice_no] * 8)?;
-
- let frm_type = br.read(2)?;
- let ftype = match frm_type {
- 0 | 1 => { Type::I },
- 2 => { Type::P },
- _ => { Type::B },
- };
-
- let marker = br.read(1)?;
- validate!(marker == 0);
- let qscale = br.read(5)? as u8;
- validate!(qscale > 0);
- if self.minor_ver >= 2 {
- br.skip(1)?; // loop filter
- }
- let seq = if self.minor_ver <= 1 {
- br.read(8)? << 8
- } else {
- br.read(13)? << 3
- };
- let w;
- let h;
- if self.rpr.present {
- let rpr = br.read(self.rpr.bits)? as usize;
- if rpr == 0 {
- w = self.w;
- h = self.h;
- } else {
- w = self.rpr.widths[rpr - 1];
- h = self.rpr.heights[rpr - 1];
- validate!((w != 0) && (h != 0));
- }
- } else {
- w = self.w;
- h = self.h;
- }
-
- let mb_pos = br.read(self.mb_pos_bits)? as usize;
- let mb_x = mb_pos % self.mb_w;
- let mb_y = mb_pos / self.mb_w;
-
- br.skip(1)?; // no rounding
-
- if (self.minor_ver <= 1) && (frm_type == 3) {
- br.skip(5)?;
- }
-
- Ok(RV20SliceInfo::new(ftype, seq, qscale, mb_x, mb_y, mb_pos, w, h))
- }
-}
-
-impl RealVideo20Decoder {
- fn new() -> Self {
- let mut coderead = H263ShortCodeReader::new(H263_INTRA_MCBPC);
- let intra_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_INTER_MCBPC);
- let inter_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_MBTYPE_B);
- let mbtype_b_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_CBPY);
- let cbpy_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_CBPC_B);
- let cbpc_b_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263RLCodeReader::new(H263_RL_CODES);
- let rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263RLCodeReader::new(H263_RL_CODES_AIC);
- let aic_rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = H263ShortCodeReader::new(H263_MV);
- let mv_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
-
- let tables = Tables {
- intra_mcbpc_cb: intra_mcbpc_cb,
- inter_mcbpc_cb: inter_mcbpc_cb,
- mbtype_b_cb: mbtype_b_cb,
- cbpy_cb: cbpy_cb,
- cbpc_b_cb: cbpc_b_cb,
- rl_cb: rl_cb,
- aic_rl_cb: aic_rl_cb,
- mv_cb: mv_cb,
- };
-
- RealVideo20Decoder{
- info: Rc::new(DUMMY_CODEC_INFO),
- dec: H263BaseDecoder::new_b_frames(false),
- tables: tables,
- w: 0,
- h: 0,
- minor_ver: 0,
- rpr: RPRInfo { present: false, bits: 0, widths: [0; 8], heights: [0; 8] },
- bdsp: H263BlockDSP::new(),
- }
- }
-}
-
-impl NADecoder for RealVideo20Decoder {
-#[allow(unused_variables)]
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- let fmt = formats::YUV420_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
- self.w = w;
- self.h = h;
-
- let edata = info.get_extradata().unwrap();
- let src: &[u8] = &edata;
- let ver = ((src[4] as u32) << 12) | ((src[5] as u32) << 4) | ((src[6] as u32) >> 4);
- let maj_ver = ver >> 16;
- let min_ver = (ver >> 8) & 0xFF;
- let mic_ver = ver & 0xFF;
- validate!(maj_ver == 2);
- self.minor_ver = min_ver as u8;
- let rprb = src[1] & 7;
- if rprb == 0 {
- self.rpr.present = false;
- } else {
- self.rpr.present = true;
- self.rpr.bits = ((rprb >> 1) + 1) as u8;
- for i in 4..(src.len()/2) {
- self.rpr.widths [i - 4] = (src[i * 2] as usize) * 4;
- self.rpr.heights[i - 4] = (src[i * 2 + 1] as usize) * 4;
- }
- }
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
-
- let mut ibr = RealVideo20BR::new(&src, &self.tables, self.w, self.h, self.minor_ver, self.rpr);
-
- let bufinfo = self.dec.parse_frame(&mut ibr, &self.bdsp)?;
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(self.dec.is_intra());
- frm.set_frame_type(self.dec.get_frame_type());
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-struct MBB { blocks: usize, bits: u8 }
-const H263_MBB: &[MBB; 7] = &[
- MBB{ blocks: 47, bits: 6 },
- MBB{ blocks: 98, bits: 7 },
- MBB{ blocks: 395, bits: 9 },
- MBB{ blocks: 1583, bits: 11 },
- MBB{ blocks: 6335, bits: 13 },
- MBB{ blocks: 9215, bits: 14 },
- MBB{ blocks: 65536, bits: 14 },
-];
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(RealVideo20Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_rv20() {
- test_file_decoding("realmedia", "assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm", /*None*/Some(3000), true, false, None/*Some("rv20")*/);
-// test_file_decoding("realmedia", "assets/RV/rv20_cook_640x352_realproducer_plus_8.51.rm", /*None*/Some(1000), true, false, Some("rv20"));
- }
-}
diff --git a/src/codecs/indeo/imc.rs b/src/codecs/indeo/imc.rs
deleted file mode 100644
index f11daa9..0000000
--- a/src/codecs/indeo/imc.rs
+++ /dev/null
@@ -1,1121 +0,0 @@
-use std::mem;
-use std::ptr;
-use std::f32::consts;
-
-use crate::formats::*;
-use crate::frame::*;
-use super::super::*;
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use crate::dsp::fft::*;
-use crate::dsp::window::*;
-
-const BANDS: usize = 32;
-const COEFFS: usize = 256;
-const BLOCK_SIZE: usize = 64;
-
-struct IMDCTContext {
- pretwiddle1: [f32; COEFFS/2],
- pretwiddle2: [f32; COEFFS/2],
- posttwiddle: [FFTComplex; COEFFS/2],
- tmp: [FFTComplex; COEFFS/2],
- fft: FFT,
- window: [f32; COEFFS],
-}
-
-struct IMCChannel {
- old_floor: [f32; BANDS],
- new_floor: [f32; BANDS],
- log_floor: [f32; BANDS],
- log_floor2: [f32; BANDS],
- bit_est: [f32; BANDS],
- mask_wght: [f32; BANDS],
- adj_floor: [f32; BANDS],
- cw: [f32; COEFFS],
- last_im: [f32; COEFFS/2],
-}
-
-struct BitAlloc {
- band_width: [usize; BANDS],
- band_present: [bool; BANDS],
- band_skip: [bool; BANDS],
- band_bits: [u8; BANDS],
- cw_len: [u8; COEFFS],
- band_bitsum: [usize; BANDS],
- skip_flag: [bool; COEFFS],
- skip_flag_bits: [u8; BANDS],
- skips_per_band: [usize; BANDS],
- keep_flag: [bool; BANDS],
- coeff: [u8; COEFFS],
-}
-
-impl IMCChannel {
- fn new() -> Self {
- IMCChannel {
- old_floor: [0.0; BANDS],
- new_floor: [0.0; BANDS],
- log_floor: [0.0; BANDS],
- log_floor2: [0.0; BANDS],
- bit_est: [0.0; BANDS],
- mask_wght: [0.0; BANDS],
- adj_floor: [0.0; BANDS],
- cw: [0.0; COEFFS],
- last_im: [0.0; COEFFS/2],
- }
- }
- fn reset(&mut self) {
- for i in 0..self.old_floor.len() { self.old_floor[i] = 1.0; }
- for i in 0..self.cw.len() { self.cw[i] = 0.0; }
- }
-}
-
-const BITALLOC_LIMIT: f32 = -1.0e20;
-const BITALLOC_TOP_LIMIT: f32 = 1.0e20;
-impl BitAlloc {
- fn new() -> Self {
- BitAlloc {
- band_width: [0; BANDS],
- band_present: [false; BANDS],
- band_skip: [false; BANDS],
- band_bits: [0; BANDS],
- cw_len: [0; COEFFS],
- band_bitsum: [0; BANDS],
- skip_flag: [false; COEFFS],
- skip_flag_bits: [0; BANDS],
- skips_per_band: [0; BANDS],
- keep_flag: [false; BANDS],
- coeff: [0; COEFFS],
- }
- }
- fn reset(&mut self) {
- for i in 0..BANDS {
- self.band_width[i] = 0;
- self.band_present[i] = false;
- self.band_skip[i] = false;
- self.band_bits[i] = 0;
- self.keep_flag[i] = false;
- self.band_bitsum[i] = 0;
- self.skips_per_band[i] = 0;
- self.skip_flag_bits[i] = 0;
- }
- for i in 0..COEFFS {
- self.cw_len[i] = 0;
- self.skip_flag[i] = false;
- }
- }
- fn calculate_bit_allocation(&mut self, ch_data: &mut IMCChannel, bits: usize, fixed_head: bool, adj_idx: usize) -> DecoderResult<()> {
-
- let mut peak = 0.0;
- for coef in ch_data.new_floor.iter() { if *coef > peak { peak = *coef; } }
- peak *= 0.25;
-
- for band in 0..BANDS-1 {
- ch_data.bit_est[band] = ch_data.log_floor2[band] - ch_data.mask_wght[band].log2();
- }
- ch_data.bit_est[BANDS - 1] = BITALLOC_LIMIT;
-
- for band in 0..BANDS {
- let mut idx = 42;
- let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
- if band_w == self.band_width[band] { idx = 0; }
- if band_w > self.band_width[band] { idx = 1; }
- if band_w/2 >= self.band_width[band] { idx = 2; }
- validate!(idx <= 2);
- idx *= 2;
- if ch_data.new_floor[band] < peak { idx += 1; }
- ch_data.bit_est[band] += IMC_BITALLOC_ADJ[adj_idx][idx];
- }
-
- if fixed_head {
- for i in 0..4 {
- ch_data.bit_est[i] = BITALLOC_LIMIT;
- }
- }
-
- let start = if fixed_head { 4 } else { 0 };
-
- let mut a_width = 0;
- let mut pool = 0.0;
- for band in start..BANDS-1 {
- a_width += self.band_width[band];
- pool += (self.band_width[band] as f32) * ch_data.bit_est[band];
- }
- validate!(a_width > 0);
-
- self.band_width[BANDS - 1] = 0;
- pool = (pool * 0.5 - (bits as f32)) / (a_width as f32);
-
- let free_bits = bits as i32;
- let mut cur_bits: i32 = 0;
- let mut flag = 1;
- let mut mmcount = 0;
- for i in 0..BANDS/2 {
- let diff = cur_bits - free_bits;
- if diff.abs() <= 8 { break; }
-
- cur_bits = 0;
- let mut acc = 0;
- for band in start..BANDS {
- let mut len = (ch_data.bit_est[band] * 0.5 - pool + 0.5) as i32;
- if len < 0 { len = 0; }
- if len > 6 { len = 6; }
- self.band_bits[band] = len as u8;
- cur_bits += (self.band_width[band] as i32) * (len as i32);
- if len > 0 {
- acc += self.band_width[band] as i32;
- }
- }
-
- let mut lflag = flag;
- flag = 1;
- if free_bits < cur_bits { flag = -1; }
- if i == 0 { lflag = flag; }
- if flag != lflag {
- mmcount += 1;
- }
- pool += ((cur_bits - free_bits) as f32) / (((mmcount + 1) * acc) as f32);
- }
-
- for band in start..BANDS {
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- self.cw_len[i] = self.band_bits[band];
- }
- }
-
- if free_bits > cur_bits {
- let mut tmp: [f32; BANDS] = [BITALLOC_LIMIT; BANDS];
- for band in 0..BANDS {
- if self.band_bits[band] != 6 {
- tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.bit_est[band] - 0.415;
- }
- }
- let mut peak = 0.0;
- while (peak > BITALLOC_LIMIT) && (cur_bits < free_bits) {
- peak = BITALLOC_LIMIT;
- let mut idx: Option<usize> = None;
- for band in 0..BANDS {
- if tmp[band] > peak {
- peak = tmp[band];
- idx = Some(band);
- }
- }
- if let Some(band) = idx {
- tmp[band] -= 2.0;
- self.band_bits[band] += 1;
- if self.band_bits[band] == 6 {
- tmp[band] = BITALLOC_LIMIT;
- }
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- self.cw_len[i] += 1;
- cur_bits += 1;
- if cur_bits >= free_bits {
- break;
- }
- }
- }
- }
- }
-
- if cur_bits > free_bits {
- let mut tmp: [f32; BANDS] = [BITALLOC_TOP_LIMIT; BANDS];
- for band in start..BANDS {
- if self.band_bits[band] != 0 {
- tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.bit_est[band] - 0.415 + 2.0;
- }
- }
- while free_bits < cur_bits {
- let mut low = BITALLOC_TOP_LIMIT;
- let mut idx = 0;
- for band in 0..BANDS {
- if tmp[band] < low {
- low = tmp[band];
- idx = band;
- }
- }
- tmp[idx] += 2.0;
- self.band_bits[idx] -= 1;
- if self.band_bits[idx] == 0 {
- tmp[idx] = BITALLOC_TOP_LIMIT;
- }
- for i in IMC_BANDS[idx]..IMC_BANDS[idx + 1] {
- if self.cw_len[i] > 0 {
- self.cw_len[i] -= 1;
- cur_bits -= 1;
- if cur_bits <= free_bits {
- break;
- }
- }
- }
- }
- }
-
- Ok(())
- }
-
- fn adjust_bit_allocation(&mut self, ch_data: &mut IMCChannel, free_bits: i32) {
- let mut tmp: [f32; BANDS] = [BITALLOC_LIMIT; BANDS];
- for band in 0..BANDS {
- if self.band_bits[band] != 6 {
- tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.bit_est[band] - 0.415;
- }
- }
- let mut used_bits: i32 = 0;
- let mut peak = 0.0;
- while (peak > BITALLOC_LIMIT) && (used_bits < free_bits) {
- peak = BITALLOC_LIMIT;
- let mut idx: Option<usize> = None;
- for band in 0..BANDS {
- if tmp[band] > peak {
- peak = tmp[band];
- idx = Some(band);
- }
- }
- if let Some(band) = idx {
- tmp[band] -= 2.0;
- self.band_bits[band] += 1;
- if self.band_bits[band] == 6 {
- tmp[band] = BITALLOC_LIMIT;
- }
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- if self.cw_len[i] >= 6 { continue; }
- self.cw_len[i] += 1;
- used_bits += 1;
- if used_bits >= free_bits {
- break;
- }
- }
- }
- }
- }
-}
-
-struct LUTs {
- exp_lev: [f32; 16],
- exp_10: [f32; 32],
- sqrt_tab: [f32; 32],
-}
-
-impl LUTs {
- fn new() -> Self {
- let mut exp_lev: [f32; 16] = [0.0; 16];
- for lev in 0..16 {
- exp_lev[lev] = 10.0f32.powf(-(lev as f32) * 0.4375);
- }
-
- let mut exp_10: [f32; 32] = [0.0; 32];
- for i in 0..32 {
- exp_10[i] = 10.0f32.powf(((i as f32) - 16.0) * 0.25);
- }
-
- let mut sqrt_tab: [f32; 32] = [0.0; 32];
- for i in 0..32 {
- sqrt_tab[i] = (i as f32).sqrt();
- }
-
- LUTs { exp_lev: exp_lev, exp_10: exp_10, sqrt_tab: sqrt_tab }
- }
-}
-
-struct IMCDecoder {
- is_imc: bool,
-
- chmap: NAChannelMap,
- ainfo: NAAudioInfo,
- info: Rc<NACodecInfo>,
-
- codes: [[Codebook<u8>; 4]; 4],
- ch_data: [IMCChannel; 2],
- ba: BitAlloc,
- imdct: IMDCTContext,
-
- cycle1: [usize; BANDS],
- cycle2: [usize; BANDS],
- weights1: [f32; BANDS-1],
- weights2: [f32; BANDS-1],
-
- luts: LUTs,
-}
-
-fn freq2bark(freq: f32) -> f32 {
- 3.5 * ((freq / 7500.0) * (freq / 7500.0)).atan() + 13.0 * (freq * 0.00076).atan()
-}
-
-fn calc_maxcoef(coef: f32) -> (f32, f32) {
- let c1 = 20000.0 / 10.0f32.powf(coef * 0.057031251);
- (c1, c1.log2())
-}
-
-impl IMCDecoder {
- fn new(is_imc: bool) -> Self {
- let mut codes: [[Codebook<u8>; 4]; 4];
- let mut cycle1: [usize; BANDS] = [0; BANDS];
- let mut cycle2: [usize; BANDS] = [0; BANDS];
- let mut weights1: [f32; BANDS-1] = [0.0; BANDS-1];
- let mut weights2: [f32; BANDS-1] = [0.0; BANDS-1];
- if is_imc {
- cycle1.copy_from_slice(&IMC_CYCLE1);
- cycle2.copy_from_slice(&IMC_CYCLE2);
- weights1.copy_from_slice(&IMC_WEIGHTS1);
- weights2.copy_from_slice(&IMC_WEIGHTS2);
- }
- unsafe {
- codes = mem::uninitialized();
- for i in 0..4 {
- for j in 0..4 {
- let mut cr = IMCCodeReader::new(i, j);
- ptr::write(&mut codes[i][j], Codebook::new(&mut cr, CodebookMode::MSB).unwrap());
- }
- }
- }
- IMCDecoder {
- is_imc: is_imc,
- chmap: NAChannelMap::new(),
- ainfo: NAAudioInfo::new(0, 0, SND_F32P_FORMAT, 0),
- info: NACodecInfo::new_dummy(),
-
- codes: codes,
- ch_data: [IMCChannel::new(), IMCChannel::new()],
- ba: BitAlloc::new(),
- imdct: IMDCTContext::new(),
- luts: LUTs::new(),
-
- cycle1: cycle1,
- cycle2: cycle2,
- weights1: weights1,
- weights2: weights2,
- }
- }
-
- fn generate_iac_tables(&mut self, sample_rate: f32) {
- let scale = sample_rate / 256.0 / 2.0 * 0.5;
- let nyq_freq = sample_rate / 2.0;
- let mut last_bark = 0.0;
- let mut freq_max: [f32; BANDS] = [0.0; BANDS];
- let mut freq_mid: [f32; BANDS] = [0.0; BANDS];
- let mut freq_min: [f32; BANDS] = [0.0; BANDS];
- for band in 0..BANDS {
- let freq = ((IMC_BANDS[band] + IMC_BANDS[band + 1] - 1) as f32) * scale;
- let bark = freq2bark(freq);
- if band > 0 {
- let bark_diff = bark - last_bark;
- self.weights1[band - 1] = 10.0f32.powf(-1.0 * bark_diff);
- self.weights2[band - 1] = 10.0f32.powf(-2.7 * bark_diff);
- }
- last_bark = bark;
- freq_mid[band] = freq;
-
- let mut tmp_freq = freq;
- while tmp_freq < nyq_freq {
- tmp_freq += 0.5;
- if freq2bark(tmp_freq) > bark + 0.5 { break; }
- }
- freq_max[band] = tmp_freq;
-
- let mut tmp_freq = freq;
- while tmp_freq > 0.0 {
- tmp_freq -= 0.5;
- if freq2bark(tmp_freq) < bark - 0.5 { break; }
- }
- freq_min[band] = tmp_freq;
- }
-
- for band in 0..BANDS {
- let mut s_band = BANDS - 1;
- while s_band > 0 && freq_max[band] <= freq_mid[s_band] { s_band -= 1; }
- self.cycle1[band] = s_band + 1;
- }
-
- self.cycle2[0] = 0;
- for band in 1..BANDS {
- let mut s_band = 0;
- while s_band < BANDS-1 && freq_min[band] >= freq_mid[s_band] { s_band += 1; }
- self.cycle2[band] = s_band - 1;
- }
- }
-
- fn read_level_coeffs_raw(&mut self, br: &mut BitReader, ch: usize) -> DecoderResult<()> {
- let ch_data = &mut self.ch_data[ch];
- let maxc_pos = br.read(5)? as usize;
- let max_coef = br.read(7)? as u8;
-
- let (c1, c2) = calc_maxcoef(max_coef as f32);
- for i in 0..BANDS {
- if i != maxc_pos {
- let level = br.read(4)?;
- ch_data.new_floor[i] = c1 * self.luts.exp_lev[level as usize];
- ch_data.log_floor[i] = c2 - 1.4533435415 * (level as f32);
- } else {
- ch_data.new_floor[i] = c1;
- ch_data.log_floor[i] = c2;
- }
- self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i];
-
- ch_data.log_floor2[i] = ch_data.log_floor[i] * 2.0;
- ch_data.mask_wght[i] = 1.0;
- }
-
- Ok(())
- }
-
- fn calculate_channel_values(&mut self, ch: usize) {
- let ch_data = &mut self.ch_data[ch];
- let mut tmp2: [f32; BANDS+1] = [0.0; BANDS+1];
- let mut tmp3: [f32; BANDS] = [0.0; BANDS];
-
- for band in 0..BANDS {
- ch_data.mask_wght[band] = 0.0;
- let val;
- if self.ba.band_width[band] > 0 {
- val = (ch_data.new_floor[band] as f64).powi(2);
- ch_data.log_floor2[band] = 2.0 * ch_data.log_floor[band];
- } else {
- val = 0.0;
- ch_data.log_floor2[band] = -30000.0;
- }
- let tmp = val * (self.ba.band_width[band] as f64) * 0.01;
- if val <= 1.0e-30 { tmp3[band] = 0.0; }
- else { tmp3[band] = tmp as f32; }
- }
-
- for band in 0..BANDS {
- let next_band = self.cycle1[band];
- for band2 in band..next_band {
- ch_data.mask_wght[band2] += tmp3[band];
- }
- tmp2[next_band] += tmp3[band];
- }
-
- let mut accum = 0.0;
- for band in 1..BANDS {
- accum = (tmp2[band] + accum) * self.weights1[band - 1];
- ch_data.mask_wght[band] += accum;
- }
-
- let mut tmp2: [f32; BANDS] = [0.0; BANDS];
- tmp2[0] = tmp3[0];
- for band in 1..BANDS {
- let prev_band = self.cycle2[band];
- for band2 in prev_band+1..band {
- ch_data.mask_wght[band2] += tmp3[band];
- }
- tmp2[prev_band + 1] += tmp3[band];
- }
-
- let mut accum = 0.0;
- for i in 0..BANDS-1 {
- let band = BANDS - 2 - i;
- accum = (tmp2[band + 1] + accum) * self.weights2[band];
- ch_data.mask_wght[band] += accum;
- }
- }
-
- fn read_level_coeffs(&mut self, br: &mut BitReader, reset: bool, sel_idx: usize, ch: usize) -> DecoderResult<()> {
- let mut level: [i8; BANDS] = [0; BANDS];
- let start;
- if reset {
- start = 1;
- level[0] = br.read(7)? as i8;
- } else {
- start = 0;
- }
- for i in start..BANDS {
- level[i] = br.read_cb(&self.codes[sel_idx][IMC_CB_SELECTOR[sel_idx][i]])? as i8;
- if level[i] == 17 {
- level[i] += br.read(4)? as i8;
- }
- self.ba.keep_flag[i] = level[i] == 16;
- }
- if reset {
- let ch_data = &mut self.ch_data[ch];
- let (mut c1, mut c2) = calc_maxcoef(level[0] as f32);
- ch_data.new_floor[0] = c1;
- ch_data.log_floor[0] = c2;
- for i in 1..BANDS {
- if level[i] == 16 {
- ch_data.new_floor[i] = 1.0;
- ch_data.log_floor[i] = 0.0;
- } else {
- let lval;
- if level[i] < 17 {
- lval = level[i] - 7;
- } else if level[i] < 25 {
- lval = level[i] - 32;
- } else {
- lval = level[i] - 16;
- }
- c1 *= self.luts.exp_10[(lval + 16) as usize];
- c2 += 0.83048 * (lval as f32);
- ch_data.new_floor[i] = c1;
- ch_data.log_floor[i] = c2;
- }
- }
- } else {
- let ch_data = &mut self.ch_data[ch];
- for i in 0..BANDS {
- if level[i] < 16 {
- let lval = level[i] - 7;
- ch_data.new_floor[i] = self.luts.exp_10[(lval + 16) as usize] * ch_data.old_floor[i];
- ch_data.log_floor[i] += (lval as f32) * 0.83048;
- } else {
- ch_data.new_floor[i] = ch_data.old_floor[i];
- }
- }
- }
-
- self.ba.band_width[0] = IMC_BANDS[1] - IMC_BANDS[0];
- for i in 1..BANDS {
- if level[i] != 16 {
- self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i];
- } else {
- self.ba.band_width[i] = 0;
- }
- }
-
- for i in 0..BANDS-1 {
- if self.ba.band_width[i] > 0 {
- self.ba.band_present[i] = br.read_bool()?;
- }
- }
- self.calculate_channel_values(ch);
-
- Ok(())
- }
-
- fn read_skip_flags(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- let ba = &mut self.ba;
- for band in 0..BANDS {
- if !ba.band_present[band] || ba.band_width[band] == 0 { continue; }
-
- if !ba.band_skip[band] {
- ba.skip_flag_bits[band] = (IMC_BANDS[band + 1] - IMC_BANDS[band]) as u8;
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- ba.skip_flag[i] = br.read_bool()?;
- if ba.skip_flag[i] {
- ba.skips_per_band[band] += 1;
- }
- }
- } else {
- let mut i = IMC_BANDS[band];
- while i < IMC_BANDS[band + 1] - 1 {
- if !br.read_bool()? {
- ba.skip_flag_bits[band] += 1;
- ba.skip_flag[i] = true;
- ba.skip_flag[i + 1] = true;
- ba.skips_per_band[band] += 2;
- } else {
- if br.read_bool()? {
- ba.skip_flag_bits[band] += 2;
- ba.skip_flag[i] = false;
- ba.skip_flag[i + 1] = true;
- ba.skips_per_band[band] += 1;
- } else {
- ba.skip_flag_bits[band] += 3;
- if !br.read_bool()? {
- ba.skip_flag[i] = true;
- ba.skips_per_band[band] += 1;
- } else {
- ba.skip_flag[i] = false;
- }
- ba.skip_flag[i + 1] = false;
- }
- }
- i += 2;
- }
- if i != IMC_BANDS[band + 1] {
- ba.skip_flag_bits[band] += 1;
- ba.skip_flag[i] = br.read_bool()?;
- if ba.skip_flag[i] {
- ba.skips_per_band[band] += 1;
- }
- }
- }
- }
- Ok(())
- }
-
- fn read_bitalloc_delta(&mut self, br: &mut BitReader, ch: usize) -> DecoderResult<()> {
- for band in 0..BANDS {
- self.ba.band_bitsum[band] = 0;
- self.ba.band_skip[band] = false;
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- self.ba.band_bitsum[band] += self.ba.cw_len[i] as usize;
- }
- if self.ba.band_present[band] {
- let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
- let bitsum = self.ba.band_bitsum[band] as usize;
- if (bitsum > 0) && (((band_w * 3) >> 1) > bitsum) {
- self.ba.band_skip[band] = true;
- }
- }
- }
-
- self.read_skip_flags(br)?;
-
- let mut ch_data = &mut self.ch_data[ch];
- for band in 0..BANDS {
- ch_data.adj_floor[band] = ch_data.new_floor[band];
- let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
- let nonskip = band_w - self.ba.skips_per_band[band];
- if self.ba.band_present[band] && nonskip > 0 {
- ch_data.adj_floor[band] *= self.luts.sqrt_tab[band_w] / self.luts.sqrt_tab[nonskip];
- }
- }
-
- let mut bits_freed: i32 = 0;
- for band in 0..BANDS {
- if !self.ba.band_present[band] { continue; }
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- if self.ba.skip_flag[i] {
- bits_freed += self.ba.cw_len[i] as i32;
- self.ba.cw_len[i] = 0;
- }
- }
- bits_freed -= self.ba.skip_flag_bits[band] as i32;
- }
-
- if bits_freed < 0 { return Err(DecoderError::Bug); }
- self.ba.adjust_bit_allocation(&mut ch_data, bits_freed);
-
- Ok(())
- }
-
- fn read_coeffs(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- for band in 0..BANDS {
- if self.ba.band_bitsum[band] == 0 { continue; }
- if !self.ba.band_present[band] && (self.ba.band_width[band] == 0) { continue; }
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- let len = self.ba.cw_len[i];
- if len > 0 && (!self.ba.band_present[band] || !self.ba.skip_flag[i]) {
- self.ba.coeff[i] = br.read(len)? as u8;
- } else {
- self.ba.coeff[i] = 0;
- }
- }
- }
- Ok(())
- }
-
- fn inv_quant(&mut self, ch: usize, raw_coeffs: bool) {
- let qidx: usize = if raw_coeffs { 1 } else { 0 };
- let ch_data = &mut self.ch_data[ch];
- for band in 0..BANDS {
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- ch_data.cw[i] = 0.0;
- let cw_len = self.ba.cw_len[i];
- if cw_len == 0 || self.ba.skip_flag[i] { continue; }
-
- let val = self.ba.coeff[i] as usize;
- let mid = 1 << (cw_len - 1);
- let max = (1 << cw_len) - 1;
- if cw_len >= 4 {
- let quant = &IMC_QUANT_LARGE[qidx];
- if val >= mid {
- ch_data.cw[i] = quant[val - 8] * ch_data.adj_floor[band];
- } else {
- ch_data.cw[i] = -quant[max - val - 8] * ch_data.adj_floor[band];
- }
- } else {
- let idx = qidx + (if self.ba.band_present[band] { 2 } else { 0 });
- let quant = &IMC_QUANT_SMALL[idx];
- if val >= mid {
- ch_data.cw[i] = quant[val - 1] * ch_data.adj_floor[band];
- } else {
- ch_data.cw[i] = -quant[max - val - 1] * ch_data.adj_floor[band];
- }
- }
- }
- }
- }
-
- fn decode_block(&mut self, data: &[u8], ch: usize, dst: &mut [f32]) -> DecoderResult<()> {
- let mut br = BitReader::new(&data[BLOCK_SIZE*ch..], BLOCK_SIZE, BitReaderMode::LE16MSB);
- let hdr = br.read(9)?;
- validate!((hdr & 0x18) == 0);
-
- let reset = br.read_bool()?;
- let fixed_head = br.read_bool()?;
- let raw_coeffs = br.read_bool()?;
- let weight_idx = br.read(1)? as usize;
-
- if reset {
- self.ch_data[ch].reset();
- }
-
- self.ba.reset();
-
- if raw_coeffs {
- self.read_level_coeffs_raw(&mut br, ch)?;
- } else {
- let cb_idx = (if reset { 2 } else { 0 }) + (if fixed_head { 1 } else { 0 });
- self.read_level_coeffs(&mut br, reset, cb_idx, ch)?;
- }
-
- self.ch_data[ch].old_floor.copy_from_slice(&self.ch_data[ch].new_floor);
-
- let mut bitcount: usize = 0;
- if fixed_head {
- bitcount += 15;
- self.ba.band_bits[0] = 5;
- for i in 0..3 {
- self.ba.cw_len[i] = 5;
- }
- for band in 1..4 {
- let bits: u8;
- if raw_coeffs || !self.ba.keep_flag[band]{
- bits = 5;
- } else {
- bits = 0;
- }
- self.ba.band_bits[band] = bits;
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- self.ba.cw_len[i] = bits;
- bitcount += bits as usize;
- }
- }
- }
-
- if !self.is_imc {
- if self.ba.band_width[BANDS - 1] != 0 {
- bitcount += 1;
- }
- bitcount += 16;
- } else {
- if self.ba.band_width[BANDS - 1] != 0 {
- bitcount += 1;
- }
- }
-
- validate!(br.tell() + bitcount < BLOCK_SIZE * 8);
- self.ba.calculate_bit_allocation(&mut self.ch_data[ch], 512 - bitcount - br.tell(), fixed_head, weight_idx)?;
-
- if !raw_coeffs {
- self.read_bitalloc_delta(&mut br, ch)?;
- }
-
- for band in 0..BANDS {
- self.ba.band_bitsum[band] = 0;
- for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
- if !self.ba.skip_flag[i] {
- self.ba.band_bitsum[band] += self.ba.cw_len[i] as usize;
- }
- }
- }
-
- self.read_coeffs(&mut br)?;
- self.inv_quant(ch, raw_coeffs);
- self.imdct.imdct(&self.ch_data[ch].cw, dst, &mut self.ch_data[ch].last_im);
-
- Ok(())
- }
-}
-
-impl IMDCTContext {
- fn new() -> Self {
- let mut window: [f32; COEFFS] = [0.0; COEFFS];
- generate_window(WindowType::Sine, 1.0, COEFFS, true, &mut window);
- let mut pretwiddle1: [f32; COEFFS/2] = [0.0; COEFFS/2];
- let mut pretwiddle2: [f32; COEFFS/2] = [0.0; COEFFS/2];
- let mut posttwiddle: [FFTComplex; COEFFS/2] = [FFTC_ZERO; COEFFS/2];
- for i in 0..COEFFS/2 {
- let n = i as f32;
- let base = (n * 4.0 + 1.0) / 1024.0 * consts::PI;
- let r1 = base.sin();
- let r2 = base.cos();
- if (i & 1) == 0 {
- pretwiddle1[i] = -(r1 + r2) * consts::SQRT_2;
- pretwiddle2[i] = (r1 - r2) * consts::SQRT_2;
- } else {
- pretwiddle1[i] = (r1 + r2) * consts::SQRT_2;
- pretwiddle2[i] = -(r1 - r2) * consts::SQRT_2;
- }
- posttwiddle[i] = FFTComplex::exp(consts::PI / 256.0 * n).scale(1.0/32768.0);
- }
- IMDCTContext {
- pretwiddle1: pretwiddle1,
- pretwiddle2: pretwiddle2,
- posttwiddle: posttwiddle,
- tmp: [FFTC_ZERO; COEFFS/2],
- fft: FFTBuilder::new_fft(FFTMode::SplitRadix, COEFFS/2),
- window: window,
- }
- }
- fn imdct(&mut self, coeffs: &[f32; COEFFS], dst: &mut [f32], last_im: &mut [f32; COEFFS/2]) {
- for i in 0..COEFFS/2 {
- let in2 = coeffs[i * 2];
- let in1 = coeffs[COEFFS - 1 - i * 2];
- let c2 = self.pretwiddle1[i];
- let c1 = self.pretwiddle2[i];
- self.tmp[i].re = -(c2 * in1 + c1 * in2);
- self.tmp[i].im = c1 * in1 - c2 * in2;
- }
- self.fft.do_fft_inplace(&mut self.tmp, false);
- for i in 0..COEFFS/2 {
- let tmp = !(self.tmp[i] * self.posttwiddle[i]);
- let c1 = self.window[i * 2];
- let c2 = self.window[COEFFS - 1 - i * 2];
- let im = last_im[i];
- dst[i * 2] = c2 * im + c1 * tmp.re;
- dst[COEFFS - 1 - i * 2] = c1 * im - c2 * tmp.re;
- last_im[i] = tmp.im;
- }
- }
-}
-
-const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
-const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R];
-
-impl NADecoder for IMCDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- self.chmap = NAChannelMap::new();
- match ainfo.get_channels() {
- 1 => { self.chmap.add_channels(&CHMAP_MONO); },
- 2 => { self.chmap.add_channels(&CHMAP_STEREO); },
- _ => { return Err(DecoderError::InvalidData); },
- };
- self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(),
- ainfo.get_channels(),
- SND_F32P_FORMAT, 0);
- self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone()));
-
- if !self.is_imc {
- self.generate_iac_tables(ainfo.get_sample_rate() as f32);
- }
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
-
- let nblocks = pktbuf.len() / BLOCK_SIZE / (self.ainfo.get_channels() as usize);
- let duration = COEFFS * nblocks;
-
- let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?;
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut dst = adata.get_data_mut();
-
- let mut start: usize = 0;
- let channels = self.ainfo.get_channels() as usize;
- for chunk in pktbuf.chunks(BLOCK_SIZE * channels) {
- for ch in 0..channels {
- let off = abuf.get_offset(ch as usize) + start;
- self.decode_block(chunk, ch as usize, &mut dst[off..off+COEFFS])?;
- }
- if (channels == 2) && ((chunk[1] & 0x20) != 0) {
- let off1 = abuf.get_offset(0) + start;
- let off2 = abuf.get_offset(1) + start;
- for i in 0..COEFFS {
- let l = dst[off1 + i];
- let r = dst[off2 + i];
- dst[off1 + i] = l + r;
- dst[off2 + i] = l - r;
- }
- }
- start += COEFFS;
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder_imc() -> Box<NADecoder> {
- Box::new(IMCDecoder::new(true))
-}
-
-pub fn get_decoder_iac() -> Box<NADecoder> {
- Box::new(IMCDecoder::new(false))
-}
-
-struct IMCCodeReader { sel1: usize, sel2: usize }
-
-impl IMCCodeReader {
- fn new(sel1: usize, sel2: usize) -> Self { IMCCodeReader { sel1: sel1, sel2: sel2 } }
-}
-
-impl CodebookDescReader<u8> for IMCCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { IMC_CODE_LENGTHS[self.sel1][self.sel2][idx] }
- fn code(&mut self, idx: usize) -> u32 { IMC_CODE_CODES[self.sel1][self.sel2][idx] as u32 }
- fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
- fn len(&mut self) -> usize { IMC_CODE_LENGTHS[0][0].len() }
-}
-
-static IMC_BANDS: [usize; 33] = [
- 0, 3, 6, 9, 12, 16, 20, 24, 29, 34, 40, 46, 53, 60, 68, 76,
- 84, 93, 102, 111, 121, 131, 141, 151, 162, 173, 184, 195, 207, 219, 231, 243,
- 256,
-];
-
-const IMC_QUANT_SMALL: &[[f32; 8]; 4] = &[
- [ 8.4431201e-1, 4.7358301e-1, 1.448354, 2.7073899e-1,
- 7.4449003e-1, 1.241991, 1.845484, 0.0 ],
- [ 8.6876702e-1, 4.7659001e-1, 1.478224, 2.5672799e-1,
- 7.55777e-1, 1.3229851, 2.03438, 0.0 ],
- [ 7.5891501e-1, 6.2272799e-1, 1.271322, 3.47904e-1,
- 7.5317699e-1, 1.150767, 1.628476, 0.0 ],
- [ 7.65257e-1, 6.44647e-1, 1.263824, 3.4548101e-1,
- 7.6384902e-1, 1.214466, 1.7638789, 0.0 ]
-];
-
-const IMC_QUANT_LARGE: &[[f32; 56]; 2] = &[
- [ 1.39236e-1, 3.50548e-1, 5.9547901e-1, 8.5772401e-1,
- 1.121545, 1.3882281, 1.695882, 2.1270809,
- 7.2221003e-2, 1.85177e-1, 2.9521701e-1, 4.12568e-1,
- 5.4068601e-1, 6.7679501e-1, 8.1196898e-1, 9.4765198e-1,
- 1.0779999, 1.203415, 1.337265, 1.481871,
- 1.639982, 1.814766, 2.0701399, 2.449862,
- 3.7533998e-2, 1.02722e-1, 1.6021401e-1, 2.16043e-1,
- 2.7231601e-1, 3.3025399e-1, 3.9022601e-1, 4.52849e-1,
- 5.1794899e-1, 5.8529502e-1, 6.53956e-1, 7.2312802e-1,
- 7.9150802e-1, 8.5891002e-1, 9.28141e-1, 9.9706203e-1,
- 1.062153, 1.12564, 1.189834, 1.256122,
- 1.324469, 1.3955311, 1.468906, 1.545084,
- 1.6264729, 1.711524, 1.802705, 1.91023,
- 2.0533991, 2.22333, 2.4830019, 3.253329 ],
- [ 1.11654e-1, 3.54469e-1, 6.4232099e-1, 9.6128798e-1,
- 1.295053, 1.61777, 1.989839, 2.51107,
- 5.7721999e-2, 1.69879e-1, 2.97589e-1, 4.3858799e-1,
- 5.9039903e-1, 7.4934798e-1, 9.1628098e-1, 1.087297,
- 1.262751, 1.4288321, 1.6040879, 1.79067,
- 2.000668, 2.2394669, 2.649332, 5.2760072,
- 2.9722e-2, 8.7316997e-2, 1.4445201e-1, 2.04247e-1,
- 2.6879501e-1, 3.3716801e-1, 4.08811e-1, 4.8306999e-1,
- 5.6049401e-1, 6.3955498e-1, 7.2044599e-1, 8.0427998e-1,
- 8.8933599e-1, 9.7537601e-1, 1.062461, 1.1510431,
- 1.240236, 1.326715, 1.412513, 1.500502,
- 1.591749, 1.686413, 1.785239, 1.891233,
- 2.0051291, 2.127681, 2.2709141, 2.475826,
- 2.7219379, 3.101985, 4.686213, 6.2287788 ]
-];
-
-static IMC_CYCLE1: [usize; BANDS] = [
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32,
-];
-
-static IMC_CYCLE2: [usize; BANDS] = [
- 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
-];
-
-static IMC_WEIGHTS1: [f32; BANDS-1] = [
- 0.119595, 0.123124, 0.129192, 9.97377e-2,
- 8.1923e-2, 9.61153e-2, 8.77885e-2, 8.61174e-2,
- 9.00882e-2, 9.91658e-2, 0.112991, 0.131126,
- 0.152886, 0.177292, 0.221782, 0.244917,
- 0.267386, 0.306816, 0.323046, 0.33729,
- 0.366773, 0.392557, 0.398076, 0.403302,
- 0.42451, 0.444777, 0.449188, 0.455445,
- 0.477853, 0.500669, 0.510395
-];
-
-static IMC_WEIGHTS2: [f32; BANDS-1] = [
- 3.23466e-3, 3.49886e-3, 3.98413e-3, 1.98116e-3,
- 1.16465e-3, 1.79283e-3, 1.40372e-3, 1.33274e-3,
- 1.50523e-3, 1.95064e-3, 2.77472e-3, 4.14725e-3,
- 6.2776e-3, 9.36401e-3, 1.71397e-2, 2.24052e-2,
- 2.83971e-2, 4.11689e-2, 4.73165e-2, 5.31631e-2,
- 6.66614e-2, 8.00824e-2, 8.31588e-2, 8.61397e-2,
- 9.89229e-2, 0.112197, 0.115227, 0.119613,
- 0.136174, 0.15445, 0.162685
-];
-
-static IMC_BITALLOC_ADJ: [[f32; 7]; 2] = [
- [ 7.6, 4.4, 6.1, 2.3, 6.2, 1.8, 0.0 ],
- [ 3.6, 3.7, 5.1, 1.6, 1.5, 1.2, 0.0 ]
-];
-
-static IMC_CODE_LENGTHS: &[[[u8; 18]; 4]; 4] = &[
- [
- [ 16, 15, 13, 11, 8, 5, 3, 1, 2, 4, 6, 9, 10, 12, 14, 16, 7, 0 ],
- [ 10, 8, 7, 6, 4, 4, 3, 2, 2, 3, 4, 6, 7, 9, 11, 11, 7, 0 ],
- [ 15, 15, 14, 11, 8, 6, 4, 2, 1, 4, 5, 7, 9, 10, 12, 13, 4, 0 ],
- [ 13, 11, 10, 8, 6, 4, 2, 2, 2, 3, 5, 7, 9, 12, 15, 15, 14, 0 ],
- ], [
- [ 14, 12, 10, 8, 7, 4, 2, 2, 2, 3, 5, 7, 9, 11, 13, 14, 7, 0 ],
- [ 14, 13, 11, 8, 6, 4, 3, 2, 2, 3, 5, 7, 9, 10, 12, 14, 3, 0 ],
- [ 13, 12, 10, 7, 5, 4, 3, 2, 2, 3, 4, 6, 8, 9, 11, 13, 4, 0 ],
- [ 13, 12, 10, 7, 5, 4, 3, 2, 2, 3, 4, 6, 8, 9, 11, 13, 4, 0 ],
- ], [
- [ 16, 14, 12, 10, 8, 5, 3, 1, 2, 4, 7, 9, 11, 13, 15, 17, 6, 17 ],
- [ 15, 13, 11, 8, 6, 4, 2, 2, 2, 3, 5, 7, 10, 12, 14, 16, 9, 16 ],
- [ 14, 12, 11, 9, 8, 6, 3, 1, 2, 5, 7, 10, 13, 15, 16, 17, 4, 17 ],
- [ 16, 14, 12, 9, 7, 5, 2, 2, 2, 3, 4, 6, 8, 11, 13, 15, 10, 16 ],
- ], [
- [ 13, 11, 10, 8, 7, 5, 2, 2, 2, 4, 6, 9, 12, 14, 15, 16, 3, 16 ],
- [ 11, 11, 10, 9, 8, 7, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 5 ],
- [ 9, 9, 7, 6, 5, 4, 3, 3, 2, 3, 4, 5, 4, 5, 5, 6, 8, 6 ],
- [ 13, 12, 10, 8, 5, 3, 3, 2, 2, 3, 4, 7, 9, 11, 14, 15, 6, 15 ]
- ]
-];
-
-static IMC_CODE_CODES: &[[[u16; 18]; 4]; 4] = &[
- [
- [ 0xCC32, 0x6618, 0x1987, 0x0660, 0x00CD, 0x0018, 0x0007, 0x0000, 0x0002,
- 0x000D, 0x0032, 0x0199, 0x0331, 0x0CC2, 0x330D, 0xCC33, 0x0067, 0x0000 ],
- [ 0x02FE, 0x00BE, 0x005E, 0x002D, 0x000A, 0x0009, 0x0003, 0x0003, 0x0000,
- 0x0002, 0x0008, 0x002C, 0x005D, 0x017E, 0x05FE, 0x05FF, 0x005C, 0x0000 ],
- [ 0x5169, 0x5168, 0x28B5, 0x0517, 0x00A3, 0x0029, 0x0008, 0x0003, 0x0000,
- 0x0009, 0x0015, 0x0050, 0x0144, 0x028A, 0x0A2C, 0x145B, 0x000B, 0x0000 ],
- [ 0x1231, 0x048D, 0x0247, 0x0090, 0x0025, 0x0008, 0x0001, 0x0003, 0x0000,
- 0x0005, 0x0013, 0x0049, 0x0122, 0x0919, 0x48C3, 0x48C2, 0x2460, 0x0000 ]
- ], [
- [ 0x2D1D, 0x0B46, 0x02D0, 0x00B5, 0x0059, 0x000A, 0x0003, 0x0001, 0x0000,
- 0x0004, 0x0017, 0x005B, 0x0169, 0x05A2, 0x168F, 0x2D1C, 0x0058, 0x0000 ],
- [ 0x1800, 0x0C01, 0x0301, 0x0061, 0x0019, 0x0007, 0x0004, 0x0003, 0x0000,
- 0x0005, 0x000D, 0x0031, 0x00C1, 0x0181, 0x0601, 0x1801, 0x0002, 0x0000 ],
- [ 0x1556, 0x0AAA, 0x02AB, 0x0054, 0x0014, 0x000B, 0x0002, 0x0003, 0x0000,
- 0x0003, 0x0008, 0x002B, 0x00AB, 0x0154, 0x0554, 0x1557, 0x0009, 0x0000 ],
- [ 0x1556, 0x0AAA, 0x02AB, 0x0054, 0x0014, 0x000B, 0x0002, 0x0003, 0x0000,
- 0x0003, 0x0008, 0x002B, 0x00AB, 0x0154, 0x0554, 0x1557, 0x0009, 0x0000 ]
- ], [
- [ 0x2993, 0x0A65, 0x0298, 0x00A7, 0x0028, 0x0004, 0x0000, 0x0001, 0x0001,
- 0x0003, 0x0015, 0x0052, 0x014D, 0x0533, 0x14C8, 0x5324, 0x000B, 0x5325 ],
- [ 0x09B8, 0x026F, 0x009A, 0x0012, 0x0005, 0x0000, 0x0001, 0x0002, 0x0003,
- 0x0001, 0x0003, 0x0008, 0x004C, 0x0136, 0x04DD, 0x1373, 0x0027, 0x1372 ],
- [ 0x0787, 0x01E0, 0x00F1, 0x003D, 0x001F, 0x0006, 0x0001, 0x0001, 0x0001,
- 0x0002, 0x000E, 0x0079, 0x03C2, 0x0F0D, 0x1E19, 0x3C30, 0x0000, 0x3C31 ],
- [ 0x4B06, 0x12C0, 0x04B1, 0x0097, 0x0024, 0x0008, 0x0002, 0x0003, 0x0000,
- 0x0003, 0x0005, 0x0013, 0x004A, 0x0259, 0x0961, 0x2582, 0x012D, 0x4B07 ]
- ], [
- [ 0x0A5A, 0x0297, 0x014A, 0x0053, 0x0028, 0x000B, 0x0003, 0x0000, 0x0002,
- 0x0004, 0x0015, 0x00A4, 0x052C, 0x14B7, 0x296C, 0x52DB, 0x0003, 0x52DA ],
- [ 0x0193, 0x0192, 0x00C8, 0x0065, 0x0033, 0x0018, 0x0007, 0x0004, 0x0000,
- 0x0004, 0x0005, 0x0007, 0x0006, 0x0003, 0x0005, 0x0005, 0x000D, 0x0004 ],
- [ 0x0012, 0x0013, 0x0005, 0x0003, 0x0000, 0x0003, 0x0005, 0x0004, 0x0003,
- 0x0003, 0x0005, 0x0005, 0x0004, 0x0004, 0x0003, 0x0005, 0x0008, 0x0004 ],
- [ 0x0D66, 0x06B2, 0x01AD, 0x006A, 0x000C, 0x0005, 0x0004, 0x0000, 0x0003,
- 0x0002, 0x0007, 0x0034, 0x00D7, 0x0358, 0x1ACF, 0x359C, 0x001B, 0x359D ]
- ]
-];
-
-const IMC_CB_SELECTOR: [[usize; BANDS]; 4] = [
- [ 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2 ],
- [ 0, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
- [ 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2 ],
- [ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
-];
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_imc() {
-// let file = "assets/neal73_saber.avi";
-// let file = "assets/IMC/hvalen.avi";
- let file = "assets/IMC/8khz.avi";
-// let file = "assets/STsKlassFist-1a.avi";
-// let file = "assets/IMC/Angel Bday.avi";
- test_decode_audio("avi", file, None, "imc");
- //test_file_decoding("avi", file, None, false, true, None);
- }
-}
diff --git a/src/codecs/indeo/indeo2.rs b/src/codecs/indeo/indeo2.rs
deleted file mode 100644
index 61f1c77..0000000
--- a/src/codecs/indeo/indeo2.rs
+++ /dev/null
@@ -1,375 +0,0 @@
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use crate::formats;
-use super::super::*;
-
-static INDEO2_DELTA_TABLE: [[u8; 256]; 4] = [
- [
- 0x80, 0x80, 0x84, 0x84, 0x7C, 0x7C, 0x7F, 0x85,
- 0x81, 0x7B, 0x85, 0x7F, 0x7B, 0x81, 0x8C, 0x8C,
- 0x74, 0x74, 0x83, 0x8D, 0x7D, 0x73, 0x8D, 0x83,
- 0x73, 0x7D, 0x77, 0x89, 0x89, 0x77, 0x89, 0x77,
- 0x77, 0x89, 0x8C, 0x95, 0x74, 0x6B, 0x95, 0x8C,
- 0x6B, 0x74, 0x7C, 0x90, 0x84, 0x70, 0x90, 0x7C,
- 0x70, 0x84, 0x96, 0x96, 0x6A, 0x6A, 0x82, 0x98,
- 0x7E, 0x68, 0x98, 0x82, 0x68, 0x7E, 0x97, 0xA2,
- 0x69, 0x5E, 0xA2, 0x97, 0x5E, 0x69, 0xA2, 0xA2,
- 0x5E, 0x5E, 0x8B, 0xA3, 0x75, 0x5D, 0xA3, 0x8B,
- 0x5D, 0x75, 0x71, 0x95, 0x8F, 0x6B, 0x95, 0x71,
- 0x6B, 0x8F, 0x78, 0x9D, 0x88, 0x63, 0x9D, 0x78,
- 0x63, 0x88, 0x7F, 0xA7, 0x81, 0x59, 0xA7, 0x7F,
- 0x59, 0x81, 0xA4, 0xB1, 0x5C, 0x4F, 0xB1, 0xA4,
- 0x4F, 0x5C, 0x96, 0xB1, 0x6A, 0x4F, 0xB1, 0x96,
- 0x4F, 0x6A, 0xB2, 0xB2, 0x4E, 0x4E, 0x65, 0x9B,
- 0x9B, 0x65, 0x9B, 0x65, 0x65, 0x9B, 0x89, 0xB4,
- 0x77, 0x4C, 0xB4, 0x89, 0x4C, 0x77, 0x6A, 0xA3,
- 0x96, 0x5D, 0xA3, 0x6A, 0x5D, 0x96, 0x73, 0xAC,
- 0x8D, 0x54, 0xAC, 0x73, 0x54, 0x8D, 0xB4, 0xC3,
- 0x4C, 0x3D, 0xC3, 0xB4, 0x3D, 0x4C, 0xA4, 0xC3,
- 0x5C, 0x3D, 0xC3, 0xA4, 0x3D, 0x5C, 0xC4, 0xC4,
- 0x3C, 0x3C, 0x96, 0xC6, 0x6A, 0x3A, 0xC6, 0x96,
- 0x3A, 0x6A, 0x7C, 0xBA, 0x84, 0x46, 0xBA, 0x7C,
- 0x46, 0x84, 0x5B, 0xAB, 0xA5, 0x55, 0xAB, 0x5B,
- 0x55, 0xA5, 0x63, 0xB4, 0x9D, 0x4C, 0xB4, 0x63,
- 0x4C, 0x9D, 0x86, 0xCA, 0x7A, 0x36, 0xCA, 0x86,
- 0x36, 0x7A, 0xB6, 0xD7, 0x4A, 0x29, 0xD7, 0xB6,
- 0x29, 0x4A, 0xC8, 0xD7, 0x38, 0x29, 0xD7, 0xC8,
- 0x29, 0x38, 0xA4, 0xD8, 0x5C, 0x28, 0xD8, 0xA4,
- 0x28, 0x5C, 0x6C, 0xC1, 0x94, 0x3F, 0xC1, 0x6C,
- 0x3F, 0x94, 0xD9, 0xD9, 0x27, 0x27, 0x80, 0x80,
- ], [
- 0x80, 0x80, 0x85, 0x85, 0x7B, 0x7B, 0x7E, 0x87,
- 0x82, 0x79, 0x87, 0x7E, 0x79, 0x82, 0x8F, 0x8F,
- 0x71, 0x71, 0x84, 0x8F, 0x7C, 0x71, 0x8F, 0x84,
- 0x71, 0x7C, 0x75, 0x8B, 0x8B, 0x75, 0x8B, 0x75,
- 0x75, 0x8B, 0x8E, 0x9A, 0x72, 0x66, 0x9A, 0x8E,
- 0x66, 0x72, 0x7B, 0x93, 0x85, 0x6D, 0x93, 0x7B,
- 0x6D, 0x85, 0x9B, 0x9B, 0x65, 0x65, 0x82, 0x9D,
- 0x7E, 0x63, 0x9D, 0x82, 0x63, 0x7E, 0x9B, 0xA8,
- 0x65, 0x58, 0xA8, 0x9B, 0x58, 0x65, 0xA9, 0xA9,
- 0x57, 0x57, 0x8D, 0xAA, 0x73, 0x56, 0xAA, 0x8D,
- 0x56, 0x73, 0x6E, 0x99, 0x92, 0x67, 0x99, 0x6E,
- 0x67, 0x92, 0x76, 0xA2, 0x8A, 0x5E, 0xA2, 0x76,
- 0x5E, 0x8A, 0x7F, 0xAF, 0x81, 0x51, 0xAF, 0x7F,
- 0x51, 0x81, 0xAB, 0xBA, 0x55, 0x46, 0xBA, 0xAB,
- 0x46, 0x55, 0x9A, 0xBB, 0x66, 0x45, 0xBB, 0x9A,
- 0x45, 0x66, 0xBB, 0xBB, 0x45, 0x45, 0x60, 0xA0,
- 0xA0, 0x60, 0xA0, 0x60, 0x60, 0xA0, 0x8B, 0xBE,
- 0x75, 0x42, 0xBE, 0x8B, 0x42, 0x75, 0x66, 0xAA,
- 0x9A, 0x56, 0xAA, 0x66, 0x56, 0x9A, 0x70, 0xB5,
- 0x90, 0x4B, 0xB5, 0x70, 0x4B, 0x90, 0xBE, 0xCF,
- 0x42, 0x31, 0xCF, 0xBE, 0x31, 0x42, 0xAB, 0xD0,
- 0x55, 0x30, 0xD0, 0xAB, 0x30, 0x55, 0xD1, 0xD1,
- 0x2F, 0x2F, 0x9A, 0xD3, 0x66, 0x2D, 0xD3, 0x9A,
- 0x2D, 0x66, 0x7B, 0xC5, 0x85, 0x3B, 0xC5, 0x7B,
- 0x3B, 0x85, 0x54, 0xB4, 0xAC, 0x4C, 0xB4, 0x54,
- 0x4C, 0xAC, 0x5E, 0xBE, 0xA2, 0x42, 0xBE, 0x5E,
- 0x42, 0xA2, 0x87, 0xD8, 0x79, 0x28, 0xD8, 0x87,
- 0x28, 0x79, 0xC0, 0xE8, 0x40, 0x18, 0xE8, 0xC0,
- 0x18, 0x40, 0xD5, 0xE8, 0x2B, 0x18, 0xE8, 0xD5,
- 0x18, 0x2B, 0xAB, 0xE9, 0x55, 0x17, 0xE9, 0xAB,
- 0x17, 0x55, 0x68, 0xCD, 0x98, 0x33, 0xCD, 0x68,
- 0x33, 0x98, 0xEA, 0xEA, 0x16, 0x16, 0x80, 0x80,
- ], [
- 0x80, 0x80, 0x86, 0x86, 0x7A, 0x7A, 0x7E, 0x88,
- 0x82, 0x78, 0x88, 0x7E, 0x78, 0x82, 0x92, 0x92,
- 0x6E, 0x6E, 0x85, 0x92, 0x7B, 0x6E, 0x92, 0x85,
- 0x6E, 0x7B, 0x73, 0x8D, 0x8D, 0x73, 0x8D, 0x73,
- 0x73, 0x8D, 0x91, 0x9E, 0x6F, 0x62, 0x9E, 0x91,
- 0x62, 0x6F, 0x79, 0x97, 0x87, 0x69, 0x97, 0x79,
- 0x69, 0x87, 0xA0, 0xA0, 0x60, 0x60, 0x83, 0xA2,
- 0x7D, 0x5E, 0xA2, 0x83, 0x5E, 0x7D, 0xA0, 0xB0,
- 0x60, 0x50, 0xB0, 0xA0, 0x50, 0x60, 0xB1, 0xB1,
- 0x4F, 0x4F, 0x8F, 0xB2, 0x71, 0x4E, 0xB2, 0x8F,
- 0x4E, 0x71, 0x6B, 0x9E, 0x95, 0x62, 0x9E, 0x6B,
- 0x62, 0x95, 0x74, 0xA9, 0x8C, 0x57, 0xA9, 0x74,
- 0x57, 0x8C, 0x7F, 0xB8, 0x81, 0x48, 0xB8, 0x7F,
- 0x48, 0x81, 0xB4, 0xC5, 0x4C, 0x3B, 0xC5, 0xB4,
- 0x3B, 0x4C, 0x9F, 0xC6, 0x61, 0x3A, 0xC6, 0x9F,
- 0x3A, 0x61, 0xC6, 0xC6, 0x3A, 0x3A, 0x59, 0xA7,
- 0xA7, 0x59, 0xA7, 0x59, 0x59, 0xA7, 0x8D, 0xCA,
- 0x73, 0x36, 0xCA, 0x8D, 0x36, 0x73, 0x61, 0xB2,
- 0x9F, 0x4E, 0xB2, 0x61, 0x4E, 0x9F, 0x6D, 0xBF,
- 0x93, 0x41, 0xBF, 0x6D, 0x41, 0x93, 0xCA, 0xDF,
- 0x36, 0x21, 0xDF, 0xCA, 0x21, 0x36, 0xB3, 0xDF,
- 0x4D, 0x21, 0xDF, 0xB3, 0x21, 0x4D, 0xE1, 0xE1,
- 0x1F, 0x1F, 0x9F, 0xE3, 0x61, 0x1D, 0xE3, 0x9F,
- 0x1D, 0x61, 0x7A, 0xD3, 0x86, 0x2D, 0xD3, 0x7A,
- 0x2D, 0x86, 0x4C, 0xBE, 0xB4, 0x42, 0xBE, 0x4C,
- 0x42, 0xB4, 0x57, 0xCA, 0xA9, 0x36, 0xCA, 0x57,
- 0x36, 0xA9, 0x88, 0xE9, 0x78, 0x17, 0xE9, 0x88,
- 0x17, 0x78, 0xCC, 0xFB, 0x34, 0x05, 0xFB, 0xCC,
- 0x05, 0x34, 0xE6, 0xFB, 0x1A, 0x05, 0xFB, 0xE6,
- 0x05, 0x1A, 0xB4, 0xFD, 0x4C, 0x03, 0xFD, 0xB4,
- 0x03, 0x4C, 0x63, 0xDC, 0x9D, 0x24, 0xDC, 0x63,
- 0x24, 0x9D, 0xFE, 0xFE, 0x02, 0x02, 0x80, 0x80,
- ], [
- 0x80, 0x80, 0x87, 0x87, 0x79, 0x79, 0x7E, 0x89,
- 0x82, 0x77, 0x89, 0x7E, 0x77, 0x82, 0x95, 0x95,
- 0x6B, 0x6B, 0x86, 0x96, 0x7A, 0x6A, 0x96, 0x86,
- 0x6A, 0x7A, 0x70, 0x90, 0x90, 0x70, 0x90, 0x70,
- 0x70, 0x90, 0x94, 0xA4, 0x6C, 0x5C, 0xA4, 0x94,
- 0x5C, 0x6C, 0x78, 0x9B, 0x88, 0x65, 0x9B, 0x78,
- 0x65, 0x88, 0xA6, 0xA6, 0x5A, 0x5A, 0x83, 0xA9,
- 0x7D, 0x57, 0xA9, 0x83, 0x57, 0x7D, 0xA6, 0xB9,
- 0x5A, 0x47, 0xB9, 0xA6, 0x47, 0x5A, 0xBA, 0xBA,
- 0x46, 0x46, 0x92, 0xBC, 0x6E, 0x44, 0xBC, 0x92,
- 0x44, 0x6E, 0x67, 0xA3, 0x99, 0x5D, 0xA3, 0x67,
- 0x5D, 0x99, 0x72, 0xB0, 0x8E, 0x50, 0xB0, 0x72,
- 0x50, 0x8E, 0x7F, 0xC3, 0x81, 0x3D, 0xC3, 0x7F,
- 0x3D, 0x81, 0xBE, 0xD2, 0x42, 0x2E, 0xD2, 0xBE,
- 0x2E, 0x42, 0xA5, 0xD4, 0x5B, 0x2C, 0xD4, 0xA5,
- 0x2C, 0x5B, 0xD4, 0xD4, 0x2C, 0x2C, 0x52, 0xAE,
- 0xAE, 0x52, 0xAE, 0x52, 0x52, 0xAE, 0x8F, 0xD8,
- 0x71, 0x28, 0xD8, 0x8F, 0x28, 0x71, 0x5B, 0xBB,
- 0xA5, 0x45, 0xBB, 0x5B, 0x45, 0xA5, 0x69, 0xCB,
- 0x97, 0x35, 0xCB, 0x69, 0x35, 0x97, 0xD8, 0xF0,
- 0x28, 0x10, 0xF0, 0xD8, 0x10, 0x28, 0xBD, 0xF1,
- 0x43, 0x0F, 0xF1, 0xBD, 0x0F, 0x43, 0xF3, 0xF3,
- 0x0D, 0x0D, 0xA5, 0xF6, 0x5B, 0x0A, 0xF6, 0xA5,
- 0x0A, 0x5B, 0x78, 0xE2, 0x88, 0x1E, 0xE2, 0x78,
- 0x1E, 0x88, 0x42, 0xC9, 0xBE, 0x37, 0xC9, 0x42,
- 0x37, 0xBE, 0x4F, 0xD8, 0xB1, 0x28, 0xD8, 0x4F,
- 0x28, 0xB1, 0x8A, 0xFD, 0x76, 0x03, 0xFD, 0x8A,
- 0x03, 0x76, 0xDB, 0xFF, 0x25, 0x01, 0xFF, 0xDB,
- 0x01, 0x25, 0xF9, 0xFF, 0x07, 0x01, 0xFF, 0xF9,
- 0x01, 0x07, 0xBE, 0xFF, 0x42, 0x01, 0xFF, 0xBE,
- 0x01, 0x42, 0x5E, 0xED, 0xA2, 0x13, 0xED, 0x5E,
- 0x13, 0xA2, 0xFF, 0xFF, 0x01, 0x01, 0x80, 0x80,
- ]
-];
-
-static INDEO2_CODE_CODES: &[u16] = &[
- 0x0000, 0x0004, 0x0006, 0x0001, 0x0009, 0x0019, 0x000D, 0x001D,
- 0x0023, 0x0013, 0x0033, 0x000B, 0x002B, 0x001B, 0x0007, 0x0087,
- 0x0027, 0x00A7, 0x0067, 0x00E7, 0x0097, 0x0057, 0x0037, 0x00B7,
- 0x00F7, 0x000F, 0x008F, 0x018F, 0x014F, 0x00CF, 0x002F, 0x012F,
- 0x01AF, 0x006F, 0x00EF, 0x01EF, 0x001F, 0x021F, 0x011F, 0x031F,
- 0x009F, 0x029F, 0x019F, 0x039F, 0x005F, 0x025F, 0x015F, 0x035F,
- 0x00DF, 0x02DF, 0x01DF, 0x03DF, 0x003F, 0x103F, 0x083F, 0x183F,
- 0x043F, 0x143F, 0x0C3F, 0x1C3F, 0x023F, 0x123F, 0x0A3F, 0x1A3F,
- 0x063F, 0x163F, 0x0E3F, 0x1E3F, 0x013F, 0x113F, 0x093F, 0x193F,
- 0x053F, 0x153F, 0x0D3F, 0x1D3F, 0x033F, 0x133F, 0x0B3F, 0x1B3F,
- 0x073F, 0x173F, 0x0F3F, 0x1F3F, 0x00BF, 0x10BF, 0x08BF, 0x18BF,
- 0x04BF, 0x14BF, 0x0CBF, 0x1CBF, 0x02BF, 0x12BF, 0x0ABF, 0x1ABF,
- 0x06BF, 0x16BF, 0x0EBF, 0x1EBF, 0x01BF, 0x11BF, 0x09BF, 0x19BF,
- 0x05BF, 0x15BF, 0x0DBF, 0x1DBF, 0x03BF, 0x13BF, 0x0BBF, 0x1BBF,
- 0x07BF, 0x17BF, 0x0FBF, 0x1FBF, 0x007F, 0x207F, 0x107F, 0x307F,
- 0x087F, 0x287F, 0x187F, 0x387F, 0x047F, 0x247F, 0x147F, 0x0002,
- 0x0011, 0x0005, 0x0015, 0x0003, 0x003B, 0x0047, 0x00C7, 0x0017,
- 0x00D7, 0x0077, 0x010F, 0x004F, 0x01CF, 0x00AF, 0x016F
-];
-
-static INDEO2_CODE_LENGTHS: &[u8] = &[
- 3, 3, 3, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 3,
- 5, 5, 5, 6, 6, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9
-];
-
-struct IR2CodeReader { }
-
-impl CodebookDescReader<u8> for IR2CodeReader {
- fn bits(&mut self, idx: usize) -> u8 { INDEO2_CODE_LENGTHS[idx] }
- fn code(&mut self, idx: usize) -> u32 { INDEO2_CODE_CODES[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u8 {
- if idx < 0x7F { (idx + 1) as u8 } else { (idx + 2) as u8 }
- }
- fn len(&mut self) -> usize { INDEO2_CODE_LENGTHS.len() }
-}
-
-struct Indeo2Decoder {
- info: Rc<NACodecInfo>,
- cb: Codebook<u8>,
- frmmgr: HAMShuffler,
-}
-
-impl Indeo2Decoder {
- fn new() -> Self {
- let dummy_info = Rc::new(DUMMY_CODEC_INFO);
- let mut coderead = IR2CodeReader{};
- let cb = Codebook::new(&mut coderead, CodebookMode::LSB).unwrap();
- Indeo2Decoder { info: dummy_info, cb: cb, frmmgr: HAMShuffler::new() }
- }
-
- fn decode_plane_intra(&self, br: &mut BitReader,
- buf: &mut NAVideoBuffer<u8>, planeno: usize,
- tableno: usize) -> DecoderResult<()> {
- let offs = buf.get_offset(planeno);
- let (w, h) = buf.get_dimensions(planeno);
- let stride = buf.get_stride(planeno);
- let cb = &self.cb;
-
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- let table = &INDEO2_DELTA_TABLE[tableno];
-
- let mut base = offs;
- let mut x: usize = 0;
- while x < w {
- let idx = br.read_cb(cb)? as usize;
- if idx >= 0x80 {
- let run = (idx - 0x80) * 2;
- if x + run > w { return Err(DecoderError::InvalidData); }
- for i in 0..run {
- framebuf[base + x + i] = 0x80;
- }
- x += run;
- } else {
- framebuf[base + x + 0] = table[(idx * 2 + 0) as usize];
- framebuf[base + x + 1] = table[(idx * 2 + 1) as usize];
- x += 2;
- }
- }
- base += stride;
- for _ in 1..h {
- let mut x: usize = 0;
- while x < w {
- let idx = br.read_cb(cb)? as usize;
- if idx >= 0x80 {
- let run = (idx - 0x80) * 2;
- if x + run > w { return Err(DecoderError::InvalidData); }
- for i in 0..run {
- framebuf[base + x + i] = framebuf[base + x + i - stride];
- }
- x += run;
- } else {
- let delta0 = (table[idx * 2 + 0] as i16) - 0x80;
- let delta1 = (table[idx * 2 + 1] as i16) - 0x80;
- let mut pix0 = framebuf[base + x + 0 - stride] as i16;
- let mut pix1 = framebuf[base + x + 1 - stride] as i16;
- pix0 += delta0;
- pix1 += delta1;
- if pix0 < 0 { pix0 = 0; }
- if pix1 < 0 { pix1 = 0; }
- if pix0 > 255 { pix0 = 255; }
- if pix1 > 255 { pix1 = 255; }
- framebuf[base + x + 0] = pix0 as u8;
- framebuf[base + x + 1] = pix1 as u8;
- x += 2;
- }
- }
- base += stride;
- }
- Ok(())
- }
-
- fn decode_plane_inter(&self, br: &mut BitReader,
- buf: &mut NAVideoBuffer<u8>, planeno: usize,
- tableno: usize) -> DecoderResult<()> {
- let offs = buf.get_offset(planeno);
- let (w, h) = buf.get_dimensions(planeno);
- let stride = buf.get_stride(planeno);
- let cb = &self.cb;
-
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- let table = &INDEO2_DELTA_TABLE[tableno];
-
- let mut base = offs;
- for _ in 0..h {
- let mut x: usize = 0;
- while x < w {
- let idx = br.read_cb(cb)? as usize;
- if idx >= 0x80 {
- let run = (idx - 0x80) * 2;
- if x + run > w { return Err(DecoderError::InvalidData); }
- x += run;
- } else {
- let delta0 = (table[idx * 2 + 0] as i16) - 0x80;
- let delta1 = (table[idx * 2 + 1] as i16) - 0x80;
- let mut pix0 = framebuf[base + x + 0] as i16;
- let mut pix1 = framebuf[base + x + 1] as i16;
- pix0 += delta0 * 3 >> 2;
- pix1 += delta1 * 3 >> 2;
- if pix0 < 0 { pix0 = 0; }
- if pix1 < 0 { pix1 = 0; }
- if pix0 > 255 { pix0 = 255; }
- if pix1 > 255 { pix1 = 255; }
- framebuf[base + x + 0] = pix0 as u8;
- framebuf[base + x + 1] = pix1 as u8;
- x += 2;
- }
- }
- base += stride;
- }
- Ok(())
- }
-}
-
-const IR2_START: usize = 48;
-
-impl NADecoder for Indeo2Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- let f = vinfo.is_flipped();
- let fmt = formats::YUV410_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
- self.frmmgr.clear();
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
- if src.len() <= IR2_START { return Err(DecoderError::ShortData); }
- let interframe = src[18];
- let tabs = src[34];
- let mut br = BitReader::new(&src[IR2_START..], src.len() - IR2_START, BitReaderMode::LE);
- let luma_tab = tabs & 3;
- let chroma_tab = (tabs >> 2) & 3;
- if interframe != 0 {
- let vinfo = self.info.get_properties().get_video_info().unwrap();
- let bufret = alloc_video_buffer(vinfo, 2);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let mut bufinfo = bufret.unwrap();
- let mut buf = bufinfo.get_vbuf().unwrap();
- for plane in 0..3 {
- let tabidx = (if plane == 0 { luma_tab } else { chroma_tab }) as usize;
- self.decode_plane_intra(&mut br, &mut buf, plane, tabidx)?;
- }
- self.frmmgr.add_frame(buf);
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(true);
- frm.set_frame_type(FrameType::I);
- Ok(Rc::new(RefCell::new(frm)))
- } else {
- let bufret = self.frmmgr.clone_ref();
- if let None = bufret { return Err(DecoderError::MissingReference); }
- let mut buf = bufret.unwrap();
-
- for plane in 0..3 {
- let tabidx = (if plane == 0 { luma_tab } else { chroma_tab }) as usize;
- self.decode_plane_inter(&mut br, &mut buf, plane, tabidx)?;
- }
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::Video(buf));
- frm.set_keyframe(false);
- frm.set_frame_type(FrameType::P);
- Ok(Rc::new(RefCell::new(frm)))
- }
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(Indeo2Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_indeo2() {
- test_file_decoding("avi", "assets/laser05.avi", Some(10), true, false, None);
- }
-}
diff --git a/src/codecs/indeo/indeo3.rs b/src/codecs/indeo/indeo3.rs
deleted file mode 100644
index 5b4876d..0000000
--- a/src/codecs/indeo/indeo3.rs
+++ /dev/null
@@ -1,1460 +0,0 @@
-use crate::formats;
-use super::super::*;
-use crate::io::byteio::*;
-use std::io::SeekFrom;
-use std::mem;
-
-struct IviDeltaCB {
- quad_radix: u8,
- data: &'static [i8],
-}
-
-#[derive(Clone, Copy)]
-struct MV {
- x: i8,
- y: i8
-}
-
-struct Buffers {
- width: usize,
- height: usize,
- buf1: Vec<u8>,
- buf2: Vec<u8>,
- fbuf: bool,
-}
-
-const DEFAULT_PIXEL: u8 = 0x40;
-
-impl Buffers {
- fn new() -> Self { Buffers { width: 0, height: 0, buf1: Vec::new(), buf2: Vec::new(), fbuf: true } }
- fn reset(&mut self) {
- self.width = 0;
- self.height = 0;
- self.buf1.truncate(0);
- self.buf2.truncate(0);
- }
- fn alloc(&mut self, w: usize, h: usize) {
- self.width = w;
- self.height = h;
- self.buf1.resize(w * h + (w >> 2) * (h >> 2) * 2, DEFAULT_PIXEL);
- self.buf2.resize(w * h + (w >> 2) * (h >> 2) * 2, DEFAULT_PIXEL);
- }
- fn flip(&mut self) { self.fbuf = !self.fbuf; }
- fn get_stride(&mut self, planeno: usize) -> usize {
- if planeno == 0 { self.width } else { self.width >> 2 }
- }
- fn get_offset(&mut self, planeno: usize) -> usize {
- match planeno {
- 1 => self.width * self.height,
- 2 => self.width * self.height + (self.width >> 2) * (self.height >> 2),
- _ => 0,
- }
- }
- fn fill_framebuf(&mut self, fbuf: &mut NAVideoBuffer<u8>) {
- for planeno in 0..3 {
- let mut soff = self.get_offset(planeno);
- let mut doff = fbuf.get_offset(planeno);
- let sstride = self.get_stride(planeno);
- let dstride = fbuf.get_stride(planeno);
- let width = if planeno == 0 { self.width } else { self.width >> 2 };
- let height = if planeno == 0 { self.height } else { self.height >> 2 };
- let src = if self.fbuf { &self.buf1[0..] } else { &self.buf2[0..] };
- let mut dst = fbuf.get_data_mut();
- for _ in 0..height {
- for x in 0..width {
- dst[doff + x] = src[soff + x] * 2;
- }
- soff += sstride;
- doff += dstride;
- }
- }
- }
- fn copy_block(&mut self, doff: usize, soff: usize, stride: usize, w: usize, h: usize) {
- let mut sidx = soff;
- let mut didx = doff;
- if self.fbuf {
- for _ in 0..h {
- for i in 0..w { self.buf1[didx + i] = self.buf2[sidx + i]; }
- sidx += stride;
- didx += stride;
- }
- } else {
- for _ in 0..h {
- for i in 0..w { self.buf2[didx + i] = self.buf1[sidx + i]; }
- sidx += stride;
- didx += stride;
- }
- }
- }
- fn fill_block(&mut self, doff: usize, stride: usize, w: usize, h: usize, topline: bool) {
- let mut didx = doff;
- let mut buf: [u8; 8] = [0; 8];
- if topline {
- if self.fbuf {
- for _ in 0..h {
- for i in 0..w { self.buf1[didx + i] = DEFAULT_PIXEL; }
- didx += stride;
- }
- } else {
- for _ in 0..h {
- for i in 0..w { self.buf2[didx + i] = DEFAULT_PIXEL; }
- didx += stride;
- }
- }
- } else {
- if self.fbuf {
- for i in 0..w { buf[i] = self.buf1[didx - stride + i]; }
- for _ in 0..h {
- for i in 0..w { self.buf1[didx + i] = buf[i]; }
- didx += stride;
- }
- } else {
- for i in 0..w { buf[i] = self.buf2[didx - stride + i]; }
- for _ in 0..h {
- for i in 0..w { self.buf2[didx + i] = buf[i]; }
- didx += stride;
- }
- }
- }
- }
-}
-
-#[allow(unused_variables)]
-fn apply_delta4x4(bufs: &mut Buffers, off: usize, stride: usize,
- deltas: &[u8], topline: bool, first_line: bool) {
- let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4)] }
- else { &mut bufs.buf2[off..(off + 4)] };
- for i in 0..4 { dst[i] = dst[i].wrapping_add(deltas[i]) & 0x7F; }
-}
-
-#[allow(unused_variables)]
-fn apply_delta4x8(bufs: &mut Buffers, off: usize, stride: usize,
- deltas: &[u8], topline: bool, first_line: bool) {
- let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4 + stride)] }
- else { &mut bufs.buf2[off..(off + 4 + stride)] };
- for i in 0..4 { dst[i + stride] = dst[i].wrapping_add(deltas[i]) & 0x7F; }
- if !topline {
- for i in 0..4 { dst[i] = (dst[i + stride] + dst[i]) >> 1; }
- } else {
- for i in 0..4 { dst[i] = dst[i + stride]; }
- }
-}
-
-#[allow(unused_variables)]
-fn apply_delta4x8m11(bufs: &mut Buffers, off: usize, stride: usize,
- deltas: &[u8], topline: bool, first_line: bool) {
- let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4 + stride)] }
- else { &mut bufs.buf2[off..(off + 4 + stride)] };
- for i in 0..4 { dst[i] = dst[i] .wrapping_add(deltas[i]) & 0x7F; }
- for i in 0..4 { dst[i + stride] = dst[i + stride].wrapping_add(deltas[i]) & 0x7F; }
-}
-
-#[allow(unused_variables)]
-fn apply_delta8x8p(bufs: &mut Buffers, off: usize, stride: usize,
- deltas: &[u8], topline: bool, first_line: bool) {
- let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8 + stride)] }
- else { &mut bufs.buf2[off..(off + 8 + stride)] };
- for i in 0..8 { dst[i] = dst[i] .wrapping_add(deltas[i >> 1]) & 0x7F; }
- for i in 0..8 { dst[i + stride] = dst[i + stride].wrapping_add(deltas[i >> 1]) & 0x7F; }
-}
-
-fn apply_delta8x8i(bufs: &mut Buffers, off: usize, stride: usize,
- deltas: &[u8], topline: bool, firstline: bool) {
- let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8 + stride)] }
- else { &mut bufs.buf2[off..(off + 8 + stride)] };
- if !firstline {
- for i in 0..8 { dst[i + stride] = dst[i ].wrapping_add(deltas[i >> 1]) & 0x7F; }
- } else {
- for i in 0..8 { dst[i + stride] = dst[i & !1].wrapping_add(deltas[i >> 1]) & 0x7F; }
- }
- if !topline {
- for i in 0..8 { dst[i] = (dst[i + stride] + dst[i]) >> 1; }
- } else {
- for i in 0..8 { dst[i] = dst[i + stride]; }
- }
-}
-
-fn copy_line_top(bufs: &mut Buffers, off: usize, stride: usize, bw: usize, topline: bool) {
- let mut buf: [u8; 8] = [0; 8];
- if !topline {
- let src = if bufs.fbuf { &bufs.buf1[(off - stride)..(off - stride + bw)] }
- else { &bufs.buf2[(off - stride)..(off - stride + bw)] };
- for i in 0..bw { buf[i] = src[i]; }
- } else {
- for i in 0..bw { buf[i] = DEFAULT_PIXEL; }
- }
- let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + bw)] }
- else { &mut bufs.buf2[off..(off + bw)] };
- for i in 0..bw { dst[i] = buf[i]; }
-}
-
-fn copy_line_top4x4(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
- copy_line_top(bufs, off, stride, 4, topline);
-}
-
-fn copy_line_top4x8(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
- copy_line_top(bufs, off, stride, 4, topline);
- copy_line_top(bufs, off + stride, stride, 4, false);
-}
-
-fn copy_line_top8x8(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
- let mut buf: [u8; 8] = [0; 8];
- if !topline {
- let src = if bufs.fbuf { &bufs.buf1[(off - stride)..(off - stride + 8)] }
- else { &bufs.buf2[(off - stride)..(off - stride + 8)] };
- for i in 0..8 { buf[i] = src[i & !1]; }
- } else {
- for i in 0..8 { buf[i] = DEFAULT_PIXEL; }
- }
- let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8)] }
- else { &mut bufs.buf2[off..(off + 8)] };
- for i in 0..8 {dst[i] = buf[i]; }
-}
-
-fn fill_block8x8(bufs: &mut Buffers, doff: usize, stride: usize, h: usize, topline: bool, firstline: bool) {
- let mut didx = doff;
- let mut buf: [u8; 8] = [0; 8];
- if firstline {
- for i in 0..8 { buf[i] = DEFAULT_PIXEL; }
- } else if bufs.fbuf {
- for i in 0..8 { buf[i] = bufs.buf1[doff - stride + i]; }
- } else {
- for i in 0..8 { buf[i] = bufs.buf1[doff - stride + i]; }
- }
- if topline && !firstline {
- for i in 0..4 { buf[i * 2 + 1] = buf[i * 2]; }
- if bufs.fbuf {
- for i in 0..8 { bufs.buf1[doff + i] = (bufs.buf1[doff - stride + i] + buf[i]) >> 1; }
- } else {
- for i in 0..8 { bufs.buf2[doff + i] = (bufs.buf2[doff - stride + i] + buf[i]) >> 1; }
- }
- }
-
- let start = if !topline { 0 } else { 1 };
- if bufs.fbuf {
- for _ in start..h {
- for i in 0..8 { bufs.buf1[didx + i] = buf[i]; }
- didx += stride;
- }
- } else {
- for _ in start..h {
- for i in 0..8 { bufs.buf2[didx + i] = buf[i]; }
- didx += stride;
- }
- }
-}
-
-struct Indeo3Decoder {
- info: Rc<NACodecInfo>,
- bpos: u8,
- bbuf: u8,
- width: u16,
- height: u16,
- mvs: Vec<MV>,
- altquant: [u8; 16],
- vq_offset: u8,
- bufs: Buffers,
-}
-
-#[derive(Clone,Copy)]
-struct IV3Cell {
- x: u16,
- y: u16,
- w: u16,
- h: u16,
- d: u8,
- vqt: bool,
- mv: Option<MV>,
-}
-
-impl IV3Cell {
- fn new(w: u16, h: u16) -> Self {
- IV3Cell { x: 0, y: 0, w: w, h: h, d: 20, vqt: false, mv: None }
- }
- fn split_h(&self) -> (Self, Self) {
- let h1 = if self.h > 2 { ((self.h + 2) >> 2) << 1 } else { 1 };
- let h2 = self.h - h1;
- let mut cell1 = *self;
- cell1.h = h1;
- cell1.d -= 1;
- let mut cell2 = *self;
- cell2.y += h1;
- cell2.h = h2;
- cell2.d -= 1;
- (cell1, cell2)
- }
- fn split_w(&self, stripw: u16) -> (Self, Self) {
- let w1 = if self.w > stripw {
- if self.w > stripw * 2 { stripw * 2 } else { stripw }
- } else {
- if self.w > 2 { ((self.w + 2) >> 2) << 1 } else { 1 }
- };
- let w2 = self.w - w1;
- let mut cell1 = *self;
- cell1.w = w1;
- cell1.d -= 1;
- let mut cell2 = *self;
- cell2.x += w1;
- cell2.w = w2;
- cell2.d -= 1;
- (cell1, cell2)
- }
- fn no_mv(&self) -> bool { match self.mv { None => true, Some(_) => false } }
-}
-
-struct CellDecParams {
- tab: [usize; 2],
- bw: u16,
- bh: u16,
- swap_q: [bool; 2],
- hq: bool,
- apply_delta: fn (&mut Buffers, usize, usize, &[u8], bool, bool),
- copy_line_top: fn (&mut Buffers, usize, usize, bool),
-}
-
-const FRMH_TAG: u32 = ((b'F' as u32) << 24) | ((b'R' as u32) << 16)
- | ((b'M' as u32) << 8) | (b'H' as u32);
-
-const H_SPLIT: u8 = 0;
-const V_SPLIT: u8 = 1;
-const SKIP_OR_TREE: u8 = 2;
-
-impl Indeo3Decoder {
- fn new() -> Self {
- let dummy_info = Rc::new(DUMMY_CODEC_INFO);
- Indeo3Decoder { info: dummy_info, bpos: 0, bbuf: 0, width: 0, height: 0,
- mvs: Vec::new(), altquant: [0; 16],
- vq_offset: 0, bufs: Buffers::new() }
- }
-
- fn br_reset(&mut self) {
- self.bpos = 0;
- self.bbuf = 0;
- }
-
- fn get_2bits(&mut self, br: &mut ByteReader) -> DecoderResult<u8> {
- if self.bpos == 0 {
- self.bbuf = br.read_byte()?;
- self.bpos = 8;
- }
- self.bpos -= 2;
- Ok((self.bbuf >> self.bpos) & 0x3)
- }
-
- fn decode_cell_data(&mut self, br: &mut ByteReader, cell: IV3Cell,
- off: usize, stride: usize, params: CellDecParams) -> DecoderResult<()> {
- let blk_w = cell.w * 4 / params.bw;
- let blk_h = cell.h * 4 / params.bh;
- let scale: usize = if params.bh == 4 { 1 } else { 2 };
-
- validate!((((cell.w * 4) % params.bw) == 0) && (((cell.h * 4) % params.bh) == 0));
-
- let mut run_blocks = 0;
- let mut run_skip = false;
-
- let mut didx: usize = ((cell.x*4) as usize) + ((cell.y * 4) as usize) * stride + off;
- let mut sidx: usize;
- if cell.no_mv() {
- sidx = 0;
- } else {
- let mv = cell.mv.unwrap();
- let mx = mv.x as i16;
- let my = mv.y as i16;
- let l = (cell.x as i16) * 4 + mx;
- let t = (cell.y as i16) * 4 + my;
- let r = ((cell.x + cell.w) as i16) * 4 + mx;
- let b = ((cell.y + cell.h) as i16) * 4 + my;
- validate!(l >= 0);
- validate!(t >= 0);
- validate!(r <= (self.width as i16));
- validate!(b <= (self.height as i16));
- sidx = (l as usize) + (t as usize) * stride + off;
- }
- for y in 0..blk_h {
- let mut xoff: usize = 0;
- for _ in 0..blk_w {
- if run_blocks > 0 {
- if !run_skip || !cell.no_mv() {
- if !(params.bw == 8 && cell.no_mv()) {
- if !cell.no_mv() {
- self.bufs.copy_block(didx + xoff, sidx + xoff, stride,
- params.bw as usize, params.bh as usize);
- } else {
- self.bufs.fill_block(didx + xoff, stride,
- params.bw as usize, params.bh as usize,
- (cell.y == 0) && (y == 0));
- }
- } else {
- fill_block8x8(&mut self.bufs,
- didx + xoff, stride, 8,
- y == 0, (cell.y == 0) && (y == 0));
- }
- }
- run_blocks -= 1;
- } else {
- let mut line: usize = 0;
- while line < 4 {
- let c = br.read_byte()?;
- if c < 0xF8 {
- let delta_tab = if params.hq {
- IVI3_DELTA_CBS[params.tab[line & 1]]
- } else {
- IVI3_DELTA_CBS[params.tab[1]]
- };
- let mut idx1;
- let mut idx2;
- if (c as usize) < delta_tab.data.len()/2 {
- idx1 = br.read_byte()? as usize;
- validate!(idx1 < delta_tab.data.len());
- idx2 = c as usize;
- } else {
- let tmp = (c as usize) - delta_tab.data.len()/2;
- idx1 = tmp / (delta_tab.quad_radix as usize);
- idx2 = tmp % (delta_tab.quad_radix as usize);
- if params.swap_q[line & 1] {
- mem::swap(&mut idx1, &mut idx2);
- }
- }
- let deltas: [u8; 4] = [delta_tab.data[idx1 * 2] as u8,
- delta_tab.data[idx1 * 2 + 1] as u8,
- delta_tab.data[idx2 * 2 + 0] as u8,
- delta_tab.data[idx2 * 2 + 1] as u8];
- let topline = (cell.y == 0) && (y == 0) && (line == 0);
- let first_line = (y == 0) && (line == 0);
- if cell.no_mv() {
- (params.copy_line_top)(&mut self.bufs,
- didx + xoff + line * scale * stride,
- stride, topline);
- } else {
- self.bufs.copy_block(didx + xoff + line * scale * stride,
- sidx + xoff + line * scale * stride,
- stride, params.bw as usize, scale);
- }
- (params.apply_delta)(&mut self.bufs,
- didx + xoff + line * scale * stride,
- stride, &deltas, topline, first_line);
- line += 1;
- } else {
- let mut tocopy: usize = 0;
- let mut do_copy = true;
- if c == 0xF8 { return Err(DecoderError::InvalidData); }
- if c == 0xF9 {
- run_blocks = 1;
- run_skip = true;
- validate!(line == 0);
- tocopy = 4;
- do_copy = !cell.no_mv();
- }
- if c == 0xFA {
- validate!(line == 0);
- tocopy = 4;
- do_copy = !cell.no_mv();
- }
- if c == 0xFB {
- let c = br.read_byte()?;
- validate!((c < 64) && ((c & 0x1F) != 0));
- run_blocks = (c & 0x1F) - 1;
- run_skip = (c & 0x20) != 0;
- tocopy = 4 - line;
- if params.bw == 4 && cell.no_mv() && run_skip {
- do_copy = false;
- }
- }
- if c == 0xFC {
- run_skip = false;
- run_blocks = 1;
- tocopy = 4 - line;
- }
- if c >= 0xFD {
- let nl = 257 - (c as i16) - (line as i16);
- validate!(nl > 0);
- tocopy = nl as usize;
- }
- if do_copy {
- if !(params.bw == 8 && cell.no_mv()) {
- if !cell.no_mv() {
- self.bufs.copy_block(didx + xoff + line * scale * stride,
- sidx + xoff + line * scale * stride,
- stride, params.bw as usize,
- tocopy * scale);
- } else {
- self.bufs.fill_block(didx + xoff + line * scale * stride,
- stride, params.bw as usize,
- tocopy * scale,
- (cell.y == 0) && (y == 0) && (line == 0));
- }
- } else {
- fill_block8x8(&mut self.bufs,
- didx + xoff + line * 2 * stride,
- stride, tocopy * 2,
- (y == 0) && (line == 0),
- (cell.y == 0) && (y == 0) && (line == 0));
- }
- }
- line += tocopy;
- }
- }
- }
- xoff += params.bw as usize;
- }
- didx += stride * (params.bh as usize);
- sidx += stride * (params.bh as usize);
- }
- Ok(())
- }
-
- fn copy_cell(&mut self, cell: IV3Cell, off: usize, stride: usize) -> DecoderResult<()> {
- if cell.no_mv() { return Err(DecoderError::InvalidData); }
- let mv = cell.mv.unwrap();
- let mx = mv.x as i16;
- let my = mv.y as i16;
- let l = (cell.x as i16) * 4 + mx;
- let t = (cell.y as i16) * 4 + my;
- let r = ((cell.x + cell.w) as i16) * 4 + mx;
- let b = ((cell.y + cell.h) as i16) * 4 + my;
- validate!(l >= 0);
- validate!(t >= 0);
- validate!(r <= (self.width as i16));
- validate!(b <= (self.height as i16));
- let sidx: usize = off + (l as usize) + (t as usize) * stride;
- let didx: usize = off + ((cell.x * 4) as usize) + ((cell.y * 4) as usize) * stride;
- self.bufs.copy_block(didx, sidx, stride, (cell.w * 4) as usize, (cell.h * 4) as usize);
- Ok(())
- }
-
- fn decode_cell(&mut self, br: &mut ByteReader, cell: IV3Cell, off: usize,
- stride: usize, intra: bool) -> DecoderResult<()> {
- let code = br.read_byte()?;
- let mode = code >> 4;
- let vq_idx = code & 0xF;
-
- let mut idx1: usize = vq_idx as usize;
- let mut idx2: usize = vq_idx as usize;
- if (mode == 1) || (mode == 4) {
- let c = self.altquant[vq_idx as usize];
- idx1 = (c >> 4) as usize;
- idx2 = (c & 0xF) as usize;
- }
-
- idx1 += self.vq_offset as usize;
- idx2 += self.vq_offset as usize;
- validate!((idx1 < 24) && (idx2 < 24));
-
- let mut cp = CellDecParams {
- tab: [idx2, idx1],
- bw: 0, bh: 0,
- swap_q: [idx2 >= 16, idx1 >= 16],
- hq: false,
- apply_delta: apply_delta4x4,
- copy_line_top: copy_line_top4x4,
- };
- if (mode == 0) || (mode == 1) {
- cp.bw = 4;
- cp.bh = 4;
- cp.hq = true;
- } else if (mode == 3) || (mode == 4) {
- if !cell.no_mv() { return Err(DecoderError::InvalidData); }
- cp.bw = 4;
- cp.bh = 8;
- cp.hq = true;
- cp.apply_delta = apply_delta4x8;
- cp.copy_line_top = copy_line_top4x8;
- } else if mode == 10 {
- if !cell.no_mv() {
- validate!(!intra);
- cp.apply_delta = apply_delta8x8p;
- } else {
- cp.apply_delta = apply_delta8x8i;
- }
- cp.bw = 8;
- cp.bh = 8;
- cp.copy_line_top = copy_line_top8x8;
- } else if mode == 11 {
- if cell.no_mv() { return Err(DecoderError::InvalidData); }
- validate!(!intra);
- cp.bw = 4;
- cp.bh = 8;
- cp.apply_delta = apply_delta4x8m11;
- cp.copy_line_top = copy_line_top4x8;
- } else {
- return Err(DecoderError::InvalidData);
- }
- self.decode_cell_data(br, cell, off, stride, cp)
- }
-
- fn parse_tree(&mut self, br: &mut ByteReader, cell: IV3Cell, off: usize,
- stride: usize, stripw: u16, intra: bool) -> DecoderResult<()> {
- let op = self.get_2bits(br)?;
- if op == H_SPLIT {
- validate!(cell.h > 1);
- validate!(cell.d > 0);
- let (cell1, cell2) = cell.split_h();
- self.parse_tree(br, cell1, off, stride, stripw, intra)?;
- self.parse_tree(br, cell2, off, stride, stripw, intra)?;
- Ok(())
- } else if op == V_SPLIT {
- validate!(cell.w > 1);
- validate!(cell.d > 0);
- let (cell1, cell2) = cell.split_w(stripw);
- self.parse_tree(br, cell1, off, stride, stripw, intra)?;
- self.parse_tree(br, cell2, off, stride, stripw, intra)?;
- Ok(())
- } else if op == SKIP_OR_TREE {
- if !cell.vqt {
- let mut newcell = cell;
- newcell.vqt = true;
- newcell.d -= 1;
- self.parse_tree(br, newcell, off, stride, stripw, intra)
- } else {
- validate!(!intra);
- let code = self.get_2bits(br)?;
- validate!(code < 2);
- if code == 1 { return Err(DecoderError::NotImplemented); }
- self.copy_cell(cell, off, stride)
- }
- } else {
- if !cell.vqt {
- let mut newcell = cell;
- newcell.vqt = true;
- newcell.d -= 1;
- let mv_idx = br.read_byte()? as usize;
- validate!(mv_idx < self.mvs.len());
- newcell.mv = Some(self.mvs[mv_idx]);
- self.parse_tree(br, newcell, off, stride, stripw, intra)
- } else {
- self.decode_cell(br, cell, off, stride, intra)
- }
- }
- }
-
- fn decode_plane_intra(&mut self, br: &mut ByteReader, planeno: usize,
- start: u64, end: u64) -> DecoderResult<()> {
- let offs = self.bufs.get_offset(planeno);
- let stride = self.bufs.get_stride(planeno);
- br.seek(SeekFrom::Start(start))?;
-
- let nvec = br.read_u32le()?;
- validate!(nvec == 0); // for intra there should be no mc_vecs
- self.mvs.truncate(0);
- for _ in 0..nvec {
- let x = br.read_byte()? as i8;
- let y = br.read_byte()? as i8;
- self.mvs.push(MV{ x: x, y: y });
- }
-
- let shift = if planeno == 0 { 2 } else { 4 };
- let cell = IV3Cell::new((self.bufs.width >> shift) as u16,
- (self.bufs.height >> shift) as u16);
- self.br_reset();
- self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, true)?;
- validate!(br.tell() <= end);
- Ok(())
- }
-
- fn decode_plane_inter(&mut self, br: &mut ByteReader, planeno: usize,
- start: u64, end: u64) -> DecoderResult<()> {
- let offs = self.bufs.get_offset(planeno);
- let stride = self.bufs.get_stride(planeno);
- br.seek(SeekFrom::Start(start))?;
-
- let nvec = br.read_u32le()?;
- validate!(nvec <= 256); // for intra there should be no mc_vecs
- self.mvs.truncate(0);
- for _ in 0..nvec {
- let y = br.read_byte()? as i8;
- let x = br.read_byte()? as i8;
- self.mvs.push(MV{ x: x, y: y });
- }
-
- let shift = if planeno == 0 { 2 } else { 4 };
- let cell = IV3Cell::new((self.bufs.width >> shift) as u16,
- (self.bufs.height >> shift) as u16);
- self.br_reset();
- self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, false)?;
- validate!(br.tell() <= end);
- Ok(())
- }
-}
-
-const FLAG_KEYFRAME: u16 = 1 << 2;
-const FLAG_NONREF: u16 = 1 << 8;
-
-impl NADecoder for Indeo3Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- let fmt = formats::YUV410_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
- self.bufs.reset();
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
- let mut mr = MemoryReader::new_read(&src);
- let mut br = ByteReader::new(&mut mr);
- let frameno = br.read_u32le()?;
- let hdr_2 = br.read_u32le()?;
- let check = br.read_u32le()?;
- let size = br.read_u32le()?;
-
- let data_start = br.tell();
-
- if (frameno ^ hdr_2 ^ size ^ FRMH_TAG) != check {
- return Err(DecoderError::InvalidData);
- }
- if (size as i64) > br.left() { return Err(DecoderError::InvalidData); }
- let ver = br.read_u16le()?;
- if ver != 32 { return Err(DecoderError::NotImplemented); }
- let flags = br.read_u16le()?;
- let size2 = br.read_u32le()?;
- validate!(((size2 + 7) >> 3) <= size);
- let cb = br.read_byte()?;
- self.vq_offset = cb;
- br.read_skip(3)?;
- let height = br.read_u16le()?;
- let width = br.read_u16le()?;
- validate!((width >= 16) && (width <= 640));
- validate!((height >= 16) && (height <= 640));
- validate!(((width & 3) == 0) && ((height & 3) == 0));
- if (self.bufs.width != (width as usize)) || (self.bufs.height != (height as usize)) {
- self.bufs.alloc(width as usize, height as usize);
- }
- self.width = width;
- self.height = height;
-
- let yoff = br.read_u32le()?;
- let uoff = br.read_u32le()?;
- let voff = br.read_u32le()?;
- if yoff > size { return Err(DecoderError::InvalidData); }
- if uoff > size { return Err(DecoderError::InvalidData); }
- if voff > size { return Err(DecoderError::InvalidData); }
-
- br.read_skip(4)?;
- br.read_buf(&mut self.altquant)?;
-
- let mut yend = src.len() as u32;//size;
- if (uoff < yend) && (uoff > yoff) { yend = uoff; }
- if (voff < yend) && (voff > yoff) { yend = voff; }
- let mut uend = size;
- if (yoff < uend) && (yoff > uoff) { uend = yoff; }
- if (voff < uend) && (voff > uoff) { uend = voff; }
- let mut vend = size;
- if (yoff < vend) && (yoff > voff) { vend = yoff; }
- if (uoff < vend) && (uoff > voff) { vend = uoff; }
-
- let intraframe = (flags & FLAG_KEYFRAME) != 0;
- let vinfo = self.info.get_properties().get_video_info().unwrap();
- let bufret = alloc_video_buffer(vinfo, 2);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let mut bufinfo = bufret.unwrap();
- let mut buf = bufinfo.get_vbuf().unwrap();
- let ystart = data_start + (yoff as u64);
- let ustart = data_start + (uoff as u64);
- let vstart = data_start + (voff as u64);
- let yendpos = data_start + (yend as u64);
- let uendpos = data_start + (uend as u64);
- let vendpos = data_start + (vend as u64);
- if intraframe {
- self.decode_plane_intra(&mut br, 0, ystart, yendpos)?;
- self.decode_plane_intra(&mut br, 1, ustart, uendpos)?;
- self.decode_plane_intra(&mut br, 2, vstart, vendpos)?;
- } else {
- self.decode_plane_inter(&mut br, 0, ystart, yendpos)?;
- self.decode_plane_inter(&mut br, 1, ustart, uendpos)?;
- self.decode_plane_inter(&mut br, 2, vstart, vendpos)?;
- }
- self.bufs.fill_framebuf(&mut buf);
- if (flags & FLAG_NONREF) == 0 { self.bufs.flip(); }
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(intraframe);
- frm.set_frame_type(if intraframe { FrameType::I } else { FrameType::P });
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(Indeo3Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_indeo3() {
- test_file_decoding("avi", "assets/iv32_example.avi", Some(10), true, false, None);
- }
-}
-
-const DT_1_1: IviDeltaCB = IviDeltaCB{ quad_radix: 7, data: &[
- 0, 0, 2, 2, -2, -2, -1, 3,
- 1, -3, 3, -1, -3, 1, 4, 4,
- -4, -4, 1, 5, -1, -5, 5, 1,
- -5, -1, -4, 4, 4, -4, -2, 6,
- 2, -6, 6, -2, -6, 2, 4, 9,
- -4, -9, 9, 4, -9, -4, 9, 9,
- -9, -9, 1, 10, -1, -10, 10, 1,
- -10, -1, -5, 8, 5, -8, 8, -5,
- -8, 5, 9, 15, -9, -15, 15, 9,
- -15, -9, -3, 12, 3, -12, 12, -3,
- -12, 3, 4, 16, -4, -16, 16, 4,
- -16, -4, 16, 16, -16, -16, 0, 18,
- 0, -18, 18, 0, -18, 0, -12, 12,
- 12, -12, -9, 16, 9, -16, 16, -9,
- -16, 9, 11, 27, -11, -27, 27, 11,
- -27, -11, 19, 28, -19, -28, 28, 19,
- -28, -19, -6, 22, 6, -22, 22, -6,
- -22, 6, 4, 29, -4, -29, 29, 4,
- -29, -4, 30, 30, -30, -30, -2, 33,
- 2, -33, 33, -2, -33, 2, -18, 23,
- 18, -23, 23, -18, -23, 18, -15, 30,
- 15, -30, 30, -15, -30, 15, 22, 46,
- -22, -46, 46, 22, -46, -22, 13, 47,
- -13, -47, 47, 13, -47, -13, 35, 49,
- -35, -49, 49, 35, -49, -35, -11, 41,
- 11, -41, 41, -11, -41, 11, 4, 51,
- -4, -51, 51, 4, -51, -4, 54, 54,
- -54, -54, -34, 34, 34, -34, -29, 42,
- 29, -42, 42, -29, -42, 29, -6, 60,
- 6, -60, 60, -6, -60, 6, 27, 76,
- -27, -76, 76, 27, -76, -27, 43, 77,
- -43, -77, 77, 43, -77, -43, -24, 55,
- 24, -55, 55, -24, -55, 24, 14, 79,
- -14, -79, 79, 14, -79, -14, 63, 83,
- -63, -83, 83, 63, -83, -63, -20, 74,
- 20, -74, 74, -20, -74, 20, 2, 88,
- -2, -88, 88, 2, -88, -2, 93, 93,
- -93, -93, -52, 61, 52, -61, 61, -52,
- -61, 52, 52, 120, -52, -120, 120, 52,
- -120, -52, -45, 75, 45, -75, 75, -45,
- -75, 45, 75, 125, -75, -125, 125, 75,
- -125, -75, 33, 122, -33, -122, 122, 33,
- -122, -33, -13, 103, 13, -103, 103, -13,
- -103, 13, -40, 96, 40, -96, 96, -40,
- -96, 40, -34, 127, 34, -127, 127, -34,
- -127, 34, -89, 89, 89, -89, -78, 105,
- 78, -105, 105, -78, -105, 78, 12, 12,
- -12, -12, 23, 23, -23, -23, 42, 42,
- -42, -42, 73, 73, -73, -73,
-]};
-
-const DT_1_2: IviDeltaCB = IviDeltaCB{ quad_radix: 9, data: &[
- 0, 0, 3, 3, -3, -3, -1, 4,
- 1, -4, 4, -1, -4, 1, 7, 7,
- -7, -7, 2, 8, -2, -8, 8, 2,
- -8, -2, -2, 9, 2, -9, 9, -2,
- -9, 2, -6, 6, 6, -6, 6, 13,
- -6, -13, 13, 6, -13, -6, 13, 13,
- -13, -13, 1, 14, -1, -14, 14, 1,
- -14, -1, -8, 12, 8, -12, 12, -8,
- -12, 8, 14, 23, -14, -23, 23, 14,
- -23, -14, -5, 18, 5, -18, 18, -5,
- -18, 5, 6, 24, -6, -24, 24, 6,
- -24, -6, 24, 24, -24, -24, -1, 27,
- 1, -27, 27, -1, -27, 1, -17, 17,
- 17, -17, -13, 23, 13, -23, 23, -13,
- -23, 13, 16, 40, -16, -40, 40, 16,
- -40, -16, 28, 41, -28, -41, 41, 28,
- -41, -28, -9, 33, 9, -33, 33, -9,
- -33, 9, 6, 43, -6, -43, 43, 6,
- -43, -6, 46, 46, -46, -46, -4, 50,
- 4, -50, 50, -4, -50, 4, -27, 34,
- 27, -34, 34, -27, -34, 27, -22, 45,
- 22, -45, 45, -22, -45, 22, 34, 69,
- -34, -69, 69, 34, -69, -34, 19, 70,
- -19, -70, 70, 19, -70, -19, 53, 73,
- -53, -73, 73, 53, -73, -53, -17, 62,
- 17, -62, 62, -17, -62, 17, 5, 77,
- -5, -77, 77, 5, -77, -5, 82, 82,
- -82, -82, -51, 51, 51, -51, -43, 64,
- 43, -64, 64, -43, -64, 43, -10, 90,
- 10, -90, 90, -10, -90, 10, 41, 114,
- -41, -114, 114, 41, -114, -41, 64, 116,
- -64, -116, 116, 64, -116, -64, -37, 82,
- 37, -82, 82, -37, -82, 37, 22, 119,
- -22, -119, 119, 22, -119, -22, 95, 124,
- -95, -124, 124, 95, -124, -95, -30, 111,
- 30, -111, 111, -30, -111, 30, -78, 92,
- 78, -92, 92, -78, -92, 78, -68, 113,
- 68, -113, 113, -68, -113, 68, 18, 18,
- -18, -18, 34, 34, -34, -34, 63, 63,
- -63, -63, 109, 109, -109, -109,
-]};
-
-const DT_1_3: IviDeltaCB = IviDeltaCB{ quad_radix: 10, data: &[
- 0, 0, 4, 4, -4, -4, -1, 5,
- 1, -5, 5, -1, -5, 1, 3, 10,
- -3, -10, 10, 3, -10, -3, 9, 9,
- -9, -9, -7, 7, 7, -7, -3, 12,
- 3, -12, 12, -3, -12, 3, 8, 17,
- -8, -17, 17, 8, -17, -8, 17, 17,
- -17, -17, 1, 19, -1, -19, 19, 1,
- -19, -1, -11, 16, 11, -16, 16, -11,
- -16, 11, -6, 23, 6, -23, 23, -6,
- -23, 6, 18, 31, -18, -31, 31, 18,
- -31, -18, 8, 32, -8, -32, 32, 8,
- -32, -8, 33, 33, -33, -33, -1, 36,
- 1, -36, 36, -1, -36, 1, -23, 23,
- 23, -23, -17, 31, 17, -31, 31, -17,
- -31, 17, 21, 54, -21, -54, 54, 21,
- -54, -21, 37, 55, -37, -55, 55, 37,
- -55, -37, -12, 44, 12, -44, 44, -12,
- -44, 12, 8, 57, -8, -57, 57, 8,
- -57, -8, 61, 61, -61, -61, -5, 66,
- 5, -66, 66, -5, -66, 5, -36, 45,
- 36, -45, 45, -36, -45, 36, -29, 60,
- 29, -60, 60, -29, -60, 29, 45, 92,
- -45, -92, 92, 45, -92, -45, 25, 93,
- -25, -93, 93, 25, -93, -25, 71, 97,
- -71, -97, 97, 71, -97, -71, -22, 83,
- 22, -83, 83, -22, -83, 22, 7, 102,
- -7, -102, 102, 7, -102, -7, 109, 109,
- -109, -109, -68, 68, 68, -68, -57, 85,
- 57, -85, 85, -57, -85, 57, -13, 120,
- 13, -120, 120, -13, -120, 13, -49, 110,
- 49, -110, 110, -49, -110, 49, -104, 123,
- 104, -123, 123, -104, -123, 104, 24, 24,
- -24, -24, 46, 46, -46, -46, 84, 84,
- -84, -84,
-]};
-
-const DT_1_4: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[
- 0, 0, 5, 5, -5, -5, -2, 7,
- 2, -7, 7, -2, -7, 2, 11, 11,
- -11, -11, 3, 13, -3, -13, 13, 3,
- -13, -3, -9, 9, 9, -9, -4, 15,
- 4, -15, 15, -4, -15, 4, 11, 22,
- -11, -22, 22, 11, -22, -11, 21, 21,
- -21, -21, 2, 24, -2, -24, 24, 2,
- -24, -2, -14, 20, 14, -20, 20, -14,
- -20, 14, 23, 38, -23, -38, 38, 23,
- -38, -23, -8, 29, 8, -29, 29, -8,
- -29, 8, 11, 39, -11, -39, 39, 11,
- -39, -11, 41, 41, -41, -41, -1, 45,
- 1, -45, 45, -1, -45, 1, -29, 29,
- 29, -29, -22, 39, 22, -39, 39, -22,
- -39, 22, 27, 67, -27, -67, 67, 27,
- -67, -27, 47, 69, -47, -69, 69, 47,
- -69, -47, -15, 56, 15, -56, 56, -15,
- -56, 15, 11, 71, -11, -71, 71, 11,
- -71, -11, 76, 76, -76, -76, -6, 83,
- 6, -83, 83, -6, -83, 6, -45, 57,
- 45, -57, 57, -45, -57, 45, -36, 75,
- 36, -75, 75, -36, -75, 36, 56, 115,
- -56, -115, 115, 56, -115, -56, 31, 117,
- -31, -117, 117, 31, -117, -31, 88, 122,
- -88, -122, 122, 88, -122, -88, -28, 104,
- 28, -104, 104, -28, -104, 28, -85, 85,
- 85, -85, -72, 106, 72, -106, 106, -72,
- -106, 72, 30, 30, -30, -30, 58, 58,
- -58, -58, 105, 105, -105, -105,
-]};
-
-const DT_1_5: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
- 0, 0, 6, 6, -6, -6, -2, 8,
- 2, -8, 8, -2, -8, 2, 13, 13,
- -13, -13, 4, 15, -4, -15, 15, 4,
- -15, -4, -11, 11, 11, -11, -5, 18,
- 5, -18, 18, -5, -18, 5, 13, 26,
- -13, -26, 26, 13, -26, -13, 26, 26,
- -26, -26, 2, 29, -2, -29, 29, 2,
- -29, -2, -16, 24, 16, -24, 24, -16,
- -24, 16, 28, 46, -28, -46, 46, 28,
- -46, -28, -9, 35, 9, -35, 35, -9,
- -35, 9, 13, 47, -13, -47, 47, 13,
- -47, -13, 49, 49, -49, -49, -1, 54,
- 1, -54, 54, -1, -54, 1, -35, 35,
- 35, -35, -26, 47, 26, -47, 47, -26,
- -47, 26, 32, 81, -32, -81, 81, 32,
- -81, -32, 56, 83, -56, -83, 83, 56,
- -83, -56, -18, 67, 18, -67, 67, -18,
- -67, 18, 13, 86, -13, -86, 86, 13,
- -86, -13, 91, 91, -91, -91, -7, 99,
- 7, -99, 99, -7, -99, 7, -54, 68,
- 54, -68, 68, -54, -68, 54, -44, 90,
- 44, -90, 90, -44, -90, 44, -33, 124,
- 33, -124, 124, -33, -124, 33, -103, 103,
- 103, -103, -86, 127, 86, -127, 127, -86,
- -127, 86, 37, 37, -37, -37, 69, 69,
- -69, -69,
-]};
-
-const DT_1_6: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
- 0, 0, 7, 7, -7, -7, -3, 10,
- 3, -10, 10, -3, -10, 3, 16, 16,
- -16, -16, 5, 18, -5, -18, 18, 5,
- -18, -5, -13, 13, 13, -13, -6, 21,
- 6, -21, 21, -6, -21, 6, 15, 30,
- -15, -30, 30, 15, -30, -15, 30, 30,
- -30, -30, 2, 34, -2, -34, 34, 2,
- -34, -2, -19, 28, 19, -28, 28, -19,
- -28, 19, 32, 54, -32, -54, 54, 32,
- -54, -32, -11, 41, 11, -41, 41, -11,
- -41, 11, 15, 55, -15, -55, 55, 15,
- -55, -15, 57, 57, -57, -57, -1, 63,
- 1, -63, 63, -1, -63, 1, -40, 40,
- 40, -40, -30, 55, 30, -55, 55, -30,
- -55, 30, 37, 94, -37, -94, 94, 37,
- -94, -37, 65, 96, -65, -96, 96, 65,
- -96, -65, -21, 78, 21, -78, 78, -21,
- -78, 21, 15, 100, -15, -100, 100, 15,
- -100, -15, 106, 106, -106, -106, -8, 116,
- 8, -116, 116, -8, -116, 8, -63, 79,
- 63, -79, 79, -63, -79, 63, -51, 105,
- 51, -105, 105, -51, -105, 51, -120, 120,
- 120, -120, 43, 43, -43, -43, 80, 80,
- -80, -80,
-]};
-
-const DT_1_7: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
- 0, 0, 8, 8, -8, -8, -3, 11,
- 3, -11, 11, -3, -11, 3, 18, 18,
- -18, -18, 5, 20, -5, -20, 20, 5,
- -20, -5, -15, 15, 15, -15, -7, 24,
- 7, -24, 24, -7, -24, 7, 17, 35,
- -17, -35, 35, 17, -35, -17, 34, 34,
- -34, -34, 3, 38, -3, -38, 38, 3,
- -38, -3, -22, 32, 22, -32, 32, -22,
- -32, 22, 37, 61, -37, -61, 61, 37,
- -61, -37, -13, 47, 13, -47, 47, -13,
- -47, 13, 17, 63, -17, -63, 63, 17,
- -63, -17, 65, 65, -65, -65, -1, 72,
- 1, -72, 72, -1, -72, 1, -46, 46,
- 46, -46, -35, 63, 35, -63, 63, -35,
- -63, 35, 43, 107, -43, -107, 107, 43,
- -107, -43, 75, 110, -75, -110, 110, 75,
- -110, -75, -24, 89, 24, -89, 89, -24,
- -89, 24, 17, 114, -17, -114, 114, 17,
- -114, -17, 121, 121, -121, -121, -72, 91,
- 72, -91, 91, -72, -91, 72, -58, 120,
- 58, -120, 120, -58, -120, 58, 49, 49,
- -49, -49, 92, 92, -92, -92,
-]};
-
-const DT_1_8: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
- 0, 0, 9, 9, -9, -9, -3, 12,
- 3, -12, 12, -3, -12, 3, 20, 20,
- -20, -20, 6, 23, -6, -23, 23, 6,
- -23, -6, -17, 17, 17, -17, -7, 27,
- 7, -27, 27, -7, -27, 7, 19, 39,
- -19, -39, 39, 19, -39, -19, 39, 39,
- -39, -39, 3, 43, -3, -43, 43, 3,
- -43, -3, -24, 36, 24, -36, 36, -24,
- -36, 24, 42, 69, -42, -69, 69, 42,
- -69, -42, -14, 53, 14, -53, 53, -14,
- -53, 14, 19, 71, -19, -71, 71, 19,
- -71, -19, 73, 73, -73, -73, -2, 80,
- 2, -80, 80, -2, -80, 2, -52, 52,
- 52, -52, -39, 70, 39, -70, 70, -39,
- -70, 39, 48, 121, -48, -121, 121, 48,
- -121, -48, 84, 124, -84, -124, 124, 84,
- -124, -84, -27, 100, 27, -100, 100, -27,
- -100, 27, -81, 102, 81, -102, 102, -81,
- -102, 81, 55, 55, -55, -55, 104, 104,
- -104, -104,
-]};
-
-const DT_2_1: IviDeltaCB = IviDeltaCB{ quad_radix: 7, data: &[
- 0, 0, 2, 2, -2, -2, 0, 2,
- 0, -2, 2, 0, -2, 0, 4, 4,
- -4, -4, 0, 4, 0, -4, 4, 0,
- -4, 0, -4, 4, 4, -4, -2, 6,
- 2, -6, 6, -2, -6, 2, 4, 8,
- -4, -8, 8, 4, -8, -4, 8, 8,
- -8, -8, 0, 10, 0, -10, 10, 0,
- -10, 0, -4, 8, 4, -8, 8, -4,
- -8, 4, 8, 14, -8, -14, 14, 8,
- -14, -8, -2, 12, 2, -12, 12, -2,
- -12, 2, 4, 16, -4, -16, 16, 4,
- -16, -4, 16, 16, -16, -16, 0, 18,
- 0, -18, 18, 0, -18, 0, -12, 12,
- 12, -12, -8, 16, 8, -16, 16, -8,
- -16, 8, 10, 26, -10, -26, 26, 10,
- -26, -10, 18, 28, -18, -28, 28, 18,
- -28, -18, -6, 22, 6, -22, 22, -6,
- -22, 6, 4, 28, -4, -28, 28, 4,
- -28, -4, 30, 30, -30, -30, -2, 32,
- 2, -32, 32, -2, -32, 2, -18, 22,
- 18, -22, 22, -18, -22, 18, -14, 30,
- 14, -30, 30, -14, -30, 14, 22, 46,
- -22, -46, 46, 22, -46, -22, 12, 46,
- -12, -46, 46, 12, -46, -12, 34, 48,
- -34, -48, 48, 34, -48, -34, -10, 40,
- 10, -40, 40, -10, -40, 10, 4, 50,
- -4, -50, 50, 4, -50, -4, 54, 54,
- -54, -54, -34, 34, 34, -34, -28, 42,
- 28, -42, 42, -28, -42, 28, -6, 60,
- 6, -60, 60, -6, -60, 6, 26, 76,
- -26, -76, 76, 26, -76, -26, 42, 76,
- -42, -76, 76, 42, -76, -42, -24, 54,
- 24, -54, 54, -24, -54, 24, 14, 78,
- -14, -78, 78, 14, -78, -14, 62, 82,
- -62, -82, 82, 62, -82, -62, -20, 74,
- 20, -74, 74, -20, -74, 20, 2, 88,
- -2, -88, 88, 2, -88, -2, 92, 92,
- -92, -92, -52, 60, 52, -60, 60, -52,
- -60, 52, 52, 118, -52, -118, 118, 52,
- -118, -52, -44, 74, 44, -74, 74, -44,
- -74, 44, 74, 118, -74, -118, 118, 74,
- -118, -74, 32, 118, -32, -118, 118, 32,
- -118, -32, -12, 102, 12, -102, 102, -12,
- -102, 12, -40, 96, 40, -96, 96, -40,
- -96, 40, -34, 118, 34, -118, 118, -34,
- -118, 34, -88, 88, 88, -88, -78, 104,
- 78, -104, 104, -78, -104, 78, 12, 12,
- -12, -12, 22, 22, -22, -22, 42, 42,
- -42, -42, 72, 72, -72, -72,
-]};
-
-const DT_2_2: IviDeltaCB = IviDeltaCB{ quad_radix: 9, data: &[
- 0, 0, 3, 3, -3, -3, 0, 3,
- 0, -3, 3, 0, -3, 0, 6, 6,
- -6, -6, 3, 9, -3, -9, 9, 3,
- -9, -3, -3, 9, 3, -9, 9, -3,
- -9, 3, -6, 6, 6, -6, 6, 12,
- -6, -12, 12, 6, -12, -6, 12, 12,
- -12, -12, 0, 15, 0, -15, 15, 0,
- -15, 0, -9, 12, 9, -12, 12, -9,
- -12, 9, 15, 24, -15, -24, 24, 15,
- -24, -15, -6, 18, 6, -18, 18, -6,
- -18, 6, 6, 24, -6, -24, 24, 6,
- -24, -6, 24, 24, -24, -24, 0, 27,
- 0, -27, 27, 0, -27, 0, -18, 18,
- 18, -18, -12, 24, 12, -24, 24, -12,
- -24, 12, 15, 39, -15, -39, 39, 15,
- -39, -15, 27, 42, -27, -42, 42, 27,
- -42, -27, -9, 33, 9, -33, 33, -9,
- -33, 9, 6, 42, -6, -42, 42, 6,
- -42, -6, 45, 45, -45, -45, -3, 51,
- 3, -51, 51, -3, -51, 3, -27, 33,
- 27, -33, 33, -27, -33, 27, -21, 45,
- 21, -45, 45, -21, -45, 21, 33, 69,
- -33, -69, 69, 33, -69, -33, 18, 69,
- -18, -69, 69, 18, -69, -18, 54, 72,
- -54, -72, 72, 54, -72, -54, -18, 63,
- 18, -63, 63, -18, -63, 18, 6, 78,
- -6, -78, 78, 6, -78, -6, 81, 81,
- -81, -81, -51, 51, 51, -51, -42, 63,
- 42, -63, 63, -42, -63, 42, -9, 90,
- 9, -90, 90, -9, -90, 9, 42, 114,
- -42, -114, 114, 42, -114, -42, 63, 117,
- -63, -117, 117, 63, -117, -63, -36, 81,
- 36, -81, 81, -36, -81, 36, 21, 120,
- -21, -120, 120, 21, -120, -21, 96, 123,
- -96, -123, 123, 96, -123, -96, -30, 111,
- 30, -111, 111, -30, -111, 30, -78, 93,
- 78, -93, 93, -78, -93, 78, -69, 114,
- 69, -114, 114, -69, -114, 69, 18, 18,
- -18, -18, 33, 33, -33, -33, 63, 63,
- -63, -63, 108, 108, -108, -108,
-]};
-
-const DT_2_3: IviDeltaCB = IviDeltaCB{ quad_radix: 10, data: &[
- 0, 0, 4, 4, -4, -4, 0, 4,
- 0, -4, 4, 0, -4, 0, 4, 8,
- -4, -8, 8, 4, -8, -4, 8, 8,
- -8, -8, -8, 8, 8, -8, -4, 12,
- 4, -12, 12, -4, -12, 4, 8, 16,
- -8, -16, 16, 8, -16, -8, 16, 16,
- -16, -16, 0, 20, 0, -20, 20, 0,
- -20, 0, -12, 16, 12, -16, 16, -12,
- -16, 12, -4, 24, 4, -24, 24, -4,
- -24, 4, 16, 32, -16, -32, 32, 16,
- -32, -16, 8, 32, -8, -32, 32, 8,
- -32, -8, 32, 32, -32, -32, 0, 36,
- 0, -36, 36, 0, -36, 0, -24, 24,
- 24, -24, -16, 32, 16, -32, 32, -16,
- -32, 16, 20, 52, -20, -52, 52, 20,
- -52, -20, 36, 56, -36, -56, 56, 36,
- -56, -36, -12, 44, 12, -44, 44, -12,
- -44, 12, 8, 56, -8, -56, 56, 8,
- -56, -8, 60, 60, -60, -60, -4, 64,
- 4, -64, 64, -4, -64, 4, -36, 44,
- 36, -44, 44, -36, -44, 36, -28, 60,
- 28, -60, 60, -28, -60, 28, 44, 92,
- -44, -92, 92, 44, -92, -44, 24, 92,
- -24, -92, 92, 24, -92, -24, 72, 96,
- -72, -96, 96, 72, -96, -72, -20, 84,
- 20, -84, 84, -20, -84, 20, 8, 100,
- -8, -100, 100, 8, -100, -8, 108, 108,
- -108, -108, -68, 68, 68, -68, -56, 84,
- 56, -84, 84, -56, -84, 56, -12, 120,
- 12, -120, 120, -12, -120, 12, -48, 108,
- 48, -108, 108, -48, -108, 48, -104, 124,
- 104, -124, 124, -104, -124, 104, 24, 24,
- -24, -24, 44, 44, -44, -44, 84, 84,
- -84, -84,
-]};
-
-const DT_2_4: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[
- 0, 0, 5, 5, -5, -5, 0, 5,
- 0, -5, 5, 0, -5, 0, 10, 10,
- -10, -10, 5, 15, -5, -15, 15, 5,
- -15, -5, -10, 10, 10, -10, -5, 15,
- 5, -15, 15, -5, -15, 5, 10, 20,
- -10, -20, 20, 10, -20, -10, 20, 20,
- -20, -20, 0, 25, 0, -25, 25, 0,
- -25, 0, -15, 20, 15, -20, 20, -15,
- -20, 15, 25, 40, -25, -40, 40, 25,
- -40, -25, -10, 30, 10, -30, 30, -10,
- -30, 10, 10, 40, -10, -40, 40, 10,
- -40, -10, 40, 40, -40, -40, 0, 45,
- 0, -45, 45, 0, -45, 0, -30, 30,
- 30, -30, -20, 40, 20, -40, 40, -20,
- -40, 20, 25, 65, -25, -65, 65, 25,
- -65, -25, 45, 70, -45, -70, 70, 45,
- -70, -45, -15, 55, 15, -55, 55, -15,
- -55, 15, 10, 70, -10, -70, 70, 10,
- -70, -10, 75, 75, -75, -75, -5, 85,
- 5, -85, 85, -5, -85, 5, -45, 55,
- 45, -55, 55, -45, -55, 45, -35, 75,
- 35, -75, 75, -35, -75, 35, 55, 115,
- -55, -115, 115, 55, -115, -55, 30, 115,
- -30, -115, 115, 30, -115, -30, 90, 120,
- -90, -120, 120, 90, -120, -90, -30, 105,
- 30, -105, 105, -30, -105, 30, -85, 85,
- 85, -85, -70, 105, 70, -105, 105, -70,
- -105, 70, 30, 30, -30, -30, 60, 60,
- -60, -60, 105, 105, -105, -105,
-]};
-
-const DT_2_5: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
- 0, 0, 6, 6, -6, -6, 0, 6,
- 0, -6, 6, 0, -6, 0, 12, 12,
- -12, -12, 6, 12, -6, -12, 12, 6,
- -12, -6, -12, 12, 12, -12, -6, 18,
- 6, -18, 18, -6, -18, 6, 12, 24,
- -12, -24, 24, 12, -24, -12, 24, 24,
- -24, -24, 0, 30, 0, -30, 30, 0,
- -30, 0, -18, 24, 18, -24, 24, -18,
- -24, 18, 30, 48, -30, -48, 48, 30,
- -48, -30, -6, 36, 6, -36, 36, -6,
- -36, 6, 12, 48, -12, -48, 48, 12,
- -48, -12, 48, 48, -48, -48, 0, 54,
- 0, -54, 54, 0, -54, 0, -36, 36,
- 36, -36, -24, 48, 24, -48, 48, -24,
- -48, 24, 30, 78, -30, -78, 78, 30,
- -78, -30, 54, 84, -54, -84, 84, 54,
- -84, -54, -18, 66, 18, -66, 66, -18,
- -66, 18, 12, 84, -12, -84, 84, 12,
- -84, -12, 90, 90, -90, -90, -6, 96,
- 6, -96, 96, -6, -96, 6, -54, 66,
- 54, -66, 66, -54, -66, 54, -42, 90,
- 42, -90, 90, -42, -90, 42, -30, 126,
- 30, -126, 126, -30, -126, 30, -102, 102,
- 102, -102, -84, 126, 84, -126, 126, -84,
- -126, 84, 36, 36, -36, -36, 66, 66,
- -66, -66,
-]};
-
-const DT_2_6: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
- 0, 0, 7, 7, -7, -7, 0, 7,
- 0, -7, 7, 0, -7, 0, 14, 14,
- -14, -14, 7, 21, -7, -21, 21, 7,
- -21, -7, -14, 14, 14, -14, -7, 21,
- 7, -21, 21, -7, -21, 7, 14, 28,
- -14, -28, 28, 14, -28, -14, 28, 28,
- -28, -28, 0, 35, 0, -35, 35, 0,
- -35, 0, -21, 28, 21, -28, 28, -21,
- -28, 21, 35, 56, -35, -56, 56, 35,
- -56, -35, -14, 42, 14, -42, 42, -14,
- -42, 14, 14, 56, -14, -56, 56, 14,
- -56, -14, 56, 56, -56, -56, 0, 63,
- 0, -63, 63, 0, -63, 0, -42, 42,
- 42, -42, -28, 56, 28, -56, 56, -28,
- -56, 28, 35, 91, -35, -91, 91, 35,
- -91, -35, 63, 98, -63, -98, 98, 63,
- -98, -63, -21, 77, 21, -77, 77, -21,
- -77, 21, 14, 98, -14, -98, 98, 14,
- -98, -14, 105, 105, -105, -105, -7, 119,
- 7, -119, 119, -7, -119, 7, -63, 77,
- 63, -77, 77, -63, -77, 63, -49, 105,
- 49, -105, 105, -49, -105, 49, -119, 119,
- 119, -119, 42, 42, -42, -42, 77, 77,
- -77, -77,
-]};
-
-const DT_2_7: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
- 0, 0, 8, 8, -8, -8, 0, 8,
- 0, -8, 8, 0, -8, 0, 16, 16,
- -16, -16, 8, 16, -8, -16, 16, 8,
- -16, -8, -16, 16, 16, -16, -8, 24,
- 8, -24, 24, -8, -24, 8, 16, 32,
- -16, -32, 32, 16, -32, -16, 32, 32,
- -32, -32, 0, 40, 0, -40, 40, 0,
- -40, 0, -24, 32, 24, -32, 32, -24,
- -32, 24, 40, 64, -40, -64, 64, 40,
- -64, -40, -16, 48, 16, -48, 48, -16,
- -48, 16, 16, 64, -16, -64, 64, 16,
- -64, -16, 64, 64, -64, -64, 0, 72,
- 0, -72, 72, 0, -72, 0, -48, 48,
- 48, -48, -32, 64, 32, -64, 64, -32,
- -64, 32, 40, 104, -40, -104, 104, 40,
- -104, -40, 72, 112, -72, -112, 112, 72,
- -112, -72, -24, 88, 24, -88, 88, -24,
- -88, 24, 16, 112, -16, -112, 112, 16,
- -112, -16, 120, 120, -120, -120, -72, 88,
- 72, -88, 88, -72, -88, 72, -56, 120,
- 56, -120, 120, -56, -120, 56, 48, 48,
- -48, -48, 88, 88, -88, -88,
-]};
-
-const DT_2_8: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
- 0, 0, 9, 9, -9, -9, 0, 9,
- 0, -9, 9, 0, -9, 0, 18, 18,
- -18, -18, 9, 27, -9, -27, 27, 9,
- -27, -9, -18, 18, 18, -18, -9, 27,
- 9, -27, 27, -9, -27, 9, 18, 36,
- -18, -36, 36, 18, -36, -18, 36, 36,
- -36, -36, 0, 45, 0, -45, 45, 0,
- -45, 0, -27, 36, 27, -36, 36, -27,
- -36, 27, 45, 72, -45, -72, 72, 45,
- -72, -45, -18, 54, 18, -54, 54, -18,
- -54, 18, 18, 72, -18, -72, 72, 18,
- -72, -18, 72, 72, -72, -72, 0, 81,
- 0, -81, 81, 0, -81, 0, -54, 54,
- 54, -54, -36, 72, 36, -72, 72, -36,
- -72, 36, 45, 117, -45, -117, 117, 45,
- -117, -45, 81, 126, -81, -126, 126, 81,
- -126, -81, -27, 99, 27, -99, 99, -27,
- -99, 27, -81, 99, 81, -99, 99, -81,
- -99, 81, 54, 54, -54, -54, 108, 108,
- -108, -108,
-]};
-
-const DT_3_1: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[
- 0, 0, 2, 2, -2, -2, 0, 3,
- 0, -3, 3, 0, -3, 0, 6, 6,
- -6, -6, 0, 7, 0, -7, 7, 0,
- -7, 0, -5, 5, 5, -5, 5, -5,
- -5, 5, 6, 11, -6, -11, 11, 6,
- -11, -6, 0, 8, 0, -8, 8, 0,
- -8, 0, 11, 11, -11, -11, 0, 12,
- 0, -12, 12, 0, -12, 0, 12, 17,
- -12, -17, 17, 12, -17, -12, 17, 17,
- -17, -17, 6, 18, -6, -18, 18, 6,
- -18, -6, -8, 11, 8, -11, 11, -8,
- -11, 8, 0, 15, 0, -15, 15, 0,
- -15, 0, 0, 20, 0, -20, 20, 0,
- -20, 0, 18, 25, -18, -25, 25, 18,
- -25, -18, 11, 25, -11, -25, 25, 11,
- -25, -11, 25, 25, -25, -25, -14, 14,
- 14, -14, 14, -14, -14, 14, 0, 26,
- 0, -26, 26, 0, -26, 0, -11, 18,
- 11, -18, 18, -11, -18, 11, -7, 22,
- 7, -22, 22, -7, -22, 7, 26, 34,
- -26, -34, 34, 26, -34, -26, 18, 34,
- -18, -34, 34, 18, -34, -18, 34, 34,
- -34, -34, 11, 35, -11, -35, 35, 11,
- -35, -11, 0, 29, 0, -29, 29, 0,
- -29, 0, -19, 22, 19, -22, 22, -19,
- -22, 19, -15, 26, 15, -26, 26, -15,
- -26, 15, 0, 37, 0, -37, 37, 0,
- -37, 0, 27, 44, -27, -44, 44, 27,
- -44, -27, 36, 44, -36, -44, 44, 36,
- -44, -36, 18, 44, -18, -44, 44, 18,
- -44, -18, -10, 33, 10, -33, 33, -10,
- -33, 10, 45, 45, -45, -45, 0, 0,
-]};
-
-const DT_3_2: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
- 0, 0, 0, 2, 0, -2, 2, 0,
- -2, 0, 2, 2, -2, -2, 6, 6,
- -6, -6, 0, 6, 0, -6, 6, 0,
- -6, 0, -4, 4, 4, -4, 10, -6,
- -10, 6, 0, -12, 0, 12, -6, -12,
- 6, -12, -6, 12, 6, 12, -14, 0,
- 14, 0, 12, 12, -12, -12, 0, -18,
- 0, 18, 14, -12, -14, 12, -18, -6,
- 18, -6, -18, 6, 18, 6, -10, -18,
- 10, -18, -10, 18, 10, 18, -22, 0,
- 22, 0, 0, -24, 0, 24, -22, -12,
- 22, -12, -22, 12, 22, 12, -8, -24,
- 8, -24, -8, 24, 8, 24, -26, -6,
- 26, -6, -26, 6, 26, 6, -28, 0,
- 28, 0, 20, 20, -20, -20, -14, -26,
- 14, 26, -30, -12, 30, 12, -10, -32,
- 10, 32, -18, -32, 18, 32, -26, -26,
- 26, 26, -34, -20, 34, 20, -38, -12,
- 38, 12, -32, -32, 32, 32, 32, 32,
- -22, -40, -34, -34, 34, 34,
-]};
-
-const DT_3_3: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
- 0, 0, 0, 2, 0, -2, 2, 0,
- -2, 0, 4, 4, -4, -4, 10, 10,
- -10, -10, 0, 10, 0, -10, 10, 0,
- -10, 0, -6, 6, 6, -6, 14, -8,
- -14, 8, -18, 0, 18, 0, 10, -16,
- -10, 16, 0, -24, 0, 24, -24, -8,
- 24, -8, -24, 8, 24, 8, 18, 18,
- -18, -18, 20, -16, -20, 16, -14, -26,
- 14, -26, -14, 26, 14, 26, -30, 0,
- 30, 0, 0, -34, 0, 34, -34, -8,
- 34, -8, -34, 8, 34, 8, -30, -18,
- 30, -18, -30, 18, 30, 18, -10, -34,
- 10, -34, -10, 34, 10, 34, -20, -34,
- 20, 34, -40, 0, 40, 0, 30, 30,
- -30, -30, -40, -18, 40, 18, 0, -44,
- 0, 44, -16, -44, 16, 44, -36, -36,
- -36, -36, 36, 36, -26, -44, 26, 44,
- -46, -26, 46, 26, -52, -18, 52, 18,
- -20, -54, -44, -44, 44, 44, -32, -54,
- -46, -46, -46, -46, 46, 46,
-]};
-
-const DT_3_4: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
- 0, 0, 0, 4, 0, -4, 4, 0,
- -4, 0, 4, 4, -4, -4, 12, 12,
- -12, -12, 0, 12, 0, -12, 12, 0,
- -12, 0, -8, 8, 8, -8, 8, -16,
- -8, 16, 0, -24, 0, 24, -24, -8,
- 24, -8, -24, 8, 24, 8, 20, -16,
- -20, 16, -28, 0, 28, 0, -16, -24,
- 16, -24, -16, 24, 16, 24, 0, -32,
- 0, 32, -28, -16, 28, -16, -28, 16,
- 28, 16, -8, -32, 8, -32, -32, -8,
- 32, -8, -32, 8, 32, 8, -8, 32,
- 8, 32, 24, 24, -24, -24, 24, -24,
- -24, 24, -20, -32, 20, 32, -40, 0,
- 40, 0, -40, -16, 40, 16, 0, -44,
- 0, -44, -44, 0, 44, 0, 0, 44,
- 0, 44, -32, -32, 32, 32, -16, -44,
- 16, 44, -24, -44, -44, -24, 44, 24,
- 24, 44, -48, -16, 48, 16, -36, -36,
- -36, -36, 36, 36, 36, 36, -20, -52,
- 40, 40, -40, -40, -32, -52,
-]};
-
-const DT_3_5: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
- 0, 0, 2, 2, -2, -2, 6, 6,
- -6, -6, 12, 12, -12, -12, 20, 20,
- -20, -20, 32, 32, -32, -32, 46, 46,
- -46, -46, 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, 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,
-]};
-
-const IVI3_DELTA_CBS: [&IviDeltaCB; 24] = [
- &DT_1_1, &DT_1_2, &DT_1_3, &DT_1_4, &DT_1_5, &DT_1_6, &DT_1_7, &DT_1_8,
- &DT_2_1, &DT_2_2, &DT_2_3, &DT_2_4, &DT_2_5, &DT_2_6, &DT_2_7, &DT_2_8,
- &DT_3_1, &DT_3_2, &DT_3_3, &DT_3_4, &DT_3_5, &DT_3_5, &DT_3_5, &DT_3_5
-];
diff --git a/src/codecs/indeo/indeo4.rs b/src/codecs/indeo/indeo4.rs
deleted file mode 100644
index 773b177..0000000
--- a/src/codecs/indeo/indeo4.rs
+++ /dev/null
@@ -1,773 +0,0 @@
-use std::cell::Ref;
-use crate::io::bitreader::*;
-use crate::formats;
-use super::super::*;
-use super::ivi::*;
-use super::ivibr::*;
-
-#[inline(always)]
-fn mclip8(a: i32) -> u8 {
- if (a as u16) > 255 { !(a >> 16) as u8 }
- else { a as u8 }
-}
-
-struct Indeo4Parser {
- mb_cb: IVICodebook,
- blk_cb: IVICodebook,
-}
-
-fn calc_quant(glob_q: u32, qd: i16) -> u8 {
- let q = (glob_q as i16) + qd;
- if q < 0 {
- 0
- } else if q > 31 {
- 31
- } else {
- q as u8
- }
-}
-
-impl Indeo4Parser {
- fn new() -> Self {
- Indeo4Parser {
- mb_cb: IVI_CB_ZERO,
- blk_cb: IVI_CB_ZERO,
- }
- }
-}
-
-impl IndeoXParser for Indeo4Parser {
-#[allow(unused_variables,unused_assignments)]
- fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader> {
- let sync = br.read(18)?;
- validate!(sync == 0x3FFF8);
- let ftype_idx = br.read(3)?;
- validate!(ftype_idx < 7);
- let ftype = INDEO4_FRAME_TYPE[ftype_idx as usize];
- let transparent = br.read_bool()?;
- br.skip(1)?;
- let data_size;
- if br.read_bool()? {
- data_size = br.read(24)? as usize;
- } else {
- data_size = 0;
- }
- if ftype.is_null() {
- return Ok(PictureHeader::new_null(ftype));
- }
- if br.read_bool()? {
- br.skip(32)?; // key lock
- }
- let width;
- let height;
- let pic_size_idx = br.read(3)?;
- if pic_size_idx < 7 {
- width = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][0];
- height = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][1];
- } else {
- height = br.read(16)? as usize;
- width = br.read(16)? as usize;
- validate!((width > 0) && ((width & 3) == 0));
- validate!((height > 0) && ((height & 3) == 0));
- }
-
- let slice_w;
- let slice_h;
- if br.read_bool()? {
- let idx = br.read(4)? as usize;
- if idx < 15 {
- slice_w = INDEO4_SLICE_SIZE_TAB[idx];
- slice_h = INDEO4_SLICE_SIZE_TAB[idx];
- } else {
- slice_w = width;
- slice_h = height;
- }
- } else {
- slice_w = width;
- slice_h = height;
- }
- let subsampling = br.read(2)?;
- validate!(subsampling == 0);
- let sc_idx = br.read(2)?;
- match sc_idx {
- 3 => { },
- 2 => { validate!(br.read(2*4)? == 0xFF); }
- _ => { return Err(DecoderError::InvalidData); }
- };
- let luma_bands = if sc_idx == 2 { 4 } else { 1 };
- let sc_idx = br.read(2)?;
- match sc_idx {
- 3 => { },
- 2 => { validate!(br.read(2*4)? == 0xFF); }
- _ => { return Err(DecoderError::InvalidData); }
- };
- let chroma_bands = if sc_idx == 2 { 4 } else { 1 };
- let frame_no;
- if br.read_bool()? {
- frame_no = br.read(20)?;
- } else {
- frame_no = 0;
- }
- if br.read_bool()? {
- br.skip(8)?; // decTimeEst
- }
- let desc_coded = br.read_bool()?;
- self.mb_cb = br.read_ivi_codebook_desc(true, desc_coded)?;
- let desc_coded = br.read_bool()?;
- self.blk_cb = br.read_ivi_codebook_desc(false, desc_coded)?;
- let rvmap = if br.read_bool()? { br.read(3)? as usize } else { 8 };
- let in_imf = br.read_bool()?;
- let in_q = br.read_bool()?;
- let glob_q = br.read(5)? as u8;
- if br.read_bool()? {
- br.skip(3)?;
- }
- let checksum = if br.read_bool()? { br.read(16)? } else { 0 };
- if br.read_bool()? {
- br.skip(8)?; // pic hdr extension
- }
- if br.read_bool()? {
- println!("bad blocks bits!");
- }
- br.align();
-
- Ok(PictureHeader::new(ftype, width, height, slice_w, slice_h, transparent, luma_bands, chroma_bands, in_q))
- }
-
-#[allow(unused_variables,unused_assignments)]
- fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader> {
- let plane_no = br.read(2)? as usize;
- let band_no = br.read(4)? as usize;
- validate!(plane_no == plane);
- validate!(band_no == band);
- if br.read_bool()? {
- br.align();
- return Ok(BandHeader::new_empty(plane_no, band_no));
- }
- let hdr_size;
- if br.read_bool()? {
- hdr_size = br.read(16)? as usize;
- } else {
- hdr_size = 32;
- }
- let mv_mode = br.read(2)?;
- validate!(mv_mode < 2);
- if br.read_bool()? {
- br.skip(16)?; //checksum
- }
-
- let scale = br.read(2)?;
- validate!(scale != 3);
- let mb_size = 16 >> scale;
- let blk_size = 8 >> (scale >> 1);
- let inherit_mv = br.read_bool()?;
- let inherit_qd = br.read_bool()?;
- let quant = br.read(5)?;
-
- let tr: IVITransformType;
- let txtype: TxType;
- if !br.read_bool()? || pic_hdr.ftype == IVIFrameType::Intra {
- let tr_id = br.read(5)?;
- validate!(tr_id < 18);
- let scan_idx = br.read(4)? as usize;
- validate!(scan_idx != 15);
- let qmat_idx = br.read(5)? as usize;
-
- tr = INDEO4_TRANSFORMS[tr_id as usize];
- if (scan_idx < 5) || (scan_idx >= 10) {
- validate!(tr.is_8x8());
- validate!(qmat_idx < 15);
- let scan = if scan_idx < 5 { INDEO4_SCANS_8X8[scan_idx] }
- else { INDEO4_SCANS_8X8[4] };
- let qidx = INDEO4_Q8X8_IDX[qmat_idx];
- let qintra = INDEO4_Q8_INTRA[qidx];
- let qinter = INDEO4_Q8_INTER[qidx];
- txtype = TxType::Transform8(TxParams8x8::new(qintra, qinter, scan));
- } else if scan_idx < 10 {
- validate!(!tr.is_8x8());
- validate!((qmat_idx >= 15) && (qmat_idx < 22));
- let scan = INDEO4_SCANS_4X4[scan_idx - 5];
- let qidx = INDEO4_Q4X4_IDX[qmat_idx - 15];
- let qintra = INDEO4_Q4_INTRA[qidx];
- let qinter = INDEO4_Q4_INTER[qidx];
- txtype = TxType::Transform4(TxParams4x4::new(qintra, qinter, scan));
- } else {
- unreachable!();
- }
- } else {
- tr = IVITransformType::None(TSize::T8x8);
- txtype = TxType::None;
- }
-
- let blk_cb;
- if br.read_bool()? {
- blk_cb = br.read_ivi_codebook_desc(false, true)?;
- } else {
- blk_cb = self.blk_cb;
- }
- let rvmap_idx;
- if br.read_bool()? {
- rvmap_idx = br.read(3)? as usize;
- } else {
- rvmap_idx = 8;
- }
- let num_corr;
- let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE];
- if br.read_bool()? {
- num_corr = br.read(8)? as usize;
- validate!(num_corr*2 <= CORR_MAP_SIZE);
- for i in 0..num_corr*2 {
- corr_map[i] = br.read(8)? as u8;
- }
- } else {
- num_corr = 0;
- }
-
- br.align();
- Ok(BandHeader::new(plane_no, band_no, mb_size, blk_size, mv_mode == 1, inherit_mv, false, inherit_qd, quant, rvmap_idx, num_corr, corr_map, blk_cb, tr, txtype))
- }
-
- fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()> {
- let mut mv_x = 0;
- let mut mv_y = 0;
- let mut mb_idx = 0;
-
- for mb_y in 0..tile.mb_h {
- for mb_x in 0..tile.mb_w {
- let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
- if !br.read_bool()? {
- if pic_hdr.ftype.is_intra() {
- mb.mtype = MBType::Intra;
- } else if band.inherit_mv {
- if let Some(ref tileref) = ref_tile {
- mb.mtype = tileref.mb[mb_idx].mtype;
- } else {
- return Err(DecoderError::MissingReference);
- }
- } else {
- if !pic_hdr.ftype.is_bidir() {
- mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra };
- } else {
- mb.mtype = match br.read(2)? {
- 0 => { MBType::Intra },
- 1 => { MBType::Inter },
- 2 => { MBType::Backward },
- _ => { MBType::Bidir },
- };
- }
- }
- if band.mb_size == band.blk_size {
- mb.cbp = br.read(1)? as u8;
- } else {
- mb.cbp = br.read(4)? as u8;
- }
- if band.inherit_qd {
- if let Some(ref tileref) = ref_tile {
- mb.qd = tileref.mb[mb_idx].qd;
- mb.q = calc_quant(band.quant, mb.qd);
- } else {
- mb.q = band.quant as u8;
- }
- } else if (mb.cbp != 0) || ((band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q) {
- mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
- mb.q = calc_quant(band.quant, mb.qd);
- } else {
- mb.q = band.quant as u8;
- }
-
- if mb.mtype != MBType::Intra {
- if band.inherit_mv {
- if let Some(ref tileref) = ref_tile {
- let mx = tileref.mb[mb_idx].mv_x;
- let my = tileref.mb[mb_idx].mv_y;
- if mv_scale == 0 {
- mb.mv_x = mx;
- mb.mv_y = my;
- } else {
- mb.mv_x = scale_mv(mx, mv_scale);
- mb.mv_y = scale_mv(my, mv_scale);
- }
- }
- } else {
- mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
- mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
- mb.mv_x = mv_x;
- mb.mv_y = mv_y;
- if mb.mtype == MBType::Backward {
- mb.mv_x = -mb.mv_x;
- mb.mv_y = -mb.mv_y;
- } else if mb.mtype == MBType::Bidir {
- mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
- mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
- mb.mv2_x = -mv_x;
- mb.mv2_y = -mv_y;
- }
- }
- }
- } else {
- validate!(!pic_hdr.ftype.is_intra());
- mb.mtype = MBType::Inter;
- mb.cbp = 0;
- mb.qd = 0;
- if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q {
- mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
- mb.q = calc_quant(band.quant, mb.qd);
- }
- if band.inherit_mv {
- if let Some(ref tileref) = ref_tile {
- let mx = tileref.mb[mb_idx].mv_x;
- let my = tileref.mb[mb_idx].mv_y;
- if mv_scale == 0 {
- mb.mv_x = mx;
- mb.mv_y = my;
- } else {
- mb.mv_x = scale_mv(mx, mv_scale);
- mb.mv_y = scale_mv(my, mv_scale);
- }
- }
- }
- }
- tile.mb[mb_idx] = mb;
- mb_idx += 1;
- }
- }
- br.align();
- Ok(())
- }
-
- fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
-/* let mut idx0 = 0;
- let mut idx1 = w / 2;
- let mut idx2 = (h / 2) * sstride;
- let mut idx3 = idx2 + idx1;
- let mut oidx0 = 0;
- let mut oidx1 = dstride;
-
- for _ in 0..(h/2) {
- for x in 0..(w/2) {
- let p0 = src[idx0 + x];
- let p1 = src[idx1 + x];
- let p2 = src[idx2 + x];
- let p3 = src[idx3 + x];
- let s0 = p0 + p2;
- let d0 = p0 - p2;
- let s1 = p1 + p3;
- let d1 = p1 - p3;
- dst[oidx0 + x * 2 + 0] = clip8(((s0 + s1 + 2) >> 2) + 128);
- dst[oidx0 + x * 2 + 1] = clip8(((d0 + d1 + 2) >> 2) + 128);
- dst[oidx1 + x * 2 + 0] = clip8(((s0 - s1 + 2) >> 2) + 128);
- dst[oidx1 + x * 2 + 1] = clip8(((d0 - d1 + 2) >> 2) + 128);
- }
- idx0 += sstride;
- idx1 += sstride;
- idx2 += sstride;
- idx3 += sstride;
- oidx0 += dstride * 2;
- oidx1 += dstride * 2;
- }*/
- unsafe {
- let hw = (w / 2) as isize;
- let hh = (h / 2) as isize;
- let mut band0 = src.as_ptr();
- let mut band1 = band0.offset(hw);
- let mut band2 = band0.offset(((h / 2) * sstride) as isize);
- let mut band3 = band2.offset(hw);
- let mut dst0 = dst.as_mut_ptr();
- let mut dst1 = dst0.offset(dstride as isize);
- for _ in 0..hh {
- let mut b0_ptr = band0;
- let mut b1_ptr = band1;
- let mut b2_ptr = band2;
- let mut b3_ptr = band3;
- let mut d0_ptr = dst0;
- let mut d1_ptr = dst1;
- for _ in 0..hw {
- let p0 = *b0_ptr as i32;
- let p1 = *b1_ptr as i32;
- let p2 = *b2_ptr as i32;
- let p3 = *b3_ptr as i32;
- let s0 = p0.wrapping_add(p2);
- let s1 = p1.wrapping_add(p3);
- let d0 = p0.wrapping_sub(p2);
- let d1 = p1.wrapping_sub(p3);
- let o0 = s0.wrapping_add(s1).wrapping_add(2);
- let o1 = d0.wrapping_add(d1).wrapping_add(2);
- let o2 = s0.wrapping_sub(s1).wrapping_add(2);
- let o3 = d0.wrapping_sub(d1).wrapping_add(2);
- *d0_ptr.offset(0) = mclip8((o0 >> 2).wrapping_add(128));
- *d0_ptr.offset(1) = mclip8((o1 >> 2).wrapping_add(128));
- *d1_ptr.offset(0) = mclip8((o2 >> 2).wrapping_add(128));
- *d1_ptr.offset(1) = mclip8((o3 >> 2).wrapping_add(128));
- b0_ptr = b0_ptr.offset(1);
- b1_ptr = b1_ptr.offset(1);
- b2_ptr = b2_ptr.offset(1);
- b3_ptr = b3_ptr.offset(1);
- d0_ptr = d0_ptr.offset(2);
- d1_ptr = d1_ptr.offset(2);
- }
- band0 = band0.offset(sstride as isize);
- band1 = band1.offset(sstride as isize);
- band2 = band2.offset(sstride as isize);
- band3 = band3.offset(sstride as isize);
- dst0 = dst0.offset((dstride * 2) as isize);
- dst1 = dst1.offset((dstride * 2) as isize);
- }
- }
- }
-}
-
-struct Indeo4Decoder {
- info: Rc<NACodecInfo>,
- dec: IVIDecoder,
-}
-
-impl Indeo4Decoder {
- fn new() -> Self {
- Indeo4Decoder {
- info: NACodecInfo::new_dummy(),
- dec: IVIDecoder::new(),
- }
- }
-}
-
-impl NADecoder for Indeo4Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- let f = vinfo.is_flipped();
- let fmt = formats::YUV410_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
- let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE);
-
- let mut ip = Indeo4Parser::new();
- let bufinfo = self.dec.decode_frame(&mut ip, &mut br)?;
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(self.dec.is_intra());
- frm.set_frame_type(self.dec.get_frame_type());
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-const INDEO4_PICTURE_SIZE_TAB: [[usize; 2]; 7] = [
- [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144]
-];
-
-const INDEO4_SLICE_SIZE_TAB: [usize; 15] = [
- 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
-];
-
-const INDEO4_FRAME_TYPE: [IVIFrameType; 7] = [
- IVIFrameType::Intra, IVIFrameType::Intra1, IVIFrameType::Inter, IVIFrameType::Bidir,
- IVIFrameType::InterDroppable, IVIFrameType::NULL, IVIFrameType::NULL2
-];
-
-const INDEO4_TRANSFORMS: [IVITransformType; 18] = [
- IVITransformType::Haar(TSize::T8x8, TDir::TwoD),
- IVITransformType::Haar(TSize::T8x8, TDir::Row),
- IVITransformType::Haar(TSize::T8x8, TDir::Col),
- IVITransformType::None(TSize::T8x8),
- IVITransformType::Slant(TSize::T8x8, TDir::TwoD),
- IVITransformType::Slant(TSize::T8x8, TDir::Row),
- IVITransformType::Slant(TSize::T8x8, TDir::Col),
- IVITransformType::DCT(TSize::T8x8, TDir::TwoD),
- IVITransformType::DCT(TSize::T8x8, TDir::Row),
- IVITransformType::DCT(TSize::T8x8, TDir::Col),
- IVITransformType::Haar(TSize::T4x4, TDir::TwoD),
- IVITransformType::Slant(TSize::T4x4, TDir::TwoD),
- IVITransformType::None(TSize::T4x4),
- IVITransformType::Haar(TSize::T4x4, TDir::Row),
- IVITransformType::Haar(TSize::T4x4, TDir::Col),
- IVITransformType::Slant(TSize::T4x4, TDir::Row),
- IVITransformType::Slant(TSize::T4x4, TDir::Col),
- IVITransformType::DCT(TSize::T4x4, TDir::TwoD),
-];
-
-const INDEO4_SCAN_8X8_ALT: [usize; 64] = [
- 0, 8, 1, 9, 16, 24, 2, 3,
- 17, 25, 10, 11, 32, 40, 48, 56,
- 4, 5, 6, 7, 33, 41, 49, 57,
- 18, 19, 26, 27, 12, 13, 14, 15,
- 34, 35, 43, 42, 50, 51, 59, 58,
- 20, 21, 22, 23, 31, 30, 29, 28,
- 36, 37, 38, 39, 47, 46, 45, 44,
- 52, 53, 54, 55, 63, 62, 61, 60
-];
-const INDEO4_SCAN_4X4_ALT: [usize; 16] = [ 0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15 ];
-const INDEO4_SCAN_4X4_VER: [usize; 16] = [ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 ];
-const INDEO4_SCAN_4X4_HOR: [usize; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ];
-
-const INDEO4_SCANS_8X8: [&[usize; 64]; 5] = [
- &IVI_ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &IVI_ZIGZAG
-];
-const INDEO4_SCANS_4X4: [&[usize; 16]; 5] = [
- &IVI_SCAN_4X4, &INDEO4_SCAN_4X4_ALT, &INDEO4_SCAN_4X4_VER, &INDEO4_SCAN_4X4_HOR, &IVI_SCAN_4X4
-];
-
-const INDEO4_Q8X8_IDX: [usize; 15] = [ 0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8 ];
-const INDEO4_Q4X4_IDX: [usize; 7] = [ 0, 1, 2, 2, 3, 3, 4 ];
-
-const INDEO4_QUANT8X8_INTRA: [[u16; 64]; 9] = [
- [
- 43, 342, 385, 470, 555, 555, 598, 726,
- 342, 342, 470, 513, 555, 598, 726, 769,
- 385, 470, 555, 555, 598, 726, 726, 811,
- 470, 470, 555, 555, 598, 726, 769, 854,
- 470, 555, 555, 598, 683, 726, 854, 1025,
- 555, 555, 598, 683, 726, 854, 1025, 1153,
- 555, 555, 598, 726, 811, 982, 1195, 1451,
- 555, 598, 726, 811, 982, 1195, 1451, 1793
- ], [
- 86, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
- 1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
- 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
- 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
- 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
- 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
- 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
- 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827
- ], [
- 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
- 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
- 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
- 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
- 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
- 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
- 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
- 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835
- ], [
- 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
- 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
- 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
- 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
- 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
- 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
- 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
- 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414
- ], [
- 897, 897, 897, 897, 897, 897, 897, 897,
- 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
- 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
- 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
- 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
- 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
- 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091
- ], [
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
- 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
- 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
- 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
- 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
- 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
- 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414
- ], [
- 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
- 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
- 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
- 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
- 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
- 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
- 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
- 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390
- ], [
- 22, 171, 214, 257, 257, 299, 299, 342,
- 171, 171, 257, 257, 299, 299, 342, 385,
- 214, 257, 257, 299, 299, 342, 342, 385,
- 257, 257, 257, 299, 299, 342, 385, 427,
- 257, 257, 299, 299, 342, 385, 427, 513,
- 257, 299, 299, 342, 385, 427, 513, 598,
- 299, 299, 299, 385, 385, 470, 598, 726,
- 299, 299, 385, 385, 470, 598, 726, 897
- ], [
- 86, 598, 1195, 1195, 2390, 2390, 2390, 2390,
- 598, 598, 1195, 1195, 2390, 2390, 2390, 2390,
- 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
- 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
- 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
- 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
- 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
- 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414
- ]
-];
-const INDEO4_QUANT8X8_INTER: [[u16; 64]; 9] = [
- [
- 427, 427, 470, 427, 427, 427, 470, 470,
- 427, 427, 470, 427, 427, 427, 470, 470,
- 470, 470, 470, 470, 470, 470, 470, 470,
- 427, 427, 470, 470, 427, 427, 470, 470,
- 427, 427, 470, 427, 427, 427, 470, 470,
- 427, 427, 470, 427, 427, 427, 470, 470,
- 470, 470, 470, 470, 470, 470, 470, 470,
- 470, 470, 470, 470, 470, 470, 470, 470
- ], [
- 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
- 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
- 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
- 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
- 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
- 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
- 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
- 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414
- ], [
- 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
- 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
- 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
- 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
- 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
- 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
- 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
- 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281
- ], [
- 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
- 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
- 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
- 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
- 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
- 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
- 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
- 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433
- ], [
- 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
- 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
- 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
- 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
- 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
- 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
- 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
- 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281
- ], [
- 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
- 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
- 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
- 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
- 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
- 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
- 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
- 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433
- ], [
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
- 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707
- ], [
- 86, 171, 171, 214, 214, 214, 214, 257,
- 171, 171, 214, 214, 214, 214, 257, 257,
- 171, 214, 214, 214, 214, 257, 257, 257,
- 214, 214, 214, 214, 257, 257, 257, 299,
- 214, 214, 214, 257, 257, 257, 299, 299,
- 214, 214, 257, 257, 257, 299, 299, 299,
- 214, 257, 257, 257, 299, 299, 299, 342,
- 257, 257, 257, 299, 299, 299, 342, 342
- ], [
- 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
- 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
- 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
- 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
- 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
- 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
- 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
- 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707
- ]
-];
-const INDEO4_QUANT4X4_INTRA: [[u16; 16]; 5] = [
- [
- 22, 214, 257, 299,
- 214, 257, 299, 342,
- 257, 299, 342, 427,
- 299, 342, 427, 513
- ], [
- 129, 1025, 1451, 1451,
- 1025, 1025, 1451, 1451,
- 1451, 1451, 2049, 2049,
- 1451, 1451, 2049, 2049
- ], [
- 43, 171, 171, 171,
- 43, 171, 171, 171,
- 43, 171, 171, 171,
- 43, 171, 171, 171
- ], [
- 43, 43, 43, 43,
- 171, 171, 171, 171,
- 171, 171, 171, 171,
- 171, 171, 171, 171
- ], [
- 43, 43, 43, 43,
- 43, 43, 43, 43,
- 43, 43, 43, 43,
- 43, 43, 43, 43
- ]
-];
-const INDEO4_QUANT4X4_INTER: [[u16; 16]; 5] = [
- [
- 107, 214, 257, 299,
- 214, 257, 299, 299,
- 257, 299, 299, 342,
- 299, 299, 342, 342
- ], [
- 513, 1025, 1238, 1238,
- 1025, 1025, 1238, 1238,
- 1238, 1238, 1451, 1451,
- 1238, 1238, 1451, 1451
- ], [
- 43, 171, 171, 171,
- 43, 171, 171, 171,
- 43, 171, 171, 171,
- 43, 171, 171, 171
- ], [
- 43, 43, 43, 43,
- 171, 171, 171, 171,
- 171, 171, 171, 171,
- 171, 171, 171, 171
- ], [
- 43, 43, 43, 43,
- 43, 43, 43, 43,
- 43, 43, 43, 43,
- 43, 43, 43, 43
- ]
-];
-const INDEO4_Q8_INTRA: [&[u16; 64]; 9] = [
- &INDEO4_QUANT8X8_INTRA[0], &INDEO4_QUANT8X8_INTRA[1], &INDEO4_QUANT8X8_INTRA[2],
- &INDEO4_QUANT8X8_INTRA[3], &INDEO4_QUANT8X8_INTRA[4], &INDEO4_QUANT8X8_INTRA[5],
- &INDEO4_QUANT8X8_INTRA[6], &INDEO4_QUANT8X8_INTRA[7], &INDEO4_QUANT8X8_INTRA[8],
-];
-const INDEO4_Q8_INTER: [&[u16; 64]; 9] = [
- &INDEO4_QUANT8X8_INTER[0], &INDEO4_QUANT8X8_INTER[1], &INDEO4_QUANT8X8_INTER[2],
- &INDEO4_QUANT8X8_INTER[3], &INDEO4_QUANT8X8_INTER[4], &INDEO4_QUANT8X8_INTER[5],
- &INDEO4_QUANT8X8_INTER[6], &INDEO4_QUANT8X8_INTER[7], &INDEO4_QUANT8X8_INTER[8],
-];
-const INDEO4_Q4_INTRA: [&[u16; 16]; 5] = [
- &INDEO4_QUANT4X4_INTRA[0], &INDEO4_QUANT4X4_INTRA[1], &INDEO4_QUANT4X4_INTRA[2],
- &INDEO4_QUANT4X4_INTRA[3], &INDEO4_QUANT4X4_INTRA[4]
-];
-const INDEO4_Q4_INTER: [&[u16; 16]; 5] = [
- &INDEO4_QUANT4X4_INTER[0], &INDEO4_QUANT4X4_INTER[1], &INDEO4_QUANT4X4_INTER[2],
- &INDEO4_QUANT4X4_INTER[3], &INDEO4_QUANT4X4_INTER[4]
-];
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(Indeo4Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_indeo4() {
- test_file_decoding("avi", "assets/IV4/volcano.avi", /*None*/Some(16), true, false, None/*Some("iv4")*/);
-//panic!("the end");
- }
-}
diff --git a/src/codecs/indeo/indeo5.rs b/src/codecs/indeo/indeo5.rs
deleted file mode 100644
index c761a8e..0000000
--- a/src/codecs/indeo/indeo5.rs
+++ /dev/null
@@ -1,727 +0,0 @@
-use std::cell::Ref;
-use crate::io::bitreader::*;
-use crate::formats;
-use super::super::*;
-use super::ivi::*;
-use super::ivibr::*;
-
-fn calc_quant(glob_q: u32, qd: i16) -> usize {
- let qq = (glob_q as i16) + (qd as i16);
- if qq < 0 {
- 0
- } else if qq > 23 {
- 23
- } else {
- qq as usize
- }
-}
-
-struct Indeo5Parser {
- mb_cb: IVICodebook,
-
- width: usize,
- height: usize,
- tile_w: usize,
- tile_h: usize,
- luma_bands: usize,
- chroma_bands: usize,
-
- is_hpel: [bool; 5],
- mb_size: [usize; 5],
- blk_size: [usize; 5],
-}
-
-impl Indeo5Parser {
- fn new() -> Self {
- Indeo5Parser {
- mb_cb: IVI_CB_ZERO,
-
- width: 0,
- height: 0,
- tile_w: 0,
- tile_h: 0,
- luma_bands: 0,
- chroma_bands: 0,
-
- is_hpel: [false; 5],
- mb_size: [0; 5],
- blk_size: [0; 5],
- }
- }
-}
-
-fn skip_extension(br: &mut BitReader) -> DecoderResult<()> {
- loop {
- let len = br.read(8)?;
- if len == 0 { break; }
- br.skip(len * 8)?;
- }
- Ok(())
-}
-
-impl IndeoXParser for Indeo5Parser {
-#[allow(unused_variables)]
-#[allow(unused_assignments)]
- fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader> {
- let sync = br.read(5)?;
- validate!(sync == 0x1F);
- let ftype_idx = br.read(3)?;
- validate!(ftype_idx < 5);
- let ftype = INDEO5_FRAME_TYPE[ftype_idx as usize];
- let fnum = br.read(8)?;
- if ftype == IVIFrameType::Intra {
- let gop_flags = br.read(8)?;
- let hdr_size;
- if (gop_flags & 0x01) != 0 {
- hdr_size = br.read(16)?;
- } else {
- hdr_size = 0;
- }
- if (gop_flags & 0x20) != 0 {
- br.skip(32)?; // lock word
- }
- self.tile_w = 0;
- self.tile_h = 0;
- if (gop_flags & 0x40) != 0 {
- self.tile_w = 64 << br.read(2)?;
- self.tile_h = self.tile_w;
- }
- validate!(self.tile_w < 256);
- self.luma_bands = (br.read(2)? * 3 + 1) as usize;
- self.chroma_bands = (br.read(1)? * 3 + 1) as usize;
- validate!((self.luma_bands == 4) || (self.luma_bands == 1));
- validate!(self.chroma_bands == 1);
- let pic_size_idx = br.read(4)? as usize;
- let w;
- let h;
- if pic_size_idx < 15 {
- w = INDEO5_PICTURE_SIZE_TAB[pic_size_idx][0];
- h = INDEO5_PICTURE_SIZE_TAB[pic_size_idx][1];
- } else {
- h = br.read(13)? as usize;
- w = br.read(13)? as usize;
- }
- validate!((w != 0) && (h != 0));
- self.width = w;
- self.height = h;
-
- validate!((gop_flags & 0x02) == 0);
- if self.tile_w == 0 {
- self.tile_w = w;
- self.tile_h = h;
- }
- for b in 0..self.luma_bands+self.chroma_bands {
- self.is_hpel[b] = br.read_bool()?;
- let mb_scale = br.read(1)?;
- self.blk_size[b] = 8 >> br.read(1)?;
- self.mb_size[b] = self.blk_size[b] << (1 - mb_scale);
- let ext_tr = br.read_bool()?;
- validate!(!ext_tr);
- let end_marker = br.read(2)?;
- validate!(end_marker == 0);
- }
- if (gop_flags & 0x08) != 0 {
- let align = br.read(3)?;
- validate!(align == 0);
- if br.read_bool()? {
- br.skip(24)?; // transparency color
- }
- }
- br.align();
- br.skip(23)?;
- if br.read_bool()? { // gop extension
- loop {
- let v = br.read(16)?;
- if (v & 0x8000) == 0 { break; }
- }
- }
- br.align();
- }
- if ftype.is_null() {
- br.align();
- return Ok(PictureHeader::new_null(ftype));
- }
- let flags = br.read(8)?;
- let size;
- if (flags & 0x01) != 0 {
- size = br.read(24)?;
- } else {
- size = 0;
- }
- let checksum;
- if (flags & 0x10) != 0 {
- checksum = br.read(16)?;
- } else {
- checksum = 0;
- }
- if (flags & 0x20) != 0 {
- skip_extension(br)?;
- }
- let in_q = (flags & 0x08) != 0;
- self.mb_cb = br.read_ivi_codebook_desc(true, (flags & 0x40) != 0)?;
- br.skip(3)?;
- br.align();
-
- Ok(PictureHeader::new(ftype, self.width, self.height, self.tile_w, self.tile_h, false, self.luma_bands, self.chroma_bands, in_q))
- }
-
-#[allow(unused_variables)]
- fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane_no: usize, band_no: usize) -> DecoderResult<BandHeader> {
- let band_flags = br.read(8)?;
-
- if (band_flags & 0x01) != 0 {
- br.align();
- return Ok(BandHeader::new_empty(plane_no, band_no));
- }
- let inherit_mv = (band_flags & 0x02) != 0;
- let has_qdelta = (band_flags & 0x04) != 0;
- let inherit_qd = ((band_flags & 0x08) != 0) || !has_qdelta;
- let data_size: usize;
- if (band_flags & 0x80) != 0 {
- data_size = br.read(24)? as usize;
- } else {
- data_size = 0;
- }
- validate!(data_size <= ((br.left() / 8) as usize));
-
- let num_corr: usize;
- let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE];
- if (band_flags & 0x10) != 0 {
- num_corr = br.read(8)? as usize;
- validate!(num_corr*2 <= CORR_MAP_SIZE);
- for i in 0..num_corr*2 {
- corr_map[i] = br.read(8)? as u8;
- }
- } else {
- num_corr = 0;
- }
- let rvmap_idx;
- if (band_flags & 0x40) != 0 {
- rvmap_idx = br.read(3)? as usize;
- } else {
- rvmap_idx = 8;
- }
- let blk_cb = br.read_ivi_codebook_desc(false, (band_flags & 0x80) != 0)?;
- if br.read_bool()? {
- br.skip(16)?; // checksum
- }
- let band_q = br.read(5)?;
- if (band_flags & 0x20) != 0 {
- skip_extension(br)?;
- }
- br.align();
-
- let tr;
- let txtype;
- let band_id = if plane_no == 0 { band_no } else { self.luma_bands };
- match plane_no {
- 0 => {
- let scan = INDEO5_SCAN8X8[band_no];
- let qintra;
- let qinter;
- validate!(self.blk_size[band_id] == 8);
- match band_no {
- 0 => {
- tr = IVITransformType::Slant(TSize::T8x8, TDir::TwoD);
- if self.luma_bands == 1 {
- qintra = INDEO5_Q8_INTRA[0];
- qinter = INDEO5_Q8_INTER[0];
- } else {
- qintra = INDEO5_Q8_INTRA[1];
- qinter = INDEO5_Q8_INTER[1];
- }
- },
- 1 => {
- tr = IVITransformType::Slant(TSize::T8x8, TDir::Row);
- qintra = INDEO5_Q8_INTRA[2];
- qinter = INDEO5_Q8_INTER[2];
- },
- 2 => {
- tr = IVITransformType::Slant(TSize::T8x8, TDir::Col);
- qintra = INDEO5_Q8_INTRA[3];
- qinter = INDEO5_Q8_INTER[3];
- },
- 3 => {
- tr = IVITransformType::None(TSize::T8x8);
- qintra = INDEO5_Q8_INTRA[4];
- qinter = INDEO5_Q8_INTER[4];
- },
- _ => { unreachable!(); }
- };
- txtype = TxType::Transform8(TxParams8x8::new(qintra, qinter, scan));
- },
- 1 | 2 => {
- validate!(self.blk_size[band_id] == 4);
- tr = IVITransformType::Slant(TSize::T4x4, TDir::TwoD);
- let scan = INDEO5_SCAN4X4;
- let qintra = INDEO5_Q4_INTRA;
- let qinter = INDEO5_Q4_INTER;
- txtype = TxType::Transform4(TxParams4x4::new(qintra, qinter, scan));
- },
- _ => { unreachable!(); }
- };
-
- Ok(BandHeader::new(plane_no, band_no, self.mb_size[band_id], self.blk_size[band_id], self.is_hpel[band_id], inherit_mv, has_qdelta, inherit_qd, band_q, rvmap_idx, num_corr, corr_map, blk_cb, tr, txtype))
- }
-
- fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()> {
- let mut mv_x = 0;
- let mut mv_y = 0;
- let band_id = if pic_hdr.luma_bands == 4 { band.band_no + 1 } else { 0 };
- let mut mb_idx = 0;
- for mb_y in 0..tile.mb_h {
- for mb_x in 0..tile.mb_w {
- let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
- if !br.read_bool()? {
- if pic_hdr.ftype.is_intra() {
- mb.mtype = MBType::Intra;
- } else if band.inherit_mv {
- if let Some(ref tileref) = ref_tile {
- mb.mtype = tileref.mb[mb_idx].mtype;
- } else {
- return Err(DecoderError::MissingReference);
- }
- } else {
- mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra };
- }
- if band.mb_size == band.blk_size {
- mb.cbp = br.read(1)? as u8;
- } else {
- mb.cbp = br.read(4)? as u8;
- }
- let q;
- if band.has_qdelta {
- if band.inherit_qd {
- if let Some(ref tileref) = ref_tile {
- mb.qd = tileref.mb[mb_idx].qd;
- q = calc_quant(band.quant, mb.qd);
- } else {
- return Err(DecoderError::MissingReference);
- }
- } else if (mb.cbp != 0) || ((band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q) {
- mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
- q = calc_quant(band.quant, mb.qd);
- } else {
- q = band.quant as usize;
- }
- } else {
- q = band.quant as usize;
- }
-
- if mb.mtype == MBType::Intra {
- if band.blk_size == 8 {
- mb.q = INDEO5_QSCALE8_INTRA[band_id][q];
- } else {
- mb.q = INDEO5_QSCALE4_INTRA[q];
- }
- } else {
- if band.blk_size == 8 {
- mb.q = INDEO5_QSCALE8_INTER[band_id][q];
- } else {
- mb.q = INDEO5_QSCALE4_INTER[q];
- }
- }
-
- if mb.mtype != MBType::Intra {
- if band.inherit_mv {
- if let Some(ref tileref) = ref_tile {
- let mx = tileref.mb[mb_idx].mv_x;
- let my = tileref.mb[mb_idx].mv_y;
- if mv_scale == 0 {
- mb.mv_x = mx;
- mb.mv_y = my;
- } else {
- mb.mv_x = scale_mv(mx, mv_scale);
- mb.mv_y = scale_mv(my, mv_scale);
- }
- }
- } else {
- mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
- mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
- mb.mv_x = mv_x;
- mb.mv_y = mv_y;
- }
- }
- } else {
- validate!(!pic_hdr.ftype.is_intra());
- mb.mtype = MBType::Inter;
- mb.cbp = 0;
- mb.qd = 0;
- if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q {
- mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
- let q = calc_quant(band.quant, mb.qd);
- if mb.mtype == MBType::Intra {
- if band.blk_size == 8 {
- mb.q = INDEO5_QSCALE8_INTRA[band_id][q];
- } else {
- mb.q = INDEO5_QSCALE4_INTRA[q];
- }
- } else {
- if band.blk_size == 8 {
- mb.q = INDEO5_QSCALE8_INTER[band_id][q];
- } else {
- mb.q = INDEO5_QSCALE4_INTER[q];
- }
- }
- }
- if band.inherit_mv {
- if let Some(ref tileref) = ref_tile {
- let mx = tileref.mb[mb_idx].mv_x;
- let my = tileref.mb[mb_idx].mv_y;
- if mv_scale == 0 {
- mb.mv_x = mx;
- mb.mv_y = my;
- } else {
- mb.mv_x = scale_mv(mx, mv_scale);
- mb.mv_y = scale_mv(my, mv_scale);
- }
- }
- }
- }
- tile.mb[mb_idx] = mb;
- mb_idx += 1;
- }
- }
- br.align();
- Ok(())
- }
-
- fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
- let mut idx0 = 0;
- let mut idx1 = w / 2;
- let mut idx2 = (h / 2) * sstride;
- let mut idx3 = idx2 + idx1;
- let mut bidx1 = idx1;
- let mut bidx3 = idx3;
- let mut oidx0 = 0;
- let mut oidx1 = dstride;
- let filt_lo = |a: i16, b: i16| a + b;
- let filt_hi = |a: i16, b: i16, c: i16| a - b * 6 + c;
-
- for _ in 0..(h/2) {
- let mut b0_1 = src[idx0];
- let mut b0_2 = src[idx0 + sstride];
- let mut b1_1 = src[bidx1];
- let mut b1_2 = src[idx1];
- let mut b1_3 = filt_hi(b1_1, b1_2, src[idx1 + sstride]);
- let mut b2_1;
- let mut b2_2 = src[idx2];
- let mut b2_3 = b2_2;
- let mut b2_4;
- let mut b2_5 = src[idx2 + sstride];
- let mut b2_6 = b2_5;
- let mut b3_1;
- let mut b3_2 = src[bidx3];
- let mut b3_3 = b3_2;
- let mut b3_4;
- let mut b3_5 = src[idx3];
- let mut b3_6 = b3_5;
- let mut b3_8 = filt_hi(b3_2, b3_5, src[idx3 + sstride]);
- let mut b3_9 = b3_8;
- let mut b3_7;
-
- for x in 0..(w/2) {
- b2_1 = b2_2;
- b2_2 = b2_3;
- b2_4 = b2_5;
- b2_5 = b2_6;
- b3_1 = b3_2;
- b3_2 = b3_3;
- b3_4 = b3_5;
- b3_5 = b3_6;
- b3_7 = b3_8;
- b3_8 = b3_9;
-
- let tmp0 = b0_1;
- let tmp1 = b0_2;
- b0_1 = src[idx0 + x + 1];
- b0_2 = src[idx0 + x + 1 + sstride];
- let mut p0 = tmp0 << 4;
- let mut p1 = (tmp0 + b0_1) << 3;
- let mut p2 = (tmp0 + tmp1) << 3;
- let mut p3 = (tmp0 + tmp1 + b0_1 + b0_2) << 2;
-
- let tmp0 = b1_1;
- let tmp1 = b1_2;
- let tmp2 = filt_lo(tmp0, tmp1);
- let tmp3 = filt_hi(tmp0, tmp1, b1_3);
- b1_2 = src[ idx1 + x + 1];
- b1_1 = src[bidx1 + x + 1];
- b1_3 = filt_hi(b1_1, b1_2, src[idx1 + x + 1 + sstride]);
- p0 += tmp2 << 3;
- p1 += (tmp2 + b1_1 + b1_2) << 2;
- p2 += tmp3 << 2;
- p3 += (tmp3 + b1_3) << 1;
-
- b2_3 = src[idx2 + x + 1];
- b2_6 = src[idx2 + x + 1 + sstride];
- let tmp0 = filt_lo(b2_1, b2_2);
- let tmp1 = filt_hi(b2_1, b2_2, b2_3);
- p0 += tmp0 << 3;
- p1 += tmp1 << 2;
- p2 += (tmp0 + filt_lo(b2_4, b2_5)) << 2;
- p3 += (tmp1 + filt_hi(b2_4, b2_5, b2_6)) << 1;
-
- b3_6 = src[idx3 + x + 1];
- b3_3 = src[bidx3 + x + 1];
- b3_9 = filt_hi(b3_3, b3_6, src[idx3 + x + 1 + sstride]);
- let tmp0 = b3_1 + b3_4;
- let tmp1 = b3_2 + b3_5;
- let tmp2 = b3_3 + b3_6;
- p0 += filt_lo(tmp0, tmp1) << 2;
- p1 += filt_hi(tmp0, tmp1, tmp2) << 1;
- p2 += filt_lo(b3_7, b3_8) << 1;
- p3 += filt_hi(b3_7, b3_8, b3_9) << 0;
-
- dst[oidx0 + x * 2 + 0] = clip8((p0 >> 6) + 128);
- dst[oidx0 + x * 2 + 1] = clip8((p1 >> 6) + 128);
- dst[oidx1 + x * 2 + 0] = clip8((p2 >> 6) + 128);
- dst[oidx1 + x * 2 + 1] = clip8((p3 >> 6) + 128);
- }
- bidx1 = idx1;
- bidx3 = idx3;
- idx0 += sstride;
- idx1 += sstride;
- idx2 += sstride;
- idx3 += sstride;
- oidx0 += dstride * 2;
- oidx1 += dstride * 2;
- }
- }
-}
-
-struct Indeo5Decoder {
- info: Rc<NACodecInfo>,
- dec: IVIDecoder,
- ip: Indeo5Parser,
-}
-
-impl Indeo5Decoder {
- fn new() -> Self {
- Indeo5Decoder {
- info: NACodecInfo::new_dummy(),
- dec: IVIDecoder::new(),
- ip: Indeo5Parser::new(),
- }
- }
-}
-
-impl NADecoder for Indeo5Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let w = vinfo.get_width();
- let h = vinfo.get_height();
- let f = vinfo.is_flipped();
- let fmt = formats::YUV410_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
- let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE);
-
- let bufinfo = self.dec.decode_frame(&mut self.ip, &mut br)?;
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(self.dec.is_intra());
- frm.set_frame_type(self.dec.get_frame_type());
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-const INDEO5_PICTURE_SIZE_TAB: [[usize; 2]; 15] = [
- [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144],
- [240, 180], [640, 240], [704, 240], [80, 60], [88, 72], [0, 0], [0, 0], [0, 0]
-];
-
-const INDEO5_FRAME_TYPE: [IVIFrameType; 5] = [
- IVIFrameType::Intra, IVIFrameType::Inter, IVIFrameType::InterScal,
- IVIFrameType::InterDroppable, IVIFrameType::NULL,
-];
-
-const INDEO5_QUANT8X8_INTRA: [[u16; 64]; 5] = [
- [
- 0x1a, 0x2e, 0x36, 0x42, 0x46, 0x4a, 0x4e, 0x5a,
- 0x2e, 0x32, 0x3e, 0x42, 0x46, 0x4e, 0x56, 0x6a,
- 0x36, 0x3e, 0x3e, 0x44, 0x4a, 0x54, 0x66, 0x72,
- 0x42, 0x42, 0x44, 0x4a, 0x52, 0x62, 0x6c, 0x7a,
- 0x46, 0x46, 0x4a, 0x52, 0x5e, 0x66, 0x72, 0x8e,
- 0x4a, 0x4e, 0x54, 0x62, 0x66, 0x6e, 0x86, 0xa6,
- 0x4e, 0x56, 0x66, 0x6c, 0x72, 0x86, 0x9a, 0xca,
- 0x5a, 0x6a, 0x72, 0x7a, 0x8e, 0xa6, 0xca, 0xfe,
- ], [
- 0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a,
- 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e,
- 0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62,
- 0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66,
- 0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a,
- 0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e,
- 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72,
- 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76,
- ], [
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- ], [
- 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e,
- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
- 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
- 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4,
- 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde,
- 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
- 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6,
- 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
- ], [
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- ]
-];
-const INDEO5_QUANT8X8_INTER: [[u16; 64]; 5] = [
- [
- 0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a,
- 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e,
- 0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62,
- 0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66,
- 0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a,
- 0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e,
- 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72,
- 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76,
- ], [
- 0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a,
- 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e,
- 0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62,
- 0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66,
- 0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a,
- 0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e,
- 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72,
- 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76,
- ], [
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
- ], [
- 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e,
- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
- 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
- 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4,
- 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde,
- 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
- 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6,
- 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
- ], [
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
- ]
-];
-const INDEO5_QUANT4X4_INTRA: [u16; 16] = [
- 0x1e, 0x3e, 0x4a, 0x52,
- 0x3e, 0x4a, 0x52, 0x5e,
- 0x4a, 0x52, 0x5e, 0x7a,
- 0x52, 0x5e, 0x7a, 0x92
-];
-const INDEO5_QUANT4X4_INTER: [u16; 16] = [
- 0x1e, 0x3e, 0x4a, 0x52,
- 0x3e, 0x4a, 0x52, 0x56,
- 0x4a, 0x52, 0x56, 0x5e,
- 0x52, 0x56, 0x5e, 0x66
-];
-const INDEO5_Q8_INTRA: [&[u16; 64]; 5] = [
- &INDEO5_QUANT8X8_INTRA[0], &INDEO5_QUANT8X8_INTRA[1], &INDEO5_QUANT8X8_INTRA[2],
- &INDEO5_QUANT8X8_INTRA[3], &INDEO5_QUANT8X8_INTRA[4],
-];
-const INDEO5_Q8_INTER: [&[u16; 64]; 5] = [
- &INDEO5_QUANT8X8_INTER[0], &INDEO5_QUANT8X8_INTER[1], &INDEO5_QUANT8X8_INTER[2],
- &INDEO5_QUANT8X8_INTER[3], &INDEO5_QUANT8X8_INTER[4],
-];
-const INDEO5_Q4_INTRA: &[u16; 16] = &INDEO5_QUANT4X4_INTRA;
-const INDEO5_Q4_INTER: &[u16; 16] = &INDEO5_QUANT4X4_INTER;
-
-const INDEO5_SCAN8X8: [&[usize; 64]; 4] = [
- &IVI_ZIGZAG, &IVI_SCAN_8X8_VER, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_HOR
-];
-const INDEO5_SCAN4X4: &[usize; 16] = &IVI_SCAN_4X4;
-
-const INDEO5_QSCALE8_INTRA: [[u8; 24]; 5] = [
- [
- 0x0b, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20,
- 0x22, 0x24, 0x27, 0x28, 0x2a, 0x2d, 0x2f, 0x31, 0x34, 0x37, 0x39, 0x3c,
- ], [
- 0x01, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x28, 0x2c,
- 0x30, 0x34, 0x38, 0x3d, 0x42, 0x47, 0x4c, 0x52, 0x58, 0x5e, 0x65, 0x6c,
- ], [
- 0x13, 0x22, 0x27, 0x2a, 0x2d, 0x33, 0x36, 0x3c, 0x41, 0x45, 0x49, 0x4e,
- 0x53, 0x58, 0x5d, 0x63, 0x69, 0x6f, 0x75, 0x7c, 0x82, 0x88, 0x8e, 0x95,
- ], [
- 0x13, 0x1f, 0x21, 0x24, 0x27, 0x29, 0x2d, 0x2f, 0x34, 0x37, 0x3a, 0x3d,
- 0x40, 0x44, 0x48, 0x4c, 0x4f, 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6b,
- ], [
- 0x31, 0x42, 0x47, 0x47, 0x4d, 0x52, 0x58, 0x58, 0x5d, 0x63, 0x67, 0x6b,
- 0x6f, 0x73, 0x78, 0x7c, 0x80, 0x84, 0x89, 0x8e, 0x93, 0x98, 0x9d, 0xa4,
- ]
-];
-const INDEO5_QSCALE8_INTER: [[u8; 24]; 5] = [
- [
- 0x0b, 0x11, 0x13, 0x14, 0x15, 0x16, 0x18, 0x1a, 0x1b, 0x1d, 0x20, 0x22,
- 0x23, 0x25, 0x28, 0x2a, 0x2e, 0x32, 0x35, 0x39, 0x3d, 0x41, 0x44, 0x4a,
- ], [
- 0x07, 0x14, 0x16, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x29, 0x2d, 0x31, 0x35,
- 0x3a, 0x3f, 0x44, 0x4a, 0x50, 0x56, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x7e,
- ], [
- 0x15, 0x25, 0x28, 0x2d, 0x30, 0x34, 0x3a, 0x3d, 0x42, 0x48, 0x4c, 0x51,
- 0x56, 0x5b, 0x60, 0x65, 0x6b, 0x70, 0x76, 0x7c, 0x82, 0x88, 0x8f, 0x97,
- ], [
- 0x13, 0x1f, 0x20, 0x22, 0x25, 0x28, 0x2b, 0x2d, 0x30, 0x33, 0x36, 0x39,
- 0x3c, 0x3f, 0x42, 0x45, 0x48, 0x4b, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x62,
- ], [
- 0x3c, 0x52, 0x58, 0x5d, 0x63, 0x68, 0x68, 0x6d, 0x73, 0x78, 0x7c, 0x80,
- 0x84, 0x89, 0x8e, 0x93, 0x98, 0x9d, 0xa3, 0xa9, 0xad, 0xb1, 0xb5, 0xba
- ]
-];
-const INDEO5_QSCALE4_INTRA: [u8; 24] = [
- 0x01, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14,
- 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
-];
-const INDEO5_QSCALE4_INTER: [u8; 24] = [
- 0x0b, 0x0d, 0x0d, 0x0e, 0x11, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
-];
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(Indeo5Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_indeo5() {
- test_file_decoding("avi", "assets/IV5/sample.avi", /*None*/Some(2), true, false, None);
-// test_file_decoding("avi", "assets/IV5/W32mdl_1.avi", None/*Some(2)*/, true, false, Some("iv5"));
-//panic!("the end");
- }
-}
diff --git a/src/codecs/indeo/ivi.rs b/src/codecs/indeo/ivi.rs
deleted file mode 100644
index 064da0b..0000000
--- a/src/codecs/indeo/ivi.rs
+++ /dev/null
@@ -1,287 +0,0 @@
-use super::ivibr::{IVICodebook,IVI_CB_ZERO,RVMap,IVI_ZERO_RVMAP,IVI_RVMAPS};
-
-pub fn clip8(a: i16) -> u8 {
- if a < 0 { 0 }
- else if a > 255 { 255 }
- else { a as u8 }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum IVIFrameType {
- Intra,
- Inter,
- Bidir,
- Intra1,
- InterDroppable,
- InterScal,
- NULL,
- NULL2,
-}
-
-impl IVIFrameType {
- pub fn is_intra(self) -> bool {
- (self == IVIFrameType::Intra) || (self == IVIFrameType::Intra1)
- }
- pub fn is_null(self) -> bool {
- (self == IVIFrameType::NULL) || (self == IVIFrameType::NULL2)
- }
- pub fn is_bidir(self) -> bool {
- self == IVIFrameType::Bidir
- }
-}
-
-#[derive(Clone,Copy)]
-pub struct PictureHeader {
- pub ftype: IVIFrameType,
- pub width: usize,
- pub height: usize,
- pub slice_w: usize,
- pub slice_h: usize,
- pub transparent: bool,
- pub luma_bands: usize,
- pub chroma_bands: usize,
- pub in_q: bool,
-}
-
-impl PictureHeader {
- pub fn new(ftype: IVIFrameType, width: usize, height: usize, slice_w: usize, slice_h: usize, transparent: bool, luma_bands: usize, chroma_bands: usize, in_q: bool) -> Self {
- PictureHeader {
- ftype: ftype,
- width: width, height: height, slice_w: slice_w, slice_h: slice_h,
- transparent: transparent,
- luma_bands: luma_bands, chroma_bands: chroma_bands,
- in_q: in_q,
- }
- }
- pub fn new_null(ftype: IVIFrameType) -> Self {
- PictureHeader {
- ftype: ftype,
- width: 0, height: 0, slice_w: 0, slice_h: 0,
- transparent: false,
- luma_bands: 0, chroma_bands: 0,
- in_q: false,
- }
- }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum TSize {
- T8x8,
- T4x4,
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum TDir {
- TwoD,
- Row,
- Col,
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum IVITransformType {
- Haar (TSize, TDir),
- Slant(TSize, TDir),
- DCT (TSize, TDir),
- None (TSize),
-}
-
-pub type TrFunc = fn (&mut [i32; 64]);
-pub type TrFuncDC = fn (&mut [i32; 64], i32);
-
-impl IVITransformType {
- pub fn is_8x8(&self) -> bool {
- match *self {
- IVITransformType::Haar (ref sz, _) => { *sz == TSize::T8x8 },
- IVITransformType::Slant(ref sz, _) => { *sz == TSize::T8x8 },
- IVITransformType::DCT (ref sz, _) => { *sz == TSize::T8x8 },
- IVITransformType::None (ref sz) => { *sz == TSize::T8x8 },
- }
- }
- pub fn is_2d(&self) -> bool {
- match *self {
- IVITransformType::Haar (_, ref dir) => { *dir == TDir::TwoD },
- IVITransformType::Slant(_, ref dir) => { *dir == TDir::TwoD },
- IVITransformType::DCT (_, ref dir) => { *dir == TDir::TwoD },
- _ => { false },
- }
- }
-}
-
-#[allow(dead_code)]
-#[derive(Clone)]
-pub struct TxParams4x4 {
- pub quant_intra: &'static [u16; 16],
- pub quant_inter: &'static [u16; 16],
- pub scan: &'static [usize; 16],
-}
-
-impl TxParams4x4 {
- pub fn new(quant_intra: &'static [u16; 16], quant_inter: &'static [u16; 16], scan: &'static [usize; 16]) -> Self {
- TxParams4x4 {
- quant_intra: quant_intra, quant_inter: quant_inter, scan: scan,
- }
- }
-}
-
-#[allow(dead_code)]
-#[derive(Clone)]
-pub struct TxParams8x8 {
- pub quant_intra: &'static [u16; 64],
- pub quant_inter: &'static [u16; 64],
- pub scan: &'static [usize; 64],
-}
-
-impl TxParams8x8 {
- pub fn new(quant_intra: &'static [u16; 64], quant_inter: &'static [u16; 64], scan: &'static [usize; 64]) -> Self {
- TxParams8x8 {
- quant_intra: quant_intra, quant_inter: quant_inter, scan: scan,
- }
- }
-}
-
-#[derive(Clone)]
-pub enum TxType {
- Transform4(TxParams4x4),
- Transform8(TxParams8x8),
- None,
-}
-
-pub const CORR_MAP_SIZE: usize = 122;
-
-#[derive(Clone)]
-pub struct BandHeader {
- pub plane_no: usize,
- pub band_no: usize,
- pub empty: bool,
- pub mb_size: usize,
- pub blk_size: usize,
- pub halfpel: bool,
- pub inherit_mv: bool,
- pub has_qdelta: bool,
- pub inherit_qd: bool,
- pub quant: u32,
- pub blk_cb: IVICodebook,
- pub rvmap: RVMap,
- pub tr: IVITransformType,
- pub ttype: TxType,
-}
-
-impl BandHeader {
- pub fn new(plane_no: usize, band_no: usize, mb_size: usize, blk_size: usize, halfpel: bool, inherit_mv: bool, has_qdelta: bool, inherit_qd: bool, quant: u32, rvmap_idx: usize, num_corr: usize, corr_map: [u8; CORR_MAP_SIZE], blk_cb: IVICodebook, tr: IVITransformType, ttype: TxType) -> Self {
- let mut rvmap = IVI_RVMAPS[rvmap_idx].clone();
- for i in 0..num_corr {
- let pos1 = corr_map[i * 2 + 0] as usize;
- let pos2 = corr_map[i * 2 + 1] as usize;
- let t = rvmap.runtab[pos1];
- rvmap.runtab[pos1] = rvmap.runtab[pos2];
- rvmap.runtab[pos2] = t;
- let t = rvmap.valtab[pos1];
- rvmap.valtab[pos1] = rvmap.valtab[pos2];
- rvmap.valtab[pos2] = t;
- }
- BandHeader {
- plane_no: plane_no, band_no: band_no,
- empty: false, halfpel: halfpel,
- inherit_mv: inherit_mv,
- has_qdelta: has_qdelta, inherit_qd: inherit_qd, quant: quant,
- mb_size: mb_size, blk_size: blk_size,
- rvmap: rvmap, blk_cb: blk_cb,
- tr: tr, ttype: ttype,
- }
- }
- pub fn new_empty(plane_no: usize, band_no: usize) -> Self {
- BandHeader {
- plane_no: plane_no, band_no: band_no,
- empty: true, halfpel: true,
- inherit_mv: false, has_qdelta: false, inherit_qd: false, quant: 0,
- mb_size: 0, blk_size: 0,
- rvmap: IVI_ZERO_RVMAP, blk_cb: IVI_CB_ZERO,
- tr: IVITransformType::None(TSize::T8x8), ttype: TxType::None,
- }
- }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum MBType {
- Intra,
- Inter,
- Backward,
- Bidir,
-}
-
-#[derive(Clone,Copy)]
-pub struct MB {
- pub mtype: MBType,
- pub pos_x: usize,
- pub pos_y: usize,
- pub mv_x: i32,
- pub mv_y: i32,
- pub mv2_x: i32,
- pub mv2_y: i32,
- pub qd: i16,
- pub q: u8,
- pub cbp: u8,
-}
-
-impl MB {
- pub fn new(x: usize, y: usize) -> Self {
- MB {
- mtype: MBType::Intra,
- pos_x: x, pos_y: y,
- mv_x: 0, mv_y: 0,
- mv2_x: 0, mv2_y: 0,
- cbp: 0, q: 0, qd: 0,
- }
- }
-}
-
-pub struct IVITile {
- pub pos_x: usize,
- pub pos_y: usize,
- pub mb_w: usize,
- pub mb_h: usize,
- pub w: usize,
- pub h: usize,
- pub mb: Vec<MB>,
-}
-
-impl IVITile {
- pub fn new(pos_x: usize, pos_y: usize, w: usize, h: usize) -> Self {
- IVITile {
- pos_x: pos_x, pos_y: pos_y, w: w, h: h,
- mb_w: 0, mb_h: 0, mb: Vec::new(),
- }
- }
-}
-
-pub const IVI_ZIGZAG: [usize; 64] = [
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63
-];
-pub const IVI_SCAN_8X8_VER: [usize; 64] = [
- 0, 8, 16, 24, 32, 40, 48, 56,
- 1, 9, 17, 25, 33, 41, 49, 57,
- 2, 10, 18, 26, 34, 42, 50, 58,
- 3, 11, 19, 27, 35, 43, 51, 59,
- 4, 12, 20, 28, 36, 44, 52, 60,
- 5, 13, 21, 29, 37, 45, 53, 61,
- 6, 14, 22, 30, 38, 46, 54, 62,
- 7, 15, 23, 31, 39, 47, 55, 63
-];
-pub const IVI_SCAN_8X8_HOR: [usize; 64] = [
- 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
-];
-pub const IVI_SCAN_4X4: [usize; 16] = [ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 ];
diff --git a/src/codecs/indeo/ivibr.rs b/src/codecs/indeo/ivibr.rs
deleted file mode 100644
index 3011e1a..0000000
--- a/src/codecs/indeo/ivibr.rs
+++ /dev/null
@@ -1,1292 +0,0 @@
-use std::mem;
-use std::rc::Rc;
-use std::cell::{Ref,RefCell};
-use crate::io::bitreader::*;
-//use io::intcode::*;
-use super::super::*;
-use crate::formats::*;
-use super::ivi::*;
-use super::ividsp::*;
-
-pub fn scale_mv(val: i32, scale: u8) -> i32 {
- (val + (if val > 0 { 1 } else { 0 }) + (scale as i32) - 1) >> scale
-}
-
-#[derive(Clone,Copy)]
-pub struct IVICodebook {
- len: usize,
- bits: [u8; 16],
- offs: [u32; 16],
-}
-
-impl IVICodebook {
- pub fn init(&self) -> Self {
- let mut cb = *self;
- let mut base: u32 = 0;
- for i in 0..cb.len {
- cb.offs[i] = base;
- base += 1 << cb.bits[i];
- }
- cb
- }
-}
-
-pub const IVI_CB_ZERO: IVICodebook = IVICodebook { len: 0, bits: [0; 16], offs: [0; 16] };
-
-const IVI_REV0: [u32; 1] = [0];
-const IVI_REV1: [u32; 2] = [0, 1];
-const IVI_REV2: [u32; 4] = [0, 2, 1, 3];
-const IVI_REV3: [u32; 8] = [0, 4, 2, 6, 1, 5, 3, 7];
-const IVI_REV4: [u32; 16] = [ 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15];
-const IVI_REV5: [u32; 32] = [ 0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30, 1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31];
-const IVI_REV6: [u32; 64] = [ 0, 32, 16, 48, 8, 40, 24, 56, 4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57, 5, 37, 21, 53, 13, 45, 29, 61, 3, 35, 19, 51, 11, 43, 27, 59, 7, 39, 23, 55, 15, 47, 31, 63];
-const IVI_REV7: [u32; 128] = [ 0, 64, 32, 96, 16, 80, 48, 112, 8, 72, 40, 104, 24, 88, 56, 120, 4, 68, 36, 100, 20, 84, 52, 116, 12, 76, 44, 108, 28, 92, 60, 124, 2, 66, 34, 98, 18, 82, 50, 114, 10, 74, 42, 106, 26, 90, 58, 122, 6, 70, 38, 102, 22, 86, 54, 118, 14, 78, 46, 110, 30, 94, 62, 126, 1, 65, 33, 97, 17, 81, 49, 113, 9, 73, 41, 105, 25, 89, 57, 121, 5, 69, 37, 101, 21, 85, 53, 117, 13, 77, 45, 109, 29, 93, 61, 125, 3, 67, 35, 99, 19, 83, 51, 115, 11, 75, 43, 107, 27, 91, 59, 123, 7, 71, 39, 103, 23, 87, 55, 119, 15, 79, 47, 111, 31, 95, 63, 127];
-const IVI_REV8: [u32; 256] = [ 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255];
-
-const IVI_REVS: [&[u32]; 9] = [ &IVI_REV0, &IVI_REV1, &IVI_REV2, &IVI_REV3, &IVI_REV4, &IVI_REV5, &IVI_REV6, &IVI_REV7, &IVI_REV8];
-
-pub trait IVICodebookReader {
- fn read_ivi_codebook_desc(&mut self, mb_cb: bool, try_default: bool) -> DecoderResult<IVICodebook>;
- fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32>;
- fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32>;
-}
-
-impl<'a> IVICodebookReader for BitReader<'a> {
- fn read_ivi_codebook_desc(&mut self, mb_cb: bool, desc_coded: bool) -> DecoderResult<IVICodebook> {
- if !desc_coded {
- if mb_cb {
- Ok(IVI_MB_CB[7].init())
- } else {
- Ok(IVI_BLK_CB[7].init())
- }
- } else {
- let idx = self.read(3)? as usize;
- if idx != 7 {
- if mb_cb {
- Ok(IVI_MB_CB[idx].init())
- } else {
- Ok(IVI_BLK_CB[idx].init())
- }
- } else {
- let mut cb = IVI_CB_ZERO;
- cb.len = self.read(4)? as usize;
- if cb.len == 0 { return Err(DecoderError::InvalidData); }
- for i in 0..cb.len {
- cb.bits[i] = self.read(4)? as u8;
- }
- Ok(cb.init())
- }
- }
- }
- #[inline(always)]
- fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32> {
-/* let pfx = if cb.len == 1 { 0 } else { self.read_code(UintCodeType::LimitedUnary((cb.len - 1) as u32, 0))? as usize };
- let nbits = cb.bits[pfx];
- let mut base: u32 = 0;
- for i in 0..pfx { base += 1 << cb.bits[i]; }
- let rval = self.read(nbits)?;
- let add = reverse_bits(rval, nbits);
- Ok(base + add)*/
- if cb.len > 1 {
- let len = (!self.peek(16)).trailing_zeros() as usize;
- let pfx;
- if len >= cb.len - 1 {
- pfx = cb.len - 1;
- self.skip((cb.len - 1) as u32)?;
- } else {
- pfx = len;
- self.skip((len + 1) as u32)?;
- }
- let nbits = cb.bits[pfx];
- let base = cb.offs[pfx];
- let rval = self.read(nbits)?;
- let add = IVI_REVS[nbits as usize][rval as usize];
- Ok(base + add)
- } else {
- let nbits = cb.bits[0];
- return Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize]);
- }
- }
- #[inline(always)]
- fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32> {
- let v = self.read_ivi_cb(cb)?;
- if v == 0 {
- Ok(0)
- } else {
- let sign = (v & 1) == 1;
- let val = (v >> 1) as i32;
- if sign {
- Ok(val + 1)
- } else {
- Ok(-val)
- }
- }
- }
-}
-
-pub const IVI_MB_CB: &[IVICodebook; 8] = &[
- IVICodebook { len: 8, bits: [ 0, 4, 5, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 12, bits: [ 0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 12, bits: [ 0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 12, bits: [ 0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 13, bits: [ 0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 9, bits: [ 0, 4, 4, 4, 4, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 10, bits: [ 0, 4, 4, 4, 4, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 12, bits: [ 0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] }
-];
-
-pub const IVI_BLK_CB: &[IVICodebook; 8] = &[
- IVICodebook { len: 10, bits: [ 1, 2, 3, 4, 4, 7, 5, 5, 4, 1, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 11, bits: [ 2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 12, bits: [ 2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 13, bits: [ 3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 11, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
- IVICodebook { len: 9, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }
-];
-
-#[allow(unused_variables)]
-fn read_trans_band_header(br: &mut BitReader, w: usize, h: usize, dst: &mut [i16], dstride: usize) -> DecoderResult<()> {
- let color_plane = br.read(2)?;
- let bit_depth = br.read(3)?;
- let dirty_rects = br.read(8)? as usize;
- for i in 0..dirty_rects {
- let x = br.read(16)?;
- let y = br.read(16)?;
- let l = br.read(16)?;
- let r = br.read(16)?;
- }
- let has_trans_color = br.read_bool()?;
- if has_trans_color {
- let r = br.read(8)?;
- let g = br.read(8)?;
- let b = br.read(8)?;
- }
-
- br.skip(1)?;
-
- let mut cb = IVI_CB_ZERO;
- cb.len = br.read(4)? as usize;
- if cb.len == 0 { return Err(DecoderError::InvalidData); }
- for i in 0..cb.len {
- cb.bits[i] = br.read(4)? as u8;
- }
- br.align();
-
-let tile_start = br.tell();
- let empty = br.read_bool()?;
- if !empty {
- br.read_bool()?;
- let mut len = br.read(8)? as usize;
- if len == 255 {
- len = br.read(24)? as usize;
- }
- br.align();
-let tile_end = tile_start + len * 8;
-
- let first_val = br.read_bool()?;
-
- let mut dec_size = 0;
- let mut x = 0;
- let mut y = 0;
- let mut fill = if !first_val { 255-128 } else { 0-128 };
- let tr_w = (w + 31) & !31;
- while br.tell() < tile_end {
- let code = br.read_ivi_cb(&cb)? as usize;
- if code == 0 {
- dec_size += 255;
- for _ in 0..255 {
- if (x < w) && (y < h) {
- dst[x + y * dstride] = fill;
- }
- x += 1;
- if x == tr_w {
- x = 0;
- y += 1;
- }
- }
- } else {
- dec_size += code;
- for _ in 0..code {
- if (x < w) && (y < h) {
- dst[x + y * dstride] = fill;
- }
- x += 1;
- if x == tr_w {
- x = 0;
- y += 1;
- }
- }
- fill = !fill;
- }
- }
- br.align();
- } else {
- }
-
- Ok(())
-}
-
-fn decode_block8x8(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams8x8, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> {
- let mut idx: isize = -1;
- let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
- while idx <= 64 {
- let c = br.read_ivi_cb(blk_cb)?;
- if c == rvmap.eob_sym { break; }
- let run;
- let val: i32;
- if c != rvmap.esc_sym {
- validate!(c < 256);
- run = rvmap.runtab[c as usize] as isize;
- val = rvmap.valtab[c as usize] as i32;
- } else {
- run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
- let lo = br.read_ivi_cb(blk_cb)?;
- let hi = br.read_ivi_cb(blk_cb)?;
- let v = (hi << 6) + lo;
- if v == 0 {
- val = 0; // should not happen but still...
- } else {
- let vv = (v >> 1) as i32;
- if (v & 1) != 0 {
- val = vv + 1;
- } else {
- val = -vv;
- }
- }
- }
- idx += run;
- validate!((idx >= 0) && (idx < 64));
-
- let spos = tables.scan[idx as usize];
- let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9;
- if q > 1 {
- let qq = q as i32;
- let bias = (((q ^ 1) - 1) >> 1) as i32;
- coeffs[spos] = val * qq;
- if val > 0 { coeffs[spos] += bias; }
- else { coeffs[spos] -= bias; }
- } else {
- coeffs[spos] = val;
- }
- }
- if is_intra && is_2d {
- *prev_dc += coeffs[0];
- coeffs[0] = *prev_dc;
- }
- (transform)(coeffs);
- Ok(())
-}
-fn decode_block4x4(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams4x4, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> {
- let mut idx: isize = -1;
- let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
- while idx <= 64 {
- let c = br.read_ivi_cb(blk_cb)?;
- if c == rvmap.eob_sym { break; }
- let run;
- let val: i32;
- if c != rvmap.esc_sym {
- validate!(c < 256);
- run = rvmap.runtab[c as usize] as isize;
- val = rvmap.valtab[c as usize] as i32;
- } else {
- run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
- let lo = br.read_ivi_cb(blk_cb)?;
- let hi = br.read_ivi_cb(blk_cb)?;
- let v = (hi << 6) + lo;
- if v == 0 {
- val = 0; // should not happen but still...
- } else {
- if (v & 1) != 0 {
- val = ((v >> 1) as i32) + 1;
- } else {
- val = -((v >> 1) as i32);
- }
- }
- }
- idx += run;
- validate!((idx >= 0) && (idx < 16));
-
- let spos = tables.scan[idx as usize];
- let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9;
- if q > 1 {
- let qq = q as i32;
- let bias = (((q ^ 1) - 1) >> 1) as i32;
- coeffs[spos] = val * qq;
- if val > 0 { coeffs[spos] += bias; }
- else { coeffs[spos] -= bias; }
- } else {
- coeffs[spos] = val;
- }
- }
- if is_intra && is_2d {
- *prev_dc += coeffs[0];
- coeffs[0] = *prev_dc;
- }
- (transform)(coeffs);
- Ok(())
-}
-
-fn put_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
- unsafe {
- let mut dptr = frame.as_mut_ptr().offset(offs as isize);
- for y in 0..blk_size {
- for x in 0..blk_size {
- *dptr.offset(x as isize) = blk[x + y * blk_size] as i16;
- }
- dptr = dptr.offset(stride as isize);
- }
- }
-}
-
-fn add_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
- unsafe {
- let mut dptr = frame.as_mut_ptr().offset(offs as isize);
- for y in 0..blk_size {
- for x in 0..blk_size {
- *dptr.offset(x as isize) = (*dptr.offset(x as isize)).wrapping_add(blk[x + y * blk_size] as i16);
- }
- dptr = dptr.offset(stride as isize);
- }
- }
-}
-
-struct FrameData {
- plane_buf: [Vec<i16>; 4],
- plane_stride: [usize; 4],
- pic_hdr: PictureHeader,
-}
-
-fn align(val: usize, bits: u8) -> usize {
- let mask = (1 << bits) - 1;
- (val + mask) & !mask
-}
-
-impl FrameData {
- fn new() -> Rc<RefCell<Self>> {
- Rc::new(RefCell::new(FrameData {
- plane_buf: [Vec::new(), Vec::new(), Vec::new(), Vec::new()],
- plane_stride: [0, 0, 0, 0],
- pic_hdr: PictureHeader::new_null(IVIFrameType::Intra),
- }))
- }
- fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
- let width = align(pic_hdr.width, 6);
- let height = align(pic_hdr.height, 6);
-
- let stride = width;
- self.plane_buf[0].resize(stride * height, 0);
- self.plane_stride[0] = stride;
- for plane in 1..3 {
- self.plane_buf[plane].resize((stride >> 1) * (height >> 1), 0);
- self.plane_stride[plane] = stride >> 1;
- }
- if pic_hdr.transparent {
- self.plane_buf[3].resize(stride * height, 0);
- self.plane_stride[3] = stride;
- }
- self.pic_hdr = *pic_hdr;
- Ok(())
- }
- fn fill_plane(&mut self, vb: &mut NAVideoBuffer<u8>, plane: usize) {
- let (w, h) = vb.get_dimensions(plane);
- let mut didx = vb.get_offset(plane);
- let dstride = vb.get_stride(plane);
- let mut dst = vb.get_data_mut();
- let src = &self.plane_buf[plane];
- let mut sidx = 0;
- let sstride = self.plane_stride[plane];
- for _ in 0..h {
- for x in 0..w {
- dst[didx + x] = clip8(src[sidx + x] + 128);
- }
- didx += dstride;
- sidx += sstride;
- }
- }
-}
-
-fn do_mc(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, is_hpel: bool, blk_size: usize) {
- let (xoff, yoff, mv_mode) = if is_hpel {
- (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
- } else{
- (mv_x, mv_y, 0)
- };
- let xpos = (x as isize) + (xoff as isize);
- let ypos = (y as isize) + (yoff as isize);
- if (xpos < (l as isize)) || ((xpos as usize) + blk_size + ((mv_mode & 1) as usize) > r) ||
- (ypos < (t as isize)) || ((ypos as usize) + blk_size + ((mv_mode >> 1) as usize) > b) {
-//println!(" copy from {},{} of {}-{},{}-{} {}x{}!", xpos, ypos, l,r,t,b,blk_size,blk_size);
- return;
- }
- let sidx = (xpos as usize) + (ypos as usize) * sstride;
- if blk_size == 8 {
- ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 8, 8);
- } else {
- ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 4, 4);
- }
-}
-
-fn do_mc_b(dst: &mut [i16], dstride: usize, src1: &[i16], sstride1: usize, src2: &[i16], sstride2: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, mv2_x: i32, mv2_y: i32, is_hpel: bool, blk_size: usize) {
- let (xoff1, yoff1, mv_mode1) = if is_hpel {
- (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
- } else{
- (mv_x, mv_y, 0)
- };
- let xpos1 = (x as isize) + (xoff1 as isize);
- let ypos1 = (y as isize) + (yoff1 as isize);
- if (xpos1 < (l as isize)) || ((xpos1 as usize) + blk_size + ((mv_mode1 & 1) as usize) > r) ||
- (ypos1 < (t as isize)) || ((ypos1 as usize) + blk_size + ((mv_mode1 >> 1) as usize) > b) {
- return;
- }
- let sidx1 = (xpos1 as usize) + (ypos1 as usize) * sstride1;
- let (xoff2, yoff2, mv_mode2) = if is_hpel {
- (mv2_x >> 1, mv2_y >> 1, ((mv2_x & 1) + (mv2_y & 1) * 2) as u8)
- } else{
- (mv2_x, mv2_y, 0)
- };
- let xpos2 = (x as isize) + (xoff2 as isize);
- let ypos2 = (y as isize) + (yoff2 as isize);
- if (xpos2 < (l as isize)) || ((xpos2 as usize) + blk_size + ((mv_mode2 & 1) as usize) > r) ||
- (ypos2 < (t as isize)) || ((ypos2 as usize) + blk_size + ((mv_mode2 >> 1) as usize) > b) {
- return;
- }
- let sidx2 = (xpos2 as usize) + (ypos2 as usize) * sstride2;
- ivi_mc_avg(dst, dstride, &src1[sidx1..], sstride1, mv_mode1, &src2[sidx2..], sstride2, mv_mode2, blk_size, blk_size);
-}
-
-pub trait IndeoXParser {
- fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader>;
- fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader>;
- fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band_hdr: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()>;
- fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize);
-}
-
-const MISSING_REF: usize = 42;
-
-pub struct IVIDecoder {
- ftype: IVIFrameType,
- frames: [Rc<RefCell<FrameData>>; 4],
- cur_frame: usize,
- prev_frame: usize,
- next_frame: usize,
- iref_0: usize,
- iref_1: usize,
- scal_ref: usize,
- vinfo: NAVideoInfo,
- vinfoa: NAVideoInfo,
- bref: Option<NABufferType>,
-
- bands: Vec<BandHeader>,
- tiles: Vec<Rc<RefCell<IVITile>>>,
- num_tiles: [[usize; 4]; 4],
- tile_start: [[usize; 4]; 4],
-}
-
-impl IVIDecoder {
- pub fn new() -> Self {
- let mut bands: Vec<BandHeader> = Vec::with_capacity(12);
- bands.resize(12, BandHeader::new_empty(42, 42));
- IVIDecoder {
- ftype: IVIFrameType::NULL,
- frames: [FrameData::new(), FrameData::new(), FrameData::new(), FrameData::new()],
- cur_frame: 0, prev_frame: MISSING_REF, next_frame: MISSING_REF,
- iref_0: MISSING_REF, iref_1: MISSING_REF, scal_ref: MISSING_REF,
- vinfo: NAVideoInfo::new(0, 0, false, YUV410_FORMAT),
- vinfoa: NAVideoInfo::new(0, 0, false, YUVA410_FORMAT),
- bref: None,
-
- bands: bands,
- tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4],
- }
- }
-
- fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
- let planes = if pic_hdr.transparent { 4 } else { 3 };
-
- //self.bands.truncate(0);
- self.tiles.truncate(0);
- self.num_tiles = [[0; 4]; 4];
- self.tile_start = [[0; 4]; 4];
- let mut tstart: usize = 0;
- for plane in 0..planes {
- let is_luma = (plane != 1) && (plane != 2);
- let bands = if is_luma { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
- let mut band_w = if is_luma { pic_hdr.width } else { (pic_hdr.width + 3) >> 2 };
- let mut band_h = if is_luma { pic_hdr.height } else { (pic_hdr.height + 3) >> 2 };
- let mut tile_w = if is_luma { pic_hdr.slice_w } else { (pic_hdr.slice_w + 3) >> 2 };
- let mut tile_h = if is_luma { pic_hdr.slice_h } else { (pic_hdr.slice_h + 3) >> 2 };
- if bands > 1 {
- band_w = (band_w + 1) >> 1;
- band_h = (band_h + 1) >> 1;
- if plane == 0 {
- tile_w = (tile_w + 1) >> 1;
- tile_h = (tile_h + 1) >> 1;
- }
- }
- for band in 0..bands {
- self.tile_start[plane][band] = tstart;
- let band_xoff = if (band & 1) == 1 { band_w } else { 0 };
- let band_yoff = if (band & 2) == 2 { band_h } else { 0 };
- let mut y = 0;
- while y < band_h {
- let cur_h = if y + tile_h <= band_h { tile_h } else { band_h - y };
- let mut x = 0;
- while x < band_w {
- let cur_w = if x + tile_w <= band_w { tile_w } else { band_w - x };
- let tile = IVITile::new(band_xoff + x, band_yoff + y, cur_w, cur_h);
- self.tiles.push(Rc::new(RefCell::new(tile)));
- self.num_tiles[plane][band] += 1;
- tstart += 1;
- x += tile_w;
- }
- y += tile_h;
- }
- }
- }
- Ok(())
- }
- fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> {
- let bidx = match plane_no {
- 0 => { band_no },
- _ => { pic_hdr.luma_bands + plane_no - 1 },
- };
- let prev_band = if bidx >= self.bands.len() { BandHeader::new_empty(plane_no, band_no) } else { self.bands[bidx].clone() };
- let mut band = dec.decode_band_header(br, pic_hdr, plane_no, band_no)?;
- if let TxType::None = band.ttype {
- validate!(band.plane_no == prev_band.plane_no);
- validate!(band.band_no == prev_band.band_no);
- validate!(band.blk_size == prev_band.blk_size);
- band.tr = prev_band.tr;
- band.ttype = prev_band.ttype;
- };
-
- let tstart = self.tile_start[band.plane_no][band.band_no];
- let tend = tstart + self.num_tiles[band.plane_no][band.band_no];
- let mb_size = band.mb_size;
- let (tr, tr_dc) = match band.ttype {
- TxType::Transform4(_) => { ivi_get_transform4x4_funcs(band.tr) },
- TxType::Transform8(_) => { ivi_get_transform8x8_funcs(band.tr) },
- _ => { ivi_get_transform4x4_funcs(band.tr) },
- };
- for tile_no in tstart..tend {
- {
- let mut tile = self.tiles[tile_no].borrow_mut();
- let mb_w = (tile.w + mb_size - 1) / mb_size;
- let mb_h = (tile.h + mb_size - 1) / mb_size;
- tile.mb_w = mb_w;
- tile.mb_h = mb_h;
- tile.mb.truncate(0);
- tile.mb.resize(mb_w * mb_h, MB::new(0, 0));
- }
-
- let tile_start = br.tell();
- if !br.read_bool()? {
- let res = br.read_bool()?;
- validate!(res);
- let mut len = br.read(8)? as usize;
- if len == 255 {
- len = br.read(24)? as usize;
- }
- br.align();
- validate!(len > 0);
- let tile_end = tile_start + len * 8;
- validate!(tile_end > br.tell());
- validate!(tile_end <= br.tell() + (br.left() as usize));
- {
- let mut tile = self.tiles[tile_no].borrow_mut();
- let ref_tile: Option<Ref<IVITile>>;
- let mv_scale;
- if (plane_no == 0) && (band_no == 0) {
- mv_scale = 0;
- } else {
- mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
- }
- if plane_no != 0 || band_no != 0 {
- let rtile = self.tiles[0].borrow();
- if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
- ref_tile = None;
- } else {
- ref_tile = Some(rtile);
- }
- } else {
- ref_tile = None;
- }
- dec.decode_mb_info(br, pic_hdr, &band, &mut tile, ref_tile, mv_scale)?;
- }
-
- self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
-let skip_part = tile_end - br.tell();
-br.skip(skip_part as u32)?;
- } else {
- {
- let mut tile = self.tiles[tile_no].borrow_mut();
- let ref_tile: Option<Ref<IVITile>>;
- let mv_scale;
- if (plane_no == 0) && (band_no == 0) {
- mv_scale = 0;
- } else {
- mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
- }
- if plane_no != 0 || band_no != 0 {
- let rtile = self.tiles[0].borrow();
- if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
- ref_tile = None;
- } else {
- ref_tile = Some(rtile);
- }
- } else {
- ref_tile = None;
- }
- let mut mb_idx = 0;
- for mb_y in 0..tile.mb_h {
- for mb_x in 0..tile.mb_w {
- let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
- mb.mtype = MBType::Inter;
- mb.cbp = 0;
- if band.inherit_mv {
- if let Some(ref tileref) = ref_tile {
- let mx = tileref.mb[mb_idx].mv_x;
- let my = tileref.mb[mb_idx].mv_y;
- mb.mv_x = scale_mv(mx, mv_scale);
- mb.mv_y = scale_mv(my, mv_scale);
- }
- }
- tile.mb[mb_idx] = mb;
- mb_idx += 1;
- }
- }
- }
- self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
- }
- }
- self.bands[bidx] = band;
- br.align();
- Ok(())
- }
- fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: &TrFunc, transform_dc: &TrFuncDC) -> DecoderResult<()> {
- let mut mb_idx = 0;
- let mut prev_dc: i32 = 0;
- let mut tile = self.tiles[tile_no].borrow_mut();
- let mut frame = self.frames[self.cur_frame].borrow_mut();
-
- let stride = frame.plane_stride[band.plane_no];
- let mut dstidx = tile.pos_x + tile.pos_y * stride;
- let mut dst = &mut frame.plane_buf[band.plane_no];
- let pos_x = tile.pos_x;
- let pos_y = tile.pos_y;
- let tile_w = (tile.w + 15) & !15;
- let tile_h = (tile.h + 15) & !15;
- for mb_y in 0..tile.mb_h {
- for mb_x in 0..tile.mb_w {
- let mb = &mut tile.mb[mb_idx];
-
- let is_intra = mb.mtype == MBType::Intra;
-
- if band.mb_size != band.blk_size {
- let mut cbp = mb.cbp;
- for blk_no in 0..4 {
- let mut blk: [i32; 64] = [0; 64];
- let boff = (blk_no & 1) * 8 + (blk_no & 2) * 4 * stride + mb_x * 16;
- if !is_intra {
- if mb.mtype != MBType::Bidir {
- let idx;
- if mb.mtype != MBType::Backward {
- idx = self.prev_frame;
- } else {
- idx = self.next_frame;
- }
- let pf = self.frames[idx].borrow();
- do_mc(&mut dst[dstidx + boff..], stride,
- &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
- pos_x + mb_x * 16 + (blk_no & 1) * 8,
- pos_y + mb_y * 16 + (blk_no & 2) * 4,
- pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
- mb.mv_x, mb.mv_y, band.halfpel, 8);
- } else {
- let pf = self.frames[self.prev_frame].borrow();
- let nf = self.frames[self.next_frame].borrow();
- do_mc_b(&mut dst[dstidx + boff..], stride,
- &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
- &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
- pos_x + mb_x * 16 + (blk_no & 1) * 8,
- pos_y + mb_y * 16 + (blk_no & 2) * 4,
- pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
- mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
- band.blk_size);
- }
- }
- if (cbp & 1) != 0 {
- if let TxType::Transform8(ref params) = band.ttype {
- decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
- if is_intra {
- put_block(&mut dst, dstidx + boff, stride, &blk, 8);
- } else {
- add_block(&mut dst, dstidx + boff, stride, &blk, 8);
- }
- }
- } else {
- if is_intra {
- (transform_dc)(&mut blk, prev_dc);
- put_block(&mut dst, dstidx + boff, stride, &blk, 8);
- }
- }
- cbp >>= 1;
- }
- } else {
- let mut blk: [i32; 64] = [0; 64];
- if !is_intra {
- if mb.mtype != MBType::Bidir {
- let idx;
- if mb.mtype != MBType::Backward {
- idx = self.prev_frame;
- } else {
- idx = self.next_frame;
- }
- let pf = self.frames[idx].borrow();
- do_mc(&mut dst[dstidx + mb_x * band.blk_size..], stride,
- &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
- pos_x + mb_x * band.mb_size,
- pos_y + mb_y * band.mb_size,
- pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
- mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
- } else {
- let pf = self.frames[self.prev_frame].borrow();
- let nf = self.frames[self.next_frame].borrow();
- do_mc_b(&mut dst[dstidx + mb_x * band.blk_size..], stride,
- &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
- &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
- pos_x + mb_x * band.mb_size,
- pos_y + mb_y * band.mb_size,
- pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
- mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
- band.blk_size);
- }
- }
- if mb.cbp != 0 {
- if let TxType::Transform8(ref params) = band.ttype {
- decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
- }
- if let TxType::Transform4(ref params) = band.ttype {
- decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
- }
- if is_intra {
- if band.blk_size == 8 {
- put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
- } else {
- put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
- }
- } else {
- if band.blk_size == 8 {
- add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
- } else {
- add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
- }
- }
- } else {
- if is_intra {
- (transform_dc)(&mut blk, prev_dc);
- if band.blk_size == 8 {
- put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
- } else {
- put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
- }
- }
- }
- }
- mb_idx += 1;
- }
- dstidx += stride * band.mb_size;
- }
- br.align();
- Ok(())
- }
-
- fn find_unused_frame(&self) -> usize {
- for fno in 0..4 {
- if (fno != self.iref_0) && (fno != self.iref_1) && (fno != self.scal_ref) {
- return fno;
- }
- }
- unreachable!();
- }
-
- fn decode_single_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
- let pic_hdr = dec.decode_picture_header(br)?;
- self.ftype = pic_hdr.ftype;
- if pic_hdr.ftype.is_null() {
- return Ok(NABufferType::None);
- }
-
- self.cur_frame = self.find_unused_frame();
- match self.ftype {
- IVIFrameType::Inter => {
- self.prev_frame = self.iref_0;
- if self.prev_frame == MISSING_REF {
- return Err(DecoderError::MissingReference);
- }
- },
- IVIFrameType::InterDroppable => {
- self.prev_frame = self.scal_ref;
- if self.prev_frame == MISSING_REF {
- return Err(DecoderError::MissingReference);
- }
- },
- IVIFrameType::InterScal => {
- self.prev_frame = self.scal_ref;
- if self.prev_frame == MISSING_REF {
- return Err(DecoderError::MissingReference);
- }
- },
- IVIFrameType::Bidir => {
- self.prev_frame = self.iref_1;
- self.next_frame = self.iref_0;
- if (self.prev_frame == MISSING_REF) || (self.next_frame == MISSING_REF) {
- return Err(DecoderError::MissingReference);
- }
- },
- _ => {},
- };
-
- let mut vinfo;
- if pic_hdr.transparent {
- vinfo = self.vinfoa.clone();
- } else {
- vinfo = self.vinfo.clone();
- }
- vinfo.set_width(pic_hdr.width);
- vinfo.set_height(pic_hdr.height);
- let mut buftype = alloc_video_buffer(vinfo, 0)?;
- self.realloc(&pic_hdr)?;
- self.frames[self.cur_frame].borrow_mut().realloc(&pic_hdr)?;
-
- for plane in 0..3 {
- let num_bands = if plane == 0 { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
- for band in 0..num_bands {
- self.decode_band(&pic_hdr, dec, br, plane, band)?;
- }
- if let NABufferType::Video(ref mut vb) = buftype {
- let mut frame = self.frames[self.cur_frame].borrow_mut();
- if num_bands == 1 {
- frame.fill_plane(vb, plane);
- } else {
- let (w, h) = vb.get_dimensions(plane);
- let dstride = vb.get_stride(plane);
- let off = vb.get_offset(plane);
- let mut dst = vb.get_data_mut();
- dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h);
- }
- }
- }
- if pic_hdr.transparent {
- let mut frame = self.frames[self.cur_frame].borrow_mut();
- let stride = frame.plane_stride[3];
- read_trans_band_header(br, pic_hdr.width, pic_hdr.height, &mut frame.plane_buf[3], stride)?;
- if let NABufferType::Video(ref mut vb) = buftype {
- frame.fill_plane(vb, 3);
- }
- }
-
- match self.ftype {
- IVIFrameType::Intra | IVIFrameType::Inter => {
- self.iref_1 = self.iref_0;
- self.iref_0 = self.cur_frame;
- self.scal_ref = self.cur_frame;
- },
- IVIFrameType::InterScal => {
- self.scal_ref = self.cur_frame;
- },
- _ => {},
- };
-
- Ok(buftype)
- }
-
- pub fn decode_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
- let res = self.decode_single_frame(dec, br);
- if res.is_err() { return res; }
- if (self.ftype == IVIFrameType::Intra) && (br.left() > 16) {
- loop {
- if br.left() < 8 { break; }
- if br.read(8)? == 0 { break; }
- }
- loop {
- if br.left() < 8 { break; }
- if br.peek(8) != 0 { break; }
- br.skip(8)?;
- }
- if br.left() > 24 {
- let seq = br.peek(21);
- if seq == 0xBFFF8 {
- let res2 = self.decode_single_frame(dec, br);
- if res2.is_ok() {
- self.bref = Some(res2.unwrap());
- }
- }
- self.ftype = IVIFrameType::Intra;
- }
- }
- if let Ok(NABufferType::None) = res {
- if self.bref.is_some() {
- let mut bref: Option<NABufferType> = None;
- mem::swap(&mut bref, &mut self.bref);
- self.ftype = IVIFrameType::Inter;
- return Ok(bref.unwrap());
- }
- }
- res
- }
-
- pub fn is_intra(&mut self) -> bool {
- self.ftype.is_intra()
- }
- pub fn get_frame_type(&mut self) -> FrameType {
- match self.ftype {
- IVIFrameType::Intra => { FrameType::I },
- IVIFrameType::Intra1 => { FrameType::I },
- IVIFrameType::Inter => { FrameType::P },
- IVIFrameType::InterDroppable => { FrameType::P },
- IVIFrameType::InterScal => { FrameType::P },
- IVIFrameType::Bidir => { FrameType::B },
- _ => { FrameType::Skip },
- }
- }
-}
-
-pub struct RVMap {
- pub eob_sym: u32,
- pub esc_sym: u32,
- pub runtab: [u8; 256],
- pub valtab: [i8; 256],
-}
-
-impl Clone for RVMap {
- fn clone(&self) -> RVMap {
- let mut runtab: [u8; 256] = [0; 256];
- let mut valtab: [i8; 256] = [0; 256];
- runtab.copy_from_slice(&self.runtab);
- valtab.copy_from_slice(&self.valtab);
- RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab: runtab, valtab: valtab }
- }
-}
-
-pub const IVI_ZERO_RVMAP: RVMap = RVMap { eob_sym: 0, esc_sym: 0, runtab: [0; 256], valtab: [0; 256] };
-
-pub static IVI_RVMAPS: [RVMap; 9] = [
- RVMap { eob_sym: 5, esc_sym: 2, runtab: [
- 1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
- 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
- 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
- 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
- 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
- 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
- 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
- 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
- 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
- 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
- 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
- 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
- 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
- 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
- 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
- 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38 ],
- valtab: [
- 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
- 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
- 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
- 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
- -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
- 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
- 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
- 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
- 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
- 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
- -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
- 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
- -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
- 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
- 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
- -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1 ],
- },
- RVMap { eob_sym: 0, esc_sym: 38, runtab: [
- 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
- 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
- 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
- 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
- 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
- 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
- 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
- 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
- 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
- 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
- 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
- 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
- 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
- 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
- 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
- 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5 ],
- valtab: [
- 0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
- -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
- -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
- 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
- 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
- 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
- -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
- -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
- 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
- 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
- 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
- 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
- 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
- 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
- -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
- -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4 ],
- },
- RVMap { eob_sym: 2, esc_sym: 11, runtab: [
- 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
- 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
- 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
- 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
- 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
- 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
- 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
- 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
- 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
- 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
- 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
- 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
- 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
- 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
- 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
- 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62 ],
- valtab: [
- 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
- 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
- -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
- 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
- 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
- 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
- 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
- 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
- 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
- -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
- -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
- -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
- 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
- -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
- -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
- -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1 ]
- },
- RVMap { eob_sym: 0, esc_sym: 35, runtab: [
- 0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
- 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
- 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
- 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
- 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
- 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
- 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
- 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
- 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
- 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
- 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
- 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
- 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
- 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
- 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
- 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16 ],
- valtab: [
- 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
- -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
- -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
- 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
- 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
- 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
- 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
- -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
- 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
- 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
- -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
- -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
- -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
- 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
- -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
- -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3 ]
- },
- RVMap { eob_sym: 0, esc_sym: 34, runtab: [
- 0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
- 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
- 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
- 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
- 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
- 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
- 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
- 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
- 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
- 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
- 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
- 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 ],
- valtab: [
- 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
- 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
- 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
- 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
- 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
- -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
- 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
- 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
- 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
- -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
- -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
- -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
- -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
- 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
- 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
- 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89 ]
- },
- RVMap { eob_sym: 2, esc_sym: 33, runtab: [
- 1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
- 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
- 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
- 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
- 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
- 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
- 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
- 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
- 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
- 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
- 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
- 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
- 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
- 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
- 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
- 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7 ],
- valtab: [
- 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
- -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
- -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
- 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
- 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
- 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
- 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
- -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
- -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
- -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
- 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
- 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
- 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
- -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
- 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
- -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5 ]
- },
- RVMap { eob_sym: 2, esc_sym: 13, runtab: [
- 1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
- 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
- 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
- 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
- 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
- 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
- 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
- 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
- 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
- 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
- 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
- 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
- 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
- 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
- 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
- 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2 ],
- valtab: [
- -20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
- 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
- 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
- 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
- -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
- 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
- -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
- -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
- 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
- -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
- -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
- -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
- 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
- -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
- 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
- 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14 ]
- },
- RVMap { eob_sym: 2, esc_sym: 38, runtab: [
- 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
- 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
- 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
- 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
- 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
- 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
- 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
- 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
- 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
- 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
- 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
- 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
- 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
- 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
- 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
- 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49 ],
- valtab: [
- 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
- -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
- -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
- 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
- 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
- -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
- -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
- 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
- -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
- -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
- -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
- -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
- -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
- 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
- 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
- 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1 ]
- },
- RVMap { eob_sym: 4, esc_sym: 11, runtab: [
- 1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
- 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
- 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
- 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
- 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
- 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
- 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
- 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
- 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
- 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
- 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
- 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
- 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
- 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
- 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
- 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1 ],
- valtab: [
- 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
- 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
- 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
- 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
- -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
- 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
- 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
- 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
- -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
- -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
- 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
- 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
- -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
- 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
- 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
- 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26 ]
- }
-];
diff --git a/src/codecs/indeo/ividsp.rs b/src/codecs/indeo/ividsp.rs
deleted file mode 100644
index 88bc8cc..0000000
--- a/src/codecs/indeo/ividsp.rs
+++ /dev/null
@@ -1,467 +0,0 @@
-use super::ivi::{IVITransformType,TDir,TrFunc,TrFuncDC};
-
-#[inline(always)]
-fn hbutterfly(a: i32, b: i32) -> (i32, i32) {
- ((a + b) >> 1, (a - b) >> 1)
-}
-#[inline(always)]
-fn butterfly(a: i32, b: i32) -> (i32, i32) {
- (a + b, a - b)
-}
-#[inline(always)]
-fn ireflect(a: i32, b: i32) -> (i32, i32) {
- (((b * 2 - a + 2) >> 2) - a, ((b + 2 * a + 2) >> 2) + b)
-}
-
-macro_rules! haar_transform {
- ($c0:expr, $c1:expr, $c2:expr, $c3:expr) => {{
- let (t0, t1) = hbutterfly($c0, $c1);
- let (t2, t3) = hbutterfly(t0, $c2);
- $c0 = t2;
- $c1 = t3;
- let (t4, t5) = hbutterfly(t1, $c3);
- $c2 = t4;
- $c3 = t5;
- }};
- ($c0:expr, $c1:expr, $c2:expr, $c3:expr, $c4:expr, $c5:expr, $c6:expr, $c7:expr) => {{
- let (a0, a1) = hbutterfly($c0 << 1, $c1 << 1);
-
- let (t0, t1) = hbutterfly(a0, $c2);
- let (t2, t3) = hbutterfly(a1, $c3);
- let (u0, u1) = hbutterfly(t0, $c4);
- let (u2, u3) = hbutterfly(t1, $c5);
- let (u4, u5) = hbutterfly(t2, $c6);
- let (u6, u7) = hbutterfly(t3, $c7);
-
- $c0 = u0;
- $c1 = u1;
- $c2 = u2;
- $c3 = u3;
- $c4 = u4;
- $c5 = u5;
- $c6 = u6;
- $c7 = u7;
- }};
-}
-macro_rules! slant_transform {
- ($c0:expr, $c1:expr, $c2:expr, $c3:expr, $output:ident) => {{
- let (t0, t1) = butterfly($c0, $c2);
- let (t2, t3) = ireflect ($c3, $c1);
- let (t4, t5) = butterfly(t0, t3);
- let (t6, t7) = butterfly(t1, t2);
- $c0 = $output(t4);
- $c1 = $output(t6);
- $c2 = $output(t7);
- $c3 = $output(t5);
- }};
- ($c0:expr, $c1:expr, $c2:expr, $c3:expr, $c4:expr, $c5:expr, $c6:expr, $c7:expr, $output:ident) => {{
- let t0 = $c3 + (($c1 * 4 - $c3 + 4) >> 3);
- let t1 = $c1 + ((-$c1 - $c3 * 4 + 4) >> 3);
-
- let (t2, t3) = butterfly($c0, t1);
- let (t4, t5) = butterfly($c4, $c5);
- let (t6, t7) = butterfly($c7, $c6);
- let (t8, t9) = butterfly(t0, $c2);
-
- let (u0, u1) = butterfly(t2, t4);
- let (u2, u3) = ireflect (t7, t8);
- let (u4, u5) = butterfly(t3, t5);
- let (u6, u7) = ireflect (t6, t9);
-
- let (t0, t1) = butterfly(u0, u3);
- let (t2, t3) = butterfly(u1, u2);
- let (t4, t5) = butterfly(u4, u7);
- let (t6, t7) = butterfly(u5, u6);
-
- $c0 = $output(t0);
- $c1 = $output(t2);
- $c2 = $output(t3);
- $c3 = $output(t1);
- $c4 = $output(t4);
- $c5 = $output(t6);
- $c6 = $output(t7);
- $c7 = $output(t5);
- }};
-}
-
-fn haar8x8_2d(blk: &mut[i32; 64]) {
- for i in 0..4 {
- let mut c0 = blk[i + 0*8] << 1;
- let mut c1 = blk[i + 1*8] << 1;
- let mut c2 = blk[i + 2*8] << 1;
- let mut c3 = blk[i + 3*8] << 1;
- haar_transform!(c0, c1, c2, c3,
- blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8]);
- blk[i + 0*8] = c0;
- blk[i + 1*8] = c1;
- blk[i + 2*8] = c2;
- blk[i + 3*8] = c3;
- }
- for i in 4..8 {
- haar_transform!(blk[i + 0*8], blk[i + 1*8], blk[i + 2*8], blk[i + 3*8],
- blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8]);
- }
- for i in 0..8 {
- let row = &mut blk[i*8..(i+1)*8];
- haar_transform!(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]);
- }
-}
-fn haar8x8_row(blk: &mut[i32; 64]) {
- for i in 0..8 {
- let row = &mut blk[i*8..(i+1)*8];
- haar_transform!(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]);
- }
-}
-fn haar8x8_col(blk: &mut[i32; 64]) {
- for i in 0..8 {
- haar_transform!(blk[i + 0*8], blk[i + 1*8], blk[i + 2*8], blk[i + 3*8],
- blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8]);
- }
-}
-fn haar8x8_dc(blk: &mut[i32; 64], in0: i32) {
- let dc = in0 >> 3;
- for i in 0..64 { blk[i] = dc; }
-}
-
-fn haar4x4_2d(blk: &mut[i32; 64]) {
- for i in 0..2 {
- let mut c0 = blk[i + 0*4] << 1;
- let mut c1 = blk[i + 1*4] << 1;
- haar_transform!(c0, c1, blk[i + 2*4], blk[i + 3*4]);
- blk[i + 0*4] = c0;
- blk[i + 1*4] = c1;
- }
- for i in 2..4 {
- haar_transform!(blk[i + 0*4], blk[i + 1*4], blk[i + 2*4], blk[i + 3*4]);
- }
- for i in 0..4 {
- let row = &mut blk[i*4..(i+1)*4];
- haar_transform!(row[0], row[1], row[2], row[3]);
- }
-}
-fn haar4x4_row(blk: &mut[i32; 64]) {
- for i in 0..4 {
- let row = &mut blk[i*4..(i+1)*4];
- haar_transform!(row[0], row[1], row[2], row[3]);
- }
-}
-fn haar4x4_col(blk: &mut[i32; 64]) {
- for i in 0..4 {
- haar_transform!(blk[i + 0*4], blk[i + 1*4], blk[i + 2*4], blk[i + 3*4]);
- }
-}
-fn haar4x4_dc(blk: &mut[i32; 64], in0: i32) {
- let dc = in0 >> 3;
- for i in 0..16 { blk[i] = dc; }
-}
-
-fn slant8x8_2d(blk: &mut[i32; 64]) {
- let pass1 = |x: i32| x;
- let pass2 = |x: i32| (x + 1) >> 1;
-
- for i in 0..8 {
- let mut s0 = 0;
- for j in 0..8 { s0 |= blk[i + j*8]; }
- if s0 == 0 { continue; }
-
- slant_transform!(blk[i + 0*8], blk[i + 1*8], blk[i + 2*8], blk[i + 3*8],
- blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8], pass1);
- }
- for i in 0..8 {
- let row = &mut blk[i*8..(i+1)*8];
- slant_transform!(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], pass2);
- }
-}
-fn slant8x8_2d_dc(blk: &mut[i32; 64], in0: i32) {
- let dc = (in0 + 1) >> 1;
- for i in 0..64 { blk[i] = dc; }
-}
-fn slant8x8_row(blk: &mut[i32; 64]) {
- let pass = |x: i32| (x + 1) >> 1;
-
- for i in 0..8 {
- let row = &mut blk[i*8..(i+1)*8];
- slant_transform!(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], pass);
- }
-}
-fn slant8x8_row_dc(blk: &mut[i32; 64], in0: i32) {
- let dc = (in0 + 1) >> 1;
-
- for i in 0..8 { blk[i] = dc; }
- for i in 8..64 { blk[i] = 0; }
-}
-fn slant8x8_col(blk: &mut[i32; 64]) {
- let pass = |x: i32| (x + 1) >> 1;
-
- for i in 0..8 {
- slant_transform!(blk[i + 0*8], blk[i + 1*8], blk[i + 2*8], blk[i + 3*8],
- blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8], pass);
- }
-}
-fn slant8x8_col_dc(blk: &mut[i32; 64], in0: i32) {
- let dc = (in0 + 1) >> 1;
-
- for i in 0..8 {
- blk[i * 8] = dc;
- for j in 1..8 { blk[i * 8 + j] = 0; }
- }
-}
-
-fn slant4x4_2d(blk: &mut[i32; 64]) {
- let pass1 = |x: i32| x;
- let pass2 = |x: i32| (x + 1) >> 1;
-
- for i in 0..4 {
- slant_transform!(blk[i + 0*4], blk[i + 1*4], blk[i + 2*4], blk[i + 3*4], pass1);
- }
- for i in 0..4 {
- let row = &mut blk[i*4..(i+1)*4];
- slant_transform!(row[0], row[1], row[2], row[3], pass2);
- }
-}
-fn slant4x4_2d_dc(blk: &mut[i32; 64], in0: i32) {
- let dc = (in0 + 1) >> 1;
- for i in 0..16 { blk[i] = dc; }
-}
-fn slant4x4_row(blk: &mut[i32; 64]) {
- let pass = |x: i32| (x + 1) >> 1;
-
- for i in 0..4 {
- let row = &mut blk[i*4..(i+1)*4];
- slant_transform!(row[0], row[1], row[2], row[3], pass);
- }
-}
-fn slant4x4_row_dc(blk: &mut[i32; 64], in0: i32) {
- let dc = (in0 + 1) >> 1;
-
- for i in 0..4 { blk[i] = dc; }
- for i in 4..16 { blk[i] = 0; }
-}
-fn slant4x4_col(blk: &mut[i32; 64]) {
- let pass = |x: i32| (x + 1) >> 1;
-
- for i in 0..4 {
- slant_transform!(blk[i + 0*4], blk[i + 1*4], blk[i + 2*4], blk[i + 3*4], pass);
- }
-}
-fn slant4x4_col_dc(blk: &mut[i32; 64], in0: i32) {
- let dc = (in0 + 1) >> 1;
-
- for i in 0..4 {
- blk[i * 4] = dc;
- for j in 1..4 { blk[i * 4 + j] = 0; }
- }
-}
-
-#[allow(unused_variables)]
-fn none8x8(blk: &mut[i32; 64]) {
-}
-fn none8x8_dc(blk: &mut[i32; 64], dc: i32) {
- for i in 1..8 { blk[i] = dc; }
- for i in 8..64 { blk[i] = 0; }
-}
-#[allow(unused_variables)]
-fn none4x4(blk: &mut[i32; 64]) {
-}
-fn none4x4_dc(blk: &mut[i32; 64], dc: i32) {
- for i in 1..4 { blk[i] = dc; }
- for i in 4..16 { blk[i] = 0; }
-}
-
-pub fn ivi_get_transform8x8_funcs(ttype: IVITransformType) -> (TrFunc, TrFuncDC) {
- match ttype {
- IVITransformType::Haar(_, ref dir) => {
- match *dir {
- TDir::TwoD => { (haar8x8_2d, haar8x8_dc) },
- TDir::Row => { (haar8x8_row, haar8x8_dc) },
- TDir::Col => { (haar8x8_col, haar8x8_dc) },
- } },
- IVITransformType::Slant(_, ref dir) => {
- match *dir {
- TDir::TwoD => { (slant8x8_2d, slant8x8_2d_dc) },
- TDir::Row => { (slant8x8_row, slant8x8_row_dc) },
- TDir::Col => { (slant8x8_col, slant8x8_col_dc) },
- } },
- IVITransformType::DCT(_, _) => { unimplemented!() },
- IVITransformType::None(_) => { (none8x8, none8x8_dc) }
- }
-}
-pub fn ivi_get_transform4x4_funcs(ttype: IVITransformType) -> (TrFunc, TrFuncDC) {
- match ttype {
- IVITransformType::Haar(_, ref dir) => {
- match *dir {
- TDir::TwoD => { (haar4x4_2d, haar4x4_dc) },
- TDir::Row => { (haar4x4_row, haar4x4_dc) },
- TDir::Col => { (haar4x4_col, haar4x4_dc) },
- } },
- IVITransformType::Slant(_, ref dir) => {
- match *dir {
- TDir::TwoD => { (slant4x4_2d, slant4x4_2d_dc) },
- TDir::Row => { (slant4x4_row, slant4x4_row_dc) },
- TDir::Col => { (slant4x4_col, slant4x4_col_dc) },
- } },
- IVITransformType::DCT(_, _) => { unimplemented!() },
- IVITransformType::None(_) => { (none4x4, none4x4_dc) }
- }
-}
-
-pub fn ivi_mc_put(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, mode: u8, w: usize, h: usize) {
- let mut sidx = 0;
- let mut didx = 0;
- if src.len() < w + h * sstride { return; }
- match mode {
- 0 => {
- for _ in 0..h {
- let dest = &mut dst[didx..didx+w];
- dest.copy_from_slice(&src[sidx..sidx+w]);
- sidx += sstride;
- didx += dstride;
- }
- },
- 1 => {
- /*for _ in 0..h {
- for x in 0..w {
- let val = (src[sidx + x] + src[sidx + x + 1]) >> 1;
- dst[didx + x] = val;
- }
- sidx += sstride;
- didx += dstride;
- }*/
- unsafe {
- let mut sptr = src.as_ptr();
- let mut dptr = dst.as_mut_ptr();
- for _ in 0..h {
- let mut last = *sptr;
- for x in 0..w {
- let nv = *sptr.offset((x + 1) as isize);
- *dptr.offset(x as isize) = nv.wrapping_add(last) >> 1;
- last = nv;
- }
- sptr = sptr.offset(sstride as isize);
- dptr = dptr.offset(dstride as isize);
- }
- }
- },
- 2 => {
- /*for _ in 0..h {
- for x in 0..w {
- let val = (src[sidx + x] + src[sidx + x + sstride]) >> 1;
- dst[didx + x] = val;
- }
- sidx += sstride;
- didx += dstride;
- }*/
- unsafe {
- let mut sptr0 = src.as_ptr();
- let mut sptr1 = sptr0.offset(sstride as isize);
- let mut dptr = dst.as_mut_ptr();
- for _ in 0..h {
- for x in 0..w {
- let a = *sptr0.offset(x as isize);
- let b = *sptr1.offset(x as isize);
- *dptr.offset(x as isize) = a.wrapping_add(b) >> 1;
- }
- sptr0 = sptr0.offset(sstride as isize);
- sptr1 = sptr1.offset(sstride as isize);
- dptr = dptr.offset(sstride as isize);
- }
- }
- },
- 3 => {
- /*for _ in 0..h {
- for x in 0..w {
- let val = (src[sidx + x + 0] + src[sidx + x + sstride + 0] +
- src[sidx + x + 1] + src[sidx + x + sstride + 1]) >> 2;
- dst[didx + x] = val;
- }
- sidx += sstride;
- didx += dstride;
- }*/
- unsafe {
- let mut sptr0 = src.as_ptr();
- let mut sptr1 = sptr0.offset(sstride as isize);
- let mut dptr = dst.as_mut_ptr();
- let mut la = *sptr0;
- let mut lb = *sptr1;
- for _ in 0..h {
- for x in 0..w {
- let a = *sptr0.offset((x + 1) as isize);
- let b = *sptr1.offset((x + 1) as isize);
- let aas = a.wrapping_add(la);
- let bbs = b.wrapping_add(lb);
- *dptr.offset(x as isize) = aas.wrapping_add(bbs) >> 2;
- la = a;
- lb = b;
- }
- sptr0 = sptr0.offset(sstride as isize);
- sptr1 = sptr1.offset(sstride as isize);
- dptr = dptr.offset(dstride as isize);
- }
- }
- },
- _ => {},
- }
-}
-fn ivi_mc_add(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, mode: u8, w: usize, h: usize) {
- let mut sidx = 0;
- let mut didx = 0;
- match mode {
- 0 => {
- for _ in 0..h {
- for x in 0..w {
- dst[didx + x] += src[sidx + x];
- }
- sidx += sstride;
- didx += dstride;
- }
- },
- 1 => {
- for _ in 0..h {
- for x in 0..w {
- let val = (src[sidx + x] + src[sidx + x + 1]) >> 1;
- dst[didx + x] += val;
- }
- sidx += sstride;
- didx += dstride;
- }
- },
- 2 => {
- for _ in 0..h {
- for x in 0..w {
- let val = (src[sidx + x] + src[sidx + x + sstride]) >> 1;
- dst[didx + x] += val;
- }
- sidx += sstride;
- didx += dstride;
- }
- },
- 3 => {
- for _ in 0..h {
- for x in 0..w {
- let val = (src[sidx + x + 0] + src[sidx + x + sstride + 0] +
- src[sidx + x + 1] + src[sidx + x + sstride + 1]) >> 2;
- dst[didx + x] += val;
- }
- sidx += sstride;
- didx += dstride;
- }
- },
- _ => {},
- }
-}
-pub fn ivi_mc_avg(dst: &mut [i16], dstride: usize,
- src1: &[i16], sstride1: usize, mode1: u8,
- src2: &[i16], sstride2: usize, mode2: u8,
- w: usize, h: usize) {
- let mut tidx = 0;
- let tstride = 8;
- let mut didx = 0;
- let mut tmp: [i16; 64] = [0; 64];
- ivi_mc_add(&mut tmp, tstride, src1, sstride1, mode1, w, h);
- ivi_mc_add(&mut tmp, tstride, src2, sstride2, mode2, w, h);
- for _ in 0..h {
- for x in 0..w { dst[didx + x] = tmp[tidx + x] >> 1; }
- tidx += tstride;
- didx += dstride;
- }
-}
diff --git a/src/codecs/indeo/mod.rs b/src/codecs/indeo/mod.rs
deleted file mode 100644
index e1fcdcd..0000000
--- a/src/codecs/indeo/mod.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-#[cfg(feature="decoder_indeo2")]
-pub mod indeo2;
-#[cfg(feature="decoder_indeo3")]
-pub mod indeo3;
-#[cfg(feature="decoder_indeo4")]
-pub mod indeo4;
-#[cfg(feature="decoder_indeo5")]
-pub mod indeo5;
-
-#[cfg(any(feature="decoder_indeo4", feature="decoder_indeo5"))]
-mod ivi;
-#[cfg(any(feature="decoder_indeo4", feature="decoder_indeo5"))]
-mod ivibr;
-#[cfg(any(feature="decoder_indeo4", feature="decoder_indeo5"))]
-mod ividsp;
-
-#[cfg(feature="decoder_imc")]
-pub mod imc;
diff --git a/src/codecs/mod.rs b/src/codecs/mod.rs
deleted file mode 100644
index 92aba8e..0000000
--- a/src/codecs/mod.rs
+++ /dev/null
@@ -1,324 +0,0 @@
-use std::fmt;
-use std::ops::{Add, AddAssign, Sub, SubAssign};
-
-use crate::frame::*;
-use std::rc::Rc;
-use std::cell::RefCell;
-use std::mem;
-use crate::io::byteio::ByteIOError;
-use crate::io::bitreader::BitReaderError;
-use crate::io::codebook::CodebookError;
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-#[allow(dead_code)]
-pub enum DecoderError {
- NoFrame,
- AllocError,
- TryAgain,
- InvalidData,
- ShortData,
- MissingReference,
- NotImplemented,
- Bug,
-}
-
-pub type DecoderResult<T> = Result<T, DecoderError>;
-
-impl From<ByteIOError> for DecoderError {
- fn from(_: ByteIOError) -> Self { DecoderError::ShortData }
-}
-
-impl From<BitReaderError> for DecoderError {
- fn from(e: BitReaderError) -> Self {
- match e {
- BitReaderError::BitstreamEnd => DecoderError::ShortData,
- _ => DecoderError::InvalidData,
- }
- }
-}
-
-impl From<CodebookError> for DecoderError {
- fn from(_: CodebookError) -> Self { DecoderError::InvalidData }
-}
-
-impl From<AllocatorError> for DecoderError {
- fn from(_: AllocatorError) -> Self { DecoderError::AllocError }
-}
-
-macro_rules! validate {
- ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DecoderError::InvalidData); } };
-}
-
-#[allow(dead_code)]
-struct HAMShuffler {
- lastframe: Option<NAVideoBuffer<u8>>,
-}
-
-impl HAMShuffler {
- #[allow(dead_code)]
- fn new() -> Self { HAMShuffler { lastframe: None } }
- #[allow(dead_code)]
- fn clear(&mut self) { self.lastframe = None; }
- #[allow(dead_code)]
- fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
- self.lastframe = Some(buf);
- }
- #[allow(dead_code)]
- fn clone_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
- if let Some(ref mut frm) = self.lastframe {
- let newfrm = frm.copy_buffer();
- *frm = newfrm.clone();
- Some(newfrm)
- } else {
- None
- }
- }
- #[allow(dead_code)]
- fn get_output_frame(&mut self) -> Option<NAVideoBuffer<u8>> {
- match self.lastframe {
- Some(ref frm) => Some(frm.clone()),
- None => None,
- }
- }
-}
-
-#[allow(dead_code)]
-struct IPShuffler {
- lastframe: Option<NAVideoBuffer<u8>>,
-}
-
-impl IPShuffler {
- #[allow(dead_code)]
- fn new() -> Self { IPShuffler { lastframe: None } }
- #[allow(dead_code)]
- fn clear(&mut self) { self.lastframe = None; }
- #[allow(dead_code)]
- fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
- self.lastframe = Some(buf);
- }
- #[allow(dead_code)]
- fn get_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
- if let Some(ref frm) = self.lastframe {
- Some(frm.clone())
- } else {
- None
- }
- }
-}
-
-#[allow(dead_code)]
-struct IPBShuffler {
- lastframe: Option<NAVideoBuffer<u8>>,
- nextframe: Option<NAVideoBuffer<u8>>,
-}
-
-impl IPBShuffler {
- #[allow(dead_code)]
- fn new() -> Self { IPBShuffler { lastframe: None, nextframe: None } }
- #[allow(dead_code)]
- fn clear(&mut self) { self.lastframe = None; self.nextframe = None; }
- #[allow(dead_code)]
- fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
- mem::swap(&mut self.lastframe, &mut self.nextframe);
- self.lastframe = Some(buf);
- }
- #[allow(dead_code)]
- fn get_lastref(&mut self) -> Option<NAVideoBuffer<u8>> {
- if let Some(ref frm) = self.lastframe {
- Some(frm.clone())
- } else {
- None
- }
- }
- #[allow(dead_code)]
- fn get_nextref(&mut self) -> Option<NAVideoBuffer<u8>> {
- if let Some(ref frm) = self.nextframe {
- Some(frm.clone())
- } else {
- None
- }
- }
- #[allow(dead_code)]
- fn get_b_fwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
- if let Some(ref frm) = self.nextframe {
- Some(frm.clone())
- } else {
- None
- }
- }
- #[allow(dead_code)]
- fn get_b_bwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
- if let Some(ref frm) = self.lastframe {
- Some(frm.clone())
- } else {
- None
- }
- }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub struct MV {
- pub x: i16,
- pub y: i16,
-}
-
-impl MV {
- pub fn new(x: i16, y: i16) -> Self { MV{ x: x, y: y } }
- pub fn pred(a: MV, b: MV, c: MV) -> Self {
- let x;
- if a.x < b.x {
- if b.x < c.x {
- x = b.x;
- } else {
- if a.x < c.x { x = c.x; } else { x = a.x; }
- }
- } else {
- if b.x < c.x {
- if a.x < c.x { x = a.x; } else { x = c.x; }
- } else {
- x = b.x;
- }
- }
- let y;
- if a.y < b.y {
- if b.y < c.y {
- y = b.y;
- } else {
- if a.y < c.y { y = c.y; } else { y = a.y; }
- }
- } else {
- if b.y < c.y {
- if a.y < c.y { y = a.y; } else { y = c.y; }
- } else {
- y = b.y;
- }
- }
- MV { x: x, y: y }
- }
-}
-
-pub const ZERO_MV: MV = MV { x: 0, y: 0 };
-
-impl Add for MV {
- type Output = MV;
- fn add(self, other: MV) -> MV { MV { x: self.x + other.x, y: self.y + other.y } }
-}
-
-impl AddAssign for MV {
- fn add_assign(&mut self, other: MV) { self.x += other.x; self.y += other.y; }
-}
-
-impl Sub for MV {
- type Output = MV;
- fn sub(self, other: MV) -> MV { MV { x: self.x - other.x, y: self.y - other.y } }
-}
-
-impl SubAssign for MV {
- fn sub_assign(&mut self, other: MV) { self.x -= other.x; self.y -= other.y; }
-}
-
-impl fmt::Display for MV {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{},{}", self.x, self.y)
- }
-}
-
-
-pub trait NADecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()>;
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef>;
-}
-
-#[derive(Clone,Copy)]
-pub struct DecoderInfo {
- name: &'static str,
- get_decoder: fn () -> Box<NADecoder>,
-}
-
-#[cfg(any(feature="h263", feature="decoder_realvideo3", feature="decoder_realvideo4"))]
-mod blockdsp;
-
-#[cfg(feature="decoder_clearvideo")]
-mod clearvideo;
-#[cfg(feature="decoder_gdvvid")]
-mod gremlinvideo;
-#[cfg(any(feature="decoder_indeo2", feature="decoder_indeo3", feature="decoder_indeo4", feature="decoder_indeo5", feature="decoder_imc"))]
-mod indeo;
-#[cfg(feature="h263")]
-mod h263;
-#[cfg(any(feature="decoder_realvideo3", feature="decoder_realvideo4", feature="decoder_realvideo6", feature="decoder_realaudio144", feature="decoder_realaudio288", feature="decoder_cook", feature="decoder_ralf"))]
-mod real;
-
-#[cfg(feature="decoder_aac")]
-mod aac;
-#[cfg(feature="decoder_atrac3")]
-mod atrac3;
-#[cfg(feature="decoder_pcm")]
-mod pcm;
-#[cfg(feature="decoder_sipro")]
-mod sipro;
-#[cfg(feature="decoder_ts102366")]
-mod ts102366;
-
-const DECODERS: &[DecoderInfo] = &[
-#[cfg(feature="decoder_clearvideo")]
- DecoderInfo { name: "clearvideo", get_decoder: clearvideo::get_decoder },
-#[cfg(feature="decoder_clearvideo")]
- DecoderInfo { name: "clearvideo_rm", get_decoder: clearvideo::get_decoder_rm },
-#[cfg(feature="decoder_gdvvid")]
- DecoderInfo { name: "gdv-audio", get_decoder: gremlinvideo::get_decoder_audio },
-#[cfg(feature="decoder_gdvvid")]
- DecoderInfo { name: "gdv-video", get_decoder: gremlinvideo::get_decoder_video },
-#[cfg(feature="decoder_indeo2")]
- DecoderInfo { name: "indeo2", get_decoder: indeo::indeo2::get_decoder },
-#[cfg(feature="decoder_indeo3")]
- DecoderInfo { name: "indeo3", get_decoder: indeo::indeo3::get_decoder },
-#[cfg(feature="decoder_indeo4")]
- DecoderInfo { name: "indeo4", get_decoder: indeo::indeo4::get_decoder },
-#[cfg(feature="decoder_indeo5")]
- DecoderInfo { name: "indeo5", get_decoder: indeo::indeo5::get_decoder },
-#[cfg(feature="decoder_intel263")]
- DecoderInfo { name: "intel263", get_decoder: h263::intel263::get_decoder },
-#[cfg(feature="decoder_realvideo1")]
- DecoderInfo { name: "realvideo1", get_decoder: h263::rv10::get_decoder },
-#[cfg(feature="decoder_realvideo2")]
- DecoderInfo { name: "realvideo2", get_decoder: h263::rv20::get_decoder },
-#[cfg(feature="decoder_realvideo3")]
- DecoderInfo { name: "realvideo3", get_decoder: real::rv30::get_decoder },
-#[cfg(feature="decoder_realvideo4")]
- DecoderInfo { name: "realvideo4", get_decoder: real::rv40::get_decoder },
-#[cfg(feature="decoder_realvideo6")]
- DecoderInfo { name: "realvideo6", get_decoder: real::rv60::get_decoder },
-
-#[cfg(feature="decoder_pcm")]
- DecoderInfo { name: "pcm", get_decoder: pcm::get_decoder },
-#[cfg(feature="decoder_imc")]
- DecoderInfo { name: "imc", get_decoder: indeo::imc::get_decoder_imc },
-#[cfg(feature="decoder_imc")]
- DecoderInfo { name: "iac", get_decoder: indeo::imc::get_decoder_iac },
-#[cfg(feature="decoder_realaudio144")]
- DecoderInfo { name: "ra14.4", get_decoder: real::ra144::get_decoder },
-#[cfg(feature="decoder_realaudio288")]
- DecoderInfo { name: "ra28.8", get_decoder: real::ra288::get_decoder },
-#[cfg(feature="decoder_sipro")]
- DecoderInfo { name: "sipro", get_decoder: sipro::get_decoder },
-#[cfg(feature="decoder_ts102366")]
- DecoderInfo { name: "ac3", get_decoder: ts102366::get_decoder },
-#[cfg(feature="decoder_cook")]
- DecoderInfo { name: "cook", get_decoder: real::cook::get_decoder },
-#[cfg(feature="decoder_atrac3")]
- DecoderInfo { name: "atrac3", get_decoder: atrac3::get_decoder },
-#[cfg(feature="decoder_aac")]
- DecoderInfo { name: "aac", get_decoder: aac::get_decoder },
-#[cfg(feature="decoder_ralf")]
- DecoderInfo { name: "ralf", get_decoder: real::ralf::get_decoder },
-];
-
-pub fn find_decoder(name: &str) -> Option<fn () -> Box<NADecoder>> {
- for &dec in DECODERS {
- if dec.name == name {
- return Some(dec.get_decoder);
- }
- }
- None
-}
diff --git a/src/codecs/pcm.rs b/src/codecs/pcm.rs
deleted file mode 100644
index 2a0e510..0000000
--- a/src/codecs/pcm.rs
+++ /dev/null
@@ -1,65 +0,0 @@
-use crate::formats::*;
-use super::*;
-
-struct PCMDecoder { chmap: NAChannelMap }
-
-impl PCMDecoder {
- fn new() -> Self {
- PCMDecoder { chmap: NAChannelMap::new() }
- }
-}
-
-const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
-const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R];
-
-fn get_default_chmap(nch: u8) -> NAChannelMap {
- let mut chmap = NAChannelMap::new();
- match nch {
- 1 => chmap.add_channels(&CHMAP_MONO),
- 2 => chmap.add_channels(&CHMAP_STEREO),
- _ => (),
- }
- chmap
-}
-
-fn get_duration(ainfo: &NAAudioInfo, duration: Option<u64>, data_size: usize) -> u64 {
- if duration == None {
- let size_bits = (data_size as u64) * 8;
- let blk_size = (ainfo.get_channels() as u64) * (ainfo.get_format().get_bits() as u64);
- size_bits / blk_size
- } else {
- duration.unwrap() as u64
- }
-}
-
-impl NADecoder for PCMDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- self.chmap = get_default_chmap(ainfo.get_channels());
- if self.chmap.num_channels() == 0 { return Err(DecoderError::InvalidData); }
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- let duration = get_duration(&ainfo, pkt.get_duration(), pkt.get_buffer().len());
- let pktbuf = pkt.get_buffer();
- let mut buf: Vec<u8> = Vec::with_capacity(pktbuf.len());
- buf.clone_from(&pktbuf);
- let abuf = NAAudioBuffer::new_from_buf(ainfo, Rc::new(RefCell::new(buf)), self.chmap.clone());
- let mut frm = NAFrame::new_from_pkt(pkt, info, NABufferType::AudioPacked(abuf));
- frm.set_duration(Some(duration));
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- } else {
- Err(DecoderError::InvalidData)
- }
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(PCMDecoder::new())
-}
diff --git a/src/codecs/real/cook.rs b/src/codecs/real/cook.rs
deleted file mode 100644
index 2fcff98..0000000
--- a/src/codecs/real/cook.rs
+++ /dev/null
@@ -1,1125 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use super::super::*;
-use crate::dsp::fft::FFTMode;
-use crate::dsp::mdct::IMDCT;
-use crate::io::bitreader::*;
-use crate::io::byteio::{ByteReader, MemoryReader};
-use crate::io::codebook::*;
-use crate::io::intcode::*;
-use std::f32::consts;
-use std::mem::swap;
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-enum Mode {
- Mono,
- Stereo,
- JointStereo,
-}
-
-impl Mode {
- fn get_channels(&self) -> usize {
- match *self {
- Mode::Mono => 1,
- _ => 2,
- }
- }
-}
-
-struct CookBookReader {
- bits: &'static [u8],
- codes: &'static [u16],
-}
-impl CodebookDescReader<u16> for CookBookReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> u16 { idx as u16 }
- fn len(&mut self) -> usize { self.bits.len() }
-}
-
-struct Codebooks {
- cpl_cb: [Codebook<u16>; 5],
- quant_cb: Vec<Codebook<u16>>,
- vq_cb: [Codebook<u16>; 7],
-}
-
-impl Codebooks {
- fn new() -> Self {
- let mut cpl0 = CookBookReader { codes: COOK_CPL_2BITS_CODES, bits: COOK_CPL_2BITS_BITS };
- let mut cpl1 = CookBookReader { codes: COOK_CPL_3BITS_CODES, bits: COOK_CPL_3BITS_BITS };
- let mut cpl2 = CookBookReader { codes: COOK_CPL_4BITS_CODES, bits: COOK_CPL_4BITS_BITS };
- let mut cpl3 = CookBookReader { codes: COOK_CPL_5BITS_CODES, bits: COOK_CPL_5BITS_BITS };
- let mut cpl4 = CookBookReader { codes: COOK_CPL_6BITS_CODES, bits: COOK_CPL_6BITS_BITS };
- let cpl_cb = [Codebook::new(&mut cpl0, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cpl1, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cpl2, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cpl3, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut cpl4, CodebookMode::MSB).unwrap()];
- let mut quant_cb: Vec<Codebook<u16>> = Vec::with_capacity(COOK_QUANT_CODES.len());
- for i in 0..COOK_QUANT_CODES.len() {
- let mut quant = CookBookReader { codes: COOK_QUANT_CODES[i], bits: COOK_QUANT_BITS[i] };
- quant_cb.push(Codebook::new(&mut quant, CodebookMode::MSB).unwrap());
- }
- let mut vq0 = CookBookReader { codes: COOK_VQ0_CODES, bits: COOK_VQ0_BITS };
- let mut vq1 = CookBookReader { codes: COOK_VQ1_CODES, bits: COOK_VQ1_BITS };
- let mut vq2 = CookBookReader { codes: COOK_VQ2_CODES, bits: COOK_VQ2_BITS };
- let mut vq3 = CookBookReader { codes: COOK_VQ3_CODES, bits: COOK_VQ3_BITS };
- let mut vq4 = CookBookReader { codes: COOK_VQ4_CODES, bits: COOK_VQ4_BITS };
- let mut vq5 = CookBookReader { codes: COOK_VQ5_CODES, bits: COOK_VQ5_BITS };
- let mut vq6 = CookBookReader { codes: COOK_VQ6_CODES, bits: COOK_VQ6_BITS };
- let vq_cb = [Codebook::new(&mut vq0, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut vq1, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut vq2, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut vq3, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut vq4, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut vq5, CodebookMode::MSB).unwrap(),
- Codebook::new(&mut vq6, CodebookMode::MSB).unwrap()];
- Codebooks {
- cpl_cb: cpl_cb,
- quant_cb: quant_cb,
- vq_cb: vq_cb,
- }
- }
-}
-
-struct CookDSP {
- imdct: IMDCT,
- window: [f32; 1024],
- out: [f32; 2048],
- size: usize,
- pow_tab: [f32; 128],
- hpow_tab: [f32; 128],
- gain_tab: [f32; 23],
-}
-
-impl CookDSP {
- fn new(samples: usize) -> Self {
- let fsamples = samples as f32;
- let mut window: [f32; 1024] = [0.0; 1024];
- let factor = consts::PI / (2.0 * fsamples);
- let scale = (2.0 / fsamples).sqrt() / 32768.0;
- for k in 0..samples {
- window[k] = (factor * ((k as f32) + 0.5)).sin() * scale;
- }
- let mut pow_tab: [f32; 128] = [0.0; 128];
- let mut hpow_tab: [f32; 128] = [0.0; 128];
- for i in 0..128 {
- pow_tab[i] = 2.0f32.powf((i as f32) - 64.0);
- hpow_tab[i] = 2.0f32.powf(((i as f32) - 64.0) * 0.5);
- }
- let mut gain_tab: [f32; 23] = [0.0; 23];
- for i in 0..23 {
- gain_tab[i] = pow_tab[i + 53].powf(8.0 / fsamples);
- }
- let size = samples;
- CookDSP { imdct: IMDCT::new(FFTMode::SplitRadix, samples*2, false), window: window, out: [0.0; 2048], size, pow_tab, hpow_tab, gain_tab }
- }
-}
-
-trait ClipCat {
- fn clip_cat(&self) -> usize;
-}
-
-impl ClipCat for i32 {
- fn clip_cat(&self) -> usize { ((*self).max(0) as usize).min(NUM_CATEGORIES - 1) }
-}
-
-const BAND_SIZE: usize = 20;
-const MAX_SAMPLES: usize = MAX_SUBBANDS * BAND_SIZE;
-const MAX_PAIRS: usize = 5;
-const MAX_SUBBANDS: usize = 52;
-const NUM_CATEGORIES: usize = 8;
-
-#[derive(Clone,Copy)]
-struct CookChannelPair {
- start_ch: usize,
- mode: Mode,
- samples: usize,
- subbands: usize,
- js_start: usize,
- js_bits: u8,
- vector_bits: u8,
-
- decouple: [u8; BAND_SIZE],
- category: [u8; MAX_SUBBANDS * 2],
-
- block: [[f32; MAX_SAMPLES * 2]; 2],
- delay: [[f32; MAX_SAMPLES]; 2],
- gains: [[i32; 9]; 2],
- prev_gains: [[i32; 9]; 2],
- qindex: [i8; MAX_SUBBANDS * 2],
-}
-
-impl CookChannelPair {
- fn new() -> Self {
- CookChannelPair {
- start_ch: 0,
- mode: Mode::Mono,
- samples: 0,
- subbands: 0,
- js_start: 0,
- js_bits: 0,
- vector_bits: 0,
-
- decouple: [0; BAND_SIZE],
- category: [0; MAX_SUBBANDS * 2],
-
- block: [[0.0; MAX_SAMPLES * 2]; 2],
- delay: [[0.0; MAX_SAMPLES]; 2],
- gains: [[0; 9]; 2],
- prev_gains: [[0; 9]; 2],
- qindex: [0; MAX_SUBBANDS * 2],
- }
- }
- fn read_hdr_v1(&mut self, br: &mut ByteReader) -> DecoderResult<()> {
- let ver = br.read_u32be()?;
- let micro_ver = ver & 0xFF;
- self.samples = br.read_u16be()? as usize;
- validate!(self.samples > 0 && ((self.samples & (self.samples - 1)) == 0));
- self.subbands = br.read_u16be()? as usize;
- validate!(self.subbands <= MAX_SUBBANDS);
- match micro_ver {
- 1 => {
- self.mode = Mode::Mono;
- self.js_start = 0;
- self.js_bits = 0;
- },
- 2 => {
- self.mode = Mode::Stereo;
- self.js_start = 0;
- self.js_bits = 0;
- },
- 3 => {
- self.mode = Mode::JointStereo;
- let _delay = br.read_u32be()?;
- self.js_start = br.read_u16be()? as usize;
- self.js_bits = br.read_u16be()? as u8;
- validate!(self.js_start < MAX_SUBBANDS);
- validate!((self.js_bits >= 2) && (self.js_bits <= 6));
- },
- _ => { return Err(DecoderError::InvalidData);}
- }
- Ok(())
- }
- fn read_hdr_v2(&mut self, br: &mut ByteReader) -> DecoderResult<u32> {
- let ver = br.read_u32be()?;
- validate!((ver >> 24) == 2);
- self.samples = br.read_u16be()? as usize;
- self.subbands = br.read_u16be()? as usize;
- validate!(self.subbands <= MAX_SUBBANDS);
- let _delay = br.read_u32be()?;
- self.js_start = br.read_u16be()? as usize;
- validate!(self.js_start < MAX_SUBBANDS);
- let js_bits = br.read_u16be()?;
- let chmap = br.read_u32be()?;
- if chmap.count_ones() == 1 {
- self.js_bits = 0;
- self.mode = Mode::Mono;
- } else {
- validate!((js_bits >= 2) && (js_bits <= 6));
- self.js_bits = js_bits as u8;
- self.mode = Mode::JointStereo;
- }
- Ok(chmap)
- }
- fn bitalloc(&mut self, num_vectors: usize, bits: usize) {
- let avail_bits = (if bits > self.samples { self.samples + ((bits - self.samples) * 5) / 8 } else { bits }) as i32;
- let total_subbands = self.subbands + self.js_start;
-
- let mut bias: i32 = -32;
- for i in 0..6 {
- let mut sum = 0;
- for j in 0..total_subbands {
- let idx = ((32 >> i) + bias - (self.qindex[j] as i32)) / 2;
- sum += COOK_EXP_BITS[idx.clip_cat()];
- }
- if sum >= (avail_bits - 32) {
- bias += 32 >> i;
- }
- }
-
- let mut exp_index1: [usize; MAX_SUBBANDS * 2] = [0; MAX_SUBBANDS * 2];
- let mut exp_index2: [usize; MAX_SUBBANDS * 2] = [0; MAX_SUBBANDS * 2];
- let mut sum = 0;
- for i in 0..total_subbands {
- let idx = ((bias - (self.qindex[i] as i32)) / 2).clip_cat();
- sum += COOK_EXP_BITS[idx];
- exp_index1[i] = idx;
- exp_index2[i] = idx;
- }
-
- let mut tbias1 = sum;
- let mut tbias2 = sum;
- let mut tcat: [usize; 128*2] = [0; 128*2];
- let mut tcat_idx1 = 128;
- let mut tcat_idx2 = 128;
- for _ in 1..(1 << self.vector_bits) {
- if tbias1 + tbias2 > avail_bits * 2 {
- let mut max = -999999;
- let mut idx = total_subbands + 1;
- for j in 0..total_subbands {
- if exp_index1[j] >= (NUM_CATEGORIES - 1) { continue; }
- let t = -2 * (exp_index1[j] as i32) - (self.qindex[j] as i32) + bias;
- if t >= max {
- max = t;
- idx = j;
- }
- }
- if idx >= total_subbands { break; }
- tcat[tcat_idx1] = idx;
- tcat_idx1 += 1;
- tbias1 -= COOK_EXP_BITS[exp_index1[idx]] - COOK_EXP_BITS[exp_index1[idx] + 1];
- exp_index1[idx] += 1;
- } else {
- let mut min = 999999;
- let mut idx = total_subbands + 1;
- for j in 0..total_subbands {
- if exp_index2[j] == 0 { continue; }
- let t = -2 * (exp_index2[j] as i32) - (self.qindex[j] as i32) + bias;
- if t < min {
- min = t;
- idx = j;
- }
- }
- if idx >= total_subbands { break; }
- tcat_idx2 -= 1;
- tcat[tcat_idx2] = idx;
- tbias2 -= COOK_EXP_BITS[exp_index2[idx]] - COOK_EXP_BITS[exp_index2[idx] - 1];
- exp_index2[idx] -= 1;
- }
- }
- for i in 0..total_subbands {
- self.category[i] = exp_index2[i] as u8;
- }
-
- for _ in 0..num_vectors {
- let idx = tcat[tcat_idx2];
- tcat_idx2 += 1;
- self.category[idx] = (self.category[idx] + 1).min((NUM_CATEGORIES - 1) as u8) as u8;
- }
- }
- fn decode_channel_data(&mut self, dsp: &mut CookDSP, rnd: &mut RND, codebooks: &Codebooks, src: &[u8], buf: &mut [u8], channel: usize) -> DecoderResult<()> {
- // decrypt
- for (i, b) in src.iter().enumerate() {
- buf[i] = b ^ COOK_XOR_KEY[i & 3];
- }
- let mut br = BitReader::new(buf, src.len(), BitReaderMode::BE);
-
- let num_gains = br.read_code(UintCodeType::UnaryOnes)? as usize;
- validate!(num_gains <= 8);
-
- swap(&mut self.gains[channel], &mut self.prev_gains[channel]);
- self.block[channel] = [0.0; MAX_SAMPLES * 2];
-
- // gains
- let mut ipos = 0;
- for _ in 0..num_gains {
- let idx = br.read(3)? as usize;
- let val;
- if br.read_bool()? {
- val = (br.read(4)? as i32) - 7;
- } else {
- val = -1;
- }
- validate!(idx >= ipos);
- while ipos <= idx {
- self.prev_gains[channel][ipos] = val;
- ipos += 1;
- }
- }
- while ipos <= 8 {
- self.prev_gains[channel][ipos] = 0;
- ipos += 1;
- }
-
- // coupling information
- if self.mode == Mode::JointStereo {
- let cstart = COOK_CPL_BAND[self.js_start] as usize;
- let cend = COOK_CPL_BAND[self.subbands - 1] as usize;
- if br.read_bool()? {
- let cb = &codebooks.cpl_cb[(self.js_bits - 2) as usize];
- for i in cstart..cend+1 {
- self.decouple[i] = br.read_cb(cb)? as u8;
- }
- } else {
- for i in cstart..cend+1 {
- self.decouple[i] = br.read(self.js_bits)? as u8;
- }
- }
- }
-
- // envelope
- let tot_subbands = self.subbands + self.js_start;
- self.qindex[0] = (br.read(6)? as i8) - 6;
- for i in 1..tot_subbands {
- let mut pos = i;
- if pos >= self.js_start * 2 {
- pos -= self.js_start;
- } else {
- pos >>= 1;
- }
- let ipos = ((pos as i8) - 1).max(0).min(12);
- let cb = &codebooks.quant_cb[ipos as usize];
- self.qindex[i] = (br.read_cb(cb)? as i8) + self.qindex[i - 1] - 12;
- validate!((self.qindex[i] >= -63) && (self.qindex[i] <= 63));
- }
- let num_vectors = br.read(self.vector_bits)? as usize;
- self.bitalloc(num_vectors, br.left() as usize);
-
- // coefficients
- self.block[channel] = [0.0; MAX_SAMPLES * 2];
- let mut off = 0;
- for sb in 0..tot_subbands {
- let mut coef_index: [u8; BAND_SIZE] = [0; BAND_SIZE];
- let mut coef_sign: [bool; BAND_SIZE] = [false; BAND_SIZE];
- let cat = self.category[sb] as usize;
- if (cat < NUM_CATEGORIES - 1) && br.left() > 0 {
- unpack_band(&mut br, codebooks, &mut coef_index, &mut coef_sign, cat)?;
- }
- for i in 0..BAND_SIZE {
- let val;
- if coef_index[i] == 0 {
- let v = COOK_DITHER_TAB[cat];
- val = if !rnd.get_sign() { v } else { -v };
- } else {
- let v = COOK_QUANT_CENTROID[cat][coef_index[i] as usize];
- val = if !coef_sign[i] { v } else { -v };
- }
- self.block[channel][off + i] = val * dsp.hpow_tab[(self.qindex[sb] + 64) as usize];
- }
- off += BAND_SIZE;
- }
-
- Ok(())
- }
- fn decode(&mut self, dsp: &mut CookDSP, rnd: &mut RND, codebooks: &Codebooks, src: &[u8], buf: &mut [u8], abuf: &mut NABufferType) -> DecoderResult<()> {
- if self.mode == Mode::Stereo {
- let mut schunk = src.chunks(src.len() / 2);
- self.decode_channel_data(dsp, rnd, codebooks, schunk.next().unwrap(), buf, 0)?;
- self.decode_channel_data(dsp, rnd, codebooks, schunk.next().unwrap(), buf, 1)?;
- } else {
- self.decode_channel_data(dsp, rnd, codebooks, src, buf, 0)?;
- }
- // uncouple joint stereo channels
- if self.mode == Mode::JointStereo {
- for i in 0..self.js_start {
- for j in 0..BAND_SIZE {
- self.block[1][i * BAND_SIZE + j] = self.block[0][(i * 2 + 1) * BAND_SIZE + j];
- self.block[0][i * BAND_SIZE + j] = self.block[0][(i * 2) * BAND_SIZE + j];
- }
- }
- let scale_idx = (self.js_bits as usize) - 2;
- let scale_off = (1 << self.js_bits) as usize;
- for i in self.js_start..self.subbands {
- let idx = self.decouple[COOK_CPL_BAND[i] as usize] as usize;
- let doff = i * BAND_SIZE;
- let soff = (i + self.js_start) * BAND_SIZE;
- let m1 = COOK_CPL_SCALES[scale_idx][ 1 + idx];
- let m2 = COOK_CPL_SCALES[scale_idx][scale_off - 1 - idx];
- for j in 0..BAND_SIZE {
- self.block[0][doff + j] = self.block[0][soff + j] * m1;
- self.block[1][doff + j] = self.block[0][soff + j] * m2;
- }
- }
- for i in (self.subbands * BAND_SIZE)..MAX_SAMPLES {
- self.block[0][i] = 0.0;
- self.block[1][i] = 0.0;
- }
- self.gains[1] = self.gains[0];
- self.prev_gains[1] = self.prev_gains[0];
- }
- for ch in 0..self.mode.get_channels() {
- let off = abuf.get_offset(ch + self.start_ch);
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut output = adata.get_data_mut();
- let dst = &mut output[off..];
-
- dsp.imdct.imdct(&self.block[ch], &mut dsp.out);
-
- let prev_gain = dsp.pow_tab[(self.prev_gains[ch][0] + 64) as usize];
- let mut cur_gain = 0.0;
- let mut cur_gain2 = 0.0;
- let mut gain_idx = 0;
- let eighthmask = (self.samples >> 3) - 1;
- for (i, out) in dst.iter_mut().take(self.samples).enumerate() {
- *out = dsp.out[i + self.samples] * prev_gain * dsp.window[i]
- - self.delay[ch][i] * dsp.window[self.samples - i - 1];
- if (i & eighthmask) == 0 {
- if (self.gains[ch][gain_idx] == 0) && (self.gains[ch][gain_idx + 1] == 0) {
- cur_gain = 1.0;
- cur_gain2 = 1.0;
- } else {
- cur_gain = dsp.pow_tab[(self.gains[ch][gain_idx] + 64) as usize];
- cur_gain2 = dsp.gain_tab[(self.gains[ch][gain_idx + 1] - self.gains[ch][gain_idx] + 11) as usize];
- }
- gain_idx += 1;
- }
- *out *= cur_gain;
- cur_gain *= cur_gain2;
- }
- for i in 0..self.samples { self.delay[ch][i] = dsp.out[i]; }
- }
- Ok(())
- }
-}
-
-const COOK_VQ_GROUP_SIZE: [usize; 7] = [ 2, 2, 2, 4, 4, 5, 5 ];
-const COOK_NUM_VQ_GROUPS: [usize; 7] = [ 10, 10, 10, 5, 5, 4, 4 ];
-const COOK_VQ_INV_RADIX: [u32; 7] = [ 74899, 104858, 149797, 209716, 262144, 349526, 524288 ];
-const COOK_VQ_MULT: [u32; 7] = [ 13, 9, 6, 4, 3, 2, 1 ];
-fn unpack_band(br: &mut BitReader, codebooks: &Codebooks, coef_index: &mut [u8; BAND_SIZE], coef_sign: &mut [bool; BAND_SIZE], cat: usize) -> DecoderResult<()> {
- let cb = &codebooks.vq_cb[cat];
- let group_size = COOK_VQ_GROUP_SIZE[cat];
- let mult = COOK_VQ_MULT[cat] + 1;
- for i in 0..COOK_NUM_VQ_GROUPS[cat] {
- let ret = br.read_cb(cb);
- let mut val;
- if let Ok(v) = ret {
- val = v as u32;
- } else {
- let left = br.left() as u32;
- br.skip(left)?;
- break;
- }
- let mut nnz = 0;
- for j in (0..group_size).rev() {
- let t = (val * COOK_VQ_INV_RADIX[cat]) >> 20;
- coef_index[i * group_size + j] = (val - t * mult) as u8;
- if coef_index[i * group_size + j] != 0 {
- nnz += 1;
- }
- val = t;
- }
- if (br.left() as usize) < nnz {
- let left = br.left() as u32;
- br.skip(left)?;
- break;
- }
- for j in 0..group_size {
- if coef_index[i * group_size + j] != 0 {
- coef_sign[i * group_size + j] = br.read_bool()?;
- } else {
- coef_sign[i * group_size + j] = false;
- }
- }
- }
- Ok(())
-}
-
-struct RND {
- state: u32,
-}
-
-impl RND {
- fn new() -> Self {
- Self { state: 0xC0DECC00 }
- }
- fn get_sign(&mut self) -> bool {
- self.state = (self.state & 0xFFFF).wrapping_mul(36969).wrapping_add(self.state >> 16);
- (self.state & 0x10000) != 0
- }
-}
-
-struct CookDecoder {
- info: Rc<NACodecInfo>,
- chmap: NAChannelMap,
- src: [u8; 65536],
- num_pairs: usize,
- pairs: [CookChannelPair; MAX_PAIRS],
- channels: usize,
- samples: usize,
- codebooks: Codebooks,
- rnd: RND,
- dsp: CookDSP,
-}
-
-impl CookDecoder {
- fn new() -> Self {
- CookDecoder {
- info: NACodecInfo::new_dummy(),
- chmap: NAChannelMap::new(),
- src: [0; 65536],
- num_pairs: 0,
- channels: 0,
- samples: 0,
- pairs: [CookChannelPair::new(); MAX_PAIRS],
- codebooks: Codebooks::new(),
- rnd: RND::new(),
- dsp: CookDSP::new(1024),
- }
- }
-}
-
-impl NADecoder for CookDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- let edata = info.get_extradata().unwrap();
- validate!(edata.len() >= 4);
-
- let mut mr = MemoryReader::new_read(&edata);
- let mut br = ByteReader::new(&mut mr);
- let ver = br.peek_u32be()?;
-
- let maj_ver = ver >> 24;
- let mut chmap: u32 = 0;
- match maj_ver {
- 1 => {
- self.num_pairs = 1;
- self.pairs[0].read_hdr_v1(&mut br)?;
- self.channels = self.pairs[0].mode.get_channels();
- if ainfo.get_channels() == 1 { // forced mono
- self.pairs[0].mode = Mode::Mono;
- self.channels = 1;
- chmap = 0x4;
- } else {
- chmap = 0x3;
- }
- },
- 2 => {
- self.num_pairs = (edata.len() - (br.tell() as usize)) / 20;
- validate!(self.num_pairs <= MAX_PAIRS);
- let mut start_ch = 0;
- for i in 0..self.num_pairs {
- let pair_chmap = self.pairs[i].read_hdr_v2(&mut br)?;
- self.pairs[i].start_ch = start_ch;
- validate!((chmap & pair_chmap) == 0);
- start_ch += self.pairs[i].mode.get_channels();
- }
- self.channels = start_ch;
- },
- _ => { return Err(DecoderError::InvalidData); }
- };
-
- self.samples = self.pairs[0].samples / self.pairs[0].mode.get_channels();
- validate!((self.samples >= 16) && (self.samples <= 1024));
- if self.samples != self.dsp.size {
- self.dsp = CookDSP::new(self.samples);
- }
- self.chmap = NAChannelMap::from_ms_mapping(chmap);
-
- for i in 1..self.num_pairs {
- validate!((self.pairs[i].samples / self.pairs[i].mode.get_channels()) == self.samples);
- }
-
- let vector_bits = match self.samples {
- 16 | 32 | 64 | 128 | 256 => 5,
- 512 => 6,
- 1024 => 7,
- _ => unreachable!(),
- };
- for pair in self.pairs.iter_mut() {
- match pair.mode {
- Mode::Mono => {
- pair.vector_bits = 5;
- },
- Mode::Stereo => {
- pair.vector_bits = 5;
- pair.samples >>= 1;
- },
- Mode::JointStereo => {
- pair.vector_bits = vector_bits;
- pair.samples >>= 1;
- },
- };
- }
-
- let ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), self.channels as u8,
- SND_F32P_FORMAT, self.samples);
- self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo));
-
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- validate!(pktbuf.len() > self.num_pairs * 2);
-
- let mut seg_size: [usize; MAX_PAIRS] = [0; MAX_PAIRS];
- let mut seg_start: [usize; MAX_PAIRS+1] = [0; MAX_PAIRS+1];
-
- let ainfo = self.info.get_properties().get_audio_info().unwrap();
-
- seg_size[0] = pktbuf.len() - (self.num_pairs - 1);
- for i in 1..self.num_pairs {
- seg_size[i] = (pktbuf[pktbuf.len() - self.num_pairs + i] as usize) * 2;
- validate!(seg_size[i] != 0);
- let ret = seg_size[0].checked_sub(seg_size[i]);
- if let Some(val) = ret {
- seg_size[0] = val;
- } else {
- return Err(DecoderError::InvalidData);
- }
- }
- validate!(seg_size[0] != 0);
- seg_start[0] = 0;
- for i in 0..self.num_pairs {
- seg_start[i + 1] = seg_start[i] + seg_size[i];
- }
-
- let mut abuf = alloc_audio_buffer(ainfo, self.samples, self.chmap.clone())?;
-
- for pair in 0..self.num_pairs {
- self.pairs[pair].decode(&mut self.dsp, &mut self.rnd, &self.codebooks, &pktbuf[seg_start[pair]..seg_start[pair + 1]], &mut self.src, &mut abuf)?;
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(CookDecoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_cook() {
-// let file = "assets/RV/rv30_weighted_mc.rm";
- let file = "assets/RV/multichannel.rma";
- test_decode_audio("realmedia", file, Some(2000), "cook");
- }
-}
-
-const COOK_XOR_KEY: [u8; 4] = [ 0x37, 0xC5, 0x11, 0xF2 ];
-
-const COOK_CPL_2BITS_BITS: &[u8; 3] = &[ 2, 1, 2 ];
-const COOK_CPL_2BITS_CODES: &[u16; 3] = &[ 0x02, 0x00, 0x03 ];
-const COOK_CPL_3BITS_BITS: &[u8; 7] = &[ 6, 5, 2, 1, 3, 4, 6 ];
-const COOK_CPL_3BITS_CODES: &[u16; 7] = &[ 0x3e, 0x1e, 0x02, 0x00, 0x06, 0x0e, 0x3f ];
-const COOK_CPL_4BITS_BITS: &[u8; 15] = &[ 8, 8, 7, 6, 5, 4, 3, 1, 3, 4, 5, 6, 7, 8, 8 ];
-const COOK_CPL_4BITS_CODES: &[u16; 15] = &[
- 0xfc, 0xfd, 0x7c, 0x3c, 0x1c, 0x0c, 0x04, 0x00,
- 0x05, 0x0d, 0x1d, 0x3d, 0x7d, 0xfe, 0xff
-];
-const COOK_CPL_5BITS_BITS: &[u8; 31] = &[
- 10, 10, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 3, 1,
- 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 10
-];
-const COOK_CPL_5BITS_CODES: &[u16; 31] = &[
- 0x03F8, 0x03F9, 0x03FA, 0x03FB, 0x01F8, 0x01F9, 0x00F8, 0x00F9,
- 0x0078, 0x0079, 0x0038, 0x0039, 0x0018, 0x0019, 0x0004, 0x0000,
- 0x0005, 0x001A, 0x001B, 0x003A, 0x003B, 0x007A, 0x007B, 0x00FA,
- 0x00FB, 0x01FA, 0x01FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF
-];
-const COOK_CPL_6BITS_BITS: &[u8; 63] = &[
- 16, 15, 14, 13, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9,
- 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 5, 5, 3, 1,
- 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9,
- 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 14, 14, 16
-];
-const COOK_CPL_6BITS_CODES: &[u16; 63] = &[
- 0xFFFE, 0x7FFE, 0x3FFC, 0x1FFC, 0x0FFC, 0x07F6, 0x07F7, 0x07F8,
- 0x07F9, 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x01F0, 0x01F1, 0x01F2,
- 0x01F3, 0x01F4, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x0070, 0x0071,
- 0x0072, 0x0073, 0x0034, 0x0035, 0x0016, 0x0017, 0x0004, 0x0000,
- 0x000A, 0x0018, 0x0019, 0x0036, 0x0037, 0x0074, 0x0075, 0x0076,
- 0x0077, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x01F5, 0x01F6, 0x01F7,
- 0x01F8, 0x03F6, 0x03F7, 0x03F8, 0x03F9, 0x03FA, 0x07FA, 0x07FB,
- 0x07FC, 0x07FD, 0x0FFD, 0x1FFD, 0x3FFD, 0x3FFE, 0xFFFF
-];
-
-const COOK_QUANT_BITS: [&[u8; 24]; 13] = [
- &[ 4, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 5, 7, 8, 9, 11, 11, 12, 12, 12, 12 ],
- &[ 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 7, 9, 11, 12, 13, 15, 15, 15, 16, 16 ],
- &[ 12, 10, 8, 6, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 5, 5, 7, 9, 11, 13, 14, 14 ],
- &[ 13, 10, 9, 9, 7, 7, 5, 5, 4, 3, 3, 3, 3, 3, 4, 4, 4, 5, 7, 9, 11, 13, 13, 13 ],
- &[ 12, 13, 10, 8, 6, 6, 5, 5, 4, 4, 3, 3, 3, 3, 3, 4, 5, 5, 6, 7, 9, 11, 14, 14 ],
- &[ 12, 11, 9, 8, 8, 7, 5, 4, 4, 3, 3, 3, 3, 3, 4, 4, 5, 5, 7, 8, 10, 13, 14, 14 ],
- &[ 15, 16, 15, 12, 10, 8, 6, 5, 4, 3, 3, 3, 2, 3, 4, 5, 5, 7, 9, 11, 13, 16, 16, 16 ],
- &[ 14, 14, 11, 10, 9, 7, 7, 5, 5, 4, 3, 3, 2, 3, 3, 4, 5, 7, 9, 9, 12, 14, 15, 15 ],
- &[ 9, 9, 9, 8, 7, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 13 ],
- &[ 14, 12, 10, 8, 6, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 8, 8, 9, 11, 14, 14, 14 ],
- &[ 13, 10, 9, 8, 6, 6, 5, 4, 4, 4, 3, 3, 2, 3, 4, 5, 6, 8, 9, 9, 11, 12, 14, 14 ],
- &[ 16, 13, 12, 11, 9, 6, 5, 5, 4, 4, 4, 3, 2, 3, 3, 4, 5, 7, 8, 10, 14, 16, 16, 16 ],
- &[ 13, 14, 14, 14, 10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9, 11, 14, 14, 14 ],
-];
-const COOK_QUANT_CODES: [&[u16; 24]; 13] = [
- &[ 0x0006, 0x003e, 0x001c, 0x001d, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x0000, 0x0001,
- 0x0002, 0x000d, 0x001e, 0x007e, 0x00fe, 0x01fe, 0x07fc, 0x07fd, 0x0ffc, 0x0ffd, 0x0ffe, 0x0fff ],
- &[ 0x03fe, 0x00fe, 0x003e, 0x001c, 0x001d, 0x000c, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005,
- 0x000d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x0ffe, 0x1ffe, 0x7ffc, 0x7ffd, 0x7ffe, 0xfffe, 0xffff ],
- &[ 0x0ffe, 0x03fe, 0x00fe, 0x003e, 0x001c, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x0000,
- 0x0001, 0x0002, 0x000c, 0x000d, 0x001d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x1ffe, 0x3ffe, 0x3fff ],
- &[ 0x1ffc, 0x03fe, 0x01fc, 0x01fd, 0x007c, 0x007d, 0x001c, 0x001d, 0x000a, 0x0000, 0x0001, 0x0002,
- 0x0003, 0x0004, 0x000b, 0x000c, 0x000d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x1ffd, 0x1ffe, 0x1fff ],
- &[ 0x0ffe, 0x1ffe, 0x03fe, 0x00fe, 0x003c, 0x003d, 0x001a, 0x001b, 0x000a, 0x000b, 0x0000, 0x0001,
- 0x0002, 0x0003, 0x0004, 0x000c, 0x001c, 0x001d, 0x003e, 0x007e, 0x01fe, 0x07fe, 0x3ffe, 0x3fff ],
- &[ 0x0ffe, 0x07fe, 0x01fe, 0x00fc, 0x00fd, 0x007c, 0x001c, 0x000a, 0x000b, 0x0000, 0x0001, 0x0002,
- 0x0003, 0x0004, 0x000c, 0x000d, 0x001d, 0x001e, 0x007d, 0x00fe, 0x03fe, 0x1ffe, 0x3ffe, 0x3fff ],
- &[ 0x7ffc, 0xfffc, 0x7ffd, 0x0ffe, 0x03fe, 0x00fe, 0x003e, 0x001c, 0x000c, 0x0002, 0x0003, 0x0004,
- 0x0000, 0x0005, 0x000d, 0x001d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x1ffe, 0xfffd, 0xfffe, 0xffff ],
- &[ 0x3ffc, 0x3ffd, 0x07fe, 0x03fe, 0x01fc, 0x007c, 0x007d, 0x001c, 0x001d, 0x000c, 0x0002, 0x0003,
- 0x0000, 0x0004, 0x0005, 0x000d, 0x001e, 0x007e, 0x01fd, 0x01fe, 0x0ffe, 0x3ffe, 0x7ffe, 0x7fff ],
- &[ 0x01fc, 0x01fd, 0x01fe, 0x00fc, 0x007c, 0x003c, 0x001c, 0x000c, 0x0000, 0x0001, 0x0002, 0x0003,
- 0x0004, 0x0005, 0x000d, 0x001d, 0x003d, 0x007d, 0x00fd, 0x03fe, 0x07fe, 0x0ffe, 0x1ffe, 0x1fff ],
- &[ 0x3ffc, 0x0ffe, 0x03fe, 0x00fc, 0x003c, 0x003d, 0x001c, 0x000c, 0x0000, 0x0001, 0x0002, 0x0003,
- 0x0004, 0x0005, 0x000d, 0x001d, 0x003e, 0x00fd, 0x00fe, 0x01fe, 0x07fe, 0x3ffd, 0x3ffe, 0x3fff ],
- &[ 0x1ffe, 0x03fe, 0x01fc, 0x00fc, 0x003c, 0x003d, 0x001c, 0x000a, 0x000b, 0x000c, 0x0002, 0x0003,
- 0x0000, 0x0004, 0x000d, 0x001d, 0x003e, 0x00fd, 0x01fd, 0x01fe, 0x07fe, 0x0ffe, 0x3ffe, 0x3fff ],
- &[ 0xfffc, 0x1ffe, 0x0ffe, 0x07fe, 0x01fe, 0x003e, 0x001c, 0x001d, 0x000a, 0x000b, 0x000c, 0x0002,
- 0x0000, 0x0003, 0x0004, 0x000d, 0x001e, 0x007e, 0x00fe, 0x03fe, 0x3ffe, 0xfffd, 0xfffe, 0xffff ],
- &[ 0x1ffc, 0x3ffa, 0x3ffb, 0x3ffc, 0x03fe, 0x00fe, 0x007c, 0x007d, 0x001c, 0x000c, 0x0002, 0x0003,
- 0x0000, 0x0004, 0x0005, 0x000d, 0x001d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x3ffd, 0x3ffe, 0x3fff ],
-];
-
-const COOK_VQ0_BITS: &[u8; 191] = &[
- 1, 4, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10,
- 11, 11, 4, 5, 6, 7, 7, 8, 8, 9, 9, 9,
- 9, 10, 11, 11, 5, 6, 7, 8, 8, 9, 9, 9,
- 9, 10, 10, 10, 11, 12, 6, 7, 8, 9, 9, 9,
- 9, 10, 10, 10, 10, 11, 12, 13, 7, 7, 8, 9,
- 9, 9, 10, 10, 10, 10, 11, 11, 12, 13, 8, 8,
- 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 13, 14,
- 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13,
- 13, 15, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12,
- 12, 13, 14, 15, 9, 9, 9, 10, 10, 10, 11, 11,
- 12, 13, 12, 14, 15, 16, 9, 9, 10, 10, 10, 10,
- 11, 12, 12, 14, 14, 16, 16, 0, 9, 9, 10, 10,
- 11, 11, 12, 13, 13, 14, 14, 15, 0, 0, 10, 10,
- 10, 11, 11, 12, 12, 13, 15, 15, 16, 0, 0, 0,
- 11, 11, 11, 12, 13, 13, 13, 15, 16, 16, 0, 0,
- 0, 0, 11, 11, 12, 13, 13, 14, 15, 16, 16
-];
-const COOK_VQ0_CODES: &[u16; 191] = &[
- 0x0000, 0x0008, 0x002c, 0x002d, 0x0062, 0x0063, 0x00d4, 0x00d5,
- 0x00d6, 0x01c6, 0x01c7, 0x03ca, 0x07d6, 0x07d7, 0x0009, 0x0014,
- 0x002e, 0x0064, 0x0065, 0x00d7, 0x00d8, 0x01c8, 0x01c9, 0x01ca,
- 0x01cb, 0x03cb, 0x07d8, 0x07d9, 0x0015, 0x002f, 0x0066, 0x00d9,
- 0x00da, 0x01cc, 0x01cd, 0x01ce, 0x01cf, 0x03cc, 0x03cd, 0x03ce,
- 0x07da, 0x0fe4, 0x0030, 0x0067, 0x00db, 0x01d0, 0x01d1, 0x01d2,
- 0x01d3, 0x03cf, 0x03d0, 0x03d1, 0x03d2, 0x07db, 0x0fe5, 0x1fea,
- 0x0068, 0x0069, 0x00dc, 0x01d4, 0x01d5, 0x01d6, 0x03d3, 0x03d4,
- 0x03d5, 0x03d6, 0x07dc, 0x07dd, 0x0fe6, 0x1feb, 0x00dd, 0x00de,
- 0x01d7, 0x01d8, 0x01d9, 0x03d7, 0x03d8, 0x03d9, 0x03da, 0x07de,
- 0x07df, 0x0fe7, 0x1fec, 0x3ff2, 0x00df, 0x00e0, 0x01da, 0x01db,
- 0x03db, 0x03dc, 0x07e0, 0x07e1, 0x07e2, 0x0fe8, 0x0fe9, 0x1fed,
- 0x1fee, 0x7ff4, 0x00e1, 0x00e2, 0x01dc, 0x01dd, 0x03dd, 0x03de,
- 0x07e3, 0x07e4, 0x07e5, 0x0fea, 0x0feb, 0x1fef, 0x3ff3, 0x7ff5,
- 0x01de, 0x01df, 0x01e0, 0x03df, 0x03e0, 0x03e1, 0x07e6, 0x07e7,
- 0x0fec, 0x1ff0, 0x0fed, 0x3ff4, 0x7ff6, 0xfff8, 0x01e1, 0x01e2,
- 0x03e2, 0x03e3, 0x03e4, 0x03e5, 0x07e8, 0x0fee, 0x0fef, 0x3ff5,
- 0x3ff6, 0xfff9, 0xfffa, 0xfffa, 0x01e3, 0x01e4, 0x03e6, 0x03e7,
- 0x07e9, 0x07ea, 0x0ff0, 0x1ff1, 0x1ff2, 0x3ff7, 0x3ff8, 0x7ff7,
- 0x7ff7, 0xfffa, 0x03e8, 0x03e9, 0x03ea, 0x07eb, 0x07ec, 0x0ff1,
- 0x0ff2, 0x1ff3, 0x7ff8, 0x7ff9, 0xfffb, 0x3ff8, 0x7ff7, 0x7ff7,
- 0x07ed, 0x07ee, 0x07ef, 0x0ff3, 0x1ff4, 0x1ff5, 0x1ff6, 0x7ffa,
- 0xfffc, 0xfffd, 0xfffb, 0xfffb, 0x3ff8, 0x7ff7, 0x07f0, 0x07f1,
- 0x0ff4, 0x1ff7, 0x1ff8, 0x3ff9, 0x7ffb, 0xfffe, 0xffff
-];
-const COOK_VQ1_BITS: &[u8; 97] = &[
- 1, 4, 5, 6, 7, 8, 8, 9, 10, 10, 4, 5,
- 6, 7, 7, 8, 8, 9, 9, 11, 5, 5, 6, 7,
- 8, 8, 9, 9, 10, 11, 6, 6, 7, 8, 8, 9,
- 9, 10, 11, 12, 7, 7, 8, 8, 9, 9, 10, 11,
- 11, 13, 8, 8, 8, 9, 9, 10, 10, 11, 12, 14,
- 8, 8, 8, 9, 10, 11, 11, 12, 13, 15, 9, 9,
- 9, 10, 11, 12, 12, 14, 14, 0, 9, 9, 9, 10,
- 11, 12, 14, 16, 0, 0, 10, 10, 11, 12, 13, 14, 16
-];
-const COOK_VQ1_CODES: &[u16; 97] = &[
- 0x0000, 0x0008, 0x0014, 0x0030, 0x006a, 0x00e2, 0x00e3, 0x01e4,
- 0x03ec, 0x03ed, 0x0009, 0x0015, 0x0031, 0x006b, 0x006c, 0x00e4,
- 0x00e5, 0x01e5, 0x01e6, 0x07f0, 0x0016, 0x0017, 0x0032, 0x006d,
- 0x00e6, 0x00e7, 0x01e7, 0x01e8, 0x03ee, 0x07f1, 0x0033, 0x0034,
- 0x006e, 0x00e8, 0x00e9, 0x01e9, 0x01ea, 0x03ef, 0x07f2, 0x0ff6,
- 0x006f, 0x0070, 0x00ea, 0x00eb, 0x01eb, 0x01ec, 0x03f0, 0x07f3,
- 0x07f4, 0x1ffa, 0x00ec, 0x00ed, 0x00ee, 0x01ed, 0x01ee, 0x03f1,
- 0x03f2, 0x07f5, 0x0ff7, 0x3ffa, 0x00ef, 0x00f0, 0x00f1, 0x01ef,
- 0x03f3, 0x07f6, 0x07f7, 0x0ff8, 0x1ffb, 0x7ffe, 0x01f0, 0x01f1,
- 0x01f2, 0x03f4, 0x07f8, 0x0ff9, 0x0ffa, 0x3ffb, 0x3ffc, 0x0000,
- 0x01f3, 0x01f4, 0x01f5, 0x03f5, 0x07f9, 0x0ffb, 0x3ffd, 0xfffe,
- 0x0000, 0x0000, 0x03f6, 0x03f7, 0x07fa, 0x0ffc, 0x1ffc, 0x3ffe,
- 0xffff
-];
-const COOK_VQ2_BITS: &[u8; 48] = &[
- 1, 4, 5, 7, 8, 9, 10, 3, 4, 5, 7, 8,
- 9, 10, 5, 5, 6, 7, 8, 10, 10, 7, 6, 7,
- 8, 9, 10, 12, 8, 8, 8, 9, 10, 12, 14, 8,
- 9, 9, 10, 11, 15, 16, 9, 10, 11, 12, 13, 16
-];
-const COOK_VQ2_CODES: &[u16; 48] = &[
- 0x0000, 0x000a, 0x0018, 0x0074, 0x00f2, 0x01f4, 0x03f6, 0x0004, 0x000b, 0x0019, 0x0075, 0x00f3,
- 0x01f5, 0x03f7, 0x001a, 0x001b, 0x0038, 0x0076, 0x00f4, 0x03f8, 0x03f9, 0x0077, 0x0039, 0x0078,
- 0x00f5, 0x01f6, 0x03fa, 0x0ffc, 0x00f6, 0x00f7, 0x00f8, 0x01f7, 0x03fb, 0x0ffd, 0x3ffe, 0x00f9,
- 0x01f8, 0x01f9, 0x03fc, 0x07fc, 0x7ffe, 0xfffe, 0x01fa, 0x03fd, 0x07fd, 0x0ffe, 0x1ffe, 0xffff
-];
-const COOK_VQ3_BITS: &[u8; 607] = &[
- 2, 4, 6, 8, 10, 5, 5, 6, 8, 10, 7, 8,
- 8, 10, 12, 9, 9, 10, 12, 15, 10, 11, 13, 16,
- 16, 5, 6, 8, 10, 11, 5, 6, 8, 10, 12, 7,
- 7, 8, 10, 13, 9, 9, 10, 12, 15, 12, 11, 13,
- 16, 16, 7, 9, 10, 12, 15, 7, 8, 10, 12, 13,
- 9, 9, 11, 13, 16, 11, 11, 12, 14, 16, 12, 12,
- 14, 16, 0, 9, 11, 12, 16, 16, 9, 10, 13, 15,
- 16, 10, 11, 12, 16, 16, 13, 13, 16, 16, 16, 16,
- 16, 15, 16, 0, 11, 13, 16, 16, 15, 11, 13, 15,
- 16, 16, 13, 13, 16, 16, 0, 14, 16, 16, 16, 0,
- 16, 16, 0, 0, 0, 4, 6, 8, 10, 13, 6, 6,
- 8, 10, 13, 9, 8, 10, 12, 16, 10, 10, 11, 15,
- 16, 13, 12, 14, 16, 16, 5, 6, 8, 11, 13, 6,
- 6, 8, 10, 13, 8, 8, 9, 11, 14, 10, 10, 12,
- 12, 16, 13, 12, 13, 15, 16, 7, 8, 9, 12, 16,
- 7, 8, 10, 12, 14, 9, 9, 10, 13, 16, 11, 10,
- 12, 15, 16, 13, 13, 16, 16, 0, 9, 11, 13, 16,
- 16, 9, 10, 12, 15, 16, 10, 11, 13, 16, 16, 13,
- 12, 16, 16, 16, 16, 16, 16, 16, 0, 11, 13, 16,
- 16, 16, 11, 13, 16, 16, 16, 12, 13, 15, 16, 0,
- 16, 16, 16, 16, 0, 16, 16, 0, 0, 0, 6, 8,
- 11, 13, 16, 8, 8, 10, 12, 16, 11, 10, 11, 13,
- 16, 12, 13, 13, 15, 16, 16, 16, 14, 16, 0, 6,
- 8, 10, 13, 16, 8, 8, 10, 12, 16, 10, 10, 11,
- 13, 16, 13, 12, 13, 16, 16, 14, 14, 14, 16, 0,
- 8, 9, 11, 13, 16, 8, 9, 11, 16, 14, 10, 10,
- 12, 15, 16, 12, 12, 13, 16, 16, 15, 16, 16, 16,
- 0, 10, 12, 15, 16, 16, 10, 12, 12, 14, 16, 12,
- 12, 13, 16, 16, 14, 15, 16, 16, 0, 16, 16, 16,
- 0, 0, 12, 15, 15, 16, 0, 13, 13, 16, 16, 0,
- 14, 16, 16, 16, 0, 16, 16, 16, 0, 0, 0, 0,
- 0, 0, 0, 8, 10, 13, 15, 16, 10, 11, 13, 16,
- 16, 13, 13, 14, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 0, 8, 10, 11, 15, 16, 9, 10, 12,
- 16, 16, 12, 12, 15, 16, 16, 16, 14, 16, 16, 16,
- 16, 16, 16, 16, 0, 9, 11, 14, 16, 16, 10, 11,
- 13, 16, 16, 14, 13, 14, 16, 16, 16, 15, 15, 16,
- 0, 16, 16, 16, 0, 0, 11, 13, 16, 16, 16, 11,
- 13, 15, 16, 16, 13, 16, 16, 16, 0, 16, 16, 16,
- 16, 0, 16, 16, 0, 0, 0, 15, 16, 16, 16, 0,
- 14, 16, 16, 16, 0, 16, 16, 16, 0, 0, 16, 16,
- 0, 0, 0, 0, 0, 0, 0, 0, 9, 13, 16, 16,
- 16, 11, 13, 16, 16, 16, 14, 15, 16, 16, 0, 15,
- 16, 16, 16, 0, 16, 16, 0, 0, 0, 9, 13, 15,
- 15, 16, 12, 13, 14, 16, 16, 16, 15, 16, 16, 0,
- 16, 16, 16, 16, 0, 16, 16, 0, 0, 0, 11, 13,
- 15, 16, 0, 12, 14, 16, 16, 0, 16, 16, 16, 16,
- 0, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 16,
- 16, 16, 16, 0, 16, 16, 16, 16, 0, 16, 16, 16,
- 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0,
- 16, 16, 0, 0, 0, 16, 16
-];
-const COOK_VQ3_CODES: &[u16; 607] = &[
- 0x0000, 0x0004, 0x0022, 0x00c6, 0x03b0, 0x000c, 0x000d, 0x0023, 0x00c7, 0x03b1, 0x005c, 0x00c8,
- 0x00c9, 0x03b2, 0x0fa4, 0x01c2, 0x01c3, 0x03b3, 0x0fa5, 0x7f72, 0x03b4, 0x07b2, 0x1f9a, 0xff24,
- 0xff25, 0x000e, 0x0024, 0x00ca, 0x03b5, 0x07b3, 0x000f, 0x0025, 0x00cb, 0x03b6, 0x0fa6, 0x005d,
- 0x005e, 0x00cc, 0x03b7, 0x1f9b, 0x01c4, 0x01c5, 0x03b8, 0x0fa7, 0x7f73, 0x0fa8, 0x07b4, 0x1f9c,
- 0xff26, 0xff27, 0x005f, 0x01c6, 0x03b9, 0x0fa9, 0x7f74, 0x0060, 0x00cd, 0x03ba, 0x0faa, 0x1f9d,
- 0x01c7, 0x01c8, 0x07b5, 0x1f9e, 0xff28, 0x07b6, 0x07b7, 0x0fab, 0x3fa2, 0xff29, 0x0fac, 0x0fad,
- 0x3fa3, 0xff2a, 0x3fa2, 0x01c9, 0x07b8, 0x0fae, 0xff2b, 0xff2c, 0x01ca, 0x03bb, 0x1f9f, 0x7f75,
- 0xff2d, 0x03bc, 0x07b9, 0x0faf, 0xff2e, 0xff2f, 0x1fa0, 0x1fa1, 0xff30, 0xff31, 0xff32, 0xff33,
- 0xff34, 0x7f76, 0xff35, 0xff31, 0x07ba, 0x1fa2, 0xff36, 0xff37, 0x7f77, 0x07bb, 0x1fa3, 0x7f78,
- 0xff38, 0xff39, 0x1fa4, 0x1fa5, 0xff3a, 0xff3b, 0xff2e, 0x3fa4, 0xff3c, 0xff3d, 0xff3e, 0xff31,
- 0xff3f, 0xff40, 0xff30, 0xff31, 0xff31, 0x0005, 0x0026, 0x00ce, 0x03bd, 0x1fa6, 0x0027, 0x0028,
- 0x00cf, 0x03be, 0x1fa7, 0x01cb, 0x00d0, 0x03bf, 0x0fb0, 0xff41, 0x03c0, 0x03c1, 0x07bc, 0x7f79,
- 0xff42, 0x1fa8, 0x0fb1, 0x3fa5, 0xff43, 0xff44, 0x0010, 0x0029, 0x00d1, 0x07bd, 0x1fa9, 0x002a,
- 0x002b, 0x00d2, 0x03c2, 0x1faa, 0x00d3, 0x00d4, 0x01cc, 0x07be, 0x3fa6, 0x03c3, 0x03c4, 0x0fb2,
- 0x0fb3, 0xff45, 0x1fab, 0x0fb4, 0x1fac, 0x7f7a, 0xff46, 0x0061, 0x00d5, 0x01cd, 0x0fb5, 0xff47,
- 0x0062, 0x00d6, 0x03c5, 0x0fb6, 0x3fa7, 0x01ce, 0x01cf, 0x03c6, 0x1fad, 0xff48, 0x07bf, 0x03c7,
- 0x0fb7, 0x7f7b, 0xff49, 0x1fae, 0x1faf, 0xff4a, 0xff4b, 0x7f7b, 0x01d0, 0x07c0, 0x1fb0, 0xff4c,
- 0xff4d, 0x01d1, 0x03c8, 0x0fb8, 0x7f7c, 0xff4e, 0x03c9, 0x07c1, 0x1fb1, 0xff4f, 0xff50, 0x1fb2,
- 0x0fb9, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff52, 0x07c2, 0x1fb3, 0xff58,
- 0xff59, 0xff5a, 0x07c3, 0x1fb4, 0xff5b, 0xff5c, 0xff5d, 0x0fba, 0x1fb5, 0x7f7d, 0xff5e, 0xff4f,
- 0xff5f, 0xff60, 0xff61, 0xff62, 0xff52, 0xff63, 0xff64, 0xff51, 0xff52, 0xff52, 0x002c, 0x00d7,
- 0x07c4, 0x1fb6, 0xff65, 0x00d8, 0x00d9, 0x03ca, 0x0fbb, 0xff66, 0x07c5, 0x03cb, 0x07c6, 0x1fb7,
- 0xff67, 0x0fbc, 0x1fb8, 0x1fb9, 0x7f7e, 0xff68, 0xff69, 0xff6a, 0x3fa8, 0xff6b, 0x7f7e, 0x002d,
- 0x00da, 0x03cc, 0x1fba, 0xff6c, 0x00db, 0x00dc, 0x03cd, 0x0fbd, 0xff6d, 0x03ce, 0x03cf, 0x07c7,
- 0x1fbb, 0xff6e, 0x1fbc, 0x0fbe, 0x1fbd, 0xff6f, 0xff70, 0x3fa9, 0x3faa, 0x3fab, 0xff71, 0xff6f,
- 0x00dd, 0x01d2, 0x07c8, 0x1fbe, 0xff72, 0x00de, 0x01d3, 0x07c9, 0xff73, 0x3fac, 0x03d0, 0x03d1,
- 0x0fbf, 0x7f7f, 0xff74, 0x0fc0, 0x0fc1, 0x1fbf, 0xff75, 0xff76, 0x7f80, 0xff77, 0xff78, 0xff79,
- 0xff75, 0x03d2, 0x0fc2, 0x7f81, 0xff7a, 0xff7b, 0x03d3, 0x0fc3, 0x0fc4, 0x3fad, 0xff7c, 0x0fc5,
- 0x0fc6, 0x1fc0, 0xff7d, 0xff7e, 0x3fae, 0x7f82, 0xff7f, 0xff80, 0xff80, 0xff81, 0xff82, 0xff83,
- 0xff80, 0xff80, 0x0fc7, 0x7f83, 0x7f84, 0xff84, 0xff7a, 0x1fc1, 0x1fc2, 0xff85, 0xff86, 0x3fad,
- 0x3faf, 0xff87, 0xff88, 0xff89, 0xff7d, 0xff8a, 0xff8b, 0xff8c, 0xff80, 0xff80, 0x3fae, 0x7f82,
- 0xff7f, 0xff80, 0xff80, 0x00df, 0x03d4, 0x1fc3, 0x7f85, 0xff8d, 0x03d5, 0x07ca, 0x1fc4, 0xff8e,
- 0xff8f, 0x1fc5, 0x1fc6, 0x3fb0, 0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97,
- 0xff98, 0xff99, 0xff9a, 0xff95, 0x00e0, 0x03d6, 0x07cb, 0x7f86, 0xff9b, 0x01d4, 0x03d7, 0x0fc8,
- 0xff9c, 0xff9d, 0x0fc9, 0x0fca, 0x7f87, 0xff9e, 0xff9f, 0xffa0, 0x3fb1, 0xffa1, 0xffa2, 0xffa3,
- 0xffa4, 0xffa5, 0xffa6, 0xffa7, 0xffa2, 0x01d5, 0x07cc, 0x3fb2, 0xffa8, 0xffa9, 0x03d8, 0x07cd,
- 0x1fc7, 0xffaa, 0xffab, 0x3fb3, 0x1fc8, 0x3fb4, 0xffac, 0xffad, 0xffae, 0x7f88, 0x7f89, 0xffaf,
- 0xffaf, 0xffb0, 0xffb1, 0xffb2, 0xffaf, 0xffaf, 0x07ce, 0x1fc9, 0xffb3, 0xffb4, 0xffb5, 0x07cf,
- 0x1fca, 0x7f8a, 0xffb6, 0xffb7, 0x1fcb, 0xffb8, 0xffb9, 0xffba, 0xffba, 0xffbb, 0xffbc, 0xffbd,
- 0xffbe, 0xffbe, 0xffbf, 0xffc0, 0xffbd, 0xffbe, 0xffbe, 0x7f8b, 0xffc1, 0xffc2, 0xffc3, 0xffb4,
- 0x3fb5, 0xffc4, 0xffc5, 0xffc6, 0xffb6, 0xffc7, 0xffc8, 0xffc9, 0xffba, 0xffba, 0xffca, 0xffcb,
- 0xffbd, 0xffbe, 0xffbe, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbe, 0x01d6, 0x1fcc, 0xffcc, 0xffcd,
- 0xffce, 0x07d0, 0x1fcd, 0xffcf, 0xffd0, 0xffd1, 0x3fb6, 0x7f8c, 0xffd2, 0xffd3, 0xff90, 0x7f8d,
- 0xffd4, 0xffd5, 0xffd6, 0xff95, 0xffd7, 0xffd8, 0xff94, 0xff95, 0xff95, 0x01d7, 0x1fce, 0x7f8e,
- 0x7f8f, 0xffd9, 0x0fcb, 0x1fcf, 0x3fb7, 0xffda, 0xffdb, 0xffdc, 0x7f90, 0xffdd, 0xffde, 0xff9e,
- 0xffdf, 0xffe0, 0xffe1, 0xffe2, 0xffa2, 0xffe3, 0xffe4, 0xffa1, 0xffa2, 0xffa2, 0x07d1, 0x1fd0,
- 0x7f91, 0xffe5, 0xffa8, 0x0fcc, 0x3fb8, 0xffe6, 0xffe7, 0xffaa, 0xffe8, 0xffe9, 0xffea, 0xffeb,
- 0xffac, 0xffec, 0xffed, 0xffee, 0xffaf, 0xffaf, 0xffae, 0x7f88, 0x7f89, 0xffaf, 0xffaf, 0xffef,
- 0xfff0, 0xfff1, 0xfff2, 0xffb4, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xffb6, 0xfff7, 0xfff8, 0xfff9,
- 0xffba, 0xffba, 0xfffa, 0xfffb, 0xffbd, 0xffbe, 0xffbe, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbe,
- 0xfffc, 0xfffd, 0xffb3, 0xffb4, 0xffb4, 0xfffe, 0xffff
-];
-const COOK_VQ4_BITS: &[u8; 246] = &[
- 2, 4, 7, 10, 4, 5, 7, 10, 7, 8, 10, 14,
- 11, 11, 15, 15, 4, 5, 9, 12, 5, 5, 8, 12,
- 8, 7, 10, 15, 11, 11, 15, 15, 7, 9, 12, 15,
- 8, 8, 12, 15, 10, 10, 13, 15, 14, 14, 15, 0,
- 11, 13, 15, 15, 11, 13, 15, 15, 14, 15, 15, 0,
- 15, 15, 0, 0, 4, 5, 9, 13, 5, 6, 9, 13,
- 9, 9, 11, 15, 14, 13, 15, 15, 4, 6, 9, 12,
- 5, 6, 9, 13, 9, 8, 11, 15, 13, 12, 15, 15,
- 7, 9, 12, 15, 7, 8, 11, 15, 10, 10, 14, 15,
- 14, 15, 15, 0, 10, 12, 15, 15, 11, 13, 15, 15,
- 15, 15, 15, 0, 15, 15, 0, 0, 6, 9, 13, 14,
- 8, 9, 12, 15, 12, 12, 15, 15, 15, 15, 15, 0,
- 7, 9, 13, 15, 8, 9, 12, 15, 11, 12, 15, 15,
- 15, 15, 15, 0, 9, 11, 15, 15, 9, 11, 15, 15,
- 14, 14, 15, 0, 15, 15, 0, 0, 14, 15, 15, 0,
- 14, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 0,
- 9, 12, 15, 15, 12, 13, 15, 15, 15, 15, 15, 0,
- 15, 15, 0, 0, 10, 12, 15, 15, 12, 14, 15, 15,
- 15, 15, 15, 0, 15, 15, 0, 0, 14, 15, 15, 0,
- 15, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 0,
- 15, 15, 0, 0, 15, 15
-];
-const COOK_VQ4_CODES: &[u16; 246] = &[
- 0x0000, 0x0004, 0x006c, 0x03e6, 0x0005, 0x0012, 0x006d, 0x03e7, 0x006e, 0x00e8, 0x03e8, 0x3fc4,
- 0x07e0, 0x07e1, 0x7fa4, 0x7fa5, 0x0006, 0x0013, 0x01e2, 0x0fda, 0x0014, 0x0015, 0x00e9, 0x0fdb,
- 0x00ea, 0x006f, 0x03e9, 0x7fa6, 0x07e2, 0x07e3, 0x7fa7, 0x7fa8, 0x0070, 0x01e3, 0x0fdc, 0x7fa9,
- 0x00eb, 0x00ec, 0x0fdd, 0x7faa, 0x03ea, 0x03eb, 0x1fd6, 0x7fab, 0x3fc5, 0x3fc6, 0x7fac, 0x1fd6,
- 0x07e4, 0x1fd7, 0x7fad, 0x7fae, 0x07e5, 0x1fd8, 0x7faf, 0x7fb0, 0x3fc7, 0x7fb1, 0x7fb2, 0x1fd6,
- 0x7fb3, 0x7fb4, 0x1fd6, 0x1fd6, 0x0007, 0x0016, 0x01e4, 0x1fd9, 0x0017, 0x0032, 0x01e5, 0x1fda,
- 0x01e6, 0x01e7, 0x07e6, 0x7fb5, 0x3fc8, 0x1fdb, 0x7fb6, 0x7fb7, 0x0008, 0x0033, 0x01e8, 0x0fde,
- 0x0018, 0x0034, 0x01e9, 0x1fdc, 0x01ea, 0x00ed, 0x07e7, 0x7fb8, 0x1fdd, 0x0fdf, 0x7fb9, 0x7fba,
- 0x0071, 0x01eb, 0x0fe0, 0x7fbb, 0x0072, 0x00ee, 0x07e8, 0x7fbc, 0x03ec, 0x03ed, 0x3fc9, 0x7fbd,
- 0x3fca, 0x7fbe, 0x7fbf, 0x3fc9, 0x03ee, 0x0fe1, 0x7fc0, 0x7fc1, 0x07e9, 0x1fde, 0x7fc2, 0x7fc3,
- 0x7fc4, 0x7fc5, 0x7fc6, 0x3fc9, 0x7fc7, 0x7fc8, 0x3fc9, 0x3fc9, 0x0035, 0x01ec, 0x1fdf, 0x3fcb,
- 0x00ef, 0x01ed, 0x0fe2, 0x7fc9, 0x0fe3, 0x0fe4, 0x7fca, 0x7fcb, 0x7fcc, 0x7fcd, 0x7fce, 0x7fca,
- 0x0073, 0x01ee, 0x1fe0, 0x7fcf, 0x00f0, 0x01ef, 0x0fe5, 0x7fd0, 0x07ea, 0x0fe6, 0x7fd1, 0x7fd2,
- 0x7fd3, 0x7fd4, 0x7fd5, 0x7fd1, 0x01f0, 0x07eb, 0x7fd6, 0x7fd7, 0x01f1, 0x07ec, 0x7fd8, 0x7fd9,
- 0x3fcc, 0x3fcd, 0x7fda, 0x7fda, 0x7fdb, 0x7fdc, 0x7fda, 0x7fda, 0x3fce, 0x7fdd, 0x7fde, 0x7fd6,
- 0x3fcf, 0x7fdf, 0x7fe0, 0x7fd8, 0x7fe1, 0x7fe2, 0x7fda, 0x7fda, 0x3fcc, 0x3fcd, 0x7fda, 0x7fda,
- 0x01f2, 0x0fe7, 0x7fe3, 0x7fe4, 0x0fe8, 0x1fe1, 0x7fe5, 0x7fe6, 0x7fe7, 0x7fe8, 0x7fe9, 0x7fca,
- 0x7fea, 0x7feb, 0x7fca, 0x7fca, 0x03ef, 0x0fe9, 0x7fec, 0x7fed, 0x0fea, 0x3fd0, 0x7fee, 0x7fef,
- 0x7ff0, 0x7ff1, 0x7ff2, 0x7fd1, 0x7ff3, 0x7ff4, 0x7fd1, 0x7fd1, 0x3fd1, 0x7ff5, 0x7ff6, 0x7fd6,
- 0x7ff7, 0x7ff8, 0x7ff9, 0x7fd8, 0x7ffa, 0x7ffb, 0x7fda, 0x7fda, 0x3fcc, 0x3fcd, 0x7fda, 0x7fda,
- 0x7ffc, 0x7ffd, 0x7fd6, 0x7fd6, 0x7ffe, 0x7fff
-];
-const COOK_VQ5_BITS: &[u8; 230] = &[
- 2, 4, 8, 4, 5, 9, 9, 10, 14, 4, 6, 11,
- 5, 6, 12, 10, 11, 15, 9, 11, 15, 10, 13, 15,
- 14, 15, 0, 4, 6, 12, 6, 7, 12, 12, 12, 15,
- 5, 7, 13, 6, 7, 13, 12, 13, 15, 10, 12, 15,
- 11, 13, 15, 15, 15, 0, 8, 13, 15, 11, 12, 15,
- 15, 15, 0, 10, 13, 15, 12, 15, 15, 15, 15, 0,
- 15, 15, 0, 15, 15, 0, 0, 0, 0, 4, 5, 11,
- 5, 7, 12, 11, 12, 15, 6, 7, 13, 7, 8, 14,
- 12, 14, 15, 11, 13, 15, 12, 13, 15, 15, 15, 0,
- 5, 6, 13, 7, 8, 15, 12, 14, 15, 6, 8, 14,
- 7, 8, 15, 14, 15, 15, 12, 12, 15, 12, 13, 15,
- 15, 15, 0, 9, 13, 15, 12, 13, 15, 15, 15, 0,
- 11, 13, 15, 13, 13, 15, 15, 15, 0, 14, 15, 0,
- 15, 15, 0, 0, 0, 0, 8, 10, 15, 11, 12, 15,
- 15, 15, 0, 10, 12, 15, 12, 13, 15, 15, 15, 0,
- 14, 15, 0, 15, 15, 0, 0, 0, 0, 8, 12, 15,
- 12, 13, 15, 15, 15, 0, 11, 13, 15, 13, 15, 15,
- 15, 15, 0, 15, 15, 0, 15, 15, 0, 0, 0, 0,
- 14, 15, 0, 15, 15, 0, 0, 0, 0, 15, 15, 0,
- 15, 15
-];
-const COOK_VQ5_CODES: &[u16; 230] = &[
- 0x0000, 0x0004, 0x00f0, 0x0005, 0x0012, 0x01f0, 0x01f1, 0x03e8, 0x3fce, 0x0006, 0x0030, 0x07de,
- 0x0013, 0x0031, 0x0fd2, 0x03e9, 0x07df, 0x7fb0, 0x01f2, 0x07e0, 0x7fb1, 0x03ea, 0x1fd2, 0x7fb2,
- 0x3fcf, 0x7fb3, 0x0031, 0x0007, 0x0032, 0x0fd3, 0x0033, 0x0070, 0x0fd4, 0x0fd5, 0x0fd6, 0x7fb4,
- 0x0014, 0x0071, 0x1fd3, 0x0034, 0x0072, 0x1fd4, 0x0fd7, 0x1fd5, 0x7fb5, 0x03eb, 0x0fd8, 0x7fb6,
- 0x07e1, 0x1fd6, 0x7fb7, 0x7fb8, 0x7fb9, 0x0072, 0x00f1, 0x1fd7, 0x7fba, 0x07e2, 0x0fd9, 0x7fbb,
- 0x7fbc, 0x7fbd, 0x0070, 0x03ec, 0x1fd8, 0x7fbe, 0x0fda, 0x7fbf, 0x7fc0, 0x7fc1, 0x7fc2, 0x0072,
- 0x7fc3, 0x7fc4, 0x0071, 0x7fc5, 0x7fc6, 0x0072, 0x0034, 0x0072, 0x0072, 0x0008, 0x0015, 0x07e3,
- 0x0016, 0x0073, 0x0fdb, 0x07e4, 0x0fdc, 0x7fc7, 0x0035, 0x0074, 0x1fd9, 0x0075, 0x00f2, 0x3fd0,
- 0x0fdd, 0x3fd1, 0x7fc8, 0x07e5, 0x1fda, 0x7fc9, 0x0fde, 0x1fdb, 0x7fca, 0x7fcb, 0x7fcc, 0x00f2,
- 0x0017, 0x0036, 0x1fdc, 0x0076, 0x00f3, 0x7fcd, 0x0fdf, 0x3fd2, 0x7fce, 0x0037, 0x00f4, 0x3fd3,
- 0x0077, 0x00f5, 0x7fcf, 0x3fd4, 0x7fd0, 0x7fd1, 0x0fe0, 0x0fe1, 0x7fd2, 0x0fe2, 0x1fdd, 0x7fd3,
- 0x7fd4, 0x7fd5, 0x00f5, 0x01f3, 0x1fde, 0x7fd6, 0x0fe3, 0x1fdf, 0x7fd7, 0x7fd8, 0x7fd9, 0x00f3,
- 0x07e6, 0x1fe0, 0x7fda, 0x1fe1, 0x1fe2, 0x7fdb, 0x7fdc, 0x7fdd, 0x00f5, 0x3fd5, 0x7fde, 0x00f4,
- 0x7fdf, 0x7fe0, 0x00f5, 0x0077, 0x00f5, 0x00f5, 0x00f6, 0x03ed, 0x7fe1, 0x07e7, 0x0fe4, 0x7fe2,
- 0x7fe3, 0x7fe4, 0x0073, 0x03ee, 0x0fe5, 0x7fe5, 0x0fe6, 0x1fe3, 0x7fe6, 0x7fe7, 0x7fe8, 0x00f2,
- 0x3fd6, 0x7fe9, 0x0074, 0x7fea, 0x7feb, 0x00f2, 0x0075, 0x00f2, 0x00f2, 0x00f7, 0x0fe7, 0x7fec,
- 0x0fe8, 0x1fe4, 0x7fed, 0x7fee, 0x7fef, 0x00f3, 0x07e8, 0x1fe5, 0x7ff0, 0x1fe6, 0x7ff1, 0x7ff2,
- 0x7ff3, 0x7ff4, 0x00f5, 0x7ff5, 0x7ff6, 0x00f4, 0x7ff7, 0x7ff8, 0x00f5, 0x0077, 0x00f5, 0x00f5,
- 0x3fd7, 0x7ff9, 0x0036, 0x7ffa, 0x7ffb, 0x00f3, 0x0076, 0x00f3, 0x00f3, 0x7ffc, 0x7ffd, 0x0000,
- 0x7ffe, 0x7fff
-];
-const COOK_VQ6_BITS: &[u8; 32] = &[
- 1, 4, 4, 6, 4, 6, 6, 8, 4, 6, 6, 8,
- 6, 9, 8, 10, 4, 6, 7, 8, 6, 9, 8, 11,
- 6, 9, 8, 10, 8, 10, 9, 11
-];
-const COOK_VQ6_CODES: &[u16; 32] = &[
- 0x0000, 0x0008, 0x0009, 0x0034, 0x000a, 0x0035, 0x0036, 0x00f6,
- 0x000b, 0x0037, 0x0038, 0x00f7, 0x0039, 0x01fa, 0x00f8, 0x03fc,
- 0x000c, 0x003a, 0x007a, 0x00f9, 0x003b, 0x01fb, 0x00fa, 0x07fe,
- 0x003c, 0x01fc, 0x00fb, 0x03fd, 0x00fc, 0x03fe, 0x01fd, 0x07ff
-];
-
-const COOK_CPL_SCALE2: &[f32; 5] = &[
- 1.0, 0.953020632266998, 0.70710676908493, 0.302905440330505, 0.0
-];
-const COOK_CPL_SCALE3: &[f32; 9] = &[
- 1.0, 0.981279790401459, 0.936997592449188, 0.875934481620789, 0.70710676908493,
- 0.482430040836334, 0.349335819482803, 0.192587479948997, 0.0
-];
-const COOK_CPL_SCALE4: &[f32; 17] = &[
- 1.0, 0.991486728191376, 0.973249018192291, 0.953020632266998, 0.930133521556854,
- 0.903453230857849, 0.870746195316315, 0.826180458068848, 0.70710676908493,
- 0.563405573368073, 0.491732746362686, 0.428686618804932, 0.367221474647522,
- 0.302905440330505, 0.229752898216248, 0.130207896232605, 0.0
-];
-const COOK_CPL_SCALE5: &[f32; 33] = &[
- 1.0, 0.995926380157471, 0.987517595291138, 0.978726446628571, 0.969505727291107,
- 0.95979779958725, 0.949531257152557, 0.938616216182709, 0.926936149597168,
- 0.914336204528809, 0.900602877140045, 0.885426938533783, 0.868331849575043,
- 0.84851086139679, 0.824381768703461, 0.791833400726318, 0.70710676908493,
- 0.610737144947052, 0.566034197807312, 0.529177963733673, 0.495983630418777,
- 0.464778542518616, 0.434642940759659, 0.404955863952637, 0.375219136476517,
- 0.344963222742081, 0.313672333955765, 0.280692428350449, 0.245068684220314,
- 0.205169528722763, 0.157508864998817, 0.0901700109243393, 0.0
-];
-const COOK_CPL_SCALE6: &[f32; 65] = &[
- 1.0, 0.998005926609039, 0.993956744670868, 0.989822506904602, 0.985598564147949,
- 0.981279790401459, 0.976860702037811, 0.972335040569305, 0.967696130275726,
- 0.962936460971832, 0.958047747612000, 0.953020632266998, 0.947844684123993,
- 0.942508161067963, 0.936997592449188, 0.931297719478607, 0.925390899181366,
- 0.919256627559662, 0.912870943546295, 0.906205296516418, 0.899225592613220,
- 0.891890347003937, 0.884148240089417, 0.875934481620789, 0.867165684700012,
- 0.857730865478516, 0.847477376461029, 0.836184680461884, 0.823513329029083,
- 0.808890223503113, 0.791194140911102, 0.767520070075989, 0.707106769084930,
- 0.641024887561798, 0.611565053462982, 0.587959706783295, 0.567296981811523,
- 0.548448026180267, 0.530831515789032, 0.514098942279816, 0.498019754886627,
- 0.482430040836334, 0.467206478118896, 0.452251672744751, 0.437485188245773,
- 0.422837972640991, 0.408248275518417, 0.393658757209778, 0.379014074802399,
- 0.364258885383606, 0.349335819482803, 0.334183186292648, 0.318732559680939,
- 0.302905440330505, 0.286608695983887, 0.269728302955627, 0.252119421958923,
- 0.233590632677078, 0.213876649737358, 0.192587479948997, 0.169101938605309,
- 0.142307326197624, 0.109772264957428, 0.0631198287010193, 0.0
-];
-const COOK_CPL_SCALES: [&[f32]; 5] = [
- COOK_CPL_SCALE2, COOK_CPL_SCALE3, COOK_CPL_SCALE4, COOK_CPL_SCALE5, COOK_CPL_SCALE6
-];
-
-const COOK_CPL_BAND: [u8; MAX_SUBBANDS - 1] = [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 12, 13,
- 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17,
- 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19,
- 19, 19, 19
-];
-
-const COOK_DITHER_TAB: [f32; 9] = [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.176777, 0.25, 0.707107, 1.0 ];
-
-const COOK_QUANT_CENTROID: [[f32; 14]; 7] = [
- [ 0.000, 0.392, 0.761, 1.120, 1.477, 1.832, 2.183, 2.541, 2.893, 3.245, 3.598, 3.942, 4.288, 4.724 ],
- [ 0.000, 0.544, 1.060, 1.563, 2.068, 2.571, 3.072, 3.562, 4.070, 4.620, 0.000, 0.000, 0.000, 0.000 ],
- [ 0.000, 0.746, 1.464, 2.180, 2.882, 3.584, 4.316, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ],
- [ 0.000, 1.006, 2.000, 2.993, 3.985, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ],
- [ 0.000, 1.321, 2.703, 3.983, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ],
- [ 0.000, 1.657, 3.491, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ],
- [ 0.000, 1.964, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ]
-];
-
-const COOK_EXP_BITS: [i32; NUM_CATEGORIES] = [ 52, 47, 43, 37, 29, 22, 16, 0 ];
diff --git a/src/codecs/real/mod.rs b/src/codecs/real/mod.rs
deleted file mode 100644
index 244b901..0000000
--- a/src/codecs/real/mod.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-#[cfg(any(feature="decoder_realvideo3", feature="decoder_realvideo4"))]
-mod rv3040;
-#[cfg(any(feature="decoder_realvideo3", feature="decoder_realvideo4"))]
-mod rv34codes;
-#[cfg(any(feature="decoder_realvideo3", feature="decoder_realvideo4"))]
-mod rv34dsp;
-
-#[cfg(feature="decoder_realvideo3")]
-pub mod rv30;
-#[cfg(feature="decoder_realvideo3")]
-pub mod rv30dsp;
-#[cfg(feature="decoder_realvideo4")]
-pub mod rv40;
-#[cfg(feature="decoder_realvideo4")]
-pub mod rv40dsp;
-#[cfg(feature="decoder_realvideo6")]
-pub mod rv60;
-#[cfg(feature="decoder_realvideo6")]
-pub mod rv60codes;
-#[cfg(feature="decoder_realvideo6")]
-pub mod rv60dsp;
-
-#[cfg(feature="decoder_realaudio144")]
-pub mod ra144;
-#[cfg(feature="decoder_realaudio288")]
-pub mod ra288;
-#[cfg(feature="decoder_cook")]
-pub mod cook;
-#[cfg(feature="decoder_ralf")]
-pub mod ralf;
-
diff --git a/src/codecs/real/ra144.rs b/src/codecs/real/ra144.rs
deleted file mode 100644
index 1fdace0..0000000
--- a/src/codecs/real/ra144.rs
+++ /dev/null
@@ -1,2305 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use super::super::*;
-use crate::io::bitreader::*;
-
-const NBLOCKS: usize = 4;
-const BLOCKSIZE: usize = 40;
-const LPC_ORDER: usize = 10;
-const BUFFERSIZE: usize = 146;
-const FRAME_SIZE: usize = 20;
-
-struct RA144Decoder {
- chmap: NAChannelMap,
- ainfo: NAAudioInfo,
- info: Rc<NACodecInfo>,
-
- old_energy: u16,
- lpc_data: [[i32; LPC_ORDER]; 2],
- frame_no: usize,
- lpc_refl_rms: [u32; 2],
- audio: [i16; BLOCKSIZE + LPC_ORDER],
- adapt_cb: [i16; BUFFERSIZE + 2],
-}
-
-impl RA144Decoder {
- fn new() -> Self {
- RA144Decoder {
- chmap: NAChannelMap::new(),
- ainfo: NAAudioInfo::new(0, 1, SND_S16_FORMAT, NBLOCKS * BLOCKSIZE),
- info: NACodecInfo::new_dummy(),
-
- old_energy: 0,
- lpc_data: [[0; 10]; 2],
- frame_no: 0,
- lpc_refl_rms: [0; 2],
- audio: [0; BLOCKSIZE + LPC_ORDER],
- adapt_cb: [0; BUFFERSIZE + 2],
- }
- }
-
- fn evaluate_coeffs(&mut self, lpc_refl: &[i32; LPC_ORDER]) {
- let mut tmp: [i32; LPC_ORDER] = [0; LPC_ORDER];
-
- for i in 0..LPC_ORDER {
- let src;
- let dst;
- if (i & 1) == 0 {
- src = &self.lpc_data[self.frame_no];
- dst = &mut tmp;
- } else {
- src = &tmp;
- dst = &mut self.lpc_data[self.frame_no];
- }
- dst[i] = lpc_refl[i] << 4;
-
- for j in 0..i {
- dst[j] = ((lpc_refl[i] * src[i - j - 1]) >> 12) + src[j];
- }
- }
- for i in 0..LPC_ORDER {
- self.lpc_data[self.frame_no][i] >>= 4;
- }
- }
- fn interpolate(&mut self, coeffs: &mut [i16; LPC_ORDER], scale1: i32, copyold: bool, energy: u16) -> u32 {
- let scale2 = (NBLOCKS as i32) - scale1;
- {
- let src1 = &self.lpc_data[self.frame_no];
- let src2 = &self.lpc_data[self.frame_no ^ 1];
- for i in 0..LPC_ORDER {
- coeffs[i] = ((scale1 * src1[i] + scale2 * src2[i]) >> 2) as i16;
- }
- }
- if let Some(rms) = eval_reflection(coeffs) {
- rescale_rms(rms, energy)
- } else {
- let src = if copyold { &self.lpc_data[self.frame_no ^ 1] } else { &self.lpc_data[self.frame_no] };
- for i in 0..LPC_ORDER {
- coeffs[i] = src[i] as i16;
- }
- rescale_rms(self.lpc_refl_rms[if copyold { 1 } else { 0 }], energy)
- }
- }
- fn process_subblock(&mut self, br: &mut BitReader, lpc_coeffs: &[i16; LPC_ORDER], rms: u32) -> DecoderResult<()> {
- let cba_idx = br.read(7)? as usize;
- let gain = br.read(8)? as usize;
- let cb1_idx = br.read(7)? as usize;
- let cb2_idx = br.read(7)? as usize;
-
- let mut tmp_a: [i16; BLOCKSIZE] = [0; BLOCKSIZE];
- let mut m: [u32; 3] = [0; 3];
- if cba_idx != 0 {
- let len = cba_idx + BLOCKSIZE/2 - 1;
- let soff = BUFFERSIZE - len;
- for i in 0..len.min(BLOCKSIZE) {
- tmp_a[i] = self.adapt_cb[i + soff];
- }
- for i in len..BLOCKSIZE {
- tmp_a[i] = self.adapt_cb[i + soff - len];
- }
- m[0] = (calc_irms(&tmp_a) * rms) >> 12;
- } else {
- m[0] = 0;
- }
- m[1] = ((RA144_CODEBOOK1[cb1_idx] as u32) * rms) >> 8;
- m[2] = ((RA144_CODEBOOK2[cb2_idx] as u32) * rms) >> 8;
- for i in 0..3 {
- m[i] = (m[i] * (RA144_GAIN_VAL_TAB[gain][i] as u32)) >> RA144_GAIN_EXP_TAB[gain];
- }
-
- for i in 0..(BUFFERSIZE - BLOCKSIZE) {
- self.adapt_cb[i] = self.adapt_cb[i + BLOCKSIZE];
- }
-
- let doff = BUFFERSIZE - BLOCKSIZE;
- if m[0] != 0 {
- for i in 0..BLOCKSIZE {
- let sum = (m[0] as i32) * (tmp_a[i] as i32)
- + (m[1] as i32) * (RA144_VECTORS1[cb1_idx][i] as i32)
- + (m[2] as i32) * (RA144_VECTORS2[cb2_idx][i] as i32);
- self.adapt_cb[i + doff] = (sum >> 12) as i16;
- }
- } else {
- for i in 0..BLOCKSIZE {
- let sum = (m[1] as i32) * (RA144_VECTORS1[cb1_idx][i] as i32)
- + (m[2] as i32) * (RA144_VECTORS2[cb2_idx][i] as i32);
- self.adapt_cb[i + doff] = (sum >> 12) as i16;
- }
- }
-
- for i in 0..LPC_ORDER {
- self.audio[i] = self.audio[i + BLOCKSIZE];
- }
- if celp_synth_filter(&mut self.audio, &self.adapt_cb, lpc_coeffs) {
- self.audio = [0; BLOCKSIZE + LPC_ORDER];
- }
- Ok(())
- }
-}
-
-const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
-
-fn celp_synth_filter(dst: &mut [i16], src: &[i16], filt: &[i16; LPC_ORDER]) -> bool { //1,0,0xfff
- for i in 0..BLOCKSIZE {
- let mut sum = -0xFFF;
- for j in 0..LPC_ORDER {
- sum += (filt[j] as i32) * (dst[LPC_ORDER + i - j - 1] as i32);
- }
- let sum1 = (-sum >> 12) + (src[BUFFERSIZE - BLOCKSIZE + i] as i32);
- if ((sum1 >> 16) != 0) && ((sum1 >> 16) != -1) { // overflow
- return true;
- }
- dst[LPC_ORDER + i] = sum1 as i16;
- }
- false
-}
-
-fn fixp_sqrt(mut val: u32) -> u32 {
- let mut shift = 2;
- while val >= (1 << 12) {
- val >>= 2;
- shift += 1;
- }
- (SQRT_TABLE[val as usize] as u32) << shift
-}
-
-fn calc_rms(coeffs: &[i32; LPC_ORDER]) -> u32 {
- let mut res = 1 << 16;
- let mut shift = 10;
-
- for i in 0..LPC_ORDER {
- res = ((((1 << 24) - ((coeffs[i] * coeffs[i]) as u32)) >> 12) * res) >> 12;
- if res == 0 { return 0; }
- while res < (1 << 14) {
- res <<= 2;
- shift += 1;
- }
- }
- fixp_sqrt(res) >> shift
-}
-
-fn calc_irms(coeffs: &[i16; BLOCKSIZE]) -> u32 {
- let mut sum = 0;
- for i in 0..BLOCKSIZE {
- sum += ((coeffs[i] as i32) * (coeffs[i] as i32)) as u32;
- }
- if sum != 0 {
- (1 << 29) / (fixp_sqrt(sum) >> 8)
- } else {
- 0
- }
-}
-
-fn rescale_rms(rms: u32, energy: u16) -> u32 {
- (rms * (energy as u32)) >> 10
-}
-
-fn eval_reflection(coeffs: &[i16; LPC_ORDER]) -> Option<u32> {
- let mut tmp1: [i32; LPC_ORDER] = [0; LPC_ORDER];
- let mut tmp2: [i32; LPC_ORDER] = [0; LPC_ORDER];
- let mut tmp3: [i32; LPC_ORDER] = [0; LPC_ORDER];
-
- for i in 0..LPC_ORDER {
- tmp2[i] = coeffs[i] as i32;
- }
- tmp3[LPC_ORDER - 1] = tmp2[LPC_ORDER - 1];
-
- if (tmp2[LPC_ORDER - 1] as u32).wrapping_add(0x1000) > 0x1FFF {
- return None;
- }
-
- for i in (0..(LPC_ORDER - 1)).rev() {
- let src;
- let dst;
- if (i & 1) == 0 {
- src = &tmp2;
- dst = &mut tmp1;
- } else {
- src = &tmp1;
- dst = &mut tmp2;
- }
- let a = (1 << 12) - ((src[i + 1] * src[i + 1]) >> 12);
- let scale = if a != 0 { (1 << 24) / a } else { (1 << 24) };
- for j in 0..(i+1) {
- let result = (src[j] - ((tmp3[i + 1] * src[i - j]) >> 12)).checked_mul(scale);
- if let Some(val) = result {
- dst[j] = val >> 12;
- } else {
- return None;
- }
- }
- if (dst[i] as u32).wrapping_add(0x1000) > 0x1FFF {
- return None;
- }
- tmp3[i] = dst[i];
- }
-
- Some(calc_rms(&tmp3))
-}
-
-fn clip_out(sample: i16) -> i16 {
- sample.max(-16384 >> 2).min(16383 >> 2)
-}
-
-impl NADecoder for RA144Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- self.chmap.add_channels(&CHMAP_MONO);
- self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(),
- 1,
- SND_S16_FORMAT, NBLOCKS * BLOCKSIZE);
- self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone()));
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- let nframes = pktbuf.len() / FRAME_SIZE;
-
- let duration = NBLOCKS * BLOCKSIZE * nframes;
-
- let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?;
- let mut adata = abuf.get_abuf_i16().unwrap();
- let mut dst = adata.get_data_mut();
-
- for (input, output) in pktbuf.chunks(FRAME_SIZE).zip(dst.chunks_mut(NBLOCKS * BLOCKSIZE)) {
- let mut br = BitReader::new(input, input.len(), BitReaderMode::BE);
-
- let mut lpc_refl: [i32; LPC_ORDER] = [0; LPC_ORDER];
- for i in 0..LPC_ORDER {
- lpc_refl[i] = RA144_LPC_REFL_CODEBOOK[i][br.read(RA144_LPC_SIZES[i])? as usize] as i32;
- }
-
- self.evaluate_coeffs(&lpc_refl);
- self.lpc_refl_rms[0] = calc_rms(&lpc_refl);
-
- let energy = RA144_ENERGY_TAB[br.read(5)? as usize];
-
- let mut block_coeffs: [[i16; LPC_ORDER]; NBLOCKS] = [[0; LPC_ORDER]; NBLOCKS];
- let mut refl_rms: [u32; NBLOCKS] = [0; NBLOCKS];
-
- let old_energy = self.old_energy;
- let interp_energy = (fixp_sqrt((energy as u32) * (old_energy as u32)) >> 12) as u16;
- refl_rms[0] = self.interpolate(&mut block_coeffs[0], 1, true, old_energy);
- refl_rms[1] = self.interpolate(&mut block_coeffs[1], 2, energy <= old_energy, interp_energy);
- refl_rms[2] = self.interpolate(&mut block_coeffs[2], 3, false, energy);
- refl_rms[3] = rescale_rms(self.lpc_refl_rms[0], energy);
- for i in 0..LPC_ORDER { block_coeffs[3][i] = self.lpc_data[self.frame_no][i] as i16; }
-
- for (i, block) in output.chunks_mut(BLOCKSIZE).enumerate() {
-
- self.process_subblock(&mut br, &block_coeffs[i], refl_rms[i])?;
- for j in 0..BLOCKSIZE {
- block[j] = clip_out(self.audio[j + LPC_ORDER]) << 2;
- }
- }
-
- self.old_energy = energy;
- self.lpc_refl_rms[1] = self.lpc_refl_rms[0];
- self.frame_no ^= 1;
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(RA144Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_ra144() {
- let file = "assets/RV/ra3_in_rm_file.rm";
- test_decode_audio("realmedia", file, Some(5000), "ra14.4");
- }
-}
-
-const RA144_LPC_SIZES: [u8; LPC_ORDER] = [ 6, 5, 5, 4, 4, 3, 3, 3, 3, 2 ];
-const RA144_LPC_REFL_CODEBOOK: [&[i16]; LPC_ORDER] = [
- LPC_REFL_CB0, LPC_REFL_CB1, LPC_REFL_CB2, LPC_REFL_CB3, LPC_REFL_CB4,
- LPC_REFL_CB5, LPC_REFL_CB6, LPC_REFL_CB7, LPC_REFL_CB8, LPC_REFL_CB9,
-];
-const LPC_REFL_CB0: &[i16; 64] = &[
- -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879,
- -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631,
- -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268,
- -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676,
- -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660,
- -1508, -1348, -1185, -994, -798, -600, -374, -110,
- 152, 447, 720, 982, 1229, 1456, 1682, 1916,
- 2130, 2353, 2595, 2853, 3118, 3363, 3588, 3814
-];
-const LPC_REFL_CB1: &[i16; 32] = &[
- -3091, -2386, -1871, -1425, -1021, -649, -316, -20,
- 267, 544, 810, 1065, 1305, 1534, 1756, 1970,
- 2171, 2359, 2536, 2700, 2854, 2996, 3133, 3263,
- 3386, 3499, 3603, 3701, 3789, 3870, 3947, 4020
-];
-const LPC_REFL_CB2: &[i16; 32] = &[
- -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149,
- -1979, -1817, -1658, -1498, -1341, -1188, -1032, -876,
- -721, -561, -394, -228, -54, 119, 296, 484,
- 683, 895, 1123, 1373, 1651, 1965, 2360, 2854
-];
-const LPC_REFL_CB3: &[i16; 16] = &[
- -1845, -1057, -522, -77, 301, 647, 975, 1285,
- 1582, 1873, 2163, 2452, 2735, 3017, 3299, 3569
-];
-const LPC_REFL_CB4: &[i16; 16] = &[
- -2691, -2187, -1788, -1435, -1118, -837, -571, -316,
- -59, 201, 470, 759, 1077, 1457, 1908, 2495
-];
-const LPC_REFL_CB5: &[i16; 8] = &[
- -1372, -474, 133, 632, 1100, 1571, 2075, 2672
-];
-const LPC_REFL_CB6: &[i16; 8] = &[
- -2389, -1787, -1231, -717, -239, 234, 770, 1474
-];
-const LPC_REFL_CB7: &[i16; 8] = &[
- -1569, -864, -296, 200, 670, 1151, 1709, 2385
-];
-const LPC_REFL_CB8: &[i16; 8] = &[
- -2200, -1608, -1062, -569, -120, 338, 863, 1621
-];
-const LPC_REFL_CB9: &[i16; 4] = &[
- -617, 190, 802, 1483
-];
-
-const RA144_ENERGY_TAB: [u16; 32] = [
- 0, 16, 20, 25, 32, 41, 51, 65,
- 81, 103, 129, 163, 205, 259, 326, 410,
- 516, 650, 819, 1031, 1298, 1634, 2057, 2590,
- 3261, 4105, 5168, 6507, 8192, 10313, 12983, 16345
-];
-
-const SQRT_TABLE: [u16; 4096] = [
-0x0000,0x0400,0x05a8,0x06ed,0x0800,0x08f1,0x09cc,0x0a95,
-0x0b50,0x0c00,0x0ca6,0x0d44,0x0ddb,0x0e6c,0x0ef7,0x0f7d,
-0x1000,0x107e,0x10f8,0x116f,0x11e3,0x1254,0x12c2,0x132e,
-0x1398,0x1400,0x1465,0x14c8,0x152a,0x158a,0x15e8,0x1645,
-0x16a0,0x16fa,0x1752,0x17aa,0x1800,0x1854,0x18a8,0x18fa,
-0x194c,0x199c,0x19ec,0x1a3a,0x1a88,0x1ad5,0x1b21,0x1b6c,
-0x1bb6,0x1c00,0x1c48,0x1c90,0x1cd8,0x1d1e,0x1d64,0x1daa,
-0x1dee,0x1e33,0x1e76,0x1eb9,0x1efb,0x1f3d,0x1f7e,0x1fbf,
-0x2000,0x203f,0x207f,0x20bd,0x20fc,0x2139,0x2177,0x21b4,
-0x21f0,0x222d,0x2268,0x22a4,0x22df,0x2319,0x2353,0x238d,
-0x23c6,0x2400,0x2438,0x2471,0x24a9,0x24e0,0x2518,0x254f,
-0x2585,0x25bc,0x25f2,0x2628,0x265d,0x2693,0x26c8,0x26fc,
-0x2731,0x2765,0x2799,0x27cc,0x2800,0x2833,0x2865,0x2898,
-0x28ca,0x28fc,0x292e,0x2960,0x2991,0x29c2,0x29f3,0x2a24,
-0x2a54,0x2a85,0x2ab5,0x2ae5,0x2b14,0x2b44,0x2b73,0x2ba2,
-0x2bd1,0x2c00,0x2c2e,0x2c5c,0x2c8a,0x2cb8,0x2ce6,0x2d13,
-0x2d41,0x2d6e,0x2d9b,0x2dc8,0x2df4,0x2e21,0x2e4d,0x2e79,
-0x2ea5,0x2ed1,0x2efd,0x2f28,0x2f54,0x2f7f,0x2faa,0x2fd5,
-0x3000,0x302a,0x3055,0x307f,0x30a9,0x30d3,0x30fd,0x3127,
-0x3150,0x317a,0x31a3,0x31cc,0x31f5,0x321e,0x3247,0x3270,
-0x3298,0x32c1,0x32e9,0x3311,0x3339,0x3361,0x3389,0x33b0,
-0x33d8,0x3400,0x3427,0x344e,0x3475,0x349c,0x34c3,0x34ea,
-0x3510,0x3537,0x355d,0x3584,0x35aa,0x35d0,0x35f6,0x361c,
-0x3642,0x3667,0x368d,0x36b2,0x36d8,0x36fd,0x3722,0x3747,
-0x376c,0x3791,0x37b6,0x37db,0x3800,0x3824,0x3848,0x386d,
-0x3891,0x38b5,0x38d9,0x38fd,0x3921,0x3945,0x3969,0x398c,
-0x39b0,0x39d3,0x39f7,0x3a1a,0x3a3d,0x3a60,0x3a83,0x3aa6,
-0x3ac9,0x3aec,0x3b0f,0x3b31,0x3b54,0x3b76,0x3b99,0x3bbb,
-0x3bdd,0x3c00,0x3c22,0x3c44,0x3c66,0x3c87,0x3ca9,0x3ccb,
-0x3ced,0x3d0e,0x3d30,0x3d51,0x3d72,0x3d94,0x3db5,0x3dd6,
-0x3df7,0x3e18,0x3e39,0x3e5a,0x3e7b,0x3e9c,0x3ebc,0x3edd,
-0x3efd,0x3f1e,0x3f3e,0x3f5f,0x3f7f,0x3f9f,0x3fbf,0x3fdf,
-0x4000,0x401f,0x403f,0x405f,0x407f,0x409f,0x40be,0x40de,
-0x40fe,0x411d,0x413c,0x415c,0x417b,0x419a,0x41ba,0x41d9,
-0x41f8,0x4217,0x4236,0x4255,0x4273,0x4292,0x42b1,0x42d0,
-0x42ee,0x430d,0x432b,0x434a,0x4368,0x4387,0x43a5,0x43c3,
-0x43e1,0x4400,0x441e,0x443c,0x445a,0x4478,0x4495,0x44b3,
-0x44d1,0x44ef,0x450c,0x452a,0x4548,0x4565,0x4583,0x45a0,
-0x45be,0x45db,0x45f8,0x4615,0x4633,0x4650,0x466d,0x468a,
-0x46a7,0x46c4,0x46e1,0x46fe,0x471b,0x4737,0x4754,0x4771,
-0x478d,0x47aa,0x47c7,0x47e3,0x4800,0x481c,0x4838,0x4855,
-0x4871,0x488d,0x48a9,0x48c6,0x48e2,0x48fe,0x491a,0x4936,
-0x4952,0x496e,0x498a,0x49a5,0x49c1,0x49dd,0x49f9,0x4a14,
-0x4a30,0x4a4b,0x4a67,0x4a83,0x4a9e,0x4ab9,0x4ad5,0x4af0,
-0x4b0b,0x4b27,0x4b42,0x4b5d,0x4b78,0x4b93,0x4bae,0x4bca,
-0x4be5,0x4c00,0x4c1a,0x4c35,0x4c50,0x4c6b,0x4c86,0x4ca1,
-0x4cbb,0x4cd6,0x4cf1,0x4d0b,0x4d26,0x4d40,0x4d5b,0x4d75,
-0x4d90,0x4daa,0x4dc4,0x4ddf,0x4df9,0x4e13,0x4e2d,0x4e48,
-0x4e62,0x4e7c,0x4e96,0x4eb0,0x4eca,0x4ee4,0x4efe,0x4f18,
-0x4f32,0x4f4c,0x4f65,0x4f7f,0x4f99,0x4fb3,0x4fcc,0x4fe6,
-0x5000,0x5019,0x5033,0x504c,0x5066,0x507f,0x5099,0x50b2,
-0x50cb,0x50e5,0x50fe,0x5117,0x5130,0x514a,0x5163,0x517c,
-0x5195,0x51ae,0x51c7,0x51e0,0x51f9,0x5212,0x522b,0x5244,
-0x525d,0x5276,0x528f,0x52a7,0x52c0,0x52d9,0x52f2,0x530a,
-0x5323,0x533c,0x5354,0x536d,0x5385,0x539e,0x53b6,0x53cf,
-0x53e7,0x5400,0x5418,0x5430,0x5449,0x5461,0x5479,0x5491,
-0x54a9,0x54c2,0x54da,0x54f2,0x550a,0x5522,0x553a,0x5552,
-0x556a,0x5582,0x559a,0x55b2,0x55ca,0x55e2,0x55fa,0x5611,
-0x5629,0x5641,0x5659,0x5670,0x5688,0x56a0,0x56b7,0x56cf,
-0x56e6,0x56fe,0x5716,0x572d,0x5745,0x575c,0x5773,0x578b,
-0x57a2,0x57ba,0x57d1,0x57e8,0x5800,0x5817,0x582e,0x5845,
-0x585c,0x5874,0x588b,0x58a2,0x58b9,0x58d0,0x58e7,0x58fe,
-0x5915,0x592c,0x5943,0x595a,0x5971,0x5988,0x599f,0x59b5,
-0x59cc,0x59e3,0x59fa,0x5a11,0x5a27,0x5a3e,0x5a55,0x5a6b,
-0x5a82,0x5a99,0x5aaf,0x5ac6,0x5adc,0x5af3,0x5b09,0x5b20,
-0x5b36,0x5b4d,0x5b63,0x5b7a,0x5b90,0x5ba6,0x5bbd,0x5bd3,
-0x5be9,0x5c00,0x5c16,0x5c2c,0x5c42,0x5c58,0x5c6f,0x5c85,
-0x5c9b,0x5cb1,0x5cc7,0x5cdd,0x5cf3,0x5d09,0x5d1f,0x5d35,
-0x5d4b,0x5d61,0x5d77,0x5d8d,0x5da3,0x5db9,0x5dce,0x5de4,
-0x5dfa,0x5e10,0x5e26,0x5e3b,0x5e51,0x5e67,0x5e7c,0x5e92,
-0x5ea8,0x5ebd,0x5ed3,0x5ee9,0x5efe,0x5f14,0x5f29,0x5f3f,
-0x5f54,0x5f6a,0x5f7f,0x5f95,0x5faa,0x5fbf,0x5fd5,0x5fea,
-0x6000,0x6015,0x602a,0x603f,0x6055,0x606a,0x607f,0x6094,
-0x60aa,0x60bf,0x60d4,0x60e9,0x60fe,0x6113,0x6128,0x613d,
-0x6152,0x6168,0x617d,0x6192,0x61a7,0x61bb,0x61d0,0x61e5,
-0x61fa,0x620f,0x6224,0x6239,0x624e,0x6263,0x6277,0x628c,
-0x62a1,0x62b6,0x62ca,0x62df,0x62f4,0x6309,0x631d,0x6332,
-0x6347,0x635b,0x6370,0x6384,0x6399,0x63ad,0x63c2,0x63d7,
-0x63eb,0x6400,0x6414,0x6428,0x643d,0x6451,0x6466,0x647a,
-0x648e,0x64a3,0x64b7,0x64cb,0x64e0,0x64f4,0x6508,0x651d,
-0x6531,0x6545,0x6559,0x656e,0x6582,0x6596,0x65aa,0x65be,
-0x65d2,0x65e6,0x65fa,0x660f,0x6623,0x6637,0x664b,0x665f,
-0x6673,0x6687,0x669b,0x66af,0x66c3,0x66d6,0x66ea,0x66fe,
-0x6712,0x6726,0x673a,0x674e,0x6761,0x6775,0x6789,0x679d,
-0x67b1,0x67c4,0x67d8,0x67ec,0x6800,0x6813,0x6827,0x683b,
-0x684e,0x6862,0x6875,0x6889,0x689d,0x68b0,0x68c4,0x68d7,
-0x68eb,0x68fe,0x6912,0x6925,0x6939,0x694c,0x6960,0x6973,
-0x6986,0x699a,0x69ad,0x69c1,0x69d4,0x69e7,0x69fb,0x6a0e,
-0x6a21,0x6a35,0x6a48,0x6a5b,0x6a6e,0x6a82,0x6a95,0x6aa8,
-0x6abb,0x6ace,0x6ae2,0x6af5,0x6b08,0x6b1b,0x6b2e,0x6b41,
-0x6b54,0x6b67,0x6b7a,0x6b8d,0x6ba1,0x6bb4,0x6bc7,0x6bda,
-0x6bed,0x6c00,0x6c12,0x6c25,0x6c38,0x6c4b,0x6c5e,0x6c71,
-0x6c84,0x6c97,0x6caa,0x6cbc,0x6ccf,0x6ce2,0x6cf5,0x6d08,
-0x6d1a,0x6d2d,0x6d40,0x6d53,0x6d65,0x6d78,0x6d8b,0x6d9e,
-0x6db0,0x6dc3,0x6dd6,0x6de8,0x6dfb,0x6e0d,0x6e20,0x6e33,
-0x6e45,0x6e58,0x6e6a,0x6e7d,0x6e8f,0x6ea2,0x6eb4,0x6ec7,
-0x6ed9,0x6eec,0x6efe,0x6f11,0x6f23,0x6f36,0x6f48,0x6f5a,
-0x6f6d,0x6f7f,0x6f92,0x6fa4,0x6fb6,0x6fc9,0x6fdb,0x6fed,
-0x7000,0x7012,0x7024,0x7036,0x7049,0x705b,0x706d,0x707f,
-0x7091,0x70a4,0x70b6,0x70c8,0x70da,0x70ec,0x70fe,0x7110,
-0x7123,0x7135,0x7147,0x7159,0x716b,0x717d,0x718f,0x71a1,
-0x71b3,0x71c5,0x71d7,0x71e9,0x71fb,0x720d,0x721f,0x7231,
-0x7243,0x7255,0x7267,0x7279,0x728a,0x729c,0x72ae,0x72c0,
-0x72d2,0x72e4,0x72f5,0x7307,0x7319,0x732b,0x733d,0x734e,
-0x7360,0x7372,0x7384,0x7395,0x73a7,0x73b9,0x73ca,0x73dc,
-0x73ee,0x7400,0x7411,0x7423,0x7434,0x7446,0x7458,0x7469,
-0x747b,0x748c,0x749e,0x74b0,0x74c1,0x74d3,0x74e4,0x74f6,
-0x7507,0x7519,0x752a,0x753c,0x754d,0x755f,0x7570,0x7581,
-0x7593,0x75a4,0x75b6,0x75c7,0x75d8,0x75ea,0x75fb,0x760d,
-0x761e,0x762f,0x7641,0x7652,0x7663,0x7674,0x7686,0x7697,
-0x76a8,0x76ba,0x76cb,0x76dc,0x76ed,0x76fe,0x7710,0x7721,
-0x7732,0x7743,0x7754,0x7766,0x7777,0x7788,0x7799,0x77aa,
-0x77bb,0x77cc,0x77dd,0x77ee,0x7800,0x7811,0x7822,0x7833,
-0x7844,0x7855,0x7866,0x7877,0x7888,0x7899,0x78aa,0x78bb,
-0x78cc,0x78dd,0x78ee,0x78fe,0x790f,0x7920,0x7931,0x7942,
-0x7953,0x7964,0x7975,0x7986,0x7996,0x79a7,0x79b8,0x79c9,
-0x79da,0x79eb,0x79fb,0x7a0c,0x7a1d,0x7a2e,0x7a3e,0x7a4f,
-0x7a60,0x7a71,0x7a81,0x7a92,0x7aa3,0x7ab3,0x7ac4,0x7ad5,
-0x7ae5,0x7af6,0x7b07,0x7b17,0x7b28,0x7b39,0x7b49,0x7b5a,
-0x7b6b,0x7b7b,0x7b8c,0x7b9c,0x7bad,0x7bbd,0x7bce,0x7bde,
-0x7bef,0x7c00,0x7c10,0x7c21,0x7c31,0x7c41,0x7c52,0x7c62,
-0x7c73,0x7c83,0x7c94,0x7ca4,0x7cb5,0x7cc5,0x7cd5,0x7ce6,
-0x7cf6,0x7d07,0x7d17,0x7d27,0x7d38,0x7d48,0x7d58,0x7d69,
-0x7d79,0x7d89,0x7d9a,0x7daa,0x7dba,0x7dcb,0x7ddb,0x7deb,
-0x7dfb,0x7e0c,0x7e1c,0x7e2c,0x7e3c,0x7e4d,0x7e5d,0x7e6d,
-0x7e7d,0x7e8d,0x7e9e,0x7eae,0x7ebe,0x7ece,0x7ede,0x7eee,
-0x7efe,0x7f0f,0x7f1f,0x7f2f,0x7f3f,0x7f4f,0x7f5f,0x7f6f,
-0x7f7f,0x7f8f,0x7f9f,0x7faf,0x7fbf,0x7fcf,0x7fdf,0x7fef,
-0x8000,0x800f,0x801f,0x802f,0x803f,0x804f,0x805f,0x806f,
-0x807f,0x808f,0x809f,0x80af,0x80bf,0x80cf,0x80df,0x80ef,
-0x80ff,0x810e,0x811e,0x812e,0x813e,0x814e,0x815e,0x816d,
-0x817d,0x818d,0x819d,0x81ad,0x81bc,0x81cc,0x81dc,0x81ec,
-0x81fc,0x820b,0x821b,0x822b,0x823b,0x824a,0x825a,0x826a,
-0x8279,0x8289,0x8299,0x82a8,0x82b8,0x82c8,0x82d7,0x82e7,
-0x82f7,0x8306,0x8316,0x8326,0x8335,0x8345,0x8354,0x8364,
-0x8374,0x8383,0x8393,0x83a2,0x83b2,0x83c1,0x83d1,0x83e0,
-0x83f0,0x8400,0x840f,0x841f,0x842e,0x843e,0x844d,0x845c,
-0x846c,0x847b,0x848b,0x849a,0x84aa,0x84b9,0x84c9,0x84d8,
-0x84e7,0x84f7,0x8506,0x8516,0x8525,0x8534,0x8544,0x8553,
-0x8562,0x8572,0x8581,0x8591,0x85a0,0x85af,0x85be,0x85ce,
-0x85dd,0x85ec,0x85fc,0x860b,0x861a,0x862a,0x8639,0x8648,
-0x8657,0x8667,0x8676,0x8685,0x8694,0x86a3,0x86b3,0x86c2,
-0x86d1,0x86e0,0x86ef,0x86ff,0x870e,0x871d,0x872c,0x873b,
-0x874a,0x8759,0x8769,0x8778,0x8787,0x8796,0x87a5,0x87b4,
-0x87c3,0x87d2,0x87e1,0x87f0,0x8800,0x880f,0x881e,0x882d,
-0x883c,0x884b,0x885a,0x8869,0x8878,0x8887,0x8896,0x88a5,
-0x88b4,0x88c3,0x88d2,0x88e1,0x88f0,0x88ff,0x890e,0x891c,
-0x892b,0x893a,0x8949,0x8958,0x8967,0x8976,0x8985,0x8994,
-0x89a3,0x89b2,0x89c0,0x89cf,0x89de,0x89ed,0x89fc,0x8a0b,
-0x8a19,0x8a28,0x8a37,0x8a46,0x8a55,0x8a64,0x8a72,0x8a81,
-0x8a90,0x8a9f,0x8aad,0x8abc,0x8acb,0x8ada,0x8ae8,0x8af7,
-0x8b06,0x8b15,0x8b23,0x8b32,0x8b41,0x8b50,0x8b5e,0x8b6d,
-0x8b7c,0x8b8a,0x8b99,0x8ba8,0x8bb6,0x8bc5,0x8bd4,0x8be2,
-0x8bf1,0x8c00,0x8c0e,0x8c1d,0x8c2b,0x8c3a,0x8c49,0x8c57,
-0x8c66,0x8c74,0x8c83,0x8c91,0x8ca0,0x8caf,0x8cbd,0x8ccc,
-0x8cda,0x8ce9,0x8cf7,0x8d06,0x8d14,0x8d23,0x8d31,0x8d40,
-0x8d4e,0x8d5d,0x8d6b,0x8d7a,0x8d88,0x8d97,0x8da5,0x8db4,
-0x8dc2,0x8dd1,0x8ddf,0x8ded,0x8dfc,0x8e0a,0x8e19,0x8e27,
-0x8e36,0x8e44,0x8e52,0x8e61,0x8e6f,0x8e7d,0x8e8c,0x8e9a,
-0x8ea9,0x8eb7,0x8ec5,0x8ed4,0x8ee2,0x8ef0,0x8eff,0x8f0d,
-0x8f1b,0x8f2a,0x8f38,0x8f46,0x8f54,0x8f63,0x8f71,0x8f7f,
-0x8f8e,0x8f9c,0x8faa,0x8fb8,0x8fc7,0x8fd5,0x8fe3,0x8ff1,
-0x9000,0x900e,0x901c,0x902a,0x9038,0x9047,0x9055,0x9063,
-0x9071,0x907f,0x908d,0x909c,0x90aa,0x90b8,0x90c6,0x90d4,
-0x90e2,0x90f0,0x90ff,0x910d,0x911b,0x9129,0x9137,0x9145,
-0x9153,0x9161,0x916f,0x917e,0x918c,0x919a,0x91a8,0x91b6,
-0x91c4,0x91d2,0x91e0,0x91ee,0x91fc,0x920a,0x9218,0x9226,
-0x9234,0x9242,0x9250,0x925e,0x926c,0x927a,0x9288,0x9296,
-0x92a4,0x92b2,0x92c0,0x92ce,0x92dc,0x92ea,0x92f8,0x9306,
-0x9314,0x9321,0x932f,0x933d,0x934b,0x9359,0x9367,0x9375,
-0x9383,0x9391,0x939f,0x93ac,0x93ba,0x93c8,0x93d6,0x93e4,
-0x93f2,0x9400,0x940d,0x941b,0x9429,0x9437,0x9445,0x9452,
-0x9460,0x946e,0x947c,0x948a,0x9497,0x94a5,0x94b3,0x94c1,
-0x94cf,0x94dc,0x94ea,0x94f8,0x9506,0x9513,0x9521,0x952f,
-0x953c,0x954a,0x9558,0x9566,0x9573,0x9581,0x958f,0x959c,
-0x95aa,0x95b8,0x95c5,0x95d3,0x95e1,0x95ee,0x95fc,0x960a,
-0x9617,0x9625,0x9633,0x9640,0x964e,0x965c,0x9669,0x9677,
-0x9684,0x9692,0x96a0,0x96ad,0x96bb,0x96c8,0x96d6,0x96e4,
-0x96f1,0x96ff,0x970c,0x971a,0x9727,0x9735,0x9742,0x9750,
-0x975d,0x976b,0x9779,0x9786,0x9794,0x97a1,0x97af,0x97bc,
-0x97ca,0x97d7,0x97e5,0x97f2,0x9800,0x980d,0x981a,0x9828,
-0x9835,0x9843,0x9850,0x985e,0x986b,0x9879,0x9886,0x9893,
-0x98a1,0x98ae,0x98bc,0x98c9,0x98d6,0x98e4,0x98f1,0x98ff,
-0x990c,0x9919,0x9927,0x9934,0x9942,0x994f,0x995c,0x996a,
-0x9977,0x9984,0x9992,0x999f,0x99ac,0x99ba,0x99c7,0x99d4,
-0x99e2,0x99ef,0x99fc,0x9a09,0x9a17,0x9a24,0x9a31,0x9a3f,
-0x9a4c,0x9a59,0x9a66,0x9a74,0x9a81,0x9a8e,0x9a9b,0x9aa9,
-0x9ab6,0x9ac3,0x9ad0,0x9ade,0x9aeb,0x9af8,0x9b05,0x9b12,
-0x9b20,0x9b2d,0x9b3a,0x9b47,0x9b54,0x9b62,0x9b6f,0x9b7c,
-0x9b89,0x9b96,0x9ba3,0x9bb1,0x9bbe,0x9bcb,0x9bd8,0x9be5,
-0x9bf2,0x9c00,0x9c0d,0x9c1a,0x9c27,0x9c34,0x9c41,0x9c4e,
-0x9c5b,0x9c68,0x9c75,0x9c83,0x9c90,0x9c9d,0x9caa,0x9cb7,
-0x9cc4,0x9cd1,0x9cde,0x9ceb,0x9cf8,0x9d05,0x9d12,0x9d1f,
-0x9d2c,0x9d39,0x9d46,0x9d53,0x9d60,0x9d6d,0x9d7a,0x9d87,
-0x9d94,0x9da1,0x9dae,0x9dbb,0x9dc8,0x9dd5,0x9de2,0x9def,
-0x9dfc,0x9e09,0x9e16,0x9e23,0x9e30,0x9e3d,0x9e4a,0x9e57,
-0x9e64,0x9e71,0x9e7e,0x9e8b,0x9e98,0x9ea4,0x9eb1,0x9ebe,
-0x9ecb,0x9ed8,0x9ee5,0x9ef2,0x9eff,0x9f0c,0x9f18,0x9f25,
-0x9f32,0x9f3f,0x9f4c,0x9f59,0x9f66,0x9f72,0x9f7f,0x9f8c,
-0x9f99,0x9fa6,0x9fb3,0x9fbf,0x9fcc,0x9fd9,0x9fe6,0x9ff3,
-0xa000,0xa00c,0xa019,0xa026,0xa033,0xa03f,0xa04c,0xa059,
-0xa066,0xa073,0xa07f,0xa08c,0xa099,0xa0a6,0xa0b2,0xa0bf,
-0xa0cc,0xa0d9,0xa0e5,0xa0f2,0xa0ff,0xa10b,0xa118,0xa125,
-0xa132,0xa13e,0xa14b,0xa158,0xa164,0xa171,0xa17e,0xa18a,
-0xa197,0xa1a4,0xa1b0,0xa1bd,0xa1ca,0xa1d6,0xa1e3,0xa1f0,
-0xa1fc,0xa209,0xa216,0xa222,0xa22f,0xa23c,0xa248,0xa255,
-0xa261,0xa26e,0xa27b,0xa287,0xa294,0xa2a0,0xa2ad,0xa2ba,
-0xa2c6,0xa2d3,0xa2df,0xa2ec,0xa2f8,0xa305,0xa312,0xa31e,
-0xa32b,0xa337,0xa344,0xa350,0xa35d,0xa369,0xa376,0xa382,
-0xa38f,0xa39b,0xa3a8,0xa3b5,0xa3c1,0xa3ce,0xa3da,0xa3e7,
-0xa3f3,0xa400,0xa40c,0xa418,0xa425,0xa431,0xa43e,0xa44a,
-0xa457,0xa463,0xa470,0xa47c,0xa489,0xa495,0xa4a2,0xa4ae,
-0xa4ba,0xa4c7,0xa4d3,0xa4e0,0xa4ec,0xa4f9,0xa505,0xa511,
-0xa51e,0xa52a,0xa537,0xa543,0xa54f,0xa55c,0xa568,0xa574,
-0xa581,0xa58d,0xa59a,0xa5a6,0xa5b2,0xa5bf,0xa5cb,0xa5d7,
-0xa5e4,0xa5f0,0xa5fc,0xa609,0xa615,0xa621,0xa62e,0xa63a,
-0xa646,0xa653,0xa65f,0xa66b,0xa678,0xa684,0xa690,0xa69d,
-0xa6a9,0xa6b5,0xa6c1,0xa6ce,0xa6da,0xa6e6,0xa6f2,0xa6ff,
-0xa70b,0xa717,0xa724,0xa730,0xa73c,0xa748,0xa754,0xa761,
-0xa76d,0xa779,0xa785,0xa792,0xa79e,0xa7aa,0xa7b6,0xa7c3,
-0xa7cf,0xa7db,0xa7e7,0xa7f3,0xa800,0xa80c,0xa818,0xa824,
-0xa830,0xa83c,0xa849,0xa855,0xa861,0xa86d,0xa879,0xa885,
-0xa892,0xa89e,0xa8aa,0xa8b6,0xa8c2,0xa8ce,0xa8da,0xa8e6,
-0xa8f3,0xa8ff,0xa90b,0xa917,0xa923,0xa92f,0xa93b,0xa947,
-0xa953,0xa960,0xa96c,0xa978,0xa984,0xa990,0xa99c,0xa9a8,
-0xa9b4,0xa9c0,0xa9cc,0xa9d8,0xa9e4,0xa9f0,0xa9fc,0xaa09,
-0xaa15,0xaa21,0xaa2d,0xaa39,0xaa45,0xaa51,0xaa5d,0xaa69,
-0xaa75,0xaa81,0xaa8d,0xaa99,0xaaa5,0xaab1,0xaabd,0xaac9,
-0xaad5,0xaae1,0xaaed,0xaaf9,0xab05,0xab11,0xab1d,0xab29,
-0xab35,0xab41,0xab4d,0xab58,0xab64,0xab70,0xab7c,0xab88,
-0xab94,0xaba0,0xabac,0xabb8,0xabc4,0xabd0,0xabdc,0xabe8,
-0xabf4,0xac00,0xac0b,0xac17,0xac23,0xac2f,0xac3b,0xac47,
-0xac53,0xac5f,0xac6b,0xac76,0xac82,0xac8e,0xac9a,0xaca6,
-0xacb2,0xacbe,0xacc9,0xacd5,0xace1,0xaced,0xacf9,0xad05,
-0xad11,0xad1c,0xad28,0xad34,0xad40,0xad4c,0xad57,0xad63,
-0xad6f,0xad7b,0xad87,0xad92,0xad9e,0xadaa,0xadb6,0xadc2,
-0xadcd,0xadd9,0xade5,0xadf1,0xadfd,0xae08,0xae14,0xae20,
-0xae2c,0xae37,0xae43,0xae4f,0xae5b,0xae66,0xae72,0xae7e,
-0xae8a,0xae95,0xaea1,0xaead,0xaeb8,0xaec4,0xaed0,0xaedc,
-0xaee7,0xaef3,0xaeff,0xaf0a,0xaf16,0xaf22,0xaf2e,0xaf39,
-0xaf45,0xaf51,0xaf5c,0xaf68,0xaf74,0xaf7f,0xaf8b,0xaf97,
-0xafa2,0xafae,0xafba,0xafc5,0xafd1,0xafdd,0xafe8,0xaff4,
-0xb000,0xb00b,0xb017,0xb022,0xb02e,0xb03a,0xb045,0xb051,
-0xb05c,0xb068,0xb074,0xb07f,0xb08b,0xb097,0xb0a2,0xb0ae,
-0xb0b9,0xb0c5,0xb0d0,0xb0dc,0xb0e8,0xb0f3,0xb0ff,0xb10a,
-0xb116,0xb121,0xb12d,0xb139,0xb144,0xb150,0xb15b,0xb167,
-0xb172,0xb17e,0xb189,0xb195,0xb1a0,0xb1ac,0xb1b8,0xb1c3,
-0xb1cf,0xb1da,0xb1e6,0xb1f1,0xb1fd,0xb208,0xb214,0xb21f,
-0xb22b,0xb236,0xb242,0xb24d,0xb259,0xb264,0xb270,0xb27b,
-0xb286,0xb292,0xb29d,0xb2a9,0xb2b4,0xb2c0,0xb2cb,0xb2d7,
-0xb2e2,0xb2ee,0xb2f9,0xb305,0xb310,0xb31b,0xb327,0xb332,
-0xb33e,0xb349,0xb355,0xb360,0xb36b,0xb377,0xb382,0xb38e,
-0xb399,0xb3a4,0xb3b0,0xb3bb,0xb3c7,0xb3d2,0xb3dd,0xb3e9,
-0xb3f4,0xb400,0xb40b,0xb416,0xb422,0xb42d,0xb438,0xb444,
-0xb44f,0xb45a,0xb466,0xb471,0xb47c,0xb488,0xb493,0xb49f,
-0xb4aa,0xb4b5,0xb4c1,0xb4cc,0xb4d7,0xb4e2,0xb4ee,0xb4f9,
-0xb504,0xb510,0xb51b,0xb526,0xb532,0xb53d,0xb548,0xb554,
-0xb55f,0xb56a,0xb575,0xb581,0xb58c,0xb597,0xb5a3,0xb5ae,
-0xb5b9,0xb5c4,0xb5d0,0xb5db,0xb5e6,0xb5f1,0xb5fd,0xb608,
-0xb613,0xb61e,0xb62a,0xb635,0xb640,0xb64b,0xb657,0xb662,
-0xb66d,0xb678,0xb684,0xb68f,0xb69a,0xb6a5,0xb6b0,0xb6bc,
-0xb6c7,0xb6d2,0xb6dd,0xb6e8,0xb6f4,0xb6ff,0xb70a,0xb715,
-0xb720,0xb72c,0xb737,0xb742,0xb74d,0xb758,0xb763,0xb76f,
-0xb77a,0xb785,0xb790,0xb79b,0xb7a6,0xb7b2,0xb7bd,0xb7c8,
-0xb7d3,0xb7de,0xb7e9,0xb7f4,0xb800,0xb80b,0xb816,0xb821,
-0xb82c,0xb837,0xb842,0xb84d,0xb858,0xb864,0xb86f,0xb87a,
-0xb885,0xb890,0xb89b,0xb8a6,0xb8b1,0xb8bc,0xb8c7,0xb8d3,
-0xb8de,0xb8e9,0xb8f4,0xb8ff,0xb90a,0xb915,0xb920,0xb92b,
-0xb936,0xb941,0xb94c,0xb957,0xb962,0xb96d,0xb978,0xb983,
-0xb98f,0xb99a,0xb9a5,0xb9b0,0xb9bb,0xb9c6,0xb9d1,0xb9dc,
-0xb9e7,0xb9f2,0xb9fd,0xba08,0xba13,0xba1e,0xba29,0xba34,
-0xba3f,0xba4a,0xba55,0xba60,0xba6b,0xba76,0xba81,0xba8c,
-0xba97,0xbaa2,0xbaad,0xbab8,0xbac3,0xbace,0xbad8,0xbae3,
-0xbaee,0xbaf9,0xbb04,0xbb0f,0xbb1a,0xbb25,0xbb30,0xbb3b,
-0xbb46,0xbb51,0xbb5c,0xbb67,0xbb72,0xbb7d,0xbb88,0xbb92,
-0xbb9d,0xbba8,0xbbb3,0xbbbe,0xbbc9,0xbbd4,0xbbdf,0xbbea,
-0xbbf5,0xbc00,0xbc0a,0xbc15,0xbc20,0xbc2b,0xbc36,0xbc41,
-0xbc4c,0xbc57,0xbc61,0xbc6c,0xbc77,0xbc82,0xbc8d,0xbc98,
-0xbca3,0xbcad,0xbcb8,0xbcc3,0xbcce,0xbcd9,0xbce4,0xbcef,
-0xbcf9,0xbd04,0xbd0f,0xbd1a,0xbd25,0xbd30,0xbd3a,0xbd45,
-0xbd50,0xbd5b,0xbd66,0xbd70,0xbd7b,0xbd86,0xbd91,0xbd9c,
-0xbda6,0xbdb1,0xbdbc,0xbdc7,0xbdd2,0xbddc,0xbde7,0xbdf2,
-0xbdfd,0xbe08,0xbe12,0xbe1d,0xbe28,0xbe33,0xbe3d,0xbe48,
-0xbe53,0xbe5e,0xbe68,0xbe73,0xbe7e,0xbe89,0xbe93,0xbe9e,
-0xbea9,0xbeb4,0xbebe,0xbec9,0xbed4,0xbedf,0xbee9,0xbef4,
-0xbeff,0xbf0a,0xbf14,0xbf1f,0xbf2a,0xbf34,0xbf3f,0xbf4a,
-0xbf55,0xbf5f,0xbf6a,0xbf75,0xbf7f,0xbf8a,0xbf95,0xbf9f,
-0xbfaa,0xbfb5,0xbfbf,0xbfca,0xbfd5,0xbfdf,0xbfea,0xbff5,
-0xc000,0xc00a,0xc015,0xc01f,0xc02a,0xc035,0xc03f,0xc04a,
-0xc055,0xc05f,0xc06a,0xc075,0xc07f,0xc08a,0xc095,0xc09f,
-0xc0aa,0xc0b5,0xc0bf,0xc0ca,0xc0d4,0xc0df,0xc0ea,0xc0f4,
-0xc0ff,0xc109,0xc114,0xc11f,0xc129,0xc134,0xc13e,0xc149,
-0xc154,0xc15e,0xc169,0xc173,0xc17e,0xc189,0xc193,0xc19e,
-0xc1a8,0xc1b3,0xc1bd,0xc1c8,0xc1d3,0xc1dd,0xc1e8,0xc1f2,
-0xc1fd,0xc207,0xc212,0xc21d,0xc227,0xc232,0xc23c,0xc247,
-0xc251,0xc25c,0xc266,0xc271,0xc27b,0xc286,0xc290,0xc29b,
-0xc2a5,0xc2b0,0xc2bb,0xc2c5,0xc2d0,0xc2da,0xc2e5,0xc2ef,
-0xc2fa,0xc304,0xc30f,0xc319,0xc324,0xc32e,0xc339,0xc343,
-0xc34e,0xc358,0xc363,0xc36d,0xc377,0xc382,0xc38c,0xc397,
-0xc3a1,0xc3ac,0xc3b6,0xc3c1,0xc3cb,0xc3d6,0xc3e0,0xc3eb,
-0xc3f5,0xc400,0xc40a,0xc414,0xc41f,0xc429,0xc434,0xc43e,
-0xc449,0xc453,0xc45d,0xc468,0xc472,0xc47d,0xc487,0xc492,
-0xc49c,0xc4a6,0xc4b1,0xc4bb,0xc4c6,0xc4d0,0xc4da,0xc4e5,
-0xc4ef,0xc4fa,0xc504,0xc50e,0xc519,0xc523,0xc52e,0xc538,
-0xc542,0xc54d,0xc557,0xc562,0xc56c,0xc576,0xc581,0xc58b,
-0xc595,0xc5a0,0xc5aa,0xc5b4,0xc5bf,0xc5c9,0xc5d4,0xc5de,
-0xc5e8,0xc5f3,0xc5fd,0xc607,0xc612,0xc61c,0xc626,0xc631,
-0xc63b,0xc645,0xc650,0xc65a,0xc664,0xc66f,0xc679,0xc683,
-0xc68e,0xc698,0xc6a2,0xc6ac,0xc6b7,0xc6c1,0xc6cb,0xc6d6,
-0xc6e0,0xc6ea,0xc6f5,0xc6ff,0xc709,0xc713,0xc71e,0xc728,
-0xc732,0xc73d,0xc747,0xc751,0xc75b,0xc766,0xc770,0xc77a,
-0xc784,0xc78f,0xc799,0xc7a3,0xc7ae,0xc7b8,0xc7c2,0xc7cc,
-0xc7d7,0xc7e1,0xc7eb,0xc7f5,0xc800,0xc80a,0xc814,0xc81e,
-0xc828,0xc833,0xc83d,0xc847,0xc851,0xc85c,0xc866,0xc870,
-0xc87a,0xc884,0xc88f,0xc899,0xc8a3,0xc8ad,0xc8b7,0xc8c2,
-0xc8cc,0xc8d6,0xc8e0,0xc8ea,0xc8f5,0xc8ff,0xc909,0xc913,
-0xc91d,0xc928,0xc932,0xc93c,0xc946,0xc950,0xc95a,0xc965,
-0xc96f,0xc979,0xc983,0xc98d,0xc997,0xc9a2,0xc9ac,0xc9b6,
-0xc9c0,0xc9ca,0xc9d4,0xc9df,0xc9e9,0xc9f3,0xc9fd,0xca07,
-0xca11,0xca1b,0xca26,0xca30,0xca3a,0xca44,0xca4e,0xca58,
-0xca62,0xca6c,0xca76,0xca81,0xca8b,0xca95,0xca9f,0xcaa9,
-0xcab3,0xcabd,0xcac7,0xcad1,0xcadc,0xcae6,0xcaf0,0xcafa,
-0xcb04,0xcb0e,0xcb18,0xcb22,0xcb2c,0xcb36,0xcb40,0xcb4a,
-0xcb55,0xcb5f,0xcb69,0xcb73,0xcb7d,0xcb87,0xcb91,0xcb9b,
-0xcba5,0xcbaf,0xcbb9,0xcbc3,0xcbcd,0xcbd7,0xcbe1,0xcbeb,
-0xcbf5,0xcc00,0xcc0a,0xcc14,0xcc1e,0xcc28,0xcc32,0xcc3c,
-0xcc46,0xcc50,0xcc5a,0xcc64,0xcc6e,0xcc78,0xcc82,0xcc8c,
-0xcc96,0xcca0,0xccaa,0xccb4,0xccbe,0xccc8,0xccd2,0xccdc,
-0xcce6,0xccf0,0xccfa,0xcd04,0xcd0e,0xcd18,0xcd22,0xcd2c,
-0xcd36,0xcd40,0xcd4a,0xcd54,0xcd5e,0xcd68,0xcd72,0xcd7c,
-0xcd86,0xcd90,0xcd99,0xcda3,0xcdad,0xcdb7,0xcdc1,0xcdcb,
-0xcdd5,0xcddf,0xcde9,0xcdf3,0xcdfd,0xce07,0xce11,0xce1b,
-0xce25,0xce2f,0xce39,0xce43,0xce4c,0xce56,0xce60,0xce6a,
-0xce74,0xce7e,0xce88,0xce92,0xce9c,0xcea6,0xceb0,0xceba,
-0xcec3,0xcecd,0xced7,0xcee1,0xceeb,0xcef5,0xceff,0xcf09,
-0xcf13,0xcf1d,0xcf26,0xcf30,0xcf3a,0xcf44,0xcf4e,0xcf58,
-0xcf62,0xcf6c,0xcf75,0xcf7f,0xcf89,0xcf93,0xcf9d,0xcfa7,
-0xcfb1,0xcfbb,0xcfc4,0xcfce,0xcfd8,0xcfe2,0xcfec,0xcff6,
-0xd000,0xd009,0xd013,0xd01d,0xd027,0xd031,0xd03b,0xd044,
-0xd04e,0xd058,0xd062,0xd06c,0xd076,0xd07f,0xd089,0xd093,
-0xd09d,0xd0a7,0xd0b0,0xd0ba,0xd0c4,0xd0ce,0xd0d8,0xd0e1,
-0xd0eb,0xd0f5,0xd0ff,0xd109,0xd112,0xd11c,0xd126,0xd130,
-0xd13a,0xd143,0xd14d,0xd157,0xd161,0xd16b,0xd174,0xd17e,
-0xd188,0xd192,0xd19b,0xd1a5,0xd1af,0xd1b9,0xd1c3,0xd1cc,
-0xd1d6,0xd1e0,0xd1ea,0xd1f3,0xd1fd,0xd207,0xd211,0xd21a,
-0xd224,0xd22e,0xd238,0xd241,0xd24b,0xd255,0xd25f,0xd268,
-0xd272,0xd27c,0xd285,0xd28f,0xd299,0xd2a3,0xd2ac,0xd2b6,
-0xd2c0,0xd2c9,0xd2d3,0xd2dd,0xd2e7,0xd2f0,0xd2fa,0xd304,
-0xd30d,0xd317,0xd321,0xd32b,0xd334,0xd33e,0xd348,0xd351,
-0xd35b,0xd365,0xd36e,0xd378,0xd382,0xd38b,0xd395,0xd39f,
-0xd3a8,0xd3b2,0xd3bc,0xd3c6,0xd3cf,0xd3d9,0xd3e3,0xd3ec,
-0xd3f6,0xd400,0xd409,0xd413,0xd41c,0xd426,0xd430,0xd439,
-0xd443,0xd44d,0xd456,0xd460,0xd46a,0xd473,0xd47d,0xd487,
-0xd490,0xd49a,0xd4a3,0xd4ad,0xd4b7,0xd4c0,0xd4ca,0xd4d4,
-0xd4dd,0xd4e7,0xd4f0,0xd4fa,0xd504,0xd50d,0xd517,0xd521,
-0xd52a,0xd534,0xd53d,0xd547,0xd551,0xd55a,0xd564,0xd56d,
-0xd577,0xd581,0xd58a,0xd594,0xd59d,0xd5a7,0xd5b0,0xd5ba,
-0xd5c4,0xd5cd,0xd5d7,0xd5e0,0xd5ea,0xd5f4,0xd5fd,0xd607,
-0xd610,0xd61a,0xd623,0xd62d,0xd637,0xd640,0xd64a,0xd653,
-0xd65d,0xd666,0xd670,0xd679,0xd683,0xd68c,0xd696,0xd6a0,
-0xd6a9,0xd6b3,0xd6bc,0xd6c6,0xd6cf,0xd6d9,0xd6e2,0xd6ec,
-0xd6f5,0xd6ff,0xd708,0xd712,0xd71b,0xd725,0xd72f,0xd738,
-0xd742,0xd74b,0xd755,0xd75e,0xd768,0xd771,0xd77b,0xd784,
-0xd78e,0xd797,0xd7a1,0xd7aa,0xd7b4,0xd7bd,0xd7c7,0xd7d0,
-0xd7da,0xd7e3,0xd7ed,0xd7f6,0xd800,0xd809,0xd812,0xd81c,
-0xd825,0xd82f,0xd838,0xd842,0xd84b,0xd855,0xd85e,0xd868,
-0xd871,0xd87b,0xd884,0xd88e,0xd897,0xd8a0,0xd8aa,0xd8b3,
-0xd8bd,0xd8c6,0xd8d0,0xd8d9,0xd8e3,0xd8ec,0xd8f5,0xd8ff,
-0xd908,0xd912,0xd91b,0xd925,0xd92e,0xd938,0xd941,0xd94a,
-0xd954,0xd95d,0xd967,0xd970,0xd979,0xd983,0xd98c,0xd996,
-0xd99f,0xd9a9,0xd9b2,0xd9bb,0xd9c5,0xd9ce,0xd9d8,0xd9e1,
-0xd9ea,0xd9f4,0xd9fd,0xda07,0xda10,0xda19,0xda23,0xda2c,
-0xda35,0xda3f,0xda48,0xda52,0xda5b,0xda64,0xda6e,0xda77,
-0xda81,0xda8a,0xda93,0xda9d,0xdaa6,0xdaaf,0xdab9,0xdac2,
-0xdacb,0xdad5,0xdade,0xdae8,0xdaf1,0xdafa,0xdb04,0xdb0d,
-0xdb16,0xdb20,0xdb29,0xdb32,0xdb3c,0xdb45,0xdb4e,0xdb58,
-0xdb61,0xdb6a,0xdb74,0xdb7d,0xdb86,0xdb90,0xdb99,0xdba2,
-0xdbac,0xdbb5,0xdbbe,0xdbc8,0xdbd1,0xdbda,0xdbe4,0xdbed,
-0xdbf6,0xdc00,0xdc09,0xdc12,0xdc1b,0xdc25,0xdc2e,0xdc37,
-0xdc41,0xdc4a,0xdc53,0xdc5d,0xdc66,0xdc6f,0xdc78,0xdc82,
-0xdc8b,0xdc94,0xdc9e,0xdca7,0xdcb0,0xdcb9,0xdcc3,0xdccc,
-0xdcd5,0xdcde,0xdce8,0xdcf1,0xdcfa,0xdd04,0xdd0d,0xdd16,
-0xdd1f,0xdd29,0xdd32,0xdd3b,0xdd44,0xdd4e,0xdd57,0xdd60,
-0xdd69,0xdd73,0xdd7c,0xdd85,0xdd8e,0xdd98,0xdda1,0xddaa,
-0xddb3,0xddbd,0xddc6,0xddcf,0xddd8,0xdde2,0xddeb,0xddf4,
-0xddfd,0xde06,0xde10,0xde19,0xde22,0xde2b,0xde35,0xde3e,
-0xde47,0xde50,0xde59,0xde63,0xde6c,0xde75,0xde7e,0xde87,
-0xde91,0xde9a,0xdea3,0xdeac,0xdeb5,0xdebf,0xdec8,0xded1,
-0xdeda,0xdee3,0xdeed,0xdef6,0xdeff,0xdf08,0xdf11,0xdf1a,
-0xdf24,0xdf2d,0xdf36,0xdf3f,0xdf48,0xdf52,0xdf5b,0xdf64,
-0xdf6d,0xdf76,0xdf7f,0xdf89,0xdf92,0xdf9b,0xdfa4,0xdfad,
-0xdfb6,0xdfbf,0xdfc9,0xdfd2,0xdfdb,0xdfe4,0xdfed,0xdff6,
-0xe000,0xe009,0xe012,0xe01b,0xe024,0xe02d,0xe036,0xe03f,
-0xe049,0xe052,0xe05b,0xe064,0xe06d,0xe076,0xe07f,0xe088,
-0xe092,0xe09b,0xe0a4,0xe0ad,0xe0b6,0xe0bf,0xe0c8,0xe0d1,
-0xe0db,0xe0e4,0xe0ed,0xe0f6,0xe0ff,0xe108,0xe111,0xe11a,
-0xe123,0xe12c,0xe136,0xe13f,0xe148,0xe151,0xe15a,0xe163,
-0xe16c,0xe175,0xe17e,0xe187,0xe190,0xe199,0xe1a3,0xe1ac,
-0xe1b5,0xe1be,0xe1c7,0xe1d0,0xe1d9,0xe1e2,0xe1eb,0xe1f4,
-0xe1fd,0xe206,0xe20f,0xe218,0xe221,0xe22b,0xe234,0xe23d,
-0xe246,0xe24f,0xe258,0xe261,0xe26a,0xe273,0xe27c,0xe285,
-0xe28e,0xe297,0xe2a0,0xe2a9,0xe2b2,0xe2bb,0xe2c4,0xe2cd,
-0xe2d6,0xe2df,0xe2e8,0xe2f1,0xe2fa,0xe303,0xe30c,0xe315,
-0xe31f,0xe328,0xe331,0xe33a,0xe343,0xe34c,0xe355,0xe35e,
-0xe367,0xe370,0xe379,0xe382,0xe38b,0xe394,0xe39d,0xe3a6,
-0xe3af,0xe3b8,0xe3c1,0xe3ca,0xe3d3,0xe3dc,0xe3e5,0xe3ee,
-0xe3f7,0xe400,0xe408,0xe411,0xe41a,0xe423,0xe42c,0xe435,
-0xe43e,0xe447,0xe450,0xe459,0xe462,0xe46b,0xe474,0xe47d,
-0xe486,0xe48f,0xe498,0xe4a1,0xe4aa,0xe4b3,0xe4bc,0xe4c5,
-0xe4ce,0xe4d7,0xe4e0,0xe4e9,0xe4f2,0xe4fa,0xe503,0xe50c,
-0xe515,0xe51e,0xe527,0xe530,0xe539,0xe542,0xe54b,0xe554,
-0xe55d,0xe566,0xe56f,0xe578,0xe580,0xe589,0xe592,0xe59b,
-0xe5a4,0xe5ad,0xe5b6,0xe5bf,0xe5c8,0xe5d1,0xe5da,0xe5e3,
-0xe5eb,0xe5f4,0xe5fd,0xe606,0xe60f,0xe618,0xe621,0xe62a,
-0xe633,0xe63c,0xe644,0xe64d,0xe656,0xe65f,0xe668,0xe671,
-0xe67a,0xe683,0xe68c,0xe694,0xe69d,0xe6a6,0xe6af,0xe6b8,
-0xe6c1,0xe6ca,0xe6d3,0xe6db,0xe6e4,0xe6ed,0xe6f6,0xe6ff,
-0xe708,0xe711,0xe71a,0xe722,0xe72b,0xe734,0xe73d,0xe746,
-0xe74f,0xe758,0xe760,0xe769,0xe772,0xe77b,0xe784,0xe78d,
-0xe795,0xe79e,0xe7a7,0xe7b0,0xe7b9,0xe7c2,0xe7cb,0xe7d3,
-0xe7dc,0xe7e5,0xe7ee,0xe7f7,0xe800,0xe808,0xe811,0xe81a,
-0xe823,0xe82c,0xe834,0xe83d,0xe846,0xe84f,0xe858,0xe861,
-0xe869,0xe872,0xe87b,0xe884,0xe88d,0xe895,0xe89e,0xe8a7,
-0xe8b0,0xe8b9,0xe8c1,0xe8ca,0xe8d3,0xe8dc,0xe8e5,0xe8ed,
-0xe8f6,0xe8ff,0xe908,0xe911,0xe919,0xe922,0xe92b,0xe934,
-0xe93c,0xe945,0xe94e,0xe957,0xe960,0xe968,0xe971,0xe97a,
-0xe983,0xe98b,0xe994,0xe99d,0xe9a6,0xe9ae,0xe9b7,0xe9c0,
-0xe9c9,0xe9d2,0xe9da,0xe9e3,0xe9ec,0xe9f5,0xe9fd,0xea06,
-0xea0f,0xea18,0xea20,0xea29,0xea32,0xea3b,0xea43,0xea4c,
-0xea55,0xea5e,0xea66,0xea6f,0xea78,0xea80,0xea89,0xea92,
-0xea9b,0xeaa3,0xeaac,0xeab5,0xeabe,0xeac6,0xeacf,0xead8,
-0xeae0,0xeae9,0xeaf2,0xeafb,0xeb03,0xeb0c,0xeb15,0xeb1d,
-0xeb26,0xeb2f,0xeb38,0xeb40,0xeb49,0xeb52,0xeb5a,0xeb63,
-0xeb6c,0xeb74,0xeb7d,0xeb86,0xeb8f,0xeb97,0xeba0,0xeba9,
-0xebb1,0xebba,0xebc3,0xebcb,0xebd4,0xebdd,0xebe5,0xebee,
-0xebf7,0xec00,0xec08,0xec11,0xec1a,0xec22,0xec2b,0xec34,
-0xec3c,0xec45,0xec4e,0xec56,0xec5f,0xec68,0xec70,0xec79,
-0xec82,0xec8a,0xec93,0xec9c,0xeca4,0xecad,0xecb5,0xecbe,
-0xecc7,0xeccf,0xecd8,0xece1,0xece9,0xecf2,0xecfb,0xed03,
-0xed0c,0xed15,0xed1d,0xed26,0xed2e,0xed37,0xed40,0xed48,
-0xed51,0xed5a,0xed62,0xed6b,0xed74,0xed7c,0xed85,0xed8d,
-0xed96,0xed9f,0xeda7,0xedb0,0xedb8,0xedc1,0xedca,0xedd2,
-0xeddb,0xede4,0xedec,0xedf5,0xedfd,0xee06,0xee0f,0xee17,
-0xee20,0xee28,0xee31,0xee3a,0xee42,0xee4b,0xee53,0xee5c,
-0xee65,0xee6d,0xee76,0xee7e,0xee87,0xee8f,0xee98,0xeea1,
-0xeea9,0xeeb2,0xeeba,0xeec3,0xeecc,0xeed4,0xeedd,0xeee5,
-0xeeee,0xeef6,0xeeff,0xef08,0xef10,0xef19,0xef21,0xef2a,
-0xef32,0xef3b,0xef43,0xef4c,0xef55,0xef5d,0xef66,0xef6e,
-0xef77,0xef7f,0xef88,0xef90,0xef99,0xefa2,0xefaa,0xefb3,
-0xefbb,0xefc4,0xefcc,0xefd5,0xefdd,0xefe6,0xefee,0xeff7,
-0xf000,0xf008,0xf011,0xf019,0xf022,0xf02a,0xf033,0xf03b,
-0xf044,0xf04c,0xf055,0xf05d,0xf066,0xf06e,0xf077,0xf07f,
-0xf088,0xf090,0xf099,0xf0a1,0xf0aa,0xf0b2,0xf0bb,0xf0c3,
-0xf0cc,0xf0d4,0xf0dd,0xf0e5,0xf0ee,0xf0f6,0xf0ff,0xf107,
-0xf110,0xf118,0xf121,0xf129,0xf132,0xf13a,0xf143,0xf14b,
-0xf154,0xf15c,0xf165,0xf16d,0xf176,0xf17e,0xf187,0xf18f,
-0xf198,0xf1a0,0xf1a9,0xf1b1,0xf1ba,0xf1c2,0xf1cb,0xf1d3,
-0xf1dc,0xf1e4,0xf1ec,0xf1f5,0xf1fd,0xf206,0xf20e,0xf217,
-0xf21f,0xf228,0xf230,0xf239,0xf241,0xf24a,0xf252,0xf25a,
-0xf263,0xf26b,0xf274,0xf27c,0xf285,0xf28d,0xf296,0xf29e,
-0xf2a6,0xf2af,0xf2b7,0xf2c0,0xf2c8,0xf2d1,0xf2d9,0xf2e1,
-0xf2ea,0xf2f2,0xf2fb,0xf303,0xf30c,0xf314,0xf31c,0xf325,
-0xf32d,0xf336,0xf33e,0xf347,0xf34f,0xf357,0xf360,0xf368,
-0xf371,0xf379,0xf381,0xf38a,0xf392,0xf39b,0xf3a3,0xf3ac,
-0xf3b4,0xf3bc,0xf3c5,0xf3cd,0xf3d6,0xf3de,0xf3e6,0xf3ef,
-0xf3f7,0xf400,0xf408,0xf410,0xf419,0xf421,0xf429,0xf432,
-0xf43a,0xf443,0xf44b,0xf453,0xf45c,0xf464,0xf46d,0xf475,
-0xf47d,0xf486,0xf48e,0xf496,0xf49f,0xf4a7,0xf4b0,0xf4b8,
-0xf4c0,0xf4c9,0xf4d1,0xf4d9,0xf4e2,0xf4ea,0xf4f2,0xf4fb,
-0xf503,0xf50c,0xf514,0xf51c,0xf525,0xf52d,0xf535,0xf53e,
-0xf546,0xf54e,0xf557,0xf55f,0xf567,0xf570,0xf578,0xf580,
-0xf589,0xf591,0xf599,0xf5a2,0xf5aa,0xf5b2,0xf5bb,0xf5c3,
-0xf5cb,0xf5d4,0xf5dc,0xf5e4,0xf5ed,0xf5f5,0xf5fd,0xf606,
-0xf60e,0xf616,0xf61f,0xf627,0xf62f,0xf638,0xf640,0xf648,
-0xf651,0xf659,0xf661,0xf66a,0xf672,0xf67a,0xf682,0xf68b,
-0xf693,0xf69b,0xf6a4,0xf6ac,0xf6b4,0xf6bd,0xf6c5,0xf6cd,
-0xf6d6,0xf6de,0xf6e6,0xf6ee,0xf6f7,0xf6ff,0xf707,0xf710,
-0xf718,0xf720,0xf728,0xf731,0xf739,0xf741,0xf74a,0xf752,
-0xf75a,0xf762,0xf76b,0xf773,0xf77b,0xf784,0xf78c,0xf794,
-0xf79c,0xf7a5,0xf7ad,0xf7b5,0xf7bd,0xf7c6,0xf7ce,0xf7d6,
-0xf7de,0xf7e7,0xf7ef,0xf7f7,0xf800,0xf808,0xf810,0xf818,
-0xf821,0xf829,0xf831,0xf839,0xf842,0xf84a,0xf852,0xf85a,
-0xf863,0xf86b,0xf873,0xf87b,0xf883,0xf88c,0xf894,0xf89c,
-0xf8a4,0xf8ad,0xf8b5,0xf8bd,0xf8c5,0xf8ce,0xf8d6,0xf8de,
-0xf8e6,0xf8ef,0xf8f7,0xf8ff,0xf907,0xf90f,0xf918,0xf920,
-0xf928,0xf930,0xf939,0xf941,0xf949,0xf951,0xf959,0xf962,
-0xf96a,0xf972,0xf97a,0xf982,0xf98b,0xf993,0xf99b,0xf9a3,
-0xf9ab,0xf9b4,0xf9bc,0xf9c4,0xf9cc,0xf9d4,0xf9dd,0xf9e5,
-0xf9ed,0xf9f5,0xf9fd,0xfa06,0xfa0e,0xfa16,0xfa1e,0xfa26,
-0xfa2f,0xfa37,0xfa3f,0xfa47,0xfa4f,0xfa58,0xfa60,0xfa68,
-0xfa70,0xfa78,0xfa80,0xfa89,0xfa91,0xfa99,0xfaa1,0xfaa9,
-0xfab1,0xfaba,0xfac2,0xfaca,0xfad2,0xfada,0xfae2,0xfaeb,
-0xfaf3,0xfafb,0xfb03,0xfb0b,0xfb13,0xfb1c,0xfb24,0xfb2c,
-0xfb34,0xfb3c,0xfb44,0xfb4c,0xfb55,0xfb5d,0xfb65,0xfb6d,
-0xfb75,0xfb7d,0xfb85,0xfb8e,0xfb96,0xfb9e,0xfba6,0xfbae,
-0xfbb6,0xfbbe,0xfbc7,0xfbcf,0xfbd7,0xfbdf,0xfbe7,0xfbef,
-0xfbf7,0xfc00,0xfc08,0xfc10,0xfc18,0xfc20,0xfc28,0xfc30,
-0xfc38,0xfc40,0xfc49,0xfc51,0xfc59,0xfc61,0xfc69,0xfc71,
-0xfc79,0xfc81,0xfc8a,0xfc92,0xfc9a,0xfca2,0xfcaa,0xfcb2,
-0xfcba,0xfcc2,0xfcca,0xfcd2,0xfcdb,0xfce3,0xfceb,0xfcf3,
-0xfcfb,0xfd03,0xfd0b,0xfd13,0xfd1b,0xfd23,0xfd2c,0xfd34,
-0xfd3c,0xfd44,0xfd4c,0xfd54,0xfd5c,0xfd64,0xfd6c,0xfd74,
-0xfd7c,0xfd84,0xfd8d,0xfd95,0xfd9d,0xfda5,0xfdad,0xfdb5,
-0xfdbd,0xfdc5,0xfdcd,0xfdd5,0xfddd,0xfde5,0xfded,0xfdf5,
-0xfdfd,0xfe06,0xfe0e,0xfe16,0xfe1e,0xfe26,0xfe2e,0xfe36,
-0xfe3e,0xfe46,0xfe4e,0xfe56,0xfe5e,0xfe66,0xfe6e,0xfe76,
-0xfe7e,0xfe86,0xfe8e,0xfe97,0xfe9f,0xfea7,0xfeaf,0xfeb7,
-0xfebf,0xfec7,0xfecf,0xfed7,0xfedf,0xfee7,0xfeef,0xfef7,
-0xfeff,0xff07,0xff0f,0xff17,0xff1f,0xff27,0xff2f,0xff37,
-0xff3f,0xff47,0xff4f,0xff57,0xff5f,0xff67,0xff6f,0xff77,
-0xff7f,0xff87,0xff8f,0xff97,0xff9f,0xffa7,0xffaf,0xffb7,
-0xffbf,0xffc7,0xffcf,0xffd7,0xffdf,0xffe7,0xffef,0xfff7
-];
-
-const RA144_CODEBOOK1: [u16; 128] = [
- 19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671,
- 20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411,
- 20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387,
- 21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852,
- 19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086,
- 21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159,
- 19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004,
- 21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781,
- 19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556,
- 18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770,
- 17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138,
- 16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675,
- 20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477,
- 19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389,
- 17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363,
- 16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657,
-];
-const RA144_VECTORS1: [[i8; BLOCKSIZE]; 128] = [
- [
- 38, -4, 15, -4, 14, -13, 12, -11, -2, -6,
- -6, -11, -45, -16, -11, -13, -7, 6, -12, 4,
- -20, 3, -16, 12, -1, 12, 46, 24, 0, 33,
- -3, 9, -12, -12, -8, -7, 17, -6, 0, -2,
- ], [
- 60, -16, 3, -22, 10, -32, 0, -28, -17, -18,
- -3, -25, -37, -23, -10, 3, 2, 3, 0, 3,
- -14, 0, -14, -1, 0, 2, 32, 9, -1, 25,
- 7, 13, -5, 13, 8, 1, 2, 8, -10, 6,
- ], [
- 27, -12, 28, -2, 6, -7, 15, 9, -11, 1,
- -13, -11, -40, 4, -29, -14, -19, -5, -23, -8,
- -30, -13, -17, 0, -14, 12, 34, 20, -2, 25,
- 2, -16, -4, -12, 15, 16, 29, 7, 24, 10,
- ], [
- 49, -24, 16, -20, 2, -26, 2, -7, -25, -10,
- -11, -25, -32, -3, -27, 2, -8, -8, -11, -9,
- -24, -17, -16, -14, -13, 2, 20, 5, -4, 17,
- 14, -12, 3, 13, 33, 25, 14, 23, 15, 19,
- ], [
- 46, -6, 21, 8, -2, -16, -5, -8, -11, 4,
- 8, 15, -24, 4, -2, -26, -3, -16, -16, -14,
- -9, -2, -1, 4, 19, 7, 36, 17, 9, 13,
- 0, 31, -5, -12, 7, -8, 11, -15, -13, -4,
- ], [
- 68, -18, 9, -9, -6, -35, -18, -25, -26, -7,
- 10, 1, -16, -3, -1, -9, 6, -19, -4, -15,
- -4, -6, 0, -8, 20, -2, 23, 2, 7, 5,
- 12, 35, 1, 13, 24, 0, -3, 0, -22, 4,
- ], [
- 35, -14, 34, 10, -10, -10, -1, 12, -20, 12,
- 0, 15, -18, 24, -20, -27, -14, -28, -27, -27,
- -20, -19, -2, -8, 5, 7, 25, 13, 5, 5,
- 6, 5, 2, -12, 31, 15, 23, -1, 12, 8,
- ], [
- 57, -26, 22, -7, -14, -28, -14, -3, -35, 0,
- 3, 1, -11, 16, -18, -10, -4, -31, -15, -28,
- -14, -23, -1, -21, 7, -2, 11, -1, 3, -1,
- 18, 9, 10, 13, 49, 24, 8, 14, 2, 16,
- ], [
- 25, 15, 22, 11, 18, 4, 15, -22, 8, -2,
- -17, -9, -48, -20, -30, -17, -16, 11, -1, 16,
- 2, 10, -5, 26, -2, -4, 22, 0, 2, 10,
- -6, 13, -14, 10, -23, 0, 10, -2, 1, 0,
- ], [
- 47, 3, 11, -6, 15, -13, 2, -38, -6, -13,
- -15, -22, -40, -28, -28, 0, -5, 8, 10, 15,
- 7, 7, -4, 13, -1, -14, 9, -14, 0, 2,
- 4, 18, -7, 36, -6, 8, -3, 13, -7, 8,
- ], [
- 14, 7, 36, 13, 10, 10, 18, 0, 0, 5,
- -25, -8, -43, 0, -48, -18, -27, 0, -12, 3,
- -7, -6, -7, 13, -15, -5, 11, -3, 0, 2,
- 0, -12, -6, 10, 0, 23, 22, 11, 26, 12,
- ], [
- 36, -5, 24, -4, 7, -7, 6, -17, -14, -5,
- -22, -22, -35, -8, -46, -1, -17, -3, 0, 2,
- -2, -10, -5, 0, -14, -15, -2, -18, -2, -4,
- 11, -7, 1, 36, 18, 32, 7, 27, 17, 20,
- ], [
- 33, 13, 29, 24, 1, 1, -2, -18, 0, 9,
- -3, 17, -27, 0, -21, -30, -12, -11, -5, -2,
- 12, 4, 9, 19, 18, -9, 13, -6, 11, -8,
- -2, 35, -8, 10, -7, -1, 4, -11, -10, -2,
- ], [
- 55, 1, 17, 6, -1, -16, -15, -35, -15, -2,
- 0, 4, -19, -8, -20, -13, -1, -14, 7, -3,
- 18, 0, 10, 5, 19, -19, 0, -21, 8, -16,
- 9, 39, 0, 36, 10, 7, -9, 4, -20, 5,
- ], [
- 22, 5, 42, 26, -6, 8, 1, 2, -9, 17,
- -10, 18, -21, 19, -39, -31, -23, -23, -16, -15,
- 2, -12, 7, 6, 5, -9, 1, -10, 7, -16,
- 4, 9, 0, 10, 17, 22, 16, 2, 14, 9,
- ], [
- 44, -6, 30, 8, -9, -10, -11, -14, -23, 5,
- -8, 4, -14, 12, -37, -14, -12, -26, -4, -16,
- 8, -16, 9, -7, 6, -19, -12, -25, 5, -24,
- 15, 13, 8, 36, 34, 31, 1, 18, 4, 18,
- ], [
- -3, -5, -9, -7, 15, -1, 5, 13, 2, 12,
- 5, 2, -21, -23, -2, -16, 0, 5, -6, 13,
- -23, 3, -32, 10, -15, 8, 44, 28, 9, 37,
- -2, 13, -9, -15, -12, -27, -7, -12, 0, -11,
- ], [
- 18, -17, -21, -25, 11, -19, -6, -3, -11, 0,
- 7, -11, -13, -31, -1, 0, 9, 1, 5, 12,
- -18, 0, -31, -2, -13, -1, 30, 14, 7, 29,
- 9, 18, -1, 10, 4, -18, -22, 3, -10, -2,
- ], [
- -13, -13, 3, -5, 7, 4, 9, 34, -5, 20,
- -2, 3, -16, -3, -20, -17, -11, -7, -17, 0,
- -34, -13, -33, -2, -28, 8, 32, 24, 5, 29,
- 3, -12, 0, -15, 11, -3, 3, 2, 24, 1,
- ], [
- 8, -25, -8, -23, 3, -13, -3, 17, -20, 8,
- 0, -10, -8, -11, -18, 0, -1, -10, -5, 0,
- -28, -17, -32, -15, -26, -1, 19, 9, 3, 21,
- 15, -7, 6, 9, 29, 5, -10, 17, 15, 9,
- ], [
- 4, -6, -3, 5, -1, -4, -11, 16, -6, 23,
- 19, 29, 0, -3, 6, -30, 3, -17, -10, -5,
- -13, -2, -17, 3, 5, 3, 35, 21, 17, 17,
- 2, 35, -2, -15, 3, -28, -13, -21, -13, -13,
- ], [
- 26, -19, -15, -12, -5, -22, -24, 0, -21, 12,
- 21, 15, 8, -11, 7, -12, 14, -20, 2, -6,
- -7, -6, -16, -9, 6, -5, 21, 7, 15, 10,
- 13, 39, 5, 10, 20, -19, -28, -5, -22, -5,
- ], [
- -5, -15, 9, 7, -9, 2, -8, 37, -14, 31,
- 11, 29, 5, 16, -11, -30, -7, -29, -21, -18,
- -23, -19, -18, -9, -7, 3, 23, 17, 14, 9,
- 8, 9, 6, -15, 27, -4, -2, -6, 12, -1,
- ], [
- 16, -27, -2, -10, -13, -16, -20, 20, -29, 20,
- 14, 16, 13, 8, -9, -13, 2, -33, -9, -19,
- -17, -23, -17, -22, -6, -6, 9, 2, 12, 2,
- 20, 13, 13, 10, 45, 4, -16, 8, 2, 7,
- ], [
- -16, 14, -2, 8, 20, 17, 9, 2, 14, 16,
- -6, 5, -24, -28, -21, -20, -8, 9, 4, 25,
- -1, 11, -22, 24, -15, -8, 21, 5, 11, 14,
- -5, 18, -11, 7, -27, -20, -14, -7, 1, -9,
- ], [
- 6, 2, -14, -9, 16, -1, -3, -14, 0, 5,
- -3, -8, -16, -36, -19, -3, 1, 6, 17, 24,
- 4, 7, -21, 11, -14, -18, 7, -9, 9, 7,
- 6, 22, -3, 33, -10, -11, -28, 7, -7, 0,
- ], [
- -26, 6, 11, 10, 12, 23, 12, 23, 5, 24,
- -13, 5, -19, -8, -38, -21, -20, -2, -6, 12,
- -11, -5, -23, 11, -29, -9, 9, 0, 7, 6,
- 1, -7, -2, 7, -3, 3, -2, 6, 27, 3,
- ], [
- -4, -6, 0, -7, 8, 4, 0, 6, -9, 13,
- -11, -7, -11, -15, -37, -4, -9, -5, 5, 11,
- -5, -9, -22, -1, -27, -18, -4, -14, 5, 0,
- 12, -3, 4, 32, 14, 12, -17, 22, 17, 11,
- ], [
- -8, 12, 3, 21, 3, 14, -8, 5, 4, 28,
- 7, 32, -2, -8, -12, -34, -4, -12, 1, 6,
- 9, 4, -7, 17, 4, -13, 11, -1, 19, -4,
- 0, 39, -4, 7, -11, -21, -20, -16, -10, -11,
- ], [
- 13, 0, -8, 3, 0, -4, -21, -11, -9, 16,
- 10, 18, 5, -16, -10, -16, 5, -15, 13, 5,
- 15, 1, -6, 4, 6, -23, -2, -16, 17, -12,
- 10, 44, 3, 33, 6, -12, -34, -1, -20, -3,
- ], [
- -18, 4, 17, 23, -4, 20, -4, 26, -3, 36,
- 0, 32, 2, 12, -29, -34, -16, -24, -10, -6,
- 0, -12, -8, 4, -8, -13, 0, -6, 16, -12,
- 5, 13, 3, 7, 13, 3, -8, -2, 14, 0,
- ], [
- 3, -7, 5, 5, -8, 2, -17, 9, -18, 24,
- 2, 19, 10, 4, -28, -17, -5, -28, 2, -7,
- 4, -15, -7, -8, -6, -23, -13, -21, 14, -20,
- 17, 18, 11, 33, 30, 11, -23, 13, 5, 9,
- ], [
- 60, 10, 7, -1, 9, -8, 6, -13, 2, -15,
- -1, -10, -13, -11, 15, 0, 6, 9, -1, 0,
- -13, 1, -11, -3, -13, 21, 13, 26, -7, 31,
- -10, -7, -16, -33, -31, -10, 22, -8, 1, -2,
- ], [
- 82, -1, -4, -19, 6, -27, -6, -29, -12, -26,
- 1, -24, -5, -18, 17, 17, 17, 6, 10, 0,
- -7, -2, -9, -16, -12, 11, 0, 11, -9, 23,
- 0, -3, -8, -8, -13, -1, 8, 7, -7, 6,
- ], [
- 49, 2, 21, 0, 1, -2, 9, 8, -6, -6,
- -8, -10, -8, 9, -2, 0, -4, -2, -13, -12,
- -23, -15, -12, -16, -26, 21, 2, 21, -11, 23,
- -4, -33, -7, -33, -6, 13, 34, 5, 27, 10,
- ], [
- 71, -10, 9, -17, -1, -20, -3, -8, -21, -18,
- -6, -24, 0, 1, 0, 16, 6, -5, 0, -13,
- -17, -19, -11, -29, -25, 11, -11, 6, -13, 15,
- 7, -29, 0, -8, 11, 22, 20, 21, 17, 18,
- ], [
- 67, 8, 14, 11, -7, -11, -11, -9, -7, -3,
- 13, 16, 8, 9, 24, -12, 10, -13, -5, -17,
- -2, -4, 3, -10, 6, 17, 4, 19, 0, 11,
- -6, 13, -9, -33, -14, -10, 16, -17, -10, -4,
- ], [
- 90, -3, 2, -6, -10, -29, -24, -26, -21, -15,
- 15, 2, 16, 1, 25, 4, 21, -16, 6, -18,
- 3, -8, 5, -24, 8, 7, -9, 4, -1, 3,
- 5, 18, -1, -7, 2, -1, 2, -1, -19, 3,
- ], [
- 57, 0, 27, 13, -14, -5, -7, 11, -15, 4,
- 5, 16, 13, 29, 6, -13, 0, -25, -16, -31,
- -12, -22, 2, -23, -6, 16, -7, 14, -2, 3,
- 0, -12, 0, -33, 9, 13, 28, -3, 14, 7,
- ], [
- 79, -11, 15, -4, -18, -23, -20, -5, -30, -7,
- 7, 2, 21, 21, 8, 3, 10, -28, -4, -31,
- -6, -25, 3, -37, -4, 7, -20, 0, -4, -4,
- 11, -7, 6, -8, 27, 22, 14, 12, 5, 16,
- ], [
- 47, 30, 15, 14, 14, 9, 9, -23, 13, -10,
- -12, -7, -16, -15, -3, -3, -1, 14, 9, 12,
- 9, 8, 0, 10, -14, 4, -9, 2, -5, 8,
- -13, -3, -18, -10, -45, -3, 16, -4, 4, 0,
- ], [
- 69, 17, 3, -3, 10, -8, -3, -40, -1, -21,
- -10, -21, -8, -23, -1, 13, 8, 11, 21, 11,
- 15, 4, 0, -2, -13, -5, -23, -12, -7, 0,
- -1, 0, -10, 14, -28, 5, 1, 11, -5, 7,
- ], [
- 36, 21, 28, 16, 6, 16, 12, -2, 4, -2,
- -20, -7, -11, 4, -20, -4, -12, 2, -1, 0,
- 0, -8, -2, -2, -27, 4, -21, -2, -9, 0,
- -6, -29, -9, -10, -21, 21, 28, 10, 29, 11,
- ], [
- 58, 9, 16, -1, 2, -2, 0, -19, -10, -13,
- -17, -21, -3, -3, -19, 12, -2, 0, 10, -1,
- 5, -12, 0, -15, -26, -5, -34, -16, -11, -7,
- 4, -25, -2, 14, -3, 29, 13, 25, 20, 20,
- ], [
- 55, 28, 21, 27, -2, 7, -8, -20, 4, 1,
- 1, 18, 5, 4, 5, -16, 2, -8, 5, -5,
- 19, 2, 14, 3, 6, 0, -18, -4, 2, -11,
- -8, 18, -11, -10, -29, -3, 10, -13, -8, -3,
- ], [
- 77, 16, 9, 9, -6, -11, -21, -37, -10, -10,
- 4, 5, 13, -3, 7, 0, 13, -11, 17, -6,
- 25, -1, 15, -9, 7, -9, -32, -19, 0, -18,
- 2, 22, -3, 15, -12, 5, -4, 2, -17, 5,
- ], [
- 44, 20, 34, 29, -10, 13, -4, 0, -4, 9,
- -5, 19, 10, 24, -11, -17, -8, -20, -5, -19,
- 9, -14, 12, -9, -6, 0, -30, -9, 0, -19,
- -2, -7, -2, -10, -5, 20, 21, 1, 17, 9,
- ], [
- 66, 8, 23, 11, -14, -5, -17, -16, -19, -2,
- -3, 5, 18, 17, -10, 0, 1, -23, 6, -20,
- 15, -18, 14, -22, -5, -10, -44, -23, -2, -26,
- 9, -3, 4, 14, 12, 29, 7, 16, 7, 18,
- ], [
- 18, 9, -17, -4, 11, 3, 0, 11, 7, 4,
- 10, 3, 10, -18, 24, -3, 14, 7, 4, 10,
- -16, 1, -27, -4, -27, 17, 12, 30, 0, 35,
- -9, -3, -12, -36, -35, -30, -2, -13, 2, -11,
- ], [
- 40, -2, -29, -22, 7, -14, -12, -5, -7, -7,
- 12, -9, 18, -26, 26, 14, 24, 4, 16, 9,
- -10, -2, -26, -18, -26, 7, -1, 15, -1, 27,
- 2, 0, -4, -11, -17, -21, -16, 1, -7, -3,
- ], [
- 8, 1, -3, -2, 3, 10, 3, 32, -1, 12,
- 2, 4, 15, 1, 7, -3, 2, -4, -6, -3,
- -26, -15, -29, -17, -40, 17, 0, 26, -2, 27,
- -2, -29, -4, -36, -10, -6, 9, 0, 27, 0,
- ], [
- 30, -11, -15, -20, 0, -8, -9, 15, -15, 0,
- 5, -9, 23, -6, 8, 13, 13, -7, 5, -3,
- -20, -19, -27, -31, -39, 7, -13, 11, -4, 19,
- 8, -25, 3, -11, 7, 2, -4, 16, 18, 9,
- ], [
- 26, 7, -11, 8, -5, 1, -17, 14, -1, 15,
- 24, 30, 32, 1, 33, -16, 18, -14, 0, -8,
- -6, -4, -12, -12, -6, 13, 2, 23, 8, 15,
- -4, 17, -5, -36, -18, -30, -8, -22, -10, -14,
- ], [
- 48, -4, -23, -9, -9, -17, -30, -2, -16, 3,
- 26, 16, 40, -6, 35, 1, 28, -17, 12, -9,
- 0, -8, -11, -25, -5, 3, -10, 8, 6, 7,
- 6, 22, 1, -11, -1, -21, -22, -7, -19, -5,
- ], [
- 15, 0, 2, 10, -13, 7, -14, 35, -10, 23,
- 16, 31, 37, 21, 16, -17, 6, -26, -10, -21,
- -16, -21, -13, -25, -19, 13, -8, 19, 5, 7,
- 1, -8, 2, -36, 5, -6, 3, -8, 15, -1,
- ], [
- 37, -12, -9, -7, -17, -11, -26, 18, -25, 12,
- 19, 17, 45, 14, 17, 0, 17, -30, 1, -22,
- -10, -25, -12, -38, -18, 3, -22, 4, 3, 0,
- 13, -3, 10, -11, 23, 2, -10, 7, 5, 7,
- ], [
- 5, 29, -9, 11, 15, 22, 3, 0, 18, 8,
- -1, 6, 7, -23, 6, -6, 5, 12, 15, 21,
- 5, 8, -17, 9, -28, 0, -11, 6, 2, 12,
- -11, 0, -14, -13, -49, -22, -8, -9, 4, -9,
- ], [
- 27, 16, -21, -6, 12, 3, -9, -16, 3, -2,
- 1, -7, 15, -31, 7, 10, 16, 9, 27, 21,
- 11, 5, -16, -3, -26, -9, -24, -7, 0, 4,
- 0, 4, -6, 11, -32, -14, -23, 6, -5, -1,
- ], [
- -4, 20, 3, 13, 8, 28, 6, 21, 10, 16,
- -8, 7, 12, -3, -11, -7, -5, 0, 4, 8,
- -4, -8, -18, -3, -41, 0, -22, 2, 0, 4,
- -5, -25, -6, -14, -25, 1, 2, 4, 29, 2,
- ], [
- 17, 8, -8, -4, 4, 10, -6, 5, -4, 5,
- -6, -6, 20, -10, -9, 9, 4, -2, 16, 7,
- 1, -12, -17, -16, -39, -9, -36, -12, -2, -3,
- 6, -21, 1, 11, -7, 10, -11, 20, 20, 11,
- ], [
- 13, 27, -3, 24, -1, 19, -14, 3, 9, 20,
- 12, 33, 29, -3, 15, -20, 9, -9, 11, 3,
- 16, 2, -2, 2, -7, -3, -20, 0, 10, -7,
- -7, 22, -7, -13, -33, -23, -14, -18, -7, -12,
- ], [
- 35, 15, -15, 6, -4, 1, -27, -12, -5, 8,
- 15, 19, 37, -11, 16, -2, 20, -12, 23, 2,
- 22, -1, -1, -11, -5, -13, -34, -14, 8, -14,
- 4, 26, 0, 11, -16, -14, -29, -2, -17, -3,
- ], [
- 3, 19, 9, 26, -8, 26, -10, 24, 0, 28,
- 5, 33, 34, 17, -2, -20, -1, -22, 0, -10,
- 6, -14, -3, -10, -20, -4, -32, -4, 7, -15,
- 0, -3, 0, -13, -9, 0, -3, -4, 17, 0,
- ], [
- 25, 7, -2, 8, -12, 7, -23, 8, -13, 16,
- 7, 20, 42, 9, 0, -3, 9, -25, 12, -10,
- 12, -18, -2, -24, -19, -13, -46, -19, 5, -22,
- 10, 0, 8, 11, 8, 9, -17, 11, 7, 8,
- ], [
- -25, -7, 2, -8, 12, -7, 23, -8, 13, -16,
- -7, -20, -42, -9, 0, 3, -9, 25, -12, 10,
- -12, 18, 2, 24, 19, 13, 46, 19, -5, 22,
- -10, 0, -8, -11, -8, -9, 17, -11, -7, -8,
- ], [
- -3, -19, -9, -26, 8, -26, 10, -24, 0, -28,
- -5, -33, -34, -17, 2, 20, 1, 22, 0, 10,
- -6, 14, 3, 10, 20, 4, 32, 4, -7, 15,
- 0, 3, 0, 13, 9, 0, 3, 4, -17, 0,
- ], [
- -35, -15, 15, -6, 4, -1, 27, 12, 5, -8,
- -15, -19, -37, 11, -16, 2, -20, 12, -23, -2,
- -22, 1, 1, 11, 5, 13, 34, 14, -8, 14,
- -4, -26, 0, -11, 16, 14, 29, 2, 17, 3,
- ], [
- -13, -27, 3, -24, 1, -19, 14, -3, -9, -20,
- -12, -33, -29, 3, -15, 20, -9, 9, -11, -3,
- -16, -2, 2, -2, 7, 3, 20, 0, -10, 7,
- 7, -22, 7, 13, 33, 23, 14, 18, 7, 12,
- ], [
- -17, -8, 8, 4, -4, -10, 6, -5, 4, -5,
- 6, 6, -20, 10, 9, -9, -4, 2, -16, -7,
- -1, 12, 17, 16, 39, 9, 36, 12, 2, 3,
- -6, 21, -1, -11, 7, -10, 11, -20, -20, -11,
- ], [
- 4, -20, -3, -13, -8, -28, -6, -21, -10, -16,
- 8, -7, -12, 3, 11, 7, 5, 0, -4, -8,
- 4, 8, 18, 3, 41, 0, 22, -2, 0, -4,
- 5, 25, 6, 14, 25, -1, -2, -4, -29, -2,
- ], [
- -27, -16, 21, 6, -12, -3, 9, 16, -3, 2,
- -1, 7, -15, 31, -7, -10, -16, -9, -27, -21,
- -11, -5, 16, 3, 26, 9, 24, 7, 0, -4,
- 0, -4, 6, -11, 32, 14, 23, -6, 5, 1,
- ], [
- -5, -29, 9, -11, -15, -22, -3, 0, -18, -8,
- 1, -6, -7, 23, -6, 6, -5, -12, -15, -21,
- -5, -8, 17, -9, 28, 0, 11, -6, -2, -12,
- 11, 0, 14, 13, 49, 22, 8, 9, -4, 9,
- ], [
- -37, 12, 9, 7, 17, 11, 26, -18, 25, -12,
- -19, -17, -45, -14, -17, 0, -17, 30, -1, 22,
- 10, 25, 12, 38, 18, -3, 22, -4, -3, 0,
- -13, 3, -10, 11, -23, -2, 10, -7, -5, -7,
- ], [
- -15, 0, -2, -10, 13, -7, 14, -35, 10, -23,
- -16, -31, -37, -21, -16, 17, -6, 26, 10, 21,
- 16, 21, 13, 25, 19, -13, 8, -19, -5, -7,
- -1, 8, -2, 36, -5, 6, -3, 8, -15, 1,
- ], [
- -48, 4, 23, 9, 9, 17, 30, 2, 16, -3,
- -26, -16, -40, 6, -35, -1, -28, 17, -12, 9,
- 0, 8, 11, 25, 5, -3, 10, -8, -6, -7,
- -6, -22, -1, 11, 1, 21, 22, 7, 19, 5,
- ], [
- -26, -7, 11, -8, 5, -1, 17, -14, 1, -15,
- -24, -30, -32, -1, -33, 16, -18, 14, 0, 8,
- 6, 4, 12, 12, 6, -13, -2, -23, -8, -15,
- 4, -17, 5, 36, 18, 30, 8, 22, 10, 14,
- ], [
- -30, 11, 15, 20, 0, 8, 9, -15, 15, 0,
- -5, 9, -23, 6, -8, -13, -13, 7, -5, 3,
- 20, 19, 27, 31, 39, -7, 13, -11, 4, -19,
- -8, 25, -3, 11, -7, -2, 4, -16, -18, -9,
- ], [
- -8, -1, 3, 2, -3, -10, -3, -32, 1, -12,
- -2, -4, -15, -1, -7, 3, -2, 4, 6, 3,
- 26, 15, 29, 17, 40, -17, 0, -26, 2, -27,
- 2, 29, 4, 36, 10, 6, -9, 0, -27, 0,
- ], [
- -40, 2, 29, 22, -7, 14, 12, 5, 7, 7,
- -12, 9, -18, 26, -26, -14, -24, -4, -16, -9,
- 10, 2, 26, 18, 26, -7, 1, -15, 1, -27,
- -2, 0, 4, 11, 17, 21, 16, -1, 7, 3,
- ], [
- -18, -9, 17, 4, -11, -3, 0, -11, -7, -4,
- -10, -3, -10, 18, -24, 3, -14, -7, -4, -10,
- 16, -1, 27, 4, 27, -17, -12, -30, 0, -35,
- 9, 3, 12, 36, 35, 30, 2, 13, -2, 11,
- ], [
- -66, -8, -23, -11, 14, 5, 17, 16, 19, 2,
- 3, -5, -18, -17, 10, 0, -1, 23, -6, 20,
- -15, 18, -14, 22, 5, 10, 44, 23, 2, 26,
- -9, 3, -4, -14, -12, -29, -7, -16, -7, -18,
- ], [
- -44, -20, -34, -29, 10, -13, 4, 0, 4, -9,
- 5, -19, -10, -24, 11, 17, 8, 20, 5, 19,
- -9, 14, -12, 9, 6, 0, 30, 9, 0, 19,
- 2, 7, 2, 10, 5, -20, -21, -1, -17, -9,
- ], [
- -77, -16, -9, -9, 6, 11, 21, 37, 10, 10,
- -4, -5, -13, 3, -7, 0, -13, 11, -17, 6,
- -25, 1, -15, 9, -7, 9, 32, 19, 0, 18,
- -2, -22, 3, -15, 12, -5, 4, -2, 17, -5,
- ], [
- -55, -28, -21, -27, 2, -7, 8, 20, -4, -1,
- -1, -18, -5, -4, -5, 16, -2, 8, -5, 5,
- -19, -2, -14, -3, -6, 0, 18, 4, -2, 11,
- 8, -18, 11, 10, 29, 3, -10, 13, 8, 3,
- ], [
- -58, -9, -16, 1, -2, 2, 0, 19, 10, 13,
- 17, 21, 3, 3, 19, -12, 2, 0, -10, 1,
- -5, 12, 0, 15, 26, 5, 34, 16, 11, 7,
- -4, 25, 2, -14, 3, -29, -13, -25, -20, -20,
- ], [
- -36, -21, -28, -16, -6, -16, -12, 2, -4, 2,
- 20, 7, 11, -4, 20, 4, 12, -2, 1, 0,
- 0, 8, 2, 2, 27, -4, 21, 2, 9, 0,
- 6, 29, 9, 10, 21, -21, -28, -10, -29, -11,
- ], [
- -69, -17, -3, 3, -10, 8, 3, 40, 1, 21,
- 10, 21, 8, 23, 1, -13, -8, -11, -21, -11,
- -15, -4, 0, 2, 13, 5, 23, 12, 7, 0,
- 1, 0, 10, -14, 28, -5, -1, -11, 5, -7,
- ], [
- -47, -30, -15, -14, -14, -9, -9, 23, -13, 10,
- 12, 7, 16, 15, 3, 3, 1, -14, -9, -12,
- -9, -8, 0, -10, 14, -4, 9, -2, 5, -8,
- 13, 3, 18, 10, 45, 3, -16, 4, -4, 0,
- ], [
- -79, 11, -15, 4, 18, 23, 20, 5, 30, 7,
- -7, -2, -21, -21, -8, -3, -10, 28, 4, 31,
- 6, 25, -3, 37, 4, -7, 20, 0, 4, 4,
- -11, 7, -6, 8, -27, -22, -14, -12, -5, -16,
- ], [
- -57, 0, -27, -13, 14, 5, 7, -11, 15, -4,
- -5, -16, -13, -29, -6, 13, 0, 25, 16, 31,
- 12, 22, -2, 23, 6, -16, 7, -14, 2, -3,
- 0, 12, 0, 33, -9, -13, -28, 3, -14, -7,
- ], [
- -90, 3, -2, 6, 10, 29, 24, 26, 21, 15,
- -15, -2, -16, -1, -25, -4, -21, 16, -6, 18,
- -3, 8, -5, 24, -8, -7, 9, -4, 1, -3,
- -5, -18, 1, 7, -2, 1, -2, 1, 19, -3,
- ], [
- -67, -8, -14, -11, 7, 11, 11, 9, 7, 3,
- -13, -16, -8, -9, -24, 12, -10, 13, 5, 17,
- 2, 4, -3, 10, -6, -17, -4, -19, 0, -11,
- 6, -13, 9, 33, 14, 10, -16, 17, 10, 4,
- ], [
- -71, 10, -9, 17, 1, 20, 3, 8, 21, 18,
- 6, 24, 0, -1, 0, -16, -6, 5, 0, 13,
- 17, 19, 11, 29, 25, -11, 11, -6, 13, -15,
- -7, 29, 0, 8, -11, -22, -20, -21, -17, -18,
- ], [
- -49, -2, -21, 0, -1, 2, -9, -8, 6, 6,
- 8, 10, 8, -9, 2, 0, 4, 2, 13, 12,
- 23, 15, 12, 16, 26, -21, -2, -21, 11, -23,
- 4, 33, 7, 33, 6, -13, -34, -5, -27, -10,
- ], [
- -82, 1, 4, 19, -6, 27, 6, 29, 12, 26,
- -1, 24, 5, 18, -17, -17, -17, -6, -10, 0,
- 7, 2, 9, 16, 12, -11, 0, -11, 9, -23,
- 0, 3, 8, 8, 13, 1, -8, -7, 7, -6,
- ], [
- -60, -10, -7, 1, -9, 8, -6, 13, -2, 15,
- 1, 10, 13, 11, -15, 0, -6, -9, 1, 0,
- 13, -1, 11, 3, 13, -21, -13, -26, 7, -31,
- 10, 7, 16, 33, 31, 10, -22, 8, -1, 2,
- ], [
- -3, 7, -5, -5, 8, -2, 17, -9, 18, -24,
- -2, -19, -10, -4, 28, 17, 5, 28, -2, 7,
- -4, 15, 7, 8, 6, 23, 13, 21, -14, 20,
- -17, -18, -11, -33, -30, -11, 23, -13, -5, -9,
- ], [
- 18, -4, -17, -23, 4, -20, 4, -26, 3, -36,
- 0, -32, -2, -12, 29, 34, 16, 24, 10, 6,
- 0, 12, 8, -4, 8, 13, 0, 6, -16, 12,
- -5, -13, -3, -7, -13, -3, 8, 2, -14, 0,
- ], [
- -13, 0, 8, -3, 0, 4, 21, 11, 9, -16,
- -10, -18, -5, 16, 10, 16, -5, 15, -13, -5,
- -15, -1, 6, -4, -6, 23, 2, 16, -17, 12,
- -10, -44, -3, -33, -6, 12, 34, 1, 20, 3,
- ], [
- 8, -12, -3, -21, -3, -14, 8, -5, -4, -28,
- -7, -32, 2, 8, 12, 34, 4, 12, -1, -6,
- -9, -4, 7, -17, -4, 13, -11, 1, -19, 4,
- 0, -39, 4, -7, 11, 21, 20, 16, 10, 11,
- ], [
- 4, 6, 0, 7, -8, -4, 0, -6, 9, -13,
- 11, 7, 11, 15, 37, 4, 9, 5, -5, -11,
- 5, 9, 22, 1, 27, 18, 4, 14, -5, 0,
- -12, 3, -4, -32, -14, -12, 17, -22, -17, -11,
- ], [
- 26, -6, -11, -10, -12, -23, -12, -23, -5, -24,
- 13, -5, 19, 8, 38, 21, 20, 2, 6, -12,
- 11, 5, 23, -11, 29, 9, -9, 0, -7, -6,
- -1, 7, 2, -7, 3, -3, 2, -6, -27, -3,
- ], [
- -6, -2, 14, 9, -16, 1, 3, 14, 0, -5,
- 3, 8, 16, 36, 19, 3, -1, -6, -17, -24,
- -4, -7, 21, -11, 14, 18, -7, 9, -9, -7,
- -6, -22, 3, -33, 10, 11, 28, -7, 7, 0,
- ], [
- 16, -14, 2, -8, -20, -17, -9, -2, -14, -16,
- 6, -5, 24, 28, 21, 20, 8, -9, -4, -25,
- 1, -11, 22, -24, 15, 8, -21, -5, -11, -14,
- 5, -18, 11, -7, 27, 20, 14, 7, -1, 9,
- ], [
- -16, 27, 2, 10, 13, 16, 20, -20, 29, -20,
- -14, -16, -13, -8, 9, 13, -2, 33, 9, 19,
- 17, 23, 17, 22, 6, 6, -9, -2, -12, -2,
- -20, -13, -13, -10, -45, -4, 16, -8, -2, -7,
- ], [
- 5, 15, -9, -7, 9, -2, 8, -37, 14, -31,
- -11, -29, -5, -16, 11, 30, 7, 29, 21, 18,
- 23, 19, 18, 9, 7, -3, -23, -17, -14, -9,
- -8, -9, -6, 15, -27, 4, 2, 6, -12, 1,
- ], [
- -26, 19, 15, 12, 5, 22, 24, 0, 21, -12,
- -21, -15, -8, 11, -7, 12, -14, 20, -2, 6,
- 7, 6, 16, 9, -6, 5, -21, -7, -15, -10,
- -13, -39, -5, -10, -20, 19, 28, 5, 22, 5,
- ], [
- -4, 6, 3, -5, 1, 4, 11, -16, 6, -23,
- -19, -29, 0, 3, -6, 30, -3, 17, 10, 5,
- 13, 2, 17, -3, -5, -3, -35, -21, -17, -17,
- -2, -35, 2, 15, -3, 28, 13, 21, 13, 13,
- ], [
- -8, 25, 8, 23, -3, 13, 3, -17, 20, -8,
- 0, 10, 8, 11, 18, 0, 1, 10, 5, 0,
- 28, 17, 32, 15, 26, 1, -19, -9, -3, -21,
- -15, 7, -6, -9, -29, -5, 10, -17, -15, -9,
- ], [
- 13, 13, -3, 5, -7, -4, -9, -34, 5, -20,
- 2, -3, 16, 3, 20, 17, 11, 7, 17, 0,
- 34, 13, 33, 2, 28, -8, -32, -24, -5, -29,
- -3, 12, 0, 15, -11, 3, -3, -2, -24, -1,
- ], [
- -18, 17, 21, 25, -11, 19, 6, 3, 11, 0,
- -7, 11, 13, 31, 1, 0, -9, -1, -5, -12,
- 18, 0, 31, 2, 13, 1, -30, -14, -7, -29,
- -9, -18, 1, -10, -4, 18, 22, -3, 10, 2,
- ], [
- 3, 5, 9, 7, -15, 1, -5, -13, -2, -12,
- -5, -2, 21, 23, 2, 16, 0, -5, 6, -13,
- 23, -3, 32, -10, 15, -8, -44, -28, -9, -37,
- 2, -13, 9, 15, 12, 27, 7, 12, 0, 11,
- ], [
- -44, 6, -30, -8, 9, 10, 11, 14, 23, -5,
- 8, -4, 14, -12, 37, 14, 12, 26, 4, 16,
- -8, 16, -9, 7, -6, 19, 12, 25, -5, 24,
- -15, -13, -8, -36, -34, -31, -1, -18, -4, -18,
- ], [
- -22, -5, -42, -26, 6, -8, -1, -2, 9, -17,
- 10, -18, 21, -19, 39, 31, 23, 23, 16, 15,
- -2, 12, -7, -6, -5, 9, -1, 10, -7, 16,
- -4, -9, 0, -10, -17, -22, -16, -2, -14, -9,
- ], [
- -55, -1, -17, -6, 1, 16, 15, 35, 15, 2,
- 0, -4, 19, 8, 20, 13, 1, 14, -7, 3,
- -18, 0, -10, -5, -19, 19, 0, 21, -8, 16,
- -9, -39, 0, -36, -10, -7, 9, -4, 20, -5,
- ], [
- -33, -13, -29, -24, -1, -1, 2, 18, 0, -9,
- 3, -17, 27, 0, 21, 30, 12, 11, 5, 2,
- -12, -4, -9, -19, -18, 9, -13, 6, -11, 8,
- 2, -35, 8, -10, 7, 1, -4, 11, 10, 2,
- ], [
- -36, 5, -24, 4, -7, 7, -6, 17, 14, 5,
- 22, 22, 35, 8, 46, 1, 17, 3, 0, -2,
- 2, 10, 5, 0, 14, 15, 2, 18, 2, 4,
- -11, 7, -1, -36, -18, -32, -7, -27, -17, -20,
- ], [
- -14, -7, -36, -13, -10, -10, -18, 0, 0, -5,
- 25, 8, 43, 0, 48, 18, 27, 0, 12, -3,
- 7, 6, 7, -13, 15, 5, -11, 3, 0, -2,
- 0, 12, 6, -10, 0, -23, -22, -11, -26, -12,
- ], [
- -47, -3, -11, 6, -15, 13, -2, 38, 6, 13,
- 15, 22, 40, 28, 28, 0, 5, -8, -10, -15,
- -7, -7, 4, -13, 1, 14, -9, 14, 0, -2,
- -4, -18, 7, -36, 6, -8, 3, -13, 7, -8,
- ], [
- -25, -15, -22, -11, -18, -4, -15, 22, -8, 2,
- 17, 9, 48, 20, 30, 17, 16, -11, 1, -16,
- -2, -10, 5, -26, 2, 4, -22, 0, -2, -10,
- 6, -13, 14, -10, 23, 0, -10, 2, -1, 0,
- ], [
- -57, 26, -22, 7, 14, 28, 14, 3, 35, 0,
- -3, -1, 11, -16, 18, 10, 4, 31, 15, 28,
- 14, 23, 1, 21, -7, 2, -11, 1, -3, 1,
- -18, -9, -10, -13, -49, -24, -8, -14, -2, -16,
- ], [
- -35, 14, -34, -10, 10, 10, 1, -12, 20, -12,
- 0, -15, 18, -24, 20, 27, 14, 28, 27, 27,
- 20, 19, 2, 8, -5, -7, -25, -13, -5, -5,
- -6, -5, -2, 12, -31, -15, -23, 1, -12, -8,
- ], [
- -68, 18, -9, 9, 6, 35, 18, 25, 26, 7,
- -10, -1, 16, 3, 1, 9, -6, 19, 4, 15,
- 4, 6, 0, 8, -20, 2, -23, -2, -7, -5,
- -12, -35, -1, -13, -24, 0, 3, 0, 22, -4,
- ], [
- -46, 6, -21, -8, 2, 16, 5, 8, 11, -4,
- -8, -15, 24, -4, 2, 26, 3, 16, 16, 14,
- 9, 2, 1, -4, -19, -7, -36, -17, -9, -13,
- 0, -31, 5, 12, -7, 8, -11, 15, 13, 4,
- ], [
- -49, 24, -16, 20, -2, 26, -2, 7, 25, 10,
- 11, 25, 32, 3, 27, -2, 8, 8, 11, 9,
- 24, 17, 16, 14, 13, -2, -20, -5, 4, -17,
- -14, 12, -3, -13, -33, -25, -14, -23, -15, -19,
- ], [
- -27, 12, -28, 2, -6, 7, -15, -9, 11, -1,
- 13, 11, 40, -4, 29, 14, 19, 5, 23, 8,
- 30, 13, 17, 0, 14, -12, -34, -20, 2, -25,
- -2, 16, 4, 12, -15, -16, -29, -7, -24, -10,
- ], [
- -60, 16, -3, 22, -10, 32, 0, 28, 17, 18,
- 3, 25, 37, 23, 10, -3, -2, -3, 0, -3,
- 14, 0, 14, 1, 0, -2, -32, -9, 1, -25,
- -7, -13, 5, -13, -8, -1, -2, -8, 10, -6,
- ], [
- -38, 4, -15, 4, -14, 13, -12, 11, 2, 6,
- 6, 11, 45, 16, 11, 13, 7, -6, 12, -4,
- 20, -3, 16, -12, 1, -12, -46, -24, 0, -33,
- 3, -9, 12, 12, 8, 7, -17, 6, 0, 2
- ]
-];
-const RA144_CODEBOOK2: [u16; 128] = [
- 12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053,
- 12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268,
- 11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109,
- 11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405,
- 10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818,
- 10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226,
- 10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053,
- 10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198,
- 14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155,
- 15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446,
- 13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443,
- 12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230,
- 12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449,
- 13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982,
- 12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410,
- 12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174,
-];
-const RA144_VECTORS2: [[i8; BLOCKSIZE]; 128] = [
- [
- 73, -32, -60, -15, -26, 59, 2, -33, 30, -10,
- -3, -17, 8, 30, -1, -26, -4, -22, 10, 16,
- -36, -5, -11, 56, 37, 6, -10, -5, -13, -3,
- 6, -5, 11, 4, -19, -5, -16, 41, 24, 13,
- ], [
- 4, -11, -37, 23, -5, 46, -2, -29, -5, -39,
- -21, -9, 0, 49, 12, -9, -16, -26, 22, 15,
- -45, -20, -5, 40, 22, 17, -26, 31, -14, 2,
- -14, 10, 30, 20, -27, -9, -39, 39, 18, 5,
- ], [
- 34, -25, -48, -28, -11, 34, -2, -41, 9, -7,
- -17, 21, 20, 24, -17, -33, 0, -24, 10, 42,
- 3, -5, 10, 42, 11, 8, -3, 3, 16, 9,
- 22, -2, 0, -33, -10, 18, 7, 58, 10, 28,
- ], [
- -34, -4, -25, 10, 9, 21, -7, -36, -26, -36,
- -35, 28, 12, 42, -3, -16, -12, -28, 21, 42,
- -5, -21, 16, 26, -4, 19, -19, 39, 15, 15,
- 1, 13, 19, -17, -17, 14, -15, 55, 4, 19,
- ], [
- 28, -20, -51, -14, -6, 7, 0, -26, 27, -4,
- 18, -40, -6, 16, -1, -15, 0, -55, -5, -16,
- -19, 14, -3, 49, 14, 1, -22, -30, -12, 0,
- 24, 15, 9, -17, -45, -29, 4, 28, 51, 35,
- ], [
- -40, 0, -28, 24, 14, -5, -4, -21, -7, -33,
- 0, -32, -15, 35, 12, 1, -11, -58, 5, -16,
- -28, 0, 1, 33, 0, 11, -39, 5, -14, 6,
- 3, 31, 28, -1, -53, -33, -19, 25, 46, 26,
- ], [
- -11, -14, -39, -27, 9, -17, -4, -33, 6, 0,
- 4, -1, 5, 10, -17, -22, 5, -57, -5, 9,
- 20, 13, 18, 35, -11, 3, -16, -22, 17, 13,
- 40, 19, -1, -55, -35, -5, 27, 44, 37, 49,
- ], [
- -80, 6, -16, 11, 30, -30, -9, -28, -28, -29,
- -13, 6, -2, 28, -3, -5, -7, -60, 5, 9,
- 11, -1, 24, 19, -27, 13, -32, 13, 15, 19,
- 19, 35, 17, -39, -43, -9, 4, 42, 32, 41,
- ], [
- 78, -21, -43, 4, -38, 17, 17, -5, 55, 24,
- -15, -36, 14, 4, 24, -24, 12, 5, 17, 31,
- -54, -5, -2, 27, 43, -12, 2, 9, -9, -15,
- 22, -3, 28, 21, -20, 3, 20, 28, 9, -5,
- ], [
- 9, -1, -20, 43, -17, 3, 12, 0, 20, -4,
- -33, -29, 6, 22, 38, -7, 0, 1, 29, 30,
- -63, -21, 3, 11, 27, -1, -14, 45, -10, -9,
- 1, 12, 47, 37, -28, 0, -2, 26, 4, -13,
- ], [
- 39, -14, -30, -8, -22, -8, 12, -12, 34, 27,
- -29, 2, 26, -2, 8, -31, 16, 3, 17, 57,
- -14, -6, 19, 13, 16, -10, 8, 17, 20, -2,
- 38, 0, 17, -16, -11, 27, 44, 45, -4, 8,
- ], [
- -29, 5, -7, 30, -1, -21, 7, -7, 0, 0,
- -47, 9, 18, 15, 22, -14, 4, 0, 28, 57,
- -23, -21, 25, -2, 1, 0, -7, 53, 19, 3,
- 17, 15, 36, 0, -19, 24, 21, 43, -9, 0,
- ], [
- 33, -10, -34, 5, -17, -35, 15, 1, 53, 30,
- 6, -59, 0, -10, 24, -13, 17, -27, 1, -1,
- -37, 13, 4, 20, 20, -18, -10, -16, -8, -11,
- 39, 18, 26, 0, -46, -20, 41, 15, 37, 15,
- ], [
- -35, 10, -11, 44, 3, -48, 10, 6, 17, 2,
- -11, -51, -8, 8, 38, 3, 4, -31, 12, -2,
- -46, -1, 10, 4, 5, -7, -26, 19, -10, -5,
- 18, 34, 45, 15, -54, -24, 18, 13, 31, 7,
- ], [
- -5, -3, -21, -7, -2, -60, 10, -5, 32, 34,
- -7, -20, 11, -16, 8, -20, 21, -29, 1, 24,
- 2, 13, 27, 6, -5, -15, -3, -8, 21, 1,
- 55, 21, 15, -38, -37, 3, 65, 32, 23, 30,
- ], [
- -74, 17, 0, 31, 18, -73, 5, 0, -3, 5,
- -25, -12, 3, 1, 22, -3, 9, -33, 12, 24,
- -6, -2, 33, -9, -21, -5, -20, 27, 19, 7,
- 34, 37, 34, -22, -44, 0, 41, 29, 17, 21,
- ], [
- 76, -35, -31, -28, -49, 43, -40, 0, 29, -14,
- 8, 5, 10, 18, -26, -46, 0, 7, 6, 3,
- -25, -7, -2, 40, 28, 14, 18, -3, -27, -28,
- -8, -45, -13, 34, -13, -27, -15, 31, 12, 3,
- ], [
- 7, -15, -9, 9, -28, 29, -45, 5, -6, -43,
- -9, 12, 2, 36, -12, -30, -11, 3, 17, 3,
- -34, -22, 3, 24, 12, 24, 2, 32, -28, -22,
- -29, -29, 5, 50, -21, -31, -38, 29, 7, -5,
- ], [
- 36, -29, -19, -41, -34, 18, -45, -6, 8, -10,
- -5, 43, 23, 11, -42, -53, 5, 5, 6, 30,
- 14, -8, 20, 26, 1, 16, 25, 4, 3, -15,
- 7, -41, -23, -3, -4, -3, 8, 48, -1, 17,
- ], [
- -32, -8, 3, -2, -13, 4, -50, -1, -27, -39,
- -23, 51, 15, 30, -27, -37, -7, 1, 17, 29,
- 5, -23, 25, 10, -14, 26, 8, 41, 1, -9,
- -13, -26, -5, 12, -12, -7, -14, 45, -6, 9,
- ], [
- 31, -24, -23, -27, -29, -9, -43, 8, 26, -7,
- 30, -17, -4, 3, -26, -35, 5, -24, -10, -28,
- -9, 12, 5, 33, 5, 8, 5, -29, -26, -24,
- 9, -23, -14, 12, -39, -52, 5, 18, 39, 24,
- ], [
- -37, -3, 0, 10, -7, -22, -48, 12, -8, -36,
- 12, -9, -12, 22, -12, -19, -6, -28, 0, -29,
- -18, -3, 11, 17, -10, 18, -10, 7, -27, -18,
- -11, -7, 3, 28, -47, -55, -18, 15, 34, 16,
- ], [
- -8, -17, -10, -40, -13, -34, -47, 0, 5, -4,
- 16, 21, 8, -2, -42, -43, 10, -26, -10, -2,
- 31, 11, 27, 19, -21, 10, 12, -20, 3, -11,
- 25, -20, -25, -25, -29, -28, 28, 34, 25, 38,
- ], [
- -77, 2, 11, -1, 7, -47, -52, 5, -29, -33,
- -1, 28, 0, 15, -28, -26, -2, -30, 0, -2,
- 22, -4, 33, 3, -36, 21, -3, 15, 2, -5,
- 4, -4, -6, -9, -37, -31, 5, 32, 20, 30,
- ], [
- 81, -25, -14, -8, -61, 0, -25, 28, 54, 20,
- -3, -14, 17, -8, 0, -44, 16, 35, 13, 18,
- -43, -7, 6, 11, 33, -4, 30, 11, -22, -40,
- 6, -43, 3, 50, -14, -18, 22, 18, -1, -16,
- ], [
- 12, -4, 8, 29, -39, -12, -30, 33, 19, -8,
- -21, -6, 8, 9, 13, -28, 4, 31, 24, 18,
- -52, -23, 12, -4, 18, 5, 14, 47, -24, -34,
- -14, -27, 22, 66, -22, -22, -1, 16, -6, -24,
- ], [
- 41, -18, -2, -21, -45, -24, -30, 21, 33, 24,
- -17, 24, 29, -15, -16, -51, 21, 33, 13, 45,
- -3, -8, 28, -2, 7, -2, 37, 19, 7, -27,
- 22, -39, -7, 12, -5, 5, 45, 35, -15, -1,
- ], [
- -27, 1, 20, 17, -24, -38, -35, 26, -1, -4,
- -35, 32, 21, 3, -2, -35, 8, 29, 24, 44,
- -12, -24, 34, -18, -8, 7, 21, 55, 5, -21,
- 2, -23, 11, 28, -13, 1, 22, 33, -21, -10,
- ], [
- 36, -13, -5, -7, -40, -51, -28, 36, 52, 27,
- 18, -36, 2, -22, 0, -33, 21, 2, -3, -13,
- -26, 11, 14, 4, 10, -10, 18, -14, -22, -36,
- 24, -21, 1, 28, -40, -42, 42, 5, 25, 5,
- ], [
- -32, 6, 17, 31, -19, -65, -33, 41, 16, -1,
- 0, -29, -6, -4, 13, -17, 9, -1, 8, -14,
- -35, -3, 19, -11, -4, 0, 1, 21, -23, -30,
- 3, -5, 20, 44, -48, -46, 19, 3, 20, -3,
- ], [
- -3, -7, 6, -20, -25, -77, -32, 29, 31, 30,
- 4, 2, 14, -29, -16, -40, 26, 0, -3, 12,
- 13, 10, 36, -9, -15, -8, 24, -6, 7, -22,
- 40, -17, -8, -9, -31, -18, 66, 22, 11, 19,
- ], [
- -72, 13, 29, 18, -4, -90, -37, 34, -4, 1,
- -13, 9, 6, -11, -2, -24, 13, -3, 7, 11,
- 4, -4, 42, -25, -31, 1, 8, 29, 6, -17,
- 19, -2, 10, 6, -38, -22, 42, 19, 6, 11,
- ], [
- 116, -20, -68, -30, -28, 83, 28, -18, 32, -22,
- -13, -21, 5, 28, 5, -7, -24, -8, -22, 17,
- -23, 30, -25, 45, 15, -9, -11, -18, 22, -10,
- 4, -2, 19, -12, 23, 3, -43, 2, 12, -4,
- ], [
- 47, 0, -45, 7, -7, 69, 23, -13, -2, -51,
- -32, -14, -3, 47, 19, 8, -37, -11, -10, 16,
- -32, 15, -19, 29, 0, 1, -28, 18, 20, -4,
- -16, 13, 38, 3, 15, 0, -66, 0, 7, -13,
- ], [
- 77, -13, -56, -43, -13, 57, 23, -26, 11, -19,
- -27, 16, 17, 22, -10, -15, -19, -10, -22, 43,
- 16, 30, -2, 31, -11, -6, -5, -9, 52, 2,
- 20, 0, 8, -50, 33, 27, -19, 19, -1, 9,
- ], [
- 8, 6, -33, -4, 7, 44, 18, -21, -23, -48,
- -46, 24, 9, 40, 3, 1, -32, -13, -11, 43,
- 7, 14, 3, 15, -26, 3, -21, 26, 50, 8,
- 0, 16, 27, -34, 25, 23, -43, 17, -6, 1,
- ], [
- 71, -9, -59, -29, -8, 30, 26, -11, 30, -16,
- 8, -44, -9, 14, 5, 2, -19, -40, -38, -15,
- -7, 50, -17, 38, -7, -14, -24, -43, 22, -6,
- 22, 19, 17, -34, -2, -20, -23, -10, 39, 16,
- ], [
- 2, 11, -36, 9, 13, 17, 21, -6, -5, -45,
- -10, -36, -18, 33, 19, 19, -31, -44, -27, -15,
- -16, 34, -11, 22, -22, -4, -40, -7, 21, 0,
- 1, 35, 36, -18, -10, -24, -46, -12, 34, 8,
- ], [
- 32, -2, -47, -42, 7, 5, 21, -18, 9, -12,
- -5, -5, 2, 8, -10, -4, -14, -42, -38, 10,
- 33, 49, 5, 24, -33, -12, -17, -35, 52, 6,
- 38, 22, 7, -72, 7, 3, 0, 6, 25, 30,
- ], [
- -36, 18, -24, -3, 28, -7, 16, -13, -26, -41,
- -24, 1, -5, 26, 3, 12, -27, -46, -27, 10,
- 24, 34, 10, 8, -49, -2, -34, 0, 51, 12,
- 17, 38, 25, -56, 0, 0, -22, 3, 20, 22,
- ], [
- 121, -9, -50, -10, -40, 40, 43, 9, 58, 12,
- -25, -41, 11, 2, 31, -5, -8, 19, -15, 32,
- -41, 30, -16, 16, 20, -28, 0, -3, 26, -22,
- 19, 0, 36, 4, 22, 12, -6, -9, -1, -24,
- ], [
- 52, 10, -27, 27, -18, 26, 38, 14, 23, -16,
- -44, -33, 3, 20, 45, 10, -20, 15, -3, 31,
- -50, 14, -10, 0, 5, -17, -15, 32, 24, -16,
- -1, 15, 55, 20, 14, 8, -29, -12, -7, -32,
- ], [
- 82, -3, -38, -23, -24, 15, 38, 2, 37, 15,
- -39, -2, 23, -4, 15, -12, -3, 17, -15, 58,
- -1, 29, 6, 2, -5, -26, 7, 4, 56, -9,
- 35, 3, 25, -33, 32, 36, 17, 7, -15, -9,
- ], [
- 13, 17, -15, 15, -3, 1, 33, 7, 1, -12,
- -58, 5, 15, 13, 29, 3, -16, 13, -4, 57,
- -10, 13, 11, -13, -21, -15, -9, 40, 55, -3,
- 14, 19, 44, -17, 24, 32, -5, 4, -21, -18,
- ], [
- 76, 1, -41, -9, -19, -12, 41, 17, 55, 18,
- -3, -63, -3, -12, 30, 5, -3, -12, -31, 0,
- -24, 49, -8, 9, -1, -33, -12, -29, 27, -18,
- 37, 21, 34, -17, -3, -11, 14, -23, 25, -2,
- ], [
- 7, 22, -18, 29, 1, -25, 36, 21, 20, -9,
- -22, -56, -11, 6, 45, 21, -15, -16, -20, -1,
- -33, 34, -2, -6, -17, -23, -28, 6, 25, -12,
- 16, 37, 53, -1, -11, -15, -8, -25, 20, -11,
- ], [
- 37, 8, -29, -22, -4, -37, 36, 9, 34, 22,
- -17, -24, 8, -18, 15, -2, 1, -14, -31, 25,
- 15, 48, 13, -4, -28, -31, -5, -21, 57, -4,
- 53, 24, 23, -55, 6, 12, 37, -6, 11, 11,
- ], [
- -31, 28, -6, 16, 16, -50, 31, 14, 0, -6,
- -36, -17, 0, 0, 29, 14, -11, -18, -20, 25,
- 6, 33, 19, -20, -43, -21, -21, 14, 55, 0,
- 32, 40, 42, -39, -1, 8, 14, -8, 6, 3,
- ], [
- 119, -24, -39, -44, -51, 66, -14, 15, 31, -26,
- -1, 0, 7, 16, -19, -28, -19, 22, -26, 4,
- -13, 28, -16, 29, 5, -1, 16, -16, 8, -35,
- -10, -42, -4, 17, 29, -19, -42, -7, 0, -15,
- ], [
- 50, -3, -16, -5, -30, 53, -19, 20, -3, -55,
- -19, 8, 0, 34, -5, -11, -32, 18, -15, 4,
- -22, 13, -10, 13, -9, 8, 0, 19, 7, -29,
- -31, -26, 13, 33, 21, -22, -65, -9, -4, -23,
- ], [
- 79, -17, -27, -56, -36, 41, -19, 8, 10, -22,
- -15, 39, 20, 9, -35, -35, -15, 20, -26, 31,
- 26, 27, 6, 15, -20, 0, 23, -8, 38, -22,
- 5, -38, -15, -20, 39, 4, -18, 9, -13, -1,
- ], [
- 10, 3, -4, -18, -15, 27, -24, 13, -24, -51,
- -34, 47, 12, 28, -21, -19, -27, 16, -15, 30,
- 17, 12, 12, 0, -36, 10, 7, 27, 37, -16,
- -15, -22, 3, -4, 31, 1, -42, 7, -18, -9,
- ], [
- 74, -12, -30, -42, -30, 14, -16, 23, 29, -19,
- 20, -21, -7, 1, -19, -17, -14, -10, -43, -27,
- 3, 48, -8, 22, -16, -7, 4, -42, 9, -31,
- 6, -20, -6, -4, 3, -43, -22, -20, 28, 5,
- ], [
- 5, 7, -7, -4, -9, 0, -21, 28, -6, -48,
- 2, -14, -15, 20, -5, 0, -27, -14, -32, -28,
- -5, 32, -2, 6, -32, 3, -12, -5, 8, -25,
- -14, -4, 12, 11, -4, -47, -45, -22, 22, -2,
- ], [
- 34, -6, -18, -55, -15, -11, -21, 16, 8, -16,
- 6, 16, 5, -4, -35, -24, -10, -12, -43, -1,
- 43, 47, 14, 8, -43, -5, 10, -34, 39, -18,
- 22, -16, -17, -42, 13, -19, 1, -3, 14, 20,
- ], [
- -34, 14, 4, -17, 5, -24, -26, 20, -27, -45,
- -12, 24, -2, 13, -21, -8, -22, -16, -32, -2,
- 34, 31, 20, -7, -58, 5, -5, 2, 38, -12,
- 2, -1, 1, -26, 5, -23, -21, -6, 8, 11,
- ], [
- 124, -13, -21, -23, -62, 23, 0, 43, 57, 8,
- -13, -18, 14, -10, 6, -26, -3, 49, -19, 19,
- -31, 27, -7, 0, 11, -20, 29, -1, 12, -47,
- 4, -39, 11, 34, 28, -9, -5, -19, -13, -34,
- ], [
- 55, 6, 1, 14, -41, 10, -4, 48, 22, -20,
- -31, -10, 5, 7, 20, -9, -16, 45, -8, 19,
- -40, 12, -1, -15, -4, -10, 12, 34, 11, -41,
- -16, -24, 30, 49, 20, -13, -28, -22, -18, -43,
- ], [
- 84, -6, -9, -36, -47, -1, -4, 36, 36, 12,
- -27, 20, 26, -17, -9, -33, 1, 47, -19, 46,
- 9, 27, 15, -13, -15, -18, 35, 6, 42, -33,
- 20, -36, 1, -4, 38, 14, 18, -2, -27, -20,
- ], [
- 15, 13, 13, 1, -26, -14, -9, 41, 1, -16,
- -46, 27, 18, 1, 4, -16, -11, 43, -8, 45,
- 0, 11, 21, -29, -30, -8, 19, 42, 41, -28,
- 0, -20, 20, 11, 30, 10, -4, -5, -32, -28,
- ], [
- 79, -2, -12, -22, -42, -28, -1, 51, 54, 15,
- 8, -41, 0, -24, 6, -15, 1, 17, -36, -12,
- -14, 47, 0, -6, -11, -26, 16, -27, 13, -43,
- 22, -18, 10, 12, 2, -34, 15, -33, 13, -13,
- ], [
- 10, 18, 10, 15, -21, -41, -6, 56, 19, -13,
- -9, -33, -9, -6, 20, 1, -11, 13, -24, -13,
- -23, 32, 6, -22, -26, -15, 0, 8, 12, -37,
- 1, -2, 28, 27, -5, -37, -7, -35, 8, -21,
- ], [
- 39, 4, 0, -35, -27, -53, -6, 44, 33, 18,
- -5, -2, 11, -31, -9, -22, 6, 15, -36, 13,
- 25, 46, 23, -20, -37, -24, 23, -19, 43, -29,
- 38, -14, 0, -26, 12, -10, 38, -16, 0, 0,
- ], [
- -29, 25, 22, 2, -6, -67, -11, 49, -1, -10,
- -24, 5, 3, -13, 4, -5, -6, 11, -25, 12,
- 16, 31, 28, -36, -53, -13, 6, 16, 42, -24,
- 17, 1, 18, -10, 4, -13, 15, -18, -5, -7,
- ], [
- 29, -25, -22, -2, 6, 67, 11, -49, 1, 10,
- 24, -5, -3, 13, -4, 5, 6, -11, 25, -12,
- -16, -31, -28, 36, 53, 13, -6, -16, -42, 24,
- -17, -1, -18, 10, -4, 13, -15, 18, 5, 7,
- ], [
- -39, -4, 0, 35, 27, 53, 6, -44, -33, -18,
- 5, 2, -11, 31, 9, 22, -6, -15, 36, -13,
- -25, -46, -23, 20, 37, 24, -23, 19, -43, 29,
- -38, 14, 0, 26, -12, 10, -38, 16, 0, 0,
- ], [
- -10, -18, -10, -15, 21, 41, 6, -56, -19, 13,
- 9, 33, 9, 6, -20, -1, 11, -13, 24, 13,
- 23, -32, -6, 22, 26, 15, 0, -8, -12, 37,
- -1, 2, -28, -27, 5, 37, 7, 35, -8, 21,
- ], [
- -79, 2, 12, 22, 42, 28, 1, -51, -54, -15,
- -8, 41, 0, 24, -6, 15, -1, -17, 36, 12,
- 14, -47, 0, 6, 11, 26, -16, 27, -13, 43,
- -22, 18, -10, -12, -2, 34, -15, 33, -13, 13,
- ], [
- -15, -13, -13, -1, 26, 14, 9, -41, -1, 16,
- 46, -27, -18, -1, -4, 16, 11, -43, 8, -45,
- 0, -11, -21, 29, 30, 8, -19, -42, -41, 28,
- 0, 20, -20, -11, -30, -10, 4, 5, 32, 28,
- ], [
- -84, 6, 9, 36, 47, 1, 4, -36, -36, -12,
- 27, -20, -26, 17, 9, 33, -1, -47, 19, -46,
- -9, -27, -15, 13, 15, 18, -35, -6, -42, 33,
- -20, 36, -1, 4, -38, -14, -18, 2, 27, 20,
- ], [
- -55, -6, -1, -14, 41, -10, 4, -48, -22, 20,
- 31, 10, -5, -7, -20, 9, 16, -45, 8, -19,
- 40, -12, 1, 15, 4, 10, -12, -34, -11, 41,
- 16, 24, -30, -49, -20, 13, 28, 22, 18, 43,
- ], [
- -124, 13, 21, 23, 62, -23, 0, -43, -57, -8,
- 13, 18, -14, 10, -6, 26, 3, -49, 19, -19,
- 31, -27, 7, 0, -11, 20, -29, 1, -12, 47,
- -4, 39, -11, -34, -28, 9, 5, 19, 13, 34,
- ], [
- 34, -14, -4, 17, -5, 24, 26, -20, 27, 45,
- 12, -24, 2, -13, 21, 8, 22, 16, 32, 2,
- -34, -31, -20, 7, 58, -5, 5, -2, -38, 12,
- -2, 1, -1, 26, -5, 23, 21, 6, -8, -11,
- ], [
- -34, 6, 18, 55, 15, 11, 21, -16, -8, 16,
- -6, -16, -5, 4, 35, 24, 10, 12, 43, 1,
- -43, -47, -14, -8, 43, 5, -10, 34, -39, 18,
- -22, 16, 17, 42, -13, 19, -1, 3, -14, -20,
- ], [
- -5, -7, 7, 4, 9, 0, 21, -28, 6, 48,
- -2, 14, 15, -20, 5, 0, 27, 14, 32, 28,
- 5, -32, 2, -6, 32, -3, 12, 5, -8, 25,
- 14, 4, -12, -11, 4, 47, 45, 22, -22, 2,
- ], [
- -74, 12, 30, 42, 30, -14, 16, -23, -29, 19,
- -20, 21, 7, -1, 19, 17, 14, 10, 43, 27,
- -3, -48, 8, -22, 16, 7, -4, 42, -9, 31,
- -6, 20, 6, 4, -3, 43, 22, 20, -28, -5,
- ], [
- -10, -3, 4, 18, 15, -27, 24, -13, 24, 51,
- 34, -47, -12, -28, 21, 19, 27, -16, 15, -30,
- -17, -12, -12, 0, 36, -10, -7, -27, -37, 16,
- 15, 22, -3, 4, -31, -1, 42, -7, 18, 9,
- ], [
- -79, 17, 27, 56, 36, -41, 19, -8, -10, 22,
- 15, -39, -20, -9, 35, 35, 15, -20, 26, -31,
- -26, -27, -6, -15, 20, 0, -23, 8, -38, 22,
- -5, 38, 15, 20, -39, -4, 18, -9, 13, 1,
- ], [
- -50, 3, 16, 5, 30, -53, 19, -20, 3, 55,
- 19, -8, 0, -34, 5, 11, 32, -18, 15, -4,
- 22, -13, 10, -13, 9, -8, 0, -19, -7, 29,
- 31, 26, -13, -33, -21, 22, 65, 9, 4, 23,
- ], [
- -119, 24, 39, 44, 51, -66, 14, -15, -31, 26,
- 1, 0, -7, -16, 19, 28, 19, -22, 26, -4,
- 13, -28, 16, -29, -5, 1, -16, 16, -8, 35,
- 10, 42, 4, -17, -29, 19, 42, 7, 0, 15,
- ], [
- 31, -28, 6, -16, -16, 50, -31, -14, 0, 6,
- 36, 17, 0, 0, -29, -14, 11, 18, 20, -25,
- -6, -33, -19, 20, 43, 21, 21, -14, -55, 0,
- -32, -40, -42, 39, 1, -8, -14, 8, -6, -3,
- ], [
- -37, -8, 29, 22, 4, 37, -36, -9, -34, -22,
- 17, 24, -8, 18, -15, 2, -1, 14, 31, -25,
- -15, -48, -13, 4, 28, 31, 5, 21, -57, 4,
- -53, -24, -23, 55, -6, -12, -37, 6, -11, -11,
- ], [
- -7, -22, 18, -29, -1, 25, -36, -21, -20, 9,
- 22, 56, 11, -6, -45, -21, 15, 16, 20, 1,
- 33, -34, 2, 6, 17, 23, 28, -6, -25, 12,
- -16, -37, -53, 1, 11, 15, 8, 25, -20, 11,
- ], [
- -76, -1, 41, 9, 19, 12, -41, -17, -55, -18,
- 3, 63, 3, 12, -30, -5, 3, 12, 31, 0,
- 24, -49, 8, -9, 1, 33, 12, 29, -27, 18,
- -37, -21, -34, 17, 3, 11, -14, 23, -25, 2,
- ], [
- -13, -17, 15, -15, 3, -1, -33, -7, -1, 12,
- 58, -5, -15, -13, -29, -3, 16, -13, 4, -57,
- 10, -13, -11, 13, 21, 15, 9, -40, -55, 3,
- -14, -19, -44, 17, -24, -32, 5, -4, 21, 18,
- ], [
- -82, 3, 38, 23, 24, -15, -38, -2, -37, -15,
- 39, 2, -23, 4, -15, 12, 3, -17, 15, -58,
- 1, -29, -6, -2, 5, 26, -7, -4, -56, 9,
- -35, -3, -25, 33, -32, -36, -17, -7, 15, 9,
- ], [
- -52, -10, 27, -27, 18, -26, -38, -14, -23, 16,
- 44, 33, -3, -20, -45, -10, 20, -15, 3, -31,
- 50, -14, 10, 0, -5, 17, 15, -32, -24, 16,
- 1, -15, -55, -20, -14, -8, 29, 12, 7, 32,
- ], [
- -121, 9, 50, 10, 40, -40, -43, -9, -58, -12,
- 25, 41, -11, -2, -31, 5, 8, -19, 15, -32,
- 41, -30, 16, -16, -20, 28, 0, 3, -26, 22,
- -19, 0, -36, -4, -22, -12, 6, 9, 1, 24,
- ], [
- 36, -18, 24, 3, -28, 7, -16, 13, 26, 41,
- 24, -1, 5, -26, -3, -12, 27, 46, 27, -10,
- -24, -34, -10, -8, 49, 2, 34, 0, -51, -12,
- -17, -38, -25, 56, 0, 0, 22, -3, -20, -22,
- ], [
- -32, 2, 47, 42, -7, -5, -21, 18, -9, 12,
- 5, 5, -2, -8, 10, 4, 14, 42, 38, -10,
- -33, -49, -5, -24, 33, 12, 17, 35, -52, -6,
- -38, -22, -7, 72, -7, -3, 0, -6, -25, -30,
- ], [
- -2, -11, 36, -9, -13, -17, -21, 6, 5, 45,
- 10, 36, 18, -33, -19, -19, 31, 44, 27, 15,
- 16, -34, 11, -22, 22, 4, 40, 7, -21, 0,
- -1, -35, -36, 18, 10, 24, 46, 12, -34, -8,
- ], [
- -71, 9, 59, 29, 8, -30, -26, 11, -30, 16,
- -8, 44, 9, -14, -5, -2, 19, 40, 38, 15,
- 7, -50, 17, -38, 7, 14, 24, 43, -22, 6,
- -22, -19, -17, 34, 2, 20, 23, 10, -39, -16,
- ], [
- -8, -6, 33, 4, -7, -44, -18, 21, 23, 48,
- 46, -24, -9, -40, -3, -1, 32, 13, 11, -43,
- -7, -14, -3, -15, 26, -3, 21, -26, -50, -8,
- 0, -16, -27, 34, -25, -23, 43, -17, 6, -1,
- ], [
- -77, 13, 56, 43, 13, -57, -23, 26, -11, 19,
- 27, -16, -17, -22, 10, 15, 19, 10, 22, -43,
- -16, -30, 2, -31, 11, 6, 5, 9, -52, -2,
- -20, 0, -8, 50, -33, -27, 19, -19, 1, -9,
- ], [
- -47, 0, 45, -7, 7, -69, -23, 13, 2, 51,
- 32, 14, 3, -47, -19, -8, 37, 11, 10, -16,
- 32, -15, 19, -29, 0, -1, 28, -18, -20, 4,
- 16, -13, -38, -3, -15, 0, 66, 0, -7, 13,
- ], [
- -116, 20, 68, 30, 28, -83, -28, 18, -32, 22,
- 13, 21, -5, -28, -5, 7, 24, 8, 22, -17,
- 23, -30, 25, -45, -15, 9, 11, 18, -22, 10,
- -4, 2, -19, 12, -23, -3, 43, -2, -12, 4,
- ], [
- 72, -13, -29, -18, 4, 90, 37, -34, 4, -1,
- 13, -9, -6, 11, 2, 24, -13, 3, -7, -11,
- -4, 4, -42, 25, 31, -1, -8, -29, -6, 17,
- -19, 2, -10, -6, 38, 22, -42, -19, -6, -11,
- ], [
- 3, 7, -6, 20, 25, 77, 32, -29, -31, -30,
- -4, -2, -14, 29, 16, 40, -26, 0, 3, -12,
- -13, -10, -36, 9, 15, 8, -24, 6, -7, 22,
- -40, 17, 8, 9, 31, 18, -66, -22, -11, -19,
- ], [
- 32, -6, -17, -31, 19, 65, 33, -41, -16, 1,
- 0, 29, 6, 4, -13, 17, -9, 1, -8, 14,
- 35, 3, -19, 11, 4, 0, -1, -21, 23, 30,
- -3, 5, -20, -44, 48, 46, -19, -3, -20, 3,
- ], [
- -36, 13, 5, 7, 40, 51, 28, -36, -52, -27,
- -18, 36, -2, 22, 0, 33, -21, -2, 3, 13,
- 26, -11, -14, -4, -10, 10, -18, 14, 22, 36,
- -24, 21, -1, -28, 40, 42, -42, -5, -25, -5,
- ], [
- 27, -1, -20, -17, 24, 38, 35, -26, 1, 4,
- 35, -32, -21, -3, 2, 35, -8, -29, -24, -44,
- 12, 24, -34, 18, 8, -7, -21, -55, -5, 21,
- -2, 23, -11, -28, 13, -1, -22, -33, 21, 10,
- ], [
- -41, 18, 2, 21, 45, 24, 30, -21, -33, -24,
- 17, -24, -29, 15, 16, 51, -21, -33, -13, -45,
- 3, 8, -28, 2, -7, 2, -37, -19, -7, 27,
- -22, 39, 7, -12, 5, -5, -45, -35, 15, 1,
- ], [
- -12, 4, -8, -29, 39, 12, 30, -33, -19, 8,
- 21, 6, -8, -9, -13, 28, -4, -31, -24, -18,
- 52, 23, -12, 4, -18, -5, -14, -47, 24, 34,
- 14, 27, -22, -66, 22, 22, 1, -16, 6, 24,
- ], [
- -81, 25, 14, 8, 61, 0, 25, -28, -54, -20,
- 3, 14, -17, 8, 0, 44, -16, -35, -13, -18,
- 43, 7, -6, -11, -33, 4, -30, -11, 22, 40,
- -6, 43, -3, -50, 14, 18, -22, -18, 1, 16,
- ], [
- 77, -2, -11, 1, -7, 47, 52, -5, 29, 33,
- 1, -28, 0, -15, 28, 26, 2, 30, 0, 2,
- -22, 4, -33, -3, 36, -21, 3, -15, -2, 5,
- -4, 4, 6, 9, 37, 31, -5, -32, -20, -30,
- ], [
- 8, 17, 10, 40, 13, 34, 47, 0, -5, 4,
- -16, -21, -8, 2, 42, 43, -10, 26, 10, 2,
- -31, -11, -27, -19, 21, -10, -12, 20, -3, 11,
- -25, 20, 25, 25, 29, 28, -28, -34, -25, -38,
- ], [
- 37, 3, 0, -10, 7, 22, 48, -12, 8, 36,
- -12, 9, 12, -22, 12, 19, 6, 28, 0, 29,
- 18, 3, -11, -17, 10, -18, 10, -7, 27, 18,
- 11, 7, -3, -28, 47, 55, 18, -15, -34, -16,
- ], [
- -31, 24, 23, 27, 29, 9, 43, -8, -26, 7,
- -30, 17, 4, -3, 26, 35, -5, 24, 10, 28,
- 9, -12, -5, -33, -5, -8, -5, 29, 26, 24,
- -9, 23, 14, -12, 39, 52, -5, -18, -39, -24,
- ], [
- 32, 8, -3, 2, 13, -4, 50, 1, 27, 39,
- 23, -51, -15, -30, 27, 37, 7, -1, -17, -29,
- -5, 23, -25, -10, 14, -26, -8, -41, -1, 9,
- 13, 26, 5, -12, 12, 7, 14, -45, 6, -9,
- ], [
- -36, 29, 19, 41, 34, -18, 45, 6, -8, 10,
- 5, -43, -23, -11, 42, 53, -5, -5, -6, -30,
- -14, 8, -20, -26, -1, -16, -25, -4, -3, 15,
- -7, 41, 23, 3, 4, 3, -8, -48, 1, -17,
- ], [
- -7, 15, 9, -9, 28, -29, 45, -5, 6, 43,
- 9, -12, -2, -36, 12, 30, 11, -3, -17, -3,
- 34, 22, -3, -24, -12, -24, -2, -32, 28, 22,
- 29, 29, -5, -50, 21, 31, 38, -29, -7, 5,
- ], [
- -76, 35, 31, 28, 49, -43, 40, 0, -29, 14,
- -8, -5, -10, -18, 26, 46, 0, -7, -6, -3,
- 25, 7, 2, -40, -28, -14, -18, 3, 27, 28,
- 8, 45, 13, -34, 13, 27, 15, -31, -12, -3,
- ], [
- 74, -17, 0, -31, -18, 73, -5, 0, 3, -5,
- 25, 12, -3, -1, -22, 3, -9, 33, -12, -24,
- 6, 2, -33, 9, 21, 5, 20, -27, -19, -7,
- -34, -37, -34, 22, 44, 0, -41, -29, -17, -21,
- ], [
- 5, 3, 21, 7, 2, 60, -10, 5, -32, -34,
- 7, 20, -11, 16, -8, 20, -21, 29, -1, -24,
- -2, -13, -27, -6, 5, 15, 3, 8, -21, -1,
- -55, -21, -15, 38, 37, -3, -65, -32, -23, -30,
- ], [
- 35, -10, 11, -44, -3, 48, -10, -6, -17, -2,
- 11, 51, 8, -8, -38, -3, -4, 31, -12, 2,
- 46, 1, -10, -4, -5, 7, 26, -19, 10, 5,
- -18, -34, -45, -15, 54, 24, -18, -13, -31, -7,
- ], [
- -33, 10, 34, -5, 17, 35, -15, -1, -53, -30,
- -6, 59, 0, 10, -24, 13, -17, 27, -1, 1,
- 37, -13, -4, -20, -20, 18, 10, 16, 8, 11,
- -39, -18, -26, 0, 46, 20, -41, -15, -37, -15,
- ], [
- 29, -5, 7, -30, 1, 21, -7, 7, 0, 0,
- 47, -9, -18, -15, -22, 14, -4, 0, -28, -57,
- 23, 21, -25, 2, -1, 0, 7, -53, -19, -3,
- -17, -15, -36, 0, 19, -24, -21, -43, 9, 0,
- ], [
- -39, 14, 30, 8, 22, 8, -12, 12, -34, -27,
- 29, -2, -26, 2, -8, 31, -16, -3, -17, -57,
- 14, 6, -19, -13, -16, 10, -8, -17, -20, 2,
- -38, 0, -17, 16, 11, -27, -44, -45, 4, -8,
- ], [
- -9, 1, 20, -43, 17, -3, -12, 0, -20, 4,
- 33, 29, -6, -22, -38, 7, 0, -1, -29, -30,
- 63, 21, -3, -11, -27, 1, 14, -45, 10, 9,
- -1, -12, -47, -37, 28, 0, 2, -26, -4, 13,
- ], [
- -78, 21, 43, -4, 38, -17, -17, 5, -55, -24,
- 15, 36, -14, -4, -24, 24, -12, -5, -17, -31,
- 54, 5, 2, -27, -43, 12, -2, -9, 9, 15,
- -22, 3, -28, -21, 20, -3, -20, -28, -9, 5,
- ], [
- 80, -6, 16, -11, -30, 30, 9, 28, 28, 29,
- 13, -6, 2, -28, 3, 5, 7, 60, -5, -9,
- -11, 1, -24, -19, 27, -13, 32, -13, -15, -19,
- -19, -35, -17, 39, 43, 9, -4, -42, -32, -41,
- ], [
- 11, 14, 39, 27, -9, 17, 4, 33, -6, 0,
- -4, 1, -5, -10, 17, 22, -5, 57, 5, -9,
- -20, -13, -18, -35, 11, -3, 16, 22, -17, -13,
- -40, -19, 1, 55, 35, 5, -27, -44, -37, -49,
- ], [
- 40, 0, 28, -24, -14, 5, 4, 21, 7, 33,
- 0, 32, 15, -35, -12, -1, 11, 58, -5, 16,
- 28, 0, -1, -33, 0, -11, 39, -5, 14, -6,
- -3, -31, -28, 1, 53, 33, 19, -25, -46, -26,
- ], [
- -28, 20, 51, 14, 6, -7, 0, 26, -27, 4,
- -18, 40, 6, -16, 1, 15, 0, 55, 5, 16,
- 19, -14, 3, -49, -14, -1, 22, 30, 12, 0,
- -24, -15, -9, 17, 45, 29, -4, -28, -51, -35,
- ], [
- 34, 4, 25, -10, -9, -21, 7, 36, 26, 36,
- 35, -28, -12, -42, 3, 16, 12, 28, -21, -42,
- 5, 21, -16, -26, 4, -19, 19, -39, -15, -15,
- -1, -13, -19, 17, 17, -14, 15, -55, -4, -19,
- ], [
- -34, 25, 48, 28, 11, -34, 2, 41, -9, 7,
- 17, -21, -20, -24, 17, 33, 0, 24, -10, -42,
- -3, 5, -10, -42, -11, -8, 3, -3, -16, -9,
- -22, 2, 0, 33, 10, -18, -7, -58, -10, -28,
- ], [
- -4, 11, 37, -23, 5, -46, 2, 29, 5, 39,
- 21, 9, 0, -49, -12, 9, 16, 26, -22, -15,
- 45, 20, 5, -40, -22, -17, 26, -31, 14, -2,
- 14, -10, -30, -20, 27, 9, 39, -39, -18, -5,
- ], [
- -73, 32, 60, 15, 26, -59, -2, 33, -30, 10,
- 3, 17, -8, -30, 1, 26, 4, 22, -10, -16,
- 36, 5, 11, -56, -37, -6, 10, 5, 13, 3,
- -6, 5, -11, -4, 19, 5, 16, -41, -24, -13
- ]
-];
-
-const RA144_GAIN_VAL_TAB: [[u16; 3]; 256] = [
- [ 541, 956, 768], [ 877, 581, 568], [ 675,1574, 635], [1248,1464, 668],
- [1246, 839, 1394], [2560,1386, 991], [ 925, 687, 608], [2208, 797, 1144],
- [ 535, 832, 799], [ 762, 605, 1154], [ 832,1122, 1003], [1180, 687, 1176],
- [1292, 901, 732], [1656, 689, 896], [1750,1248, 848], [2284, 942, 1022],
- [ 824,1472, 643], [ 517, 765, 512], [ 562,1816, 1522], [ 694,1826, 2700],
- [ 704, 524, 672], [1442, 757, 2232], [ 884, 551, 1266], [2232,1007, 1692],
- [ 932, 746, 777], [1132, 822, 926], [1226, 771, 611], [2948,1342, 1008],
- [1302, 594, 1158], [1602, 636, 1128], [3408, 910, 1438], [1996, 614, 575],
- [ 665, 935, 628], [ 631,1192, 829], [ 644, 926, 1052], [ 879, 988, 1226],
- [ 941,2768, 2772], [ 565,1344, 2304], [ 547, 628, 740], [ 639, 532, 1074],
- [ 955,1208, 598], [1124,1160, 900], [1206, 899, 1242], [ 746, 533, 624],
- [1458,1028, 735], [1706,1102, 692], [1898,1018, 1004], [2176, 988, 735],
- [1578, 782, 1642], [ 897, 516, 754], [2068, 702, 1656], [2344, 818, 1526],
- [ 907, 652, 592], [1056, 652, 642], [2124,1416, 780], [2664,1250, 727],
- [1894, 727, 1108], [2196, 657, 981], [4840, 920, 1704], [4992,1238, 983],
- [2420, 909, 1094], [2760, 935, 1032], [2800, 612, 853], [3068, 832, 574],
- [ 523,1796, 923], [ 722,1916, 1382], [1226,1542, 928], [ 758, 757, 584],
- [ 512,1134, 577], [ 615,1276, 698], [ 574,2568, 2356], [ 993,2728, 3512],
- [ 539, 890, 913], [ 694, 928, 1088], [ 805, 600, 1360], [2160, 951, 3128],
- [ 816, 950, 590], [ 955, 847, 811], [1094, 883, 556], [1304, 888, 604],
- [ 863,1170, 855], [1023, 997, 1032], [ 932,1228, 1280], [ 627, 564, 573],
- [ 876, 900, 1448], [1030, 857, 1792], [1294, 953, 1758], [1612, 854, 1714],
- [1090,1166, 631], [1314,1202, 751], [1480, 905, 795], [1682,1016, 568],
- [1494,1178, 983], [ 878, 613, 526], [1728,1446, 779], [2136,1348, 774],
- [ 950, 649, 939], [1180, 703, 899], [1236, 527, 1158], [1450, 647, 972],
- [1282, 647, 707], [1460, 663, 644], [1614, 572, 578], [3516,1222, 821],
- [2668, 729, 1682], [3128, 585, 1502], [3208, 733, 976], [6800, 871, 1416],
- [3480, 743, 1408], [3764, 899, 1170], [3772, 632, 875], [4092, 732, 638],
- [3112, 753, 2620], [3372, 945, 1890], [3768, 969, 2288], [2016, 559, 854],
- [1736, 729, 787], [1940, 686, 547], [2140, 635, 674], [4480,1272, 828],
- [3976, 592, 1666], [4384, 621, 1388], [4400, 801, 955], [4656, 522, 646],
- [4848, 625, 1636], [4984, 591, 874], [5352, 535, 1001], [11216,938, 1184],
- [ 925,3280, 1476], [ 735,1580, 1088], [1150,1576, 674], [ 655, 783, 528],
- [ 527,2052, 1354], [ 782,1704, 1880], [ 578, 910, 1026], [ 692, 882, 1468],
- [ 586, 683, 715], [ 739, 609, 717], [ 778, 773, 697], [ 922, 785, 813],
- [ 766, 651, 984], [ 978, 596, 1030], [1070, 757, 1080], [1324, 687, 1178],
- [1108,2144, 979], [ 723, 982, 690], [ 936, 956, 527], [1180,1002, 547],
- [ 517,1306, 825], [ 832,1184, 974], [1024, 957, 903], [1262,1090, 906],
- [1028, 720, 649], [1192, 679, 694], [2468,1480, 979], [2844,1370, 877],
- [1310, 835, 848], [1508, 839, 698], [1742,1030, 769], [1910, 852, 573],
- [1280, 859, 1174], [1584, 863, 1108], [1686, 708, 1364], [1942, 768, 1104],
- [ 891, 536, 690], [1016, 560, 663], [2172, 870, 1348], [2404, 999, 1170],
- [1890, 966, 889], [2116, 912, 777], [2296,1020, 714], [4872,1844, 932],
- [2392, 778, 929], [2604, 772, 744], [2764, 957, 722], [5832,1532, 984],
- [2188, 519, 1264], [2332, 532, 922], [5064, 995, 2412], [2708, 571, 874],
- [2408, 545, 666], [5016,1084, 875], [5376, 983, 1196], [5536, 979, 730],
- [5344, 634, 1744], [5688, 706, 1348], [5912, 977, 1190], [6072, 905, 763],
- [6048, 582, 1526], [11968,1013,1816], [12864,937, 1900], [12560,1086, 998],
- [1998, 684, 1884], [2504, 633, 1992], [1252, 567, 835], [1478, 571, 973],
- [2620, 769, 1414], [2808, 952, 1142], [2908, 712, 1028], [2976, 686, 741],
- [1462, 552, 714], [3296, 991, 1452], [1590, 615, 544], [3480,1150, 824],
- [3212, 832, 923], [3276, 839, 531], [3548, 786, 852], [3732, 764, 570],
- [5728, 906, 2616], [6272, 804, 2252], [3096, 535, 876], [3228, 598, 649],
- [6536, 759, 1436], [6648, 993, 846], [6864, 567, 1210],[14016,1012, 1302],
- [3408, 548, 1098], [7160,1008, 1742], [7136,1000, 1182], [7480,1032, 836],
- [7448, 612, 1552], [7744, 614, 816], [8384, 777, 1438], [8784, 694, 786],
- [ 882,1508, 1068], [ 597, 837, 766], [1270, 954, 1408], [ 803, 550, 798],
- [1398,1308, 798], [1848,1534, 738], [ 970, 675, 608], [1264, 706, 684],
- [1716, 767, 1126], [2108, 765, 1404], [2236, 924, 1003], [2472,1048, 611],
- [ 999, 942, 963], [1094, 857, 935], [2936, 926, 1138], [1934, 746, 551],
- [3336, 633, 1762], [3764, 701, 1454], [1890, 564, 636], [4096,1126, 793],
- [3936, 556, 1140], [3936, 540, 740], [4216, 764, 874], [8480,1328, 1014],
- [2184, 515, 1042], [4432, 934, 1344], [4784, 945, 1112], [5016,1062, 733],
- [9216,1020, 2028], [9968, 924, 1188], [5424, 909, 1206], [6512, 744, 1086]
-];
-const RA144_GAIN_EXP_TAB: [u8; 256] = [
- 15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13,
- 13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13,
- 13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13,
- 13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12,
- 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13,
- 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14,
- 13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11,
- 12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13,
- 12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
- 12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12,
- 13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13,
- 11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10, 9, 11, 10,
- 12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12
-];
diff --git a/src/codecs/real/ra288.rs b/src/codecs/real/ra288.rs
deleted file mode 100644
index 6a5a352..0000000
--- a/src/codecs/real/ra288.rs
+++ /dev/null
@@ -1,330 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use super::super::*;
-use crate::io::bitreader::*;
-const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
-const NBLOCKS: usize = 32;
-const BLOCKSIZE: usize = 5;
-const FRAME_SIZE: usize = 38;
-
-const SP_LPC_ORDER: usize = 36;
-const SP_START: usize = 70;
-const GAIN_LPC_ORDER: usize = 10;
-const GAIN_START: usize = 28;
-
-struct RA288Decoder {
- chmap: NAChannelMap,
- ainfo: NAAudioInfo,
- info: Rc<NACodecInfo>,
-
- speech_lpc: [f32; SP_LPC_ORDER],
- speech_hist: [f32; 111],
- speech_rec: [f32; SP_LPC_ORDER + 1],
- gain_lpc: [f32; GAIN_LPC_ORDER],
- gain_hist: [f32; GAIN_LPC_ORDER + GAIN_START],
- gain_rec: [f32; GAIN_LPC_ORDER + 1],
-}
-
-const BF_ORDER: usize = SP_LPC_ORDER + 1;
-const BF_WORK_SIZE: usize = SP_LPC_ORDER + 40 + 35;
-
-fn backfilter(hist: &mut [f32], rec: &mut [f32], filt: &mut [f32], win: &[f32], bw_tab: &[f32], start: usize, non_rec: usize, move_size: usize) {
- let mut temp: [f32; BF_ORDER] = [0.0; BF_ORDER];
- let order = filt.len();
-
- let mut tmp1: [f32; BF_ORDER] = [0.0; BF_ORDER];
- let mut tmp2: [f32; BF_ORDER] = [0.0; BF_ORDER];
- let mut work: [f32; BF_WORK_SIZE] = [0.0; BF_WORK_SIZE];
- for i in 0..(order + start + non_rec) {
- work[i] = win[i] * hist[i];
- }
- for i in (0..order + 1).rev() {
- let src1 = &work[(order - i)..];
- let src2 = &work[order + start - i..];
- tmp1[i] = scalarprod(&work[order..], src1, start);
- tmp2[i] = scalarprod(&work[order + start..], src2, non_rec);
- }
-
- for i in 0..(order + 1) {
- rec[i] = rec[i] * 0.5625 + tmp1[i];
- temp[i] = rec[i] + tmp2[i];
- }
- temp[0] *= 257.0 / 256.0;
-
- if compute_lpc(&temp, filt) {
- for (f, c) in filt.iter_mut().zip(bw_tab.iter()) {
- *f *= c;
- }
- }
- for i in 0..move_size {
- hist[i] = hist[i + start];
- }
-}
-
-fn scalarprod(src0: &[f32], src1: &[f32], len: usize) -> f32 {
- let mut sum: f32 = 0.0;
- for (a, b) in src0.iter().take(len).zip(src1.iter().take(len)) {
- sum += *a * *b;
- }
- sum
-}
-
-fn compute_lpc(autoc: &[f32], filt: &mut [f32]) -> bool {
- let order = filt.len();
- let mut err = autoc[0];
- if (err <= 0.0) || (autoc[order] == 0.0) {
- return false;
- }
- for i in 0..order {
- let mut r = -autoc[i + 1];
- for j in 0..i {
- r -= filt[j] * autoc[i - j];
- }
- r /= err;
- err *= 1.0 - r * r;
- filt[i] = r;
-
- for j in 0..((i + 1) >> 1) {
- let f = filt[j];
- let b = filt[i - j - 1];
- filt[j] = f + r * b;
- filt[i - j - 1] = b + r * f;
- }
-
- if err < 0.0 { return false; }
- }
- true
-}
-
-fn celp_lp_synth_filter(dst: &mut [f32], start: usize, filt: &[f32], src: &[f32]) {
- for (i, el) in src.iter().enumerate() {
- dst[start + i] = *el;
- for (j, coeff) in filt.iter().enumerate() {
- dst[start + i] -= *coeff * dst[start + i - j - 1];
- }
- }
-}
-
-impl RA288Decoder {
- fn new() -> Self {
- RA288Decoder {
- chmap: NAChannelMap::new(),
- ainfo: NAAudioInfo::new(0, 1, SND_F32P_FORMAT, NBLOCKS * BLOCKSIZE),
- info: NACodecInfo::new_dummy(),
-
- speech_lpc: [0.0; SP_LPC_ORDER],
- speech_hist: [0.0; 111],
- speech_rec: [0.0; SP_LPC_ORDER + 1],
- gain_lpc: [0.0; GAIN_LPC_ORDER],
- gain_hist: [0.0; 38],
- gain_rec: [0.0; GAIN_LPC_ORDER + 1],
- }
- }
-
- fn process_subblock(&mut self, gain: f32, cb_idx: usize) {
- for i in 0..SP_LPC_ORDER {
- self.speech_hist[SP_START + i] = self.speech_hist[75 + i];
- }
- let mut sum: f32 = 32.0;
- for i in 0..GAIN_LPC_ORDER {
- sum -= self.gain_hist[GAIN_START + GAIN_LPC_ORDER - 1 - i] * self.gain_lpc[i];
- }
- sum = sum.max(0.0).min(60.0);
-
- let scale = (sum * 0.1151292546497).exp() * gain * (1.0 / ((1 << 23) as f32));
- let mut buf: [f32; BLOCKSIZE] = [0.0; BLOCKSIZE];
- for i in 0..BLOCKSIZE {
- buf[i] = (RA288_CODEBOOK[cb_idx][i] as f32) * scale;
- }
-
- let mut sum: f32 = 0.0;
- for el in buf.iter() {
- sum += *el * *el * (((1 << 24) as f32) / 5.0);
- }
- sum = sum.max(1.0);
- for i in 0..(GAIN_LPC_ORDER - 1) {
- self.gain_hist[GAIN_START + i] = self.gain_hist[GAIN_START + i + 1];
- }
- self.gain_hist[GAIN_START + GAIN_LPC_ORDER - 1] = 10.0 * sum.log10() - 32.0;
- celp_lp_synth_filter(&mut self.speech_hist, SP_START + SP_LPC_ORDER, &self.speech_lpc, &buf);
- }
-}
-
-impl NADecoder for RA288Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- self.chmap.add_channels(&CHMAP_MONO);
- self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(),
- 1,
- SND_F32P_FORMAT, NBLOCKS * BLOCKSIZE);
- self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone()));
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- let nframes = pktbuf.len() / FRAME_SIZE;
- let duration = NBLOCKS * BLOCKSIZE * nframes;
-
- let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?;
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut dst = adata.get_data_mut();
-
- for (input, output) in pktbuf.chunks(FRAME_SIZE).zip(dst.chunks_mut(NBLOCKS * BLOCKSIZE)) {
- let mut br = BitReader::new(input, input.len(), BitReaderMode::LE);
-
- for (i, block) in output.chunks_mut(BLOCKSIZE).enumerate() {
- let gain = RA288_GAIN_TAB[br.read(3)? as usize];
- let cb = br.read((6 + (i & 1)) as u8)? as usize;
-
- self.process_subblock(gain, cb);
-
- for j in 0..BLOCKSIZE {
- block[j] = self.speech_hist[SP_START + SP_LPC_ORDER + j];
- }
- if (i & 7) == 3 {
- backfilter(&mut self.speech_hist, &mut self.speech_rec, &mut self.speech_lpc, RA288_SPEECH_WINDOW, RA288_SPEECH_BW_TAB, 40, 35, SP_START);
- backfilter(&mut self.gain_hist, &mut self.gain_rec, &mut self.gain_lpc, RA288_GAIN_WINDOW, RA288_GAIN_BW_TAB, 8, 20, GAIN_START);
- }
- }
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(RA288Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_ra288() {
- let file = "assets/RV/A0000044.rm";
- test_decode_audio("realmedia", file, Some(5000), "ra28.8");
- }
-}
-
-const RA288_GAIN_TAB: [f32; 8] = [
- 0.515625, 0.90234375, 1.57910156, 2.76342773,
- -0.515625, -0.90234375, -1.57910156, -2.76342773
-];
-
-const RA288_CODEBOOK: [[i16; 5]; 128] = [
- [ 668, -2950, -1254, -1790, -2553], [ -5032, -4577, -1045, 2908, 3318],
- [ -2819, -2677, -948, -2825, -4450], [ -6679, -340, 1482, -1276, 1262],
- [ -562, -6757, 1281, 179, -1274], [ -2512, -7130, -4925, 6913, 2411],
- [ -2478, -156, 4683, -3873, 0], [ -8208, 2140, -478, -2785, 533],
- [ 1889, 2759, 1381, -6955, -5913], [ 5082, -2460, -5778, 1797, 568],
- [ -2208, -3309, -4523, -6236, -7505], [ -2719, 4358, -2988, -1149, 2664],
- [ 1259, 995, 2711, -2464,-10390], [ 1722, -7569, -2742, 2171, -2329],
- [ 1032, 747, -858, -7946,-12843], [ 3106, 4856, -4193, -2541, 1035],
- [ 1862, -960, -6628, 410, 5882], [ -2493, -2628, -4000, -60, 7202],
- [ -2672, 1446, 1536, -3831, 1233], [ -5302, 6912, 1589, -4187, 3665],
- [ -3456, -8170, -7709, 1384, 4698], [ -4699, -6209,-11176, 8104, 16830],
- [ 930, 7004, 1269, -8977, 2567], [ 4649, 11804, 3441, -5657, 1199],
- [ 2542, -183, -8859, -7976, 3230], [ -2872, -2011, -9713, -8385, 12983],
- [ 3086, 2140, -3680, -9643, -2896], [ -7609, 6515, -2283, -2522, 6332],
- [ -3333, -5620, -9130,-11131, 5543], [ -407, -6721,-17466, -2889, 11568],
- [ 3692, 6796, -262,-10846, -1856], [ 7275, 13404, -2989,-10595, 4936],
- [ 244, -2219, 2656, 3776, -5412], [ -4043, -5934, 2131, 863, -2866],
- [ -3302, 1743, -2006, -128, -2052], [ -6361, 3342, -1583, -21, 1142],
- [ -3837, -1831, 6397, 2545, -2848], [ -9332, -6528, 5309, 1986, -2245],
- [ -4490, 748, 1935, -3027, -493], [ -9255, 5366, 3193, -4493, 1784],
- [ 4784, -370, 1866, 1057, -1889], [ 7342, -2690, -2577, 676, -611],
- [ -502, 2235, -1850, -1777, -2049], [ 1011, 3880, -2465, 2209, -152],
- [ 2592, 2829, 5588, 2839, -7306], [ -3049, -4918, 5955, 9201, -4447],
- [ 697, 3908, 5798, -4451, -4644], [ -2121, 5444, -2570, 321, -1202],
- [ 2846, -2086, 3532, 566, -708], [ -4279, 950, 4980, 3749, 452],
- [ -2484, 3502, 1719, -170, 238], [ -3435, 263, 2114, -2005, 2361],
- [ -7338, -1208, 9347, -1216, -4013], [-13498, -439, 8028, -4232, 361],
- [ -3729, 5433, 2004, -4727, -1259], [ -3986, 7743, 8429, -3691, -987],
- [ 5198, -423, 1150, -1281, 816], [ 7409, 4109, -3949, 2690, 30],
- [ 1246, 3055, -35, -1370, -246], [ -1489, 5635, -678, -2627, 3170],
- [ 4830, -4585, 2008, -1062, 799], [ -129, 717, 4594, 14937, 10706],
- [ 417, 2759, 1850, -5057, -1153], [ -3887, 7361, -5768, 4285, 666],
- [ 1443, -938, 20, -2119, -1697], [ -3712, -3402, -2212, 110, 2136],
- [ -2952, 12, -1568, -3500, -1855], [ -1315, -1731, 1160, -558, 1709],
- [ 88, -4569, 194, -454, -2957], [ -2839, -1666, -273, 2084, -155],
- [ -189, -2376, 1663, -1040, -2449], [ -2842, -1369, 636, -248, -2677],
- [ 1517, 79, -3013, -3669, -973], [ 1913, -2493, -5312, -749, 1271],
- [ -2903, -3324, -3756, -3690, -1829], [ -2913, -1547, -2760, -1406, 1124],
- [ 1844, -1834, 456, 706, -4272], [ 467, -4256, -1909, 1521, 1134],
- [ -127, -994, -637, -1491, -6494], [ 873, -2045, -3828, -2792, -578],
- [ 2311, -1817, 2632, -3052, 1968], [ 641, 1194, 1893, 4107, 6342],
- [ -45, 1198, 2160, -1449, 2203], [ -2004, 1713, 3518, 2652, 4251],
- [ 2936, -3968, 1280, 131, -1476], [ 2827, 8, -1928, 2658, 3513],
- [ 3199, -816, 2687, -1741, -1407], [ 2948, 4029, 394, -253, 1298],
- [ 4286, 51, -4507, -32, -659], [ 3903, 5646, -5588, -2592, 5707],
- [ -606, 1234, -1607, -5187, 664], [ -525, 3620, -2192, -2527, 1707],
- [ 4297, -3251, -2283, 812, -2264], [ 5765, 528, -3287, 1352, 1672],
- [ 2735, 1241, -1103, -3273, -3407], [ 4033, 1648, -2965, -1174, 1444],
- [ 74, 918, 1999, 915, -1026], [ -2496, -1605, 2034, 2950, 229],
- [ -2168, 2037, 15, -1264, -208], [ -3552, 1530, 581, 1491, 962],
- [ -2613, -2338, 3621, -1488, -2185], [ -1747, 81, 5538, 1432, -2257],
- [ -1019, 867, 214, -2284, -1510], [ -1684, 2816, -229, 2551, -1389],
- [ 2707, 504, 479, 2783, -1009], [ 2517, -1487, -1596, 621, 1929],
- [ -148, 2206, -4288, 1292, -1401], [ -527, 1243, -2731, 1909, 1280],
- [ 2149, -1501, 3688, 610, -4591], [ 3306, -3369, 1875, 3636, -1217],
- [ 2574, 2513, 1449, -3074, -4979], [ 814, 1826, -2497, 4234, -4077],
- [ 1664, -220, 3418, 1002, 1115], [ 781, 1658, 3919, 6130, 3140],
- [ 1148, 4065, 1516, 815, 199], [ 1191, 2489, 2561, 2421, 2443],
- [ 770, -5915, 5515, -368, -3199], [ 1190, 1047, 3742, 6927, -2089],
- [ 292, 3099, 4308, -758, -2455], [ 523, 3921, 4044, 1386, 85],
- [ 4367, 1006, -1252, -1466, -1383], [ 3852, 1579, -77, 2064, 868],
- [ 5109, 2919, -202, 359, -509], [ 3650, 3206, 2303, 1693, 1296],
- [ 2905, -3907, 229, -1196, -2332], [ 5977, -3585, 805, 3825, -3138],
- [ 3746, -606, 53, -269, -3301], [ 606, 2018, -1316, 4064, 398]
-];
-
-const RA288_SPEECH_WINDOW: &[f32] = &[
- 0.576690972, 0.580838025, 0.585013986, 0.589219987, 0.59345597, 0.597723007,
- 0.602020264, 0.606384277, 0.610748291, 0.615142822, 0.619598389, 0.624084473,
- 0.628570557, 0.633117676, 0.637695313, 0.642272949, 0.646911621, 0.651580811,
- 0.656280518, 0.66104126, 0.665802002, 0.670593262, 0.675445557, 0.680328369,
- 0.685241699, 0.690185547, 0.695159912, 0.700164795, 0.705230713, 0.710327148,
- 0.715454102, 0.720611572, 0.725830078, 0.731048584, 0.736328125, 0.741638184,
- 0.747009277, 0.752380371, 0.7578125, 0.763305664, 0.768798828, 0.774353027,
- 0.779937744, 0.785583496, 0.791229248, 0.796936035, 0.802703857, 0.808502197,
- 0.814331055, 0.820220947, 0.826141357, 0.832092285, 0.838104248, 0.844146729,
- 0.850250244, 0.856384277, 0.862548828, 0.868774414, 0.875061035, 0.881378174,
- 0.88772583, 0.894134521, 0.900604248, 0.907104492, 0.913635254, 0.920227051,
- 0.926879883, 0.933563232, 0.940307617, 0.94708252, 0.953918457, 0.96081543,
- 0.96774292, 0.974731445, 0.981781006, 0.988861084, 0.994842529, 0.998565674,
- 0.999969482, 0.99911499, 0.996002197, 0.990600586, 0.982910156, 0.973022461,
- 0.960876465, 0.946533203, 0.930053711, 0.911437988, 0.89074707, 0.868041992,
- 0.843322754, 0.816680908, 0.788208008, 0.757904053, 0.725891113, 0.692199707,
- 0.656921387, 0.620178223, 0.582000732, 0.542480469, 0.501739502, 0.459838867,
- 0.416900635, 0.373016357, 0.328277588, 0.282775879, 0.236663818, 0.189971924,
- 0.142852783, 0.0954284668,0.0477600098
-];
-const RA288_SPEECH_BW_TAB: &[f32] = &[
- 0.98828125, 0.976699829, 0.965254128, 0.953942537, 0.942763507, 0.931715488,
- 0.920796931, 0.910006344, 0.899342179, 0.888803005, 0.878387332, 0.868093729,
- 0.857920766, 0.847867012, 0.837931097, 0.828111589, 0.818407178, 0.808816493,
- 0.799338162, 0.789970934, 0.780713439, 0.771564424, 0.762522638, 0.753586829,
- 0.744755745, 0.736028135, 0.727402806, 0.718878567, 0.710454226, 0.702128589,
- 0.693900526, 0.685768902, 0.677732527, 0.669790328, 0.66194123, 0.654184103
-];
-
-const RA288_GAIN_WINDOW: &[f32] = &[
- 0.505699992, 0.524200022, 0.54339999, 0.563300014, 0.583953857, 0.60534668,
- 0.627502441, 0.650482178, 0.674316406, 0.699005127, 0.724578857, 0.75112915,
- 0.778625488, 0.807128906, 0.836669922, 0.86730957, 0.899078369, 0.932006836,
- 0.961486816, 0.982757568, 0.995635986, 1.0, 0.995819092, 0.983154297,
- 0.96206665, 0.932769775, 0.895507813, 0.850585938, 0.798400879, 0.739379883,
- 0.674072266, 0.602996826, 0.526763916, 0.446014404, 0.361480713, 0.273834229,
- 0.183868408, 0.0923461914
-];
-const RA288_GAIN_BW_TAB: &[f32] = &[
- 0.90625, 0.821289063, 0.74432373, 0.674499512, 0.61126709,
- 0.553955078, 0.50201416, 0.454956055, 0.41229248, 0.373657227
-];
diff --git a/src/codecs/real/ralf.rs b/src/codecs/real/ralf.rs
deleted file mode 100644
index 3b5d88f..0000000
--- a/src/codecs/real/ralf.rs
+++ /dev/null
@@ -1,10377 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use crate::codecs::*;
-use crate::io::byteio::*;
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use crate::io::intcode::*;
-
-struct CodebookSet {
- filter_params_cb: Codebook<u16>,
- bias_cb: Codebook<u16>,
- coding_mode_cb: Codebook<u16>,
- filter_coeffs_cb: Vec<Vec<Codebook<u16>>>,
- short_codes_cb: Vec<Codebook<u16>>,
- long_codes_cb: Vec<Codebook<u16>>,
-}
-
-const MAX_ELEMS: usize = 644;
-struct RALFCodebookDescReader {
- len: usize,
- codes: [u32; MAX_ELEMS],
- bits: [u8; MAX_ELEMS],
-}
-
-impl RALFCodebookDescReader {
- fn new(table: &'static [u8], len: usize) -> Self {
- let mut prefixes: [u32; 18] = [0; 18];
- let mut counts: [usize; 17] = [0; 17];
-
- let mut codes: [u32; MAX_ELEMS] = [0; MAX_ELEMS];
- let mut bits: [u8; MAX_ELEMS] = [0; MAX_ELEMS];
- for i in 0..len {
- let b = (if (i & 1) == 0 { table[i >> 1] >> 4 } else { table[i >> 1] & 0xF }) + 1;
- bits[i] = b;
- counts[b as usize] += 1;
- }
- for i in 1..17 {
- prefixes[i + 1] = (prefixes[i] + (counts[i] as u32)) << 1;
- }
- for i in 0..len {
- codes[i] = prefixes[bits[i] as usize];
- prefixes[bits[i] as usize] += 1;
- }
-
- Self { len, codes, bits }
- }
-}
-
-impl CodebookDescReader<u16> for RALFCodebookDescReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] }
- fn sym (&mut self, idx: usize) -> u16 { idx as u16 }
- fn len(&mut self) -> usize { self.len }
-}
-
-impl CodebookSet {
- fn new(idx: usize) -> Self {
- let mut cbr = RALFCodebookDescReader::new(&RALF_FILTER_PARAM_TAB[idx], RALF_FILTER_PARAM_LEN);
- let filter_params_cb = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
-
- let mut cbr = RALFCodebookDescReader::new(&RALF_BIAS_TAB[idx], RALF_BIAS_LEN);
- let bias_cb = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
-
- let mut cbr = RALFCodebookDescReader::new(&RALF_CODING_MODE_TAB[idx], RALF_CODING_MODE_LEN);
- let coding_mode_cb = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
-
- let mut filter_coeffs_cb: Vec<Vec<Codebook<u16>>> = Vec::with_capacity(10);
- for i in 0..10 {
- let mut fcb: Vec<Codebook<u16>> = Vec::with_capacity(11);
- for j in 0..11 {
- let mut cbr = RALFCodebookDescReader::new(&RALF_FILTER_COEFFS_TAB[idx][i][j], RALF_FILTER_COEFFS_LEN);
- fcb.push(Codebook::new(&mut cbr, CodebookMode::MSB).unwrap());
- }
- filter_coeffs_cb.push(fcb);
- }
-
- let mut short_codes_cb: Vec<Codebook<u16>> = Vec::with_capacity(15);
- for i in 0..15 {
- let mut cbr = RALFCodebookDescReader::new(&RALF_SHORT_CODES_TAB[idx][i], RALF_SHORT_CODES_LEN);
- short_codes_cb.push(Codebook::new(&mut cbr, CodebookMode::MSB).unwrap());
- }
- let mut long_codes_cb: Vec<Codebook<u16>> = Vec::with_capacity(125);
- for i in 0..125 {
- let mut cbr = RALFCodebookDescReader::new(&RALF_LONG_CODES_TAB[idx][i], RALF_LONG_CODES_LEN);
- long_codes_cb.push(Codebook::new(&mut cbr, CodebookMode::MSB).unwrap());
- }
-
- Self { filter_params_cb, bias_cb, coding_mode_cb, filter_coeffs_cb, short_codes_cb, long_codes_cb }
- }
-}
-
-const FILTER_NONE: u16 = 0;
-const FILTER_RAW: u16 = 642;
-struct Filter {
- params: u16,
- length: usize,
- bits: u8,
- coeffs: [i32; 64],
-}
-
-impl Filter {
- fn new() -> Self {
- Self { params: 0, length: 0, bits: 0, coeffs: [0; 64] }
- }
- fn init(&mut self) {
- if self.params > 1 {
- self.bits = ((self.params - 2) >> 6) as u8;
- self.length = (self.params as usize) - ((self.bits as usize) << 6) - 1;
- } else {
- self.bits = 0;
- self.length = 0;
- }
- }
- fn is_none(&self) -> bool { self.params == FILTER_NONE }
- fn is_raw(&self) -> bool { self.params == FILTER_RAW }
- fn read_coeffs(&mut self, br: &mut BitReader, cset: &CodebookSet) -> DecoderResult<()> {
- let coeff_cb = &cset.filter_coeffs_cb[self.bits as usize];
- let mut cmode: i32 = 0;
- let mut coeff = 0;
- for i in 0..self.length {
- let val = br.read_cb(&coeff_cb[(cmode + 5) as usize]).unwrap();
- let m = extend_code(br, val, 21, self.bits).unwrap();
- if cmode == 0 {
- coeff -= 12 << self.bits;
- }
- coeff = m - coeff;
- self.coeffs[i] = coeff;
-
- cmode = coeff >> self.bits;
- if cmode < 0 {
- cmode = -1 - (31 - ((-cmode).leading_zeros() as i32));
- if cmode < -5 { cmode = -5; }
- } else if cmode > 0 {
- cmode = 1 + (31 - (cmode.leading_zeros() as i32));
- if cmode > 5 { cmode = 5; }
- }
- }
- if !self.is_raw() && (self.params > 1) { self.bits += 3; }
- Ok(())
- }
- fn predict(&self, src: &[i32], bits: u8) -> i32 {
- let mut acc: i32 = 0;
- for (f, s) in src.iter().rev().take(self.length).zip(self.coeffs.into_iter()) {
- acc += *f * *s;
- }
- let bias = 1 << (self.bits - 1);
- if acc < 0 {
- let low_bound = -(1 << bits);
- ((acc + bias - 1) >> self.bits).max(low_bound)
- } else {
- let high_bound = (1 << bits) - 1;
- ((acc + bias) >> self.bits).min(high_bound)
- }
- }
-}
-
-struct Channel {
- bias: i32,
- mode: u8,
- bits: u8,
- data: [i32; 4096],
- filter: Filter,
-}
-
-fn extend_code(br: &mut BitReader, code: u16, range: i32, bits: u8) -> DecoderResult<i32> {
- let mut val;
- if code == 0 {
- val = -range - (br.read_code(UintCodeType::GammaP).unwrap() as i32) + 1;
- } else if (code as i32) == range * 2 {
- val = range + (br.read_code(UintCodeType::GammaP).unwrap() as i32) - 1;
- } else {
- val = (code as i32) - range;
- }
- if bits != 0 {
- val = (val << bits) | (br.read(bits).unwrap() as i32);
- }
-
- Ok(val)
-}
-
-impl Channel {
- fn new() -> Self {
- Self { bias: 0, mode: 0, bits: 0, data: [0; 4096], filter: Filter::new() }
- }
- fn decode(&mut self, br: &mut BitReader, codebooks: &[CodebookSet; 3], length: usize) -> DecoderResult<()> {
- let cset = &codebooks[self.mode as usize];
- self.filter.params = br.read_cb(&cset.filter_params_cb).unwrap();
- self.filter.init();
-
- if self.filter.is_raw() {
- for i in 0..length {
- self.data[i] = br.read(self.filter.bits).unwrap() as i32;
- }
- self.bias = 0;
- return Ok(());
- }
- let bias = br.read_cb(&cset.bias_cb).unwrap();
- self.bias = extend_code(br, bias, 127, 4).unwrap();
- if self.filter.is_none() {
- self.data = [0; 4096];
- return Ok(());
- }
-
- self.filter.read_coeffs(br, cset).unwrap();
-
- let code_params = br.read_cb(&cset.coding_mode_cb).unwrap();
- let (add_bits, range, range2, codes_cb) = if code_params >= 15 {
- let mut add_bits = ((code_params / 5 - 3) / 2).max(0).min(10) as u8;
- if add_bits > 9 && ((code_params % 5) != 2) {
- add_bits -= 1;
- }
- (add_bits, 10, 21, &cset.long_codes_cb[(code_params as usize) - 15])
- } else {
- (0, 6, 13, &cset.short_codes_cb[code_params as usize])
- };
-
- for i in 0..length/2 {
- let val = br.read_cb(codes_cb).unwrap();
- let code0 = val / range2;
- let code1 = val % range2;
- self.data[i*2 + 0] = extend_code(br, code0, range, 0).unwrap() << add_bits;
- self.data[i*2 + 1] = extend_code(br, code1, range, 0).unwrap() << add_bits;
- if add_bits != 0 {
- self.data[i*2 + 0] |= br.read(add_bits).unwrap() as i32;
- self.data[i*2 + 1] |= br.read(add_bits).unwrap() as i32;
- }
- }
-
- Ok(())
- }
- fn restore(&mut self, length: usize) {
- if self.filter.is_none() || (self.filter.params == 1) { return; }
- for i in 1..length {
- self.data[i] += self.filter.predict(&self.data[..i], self.bits);
- }
- }
-}
-
-#[derive(Clone,Copy)]
-struct Block {
- size: usize,
- _pts: u16,
-}
-
-const RALF_MAX_PACKET_SIZE: usize = 8192;
-struct RALFDecoder {
- info: Rc<NACodecInfo>,
- chmap: NAChannelMap,
- channels: u8,
-
- max_frame_size: usize,
-
- codebooks: [CodebookSet; 3],
- ch_data: [Channel; 2],
-
- sample_offset: usize,
- blocks: Vec<Block>,
-
- has_pkt: bool,
- pkt_buf: [u8; 16384],
-}
-
-impl RALFDecoder {
- fn new() -> Self {
- RALFDecoder {
- info: NACodecInfo::new_dummy(),
- chmap: NAChannelMap::new(),
- channels: 0,
-
- has_pkt: false,
- pkt_buf: [0; 16384],
- codebooks: [CodebookSet::new(0), CodebookSet::new(1), CodebookSet::new(2)],
- ch_data: [Channel::new(), Channel::new()],
- sample_offset: 0,
- max_frame_size: 0,
- blocks: Vec::with_capacity(32),
- }
- }
- fn decode_block(&mut self, off: usize, size: usize, abuf: &mut NABufferType) -> DecoderResult<()> {
- let mut br = BitReader::new(&self.pkt_buf[off..][..size], size, BitReaderMode::BE);
-
- let length = read_block_length(&mut br).unwrap();
- validate!(length + self.sample_offset <= self.max_frame_size);
-
- let dmode;
- if self.channels > 1 {
- dmode = (br.read(2).unwrap() + 1) as u8;
- } else {
- dmode = 0;
- }
- self.ch_data[0].mode = dmode >> 2;
- self.ch_data[0].bits = 16;
- self.ch_data[1].mode = if dmode >= 2 { 2 } else { 0 };
- self.ch_data[1].bits = if self.ch_data[1].mode == 2 { 17 } else { 16 };
-
- for ch in 0..self.channels {
- self.ch_data[ch as usize].decode(&mut br, &self.codebooks, length).unwrap();
- self.ch_data[ch as usize].restore(length);
- }
-
- let ch0 = abuf.get_offset(0) + self.sample_offset;
- let ch1 = abuf.get_offset(1) + self.sample_offset;
- let mut adata = abuf.get_abuf_i16().unwrap();
- let mut output = adata.get_data_mut();
- match dmode {
- 0 => {
- for i in 0..length {
- output[ch0 + i] = (self.ch_data[0].data[i] + self.ch_data[0].bias) as i16;
- }
- },
- 1 => {
- for i in 0..length {
- output[ch0 + i] = (self.ch_data[0].data[i] + self.ch_data[0].bias) as i16;
- output[ch1 + i] = (self.ch_data[1].data[i] + self.ch_data[1].bias) as i16;
- }
- },
- 2 => {
- for i in 0..length {
- let c0v = self.ch_data[0].data[i] + self.ch_data[0].bias;
- let c1v = self.ch_data[1].data[i] + self.ch_data[1].bias;
- output[ch0 + i] = c0v as i16;
- output[ch1 + i] = (c0v - c1v) as i16;
- }
- },
- 3 => {
- for i in 0..length {
- let c0v = self.ch_data[0].data[i] + self.ch_data[0].bias;
- let c1v = self.ch_data[1].data[i] + self.ch_data[1].bias;
- output[ch0 + i] = (c0v + c1v) as i16;
- output[ch1 + i] = c0v as i16;
- }
- },
- 4 => {
- for i in 0..length {
- let c0v = self.ch_data[0].data[i] + self.ch_data[0].bias;
- let c1v = self.ch_data[1].data[i] + self.ch_data[1].bias;
- let t = (c0v << 1) | (c1v & 1);
- output[ch0 + i] = ((t + c1v) / 2) as i16;
- output[ch1 + i] = ((t - c1v) / 2) as i16;
- }
- },
- _ => unreachable!(),
- }
- self.sample_offset += length;
-
- Ok(())
- }
-}
-
-fn read_block_length(br: &mut BitReader) -> DecoderResult<usize> {
- let code = br.read_code(UintCodeType::LimitedUnary(6, 0)).unwrap() as usize;
- let mut len = 12 - code;
- if len <= 7 { len ^= 1; }
- Ok(1 << len)
-}
-
-impl NADecoder for RALFDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- let edata = info.get_extradata().unwrap();
-
- validate!(edata.len() >= 20);
- let mut mr = MemoryReader::new_read(&edata);
- let mut br = ByteReader::new(&mut mr);
- br.read_skip(4).unwrap();
- let version = br.read_u16be().unwrap();
- br.read_skip(2).unwrap();
- validate!(version == 0x103);
- let channels = br.read_u16be().unwrap();
- let _bits = br.read_u16be().unwrap();
- let sample_rate = br.read_u32be().unwrap();
- let max_frame_size = br.read_u32be().unwrap();
- validate!((channels == 1 || channels == 2) && (sample_rate >= 8000 && sample_rate <= 96000));
- self.max_frame_size = max_frame_size.max(sample_rate) as usize;
-
- let ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), channels as u8,
- SND_S16P_FORMAT, self.max_frame_size);
- self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo));
- self.channels = channels as u8;
- if channels == 1 {
- self.chmap.add_channel(NAChannelType::C);
- } else {
- self.chmap.add_channel(NAChannelType::L);
- self.chmap.add_channel(NAChannelType::R);
- }
-
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- let ainfo = self.info.get_properties().get_audio_info().unwrap();
-
- let src_len;
- if self.has_pkt {
- self.has_pkt = false;
- let table_bits = ((pktbuf[0] as usize) << 8) | (pktbuf[1] as usize);
- let table_bytes = table_bits >> 3;
- validate!((table_bytes + 3 <= pktbuf.len()) && (pktbuf.len() <= RALF_MAX_PACKET_SIZE));
- let cmp_len = table_bytes + 2;
- validate!(&pktbuf[..cmp_len] == &self.pkt_buf[..cmp_len]);
- {
- let copy_size = pktbuf.len() - cmp_len;
- let dst = &mut self.pkt_buf[RALF_MAX_PACKET_SIZE..][..copy_size];
- dst.copy_from_slice(&pktbuf[cmp_len..]);
- src_len = RALF_MAX_PACKET_SIZE + copy_size;
- }
- } else {
- let dst = &mut self.pkt_buf[..pktbuf.len()];
- dst.copy_from_slice(&pktbuf[0..]);
- if pktbuf.len() == RALF_MAX_PACKET_SIZE { //todo better solution
- self.has_pkt = true;
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), NABufferType::None);
- frm.set_frame_type(FrameType::Skip);
- return Ok(Rc::new(RefCell::new(frm)));
- }
- src_len = pktbuf.len();
- }
- validate!(src_len >= 5);
-
- let table_bits = ((self.pkt_buf[0] as usize) << 8) | (self.pkt_buf[1] as usize);
- let table_bytes = (table_bits + 7) >> 3;
- validate!(src_len > table_bytes + 3);
- self.blocks.truncate(0);
- {
- let mut br = BitReader::new(&self.pkt_buf[2..], table_bytes, BitReaderMode::BE);
- while br.tell() < table_bits.into() {
- let size = br.read(13 + self.channels).unwrap() as usize;
- let pts;
- if br.read_bool().unwrap() {
- pts = br.read(9).unwrap() as u16;
- } else {
- pts = 0;
- }
- self.blocks.push(Block{ size, _pts: pts });
- }
- }
- let mut off = table_bytes + 2;
- let mut alength: usize = 0;
- for blk_no in 0..self.blocks.len() {
- let bsize = self.blocks[blk_no].size;
- validate!(src_len - off >= bsize);
- let mut bits = 12 - (!self.pkt_buf[off]).leading_zeros();
- if bits < 6 { bits = 6; }
- if bits <= 7 { bits ^= 1; }
- alength += 1 << bits;
- off += bsize;
- }
- validate!(alength <= self.max_frame_size);
- let mut abuf = alloc_audio_buffer(ainfo, alength, self.chmap.clone()).unwrap();
-
- self.sample_offset = 0;
- let mut off = table_bytes + 2;
- for blk_no in 0..self.blocks.len() {
- let bsize = self.blocks[blk_no].size;
- validate!(src_len - off >= bsize);
- self.decode_block(off, bsize, &mut abuf).unwrap();
- off += bsize;
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(RALFDecoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_ralf() {
- let file = "assets/RV/rv40_ralf.rmvb";
- test_decode_audio("realmedia", file, Some(2000), "ralf");
-//panic!("end");
- }
-}
-
-const RALF_FILTER_PARAM_LEN: usize = 643;
-const RALF_BIAS_LEN: usize = 255;
-const RALF_CODING_MODE_LEN: usize = 140;
-const RALF_FILTER_COEFFS_LEN: usize = 43;
-const RALF_SHORT_CODES_LEN: usize = 169;
-const RALF_LONG_CODES_LEN: usize = 441;
-
-const RALF_FILTER_PARAM_TAB: [[u8; 324]; 3] = [
- [
- 0x48, 0x86, 0x66, 0x8A, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x54, 0x45,
- 0x66, 0x88, 0xAA, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x65, 0x45, 0x55, 0x66, 0x77, 0x78,
- 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xBC, 0xCB, 0xBF, 0xFF, 0xCF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF9, 0x86, 0x55, 0x55, 0x55, 0x66, 0x67, 0x77, 0x88, 0x88, 0x99,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0x9B, 0xBB, 0xCB, 0xBB, 0xCC, 0xCC,
- 0xCF, 0xFF, 0xCC, 0xCF, 0xFC, 0xBC, 0xCC, 0xFB, 0xB9, 0xFC, 0xA8, 0x76,
- 0x66, 0x56, 0x66, 0x67, 0x67, 0x77, 0x78, 0x88, 0x88, 0x89, 0x88, 0x89,
- 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0x9A, 0xA9,
- 0xAB, 0xA9, 0xA9, 0x98, 0x86, 0xFF, 0xCA, 0x88, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0x99, 0x98, 0x99, 0x99, 0x9A,
- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x88, 0x87,
- 0x65, 0xFF, 0xFB, 0xAA, 0xA9, 0x88, 0x88, 0x89, 0x99, 0x98, 0x99, 0x9A,
- 0xA9, 0x9A, 0xA9, 0xAA, 0xA9, 0x9A, 0xAA, 0xA9, 0xAA, 0xA9, 0x99, 0x99,
- 0xA9, 0x9A, 0x99, 0x99, 0x99, 0x98, 0x88, 0x77, 0x64, 0xFF, 0xFF, 0xFC,
- 0xBB, 0xBA, 0xB9, 0xAA, 0xAB, 0xAA, 0xAA, 0xBA, 0xAB, 0xAB, 0xAB, 0xCB,
- 0xBA, 0xAB, 0xBB, 0xBB, 0xAA, 0xBA, 0xAA, 0xAA, 0xAA, 0xA9, 0xAA, 0x99,
- 0x99, 0x99, 0x88, 0x87, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCB, 0xBB, 0xBC, 0xBB, 0xCC, 0xFB, 0xCC, 0xCF, 0xCF,
- 0xCC, 0xFC, 0xFC, 0xCF, 0xCB, 0xCC, 0xBB, 0xBB, 0xCB, 0xBB, 0xAA, 0x99,
- 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xB8, 0xA0, 0x00, 0x00,
- ], [
- 0xFB, 0x95, 0x67, 0x8B, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x55, 0x56,
- 0x77, 0x89, 0xBA, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x65, 0x55, 0x55, 0x56, 0x77, 0x78,
- 0x89, 0x9A, 0xAA, 0xAA, 0xBC, 0xBC, 0xCB, 0xBC, 0xCF, 0xCF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFB, 0x86, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x77, 0x77, 0x88,
- 0x89, 0x9A, 0x99, 0x99, 0xAA, 0xBB, 0xBB, 0xAB, 0xBF, 0xCB, 0xFA, 0xCC,
- 0xFC, 0xEC, 0xEF, 0xFB, 0xBC, 0xFF, 0xBC, 0xBB, 0xA9, 0xFF, 0x98, 0x76,
- 0x66, 0x66, 0x65, 0x66, 0x66, 0x76, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88,
- 0x89, 0x99, 0x99, 0x99, 0x99, 0xA9, 0x99, 0x99, 0x9A, 0x99, 0x99, 0xAA,
- 0xAA, 0xA9, 0x99, 0x98, 0x76, 0xFF, 0xF9, 0x87, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0x89, 0x99,
- 0x99, 0x99, 0x99, 0x89, 0x99, 0x99, 0x99, 0x98, 0x99, 0x98, 0x77, 0x77,
- 0x65, 0xFF, 0xCA, 0xA9, 0x99, 0x89, 0x88, 0x88, 0x98, 0x89, 0x99, 0x98,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0x99, 0x99, 0xA9, 0x9A, 0xA9, 0x99, 0x99,
- 0x99, 0x99, 0xA9, 0x99, 0x99, 0x98, 0x88, 0x77, 0x64, 0xFF, 0xCB, 0xA9,
- 0xA9, 0xAA, 0xAA, 0xAA, 0x9A, 0xAB, 0xAA, 0x9A, 0xBB, 0xAB, 0xAB, 0xBB,
- 0xAB, 0xBA, 0xBB, 0xBA, 0xAA, 0xBA, 0xBA, 0xAA, 0xAA, 0xA9, 0xA9, 0x99,
- 0x99, 0x99, 0x88, 0x77, 0x64, 0xFF, 0xFF, 0xFF, 0xBC, 0xFB, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBA, 0xBA, 0xAB, 0xBF, 0xCB, 0xBB, 0xBB, 0xBC, 0xBF, 0xCC,
- 0xCB, 0xCB, 0xCC, 0xBB, 0xBB, 0xFB, 0xCB, 0xBC, 0xCA, 0xBC, 0xAA, 0xA9,
- 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF0, 0x00, 0x00,
- ], [
- 0x9B, 0x65, 0x67, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x54, 0x56,
- 0x67, 0x88, 0xA9, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x65, 0x44, 0x45, 0x56, 0x67, 0x78,
- 0x89, 0x99, 0xA9, 0xAA, 0xBB, 0xBB, 0xAB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF9, 0x76, 0x55, 0x54, 0x55, 0x55, 0x56, 0x67, 0x77, 0x77, 0x88,
- 0x89, 0x99, 0x98, 0x99, 0x8A, 0x99, 0xBB, 0xAB, 0xBC, 0xAB, 0xBA, 0xAA,
- 0xBB, 0xCB, 0xCC, 0xBB, 0xCC, 0xBB, 0xAC, 0xBA, 0x97, 0xFB, 0x97, 0x76,
- 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88,
- 0x99, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9A, 0x98, 0x99, 0x99,
- 0xA9, 0x99, 0x88, 0x87, 0x65, 0xFF, 0xCA, 0x98, 0x87, 0x77, 0x77, 0x87,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x88, 0x87, 0x77,
- 0x64, 0xFF, 0xFC, 0xCA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAA, 0x9A,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0x99, 0x99, 0x99, 0x89, 0x88, 0x87, 0x64, 0xFF, 0xFF, 0xFB,
- 0xFF, 0xBC, 0xFC, 0xBB, 0xCB, 0xBB, 0xCA, 0xCB, 0xBC, 0xCC, 0xBF, 0xBC,
- 0xBB, 0xBB, 0xBE, 0xBC, 0xCB, 0xCC, 0xBB, 0xFC, 0xBC, 0xCC, 0xAB, 0xCB,
- 0xAB, 0xBB, 0xAA, 0xA9, 0x97, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xFB,
- 0xCC, 0xFC, 0xCF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ]
-];
-
-const RALF_BIAS_TAB: [[u8; 128]; 3] = [
- [
- 0x4A, 0xAA, 0xAA, 0xAA, 0xBA, 0xBA, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x9A, 0xA9, 0xA9,
- 0x99, 0xA9, 0x99, 0x99, 0xA9, 0xA9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
- 0x99, 0x99, 0x88, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x66, 0x66, 0x66, 0x55, 0x55, 0x55,
- 0x55, 0x54, 0x44, 0x32, 0x44, 0x55, 0x55, 0x66, 0x66, 0x66, 0x66, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x89, 0x88, 0x89, 0x89, 0x99, 0x99, 0x98, 0x99, 0x9A,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xA9, 0x9A, 0x99, 0x9A, 0xA9, 0xA9, 0xA9,
- 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBA, 0x40,
- ], [
- 0x4C, 0xBC, 0xAC, 0xBC, 0xBA, 0xAB, 0xAB, 0xBB, 0xBA, 0xAA, 0xAB, 0xAA,
- 0xBB, 0xAA, 0xBB, 0xAA, 0xAB, 0xBA, 0xBA, 0xAA, 0xBB, 0xAA, 0xA9, 0xAA,
- 0xBB, 0xAA, 0xAA, 0x9A, 0x9A, 0xAA, 0xA9, 0xAA, 0x99, 0x99, 0x99, 0x99,
- 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x89, 0x88, 0x88, 0x88, 0x88,
- 0x87, 0x78, 0x77, 0x77, 0x77, 0x77, 0x67, 0x66, 0x66, 0x55, 0x44, 0x45,
- 0x54, 0x44, 0x44, 0x33, 0x44, 0x45, 0x55, 0x56, 0x66, 0x66, 0x66, 0x67,
- 0x77, 0x77, 0x77, 0x77, 0x87, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x99, 0x88, 0x99, 0x99, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xA9,
- 0xA9, 0xAA, 0x9A, 0xA9, 0xAA, 0x9A, 0xAA, 0x9A, 0xAA, 0xAB, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xBB, 0xBA, 0xAA, 0xAB, 0xAB, 0xAA,
- 0xAB, 0xAB, 0xAC, 0xBB, 0xAA, 0xBB, 0xBB, 0x40,
- ], [
- 0x5B, 0xBB, 0xBC, 0xBB, 0xCB, 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xBB, 0xCB,
- 0xBA, 0xCB, 0xBC, 0xBB, 0xAA, 0xBB, 0xAB, 0xBA, 0xBB, 0xBB, 0xAB, 0xBB,
- 0xAA, 0xBA, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA9, 0x9A,
- 0x9A, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x89, 0x99,
- 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x66, 0x66, 0x55,
- 0x54, 0x44, 0x43, 0x22, 0x34, 0x44, 0x55, 0x56, 0x66, 0x66, 0x67, 0x77,
- 0x77, 0x77, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x99, 0x89, 0x99, 0x99,
- 0x99, 0x99, 0x99, 0x9A, 0x9A, 0xA9, 0xA9, 0x9A, 0x9A, 0xAA, 0x9A, 0xAA,
- 0xAA, 0xAA, 0xBA, 0xAA, 0xAA, 0xAA, 0xBA, 0xAA, 0xAA, 0xAB, 0xBA, 0xBB,
- 0xAA, 0xBB, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC,
- 0xBB, 0xBC, 0xBB, 0xBB, 0xCC, 0xBC, 0xCB, 0x50,
- ]
-];
-
-const RALF_CODING_MODE_TAB: [[u8; 72]; 3] = [
- [
- 0xAA, 0x99, 0xAC, 0xB9, 0xBD, 0xAA, 0x7A, 0xA8, 0xA8, 0xA8, 0x79, 0x79,
- 0x77, 0xA8, 0x97, 0x79, 0x89, 0x77, 0x87, 0x87, 0x68, 0x78, 0x66, 0x86,
- 0x87, 0x67, 0x68, 0x66, 0x76, 0x76, 0x57, 0x67, 0x55, 0x75, 0x65, 0x56,
- 0x56, 0x55, 0x65, 0x65, 0x56, 0x45, 0x55, 0x54, 0x55, 0x55, 0x45, 0x55,
- 0x54, 0x55, 0x55, 0x45, 0x56, 0x64, 0x66, 0x76, 0x57, 0x67, 0x77, 0x77,
- 0x98, 0x88, 0x9D, 0xBF, 0xBA, 0xEC, 0xFC, 0xBA, 0xEF, 0xFC, 0x00, 0x00,
- ], [
- 0xCF, 0x9B, 0xAF, 0xFF, 0xFF, 0xAB, 0x8A, 0x98, 0xB8, 0xF9, 0x78, 0x89,
- 0x77, 0xF9, 0xF7, 0x79, 0x89, 0x77, 0x97, 0x97, 0x68, 0x68, 0x66, 0xA6,
- 0x87, 0x77, 0x68, 0x66, 0x75, 0x76, 0x67, 0x56, 0x65, 0x75, 0x75, 0x56,
- 0x56, 0x55, 0x65, 0x65, 0x56, 0x56, 0x55, 0x54, 0x55, 0x55, 0x45, 0x55,
- 0x53, 0x55, 0x65, 0x35, 0x67, 0x64, 0x66, 0x66, 0x56, 0x78, 0x86, 0x88,
- 0xA8, 0xFB, 0xAF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
- ], [
- 0xDC, 0xAD, 0xCC, 0xCA, 0xCF, 0xFE, 0xDF, 0xFF, 0xE9, 0xFF, 0x99, 0x79,
- 0x97, 0x97, 0x97, 0x79, 0x79, 0x77, 0x97, 0x97, 0x79, 0x79, 0x77, 0x86,
- 0x87, 0x68, 0x68, 0x76, 0x76, 0x76, 0x67, 0x57, 0x66, 0x65, 0x76, 0x66,
- 0x56, 0x55, 0x64, 0x65, 0x55, 0x45, 0x55, 0x54, 0x55, 0x55, 0x35, 0x55,
- 0x53, 0x55, 0x65, 0x35, 0x67, 0x64, 0x67, 0x87, 0x57, 0x8A, 0x86, 0x8B,
- 0xBA, 0x9A, 0xCD, 0xAA, 0xAF, 0xFC, 0xFF, 0xFF, 0xDF, 0xFF, 0x00, 0x00,
- ]
-];
-
-const RALF_FILTER_COEFFS_TAB: [[[[u8; 24]; 11]; 10]; 3] = [
- [
- [
- [
- 0x47, 0x88, 0x76, 0x52, 0x12, 0x35, 0x44, 0x43, 0x34, 0x45, 0x77, 0x67,
- 0x66, 0x87, 0x87, 0x7D, 0x8A, 0x89, 0x9D, 0xDD, 0x9C, 0xC0, 0x00, 0x00,
- ],
- [
- 0x7C, 0xCC, 0xC7, 0x65, 0xCC, 0x22, 0x23, 0x46, 0x32, 0x22, 0x46, 0x7B,
- 0xB6, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xBB, 0xB4, 0x43, 0x25, 0x5B, 0x5A, 0xAB, 0x5B, 0x22, 0x22, 0x2B,
- 0xBA, 0xAA, 0x46, 0x5B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
- ],
- [
- 0x99, 0x89, 0x88, 0x89, 0x31, 0x88, 0x88, 0x89, 0x88, 0x38, 0x88, 0x13,
- 0x28, 0x88, 0x88, 0x28, 0x88, 0x88, 0x88, 0x88, 0x99, 0x90, 0x00, 0x00,
- ],
- [
- 0x99, 0x89, 0x88, 0x89, 0x88, 0x88, 0x88, 0x39, 0x98, 0x88, 0x88, 0x88,
- 0x08, 0x88, 0x88, 0x81, 0x99, 0x88, 0x99, 0x99, 0x99, 0x20, 0x00, 0x00,
- ],
- [
- 0xAA, 0xD9, 0x86, 0xCD, 0xDD, 0xDD, 0x98, 0x76, 0x43, 0x65, 0x35, 0x63,
- 0x23, 0x44, 0x33, 0x24, 0x45, 0x44, 0x45, 0x59, 0xA8, 0x90, 0x00, 0x00,
- ],
- [
- 0x99, 0x89, 0x88, 0x89, 0x98, 0x88, 0x88, 0x89, 0x98, 0x08, 0x88, 0x88,
- 0x28, 0x88, 0x88, 0x83, 0x19, 0x98, 0x88, 0x99, 0x99, 0x90, 0x00, 0x00,
- ],
- [
- 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA5, 0xA4, 0x01, 0x4A, 0xAA,
- 0x53, 0x4A, 0xA4, 0xAA, 0x5A, 0xAA, 0xAA, 0xAA, 0xAA, 0xB0, 0x00, 0x00,
- ],
- [
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x9A, 0xAA, 0xA3, 0x31, 0x31,
- 0x34, 0x34, 0xA9, 0xA5, 0x44, 0x4A, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xED, 0xDE, 0xEE, 0xED, 0xDD, 0xDE, 0xE8, 0xEE, 0xE7, 0x64,
- 0x47, 0x43, 0x30, 0x43, 0x43, 0x36, 0x7E, 0xEE, 0xEE, 0x90, 0x00, 0x00,
- ],
- [
- 0x67, 0x87, 0x87, 0x66, 0x65, 0x55, 0x44, 0x45, 0x65, 0x54, 0x54, 0x32,
- 0x34, 0x66, 0x63, 0x55, 0x44, 0x54, 0x34, 0x45, 0x56, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x56, 0x66, 0x65, 0x54, 0x33, 0x34, 0x33, 0x33, 0x33, 0x34, 0x44, 0x45,
- 0x56, 0x66, 0x67, 0x77, 0x77, 0x77, 0x78, 0x89, 0x89, 0x60, 0x00, 0x00,
- ],
- [
- 0x78, 0x89, 0x98, 0x65, 0x65, 0x32, 0x22, 0x32, 0x33, 0x33, 0x45, 0x77,
- 0x77, 0x8B, 0x9A, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xF0, 0x00, 0x00,
- ],
- [
- 0x9D, 0xD8, 0x8D, 0x57, 0x56, 0x55, 0x44, 0x45, 0x22, 0x22, 0x23, 0x34,
- 0x57, 0x78, 0x88, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00,
- ],
- [
- 0xDC, 0xCC, 0x8C, 0xCC, 0x87, 0x65, 0x55, 0x54, 0x23, 0x44, 0x21, 0x23,
- 0x46, 0x56, 0x87, 0x7C, 0x8C, 0x8C, 0xCC, 0xCC, 0xCC, 0xD0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xCD, 0xCC, 0xCD, 0xDC, 0xC7, 0x64, 0x58, 0x31, 0x25, 0x33, 0x22,
- 0x44, 0x56, 0x66, 0x6D, 0xDD, 0xDD, 0xDC, 0xDC, 0xDC, 0xD0, 0x00, 0x00,
- ],
- [
- 0xB9, 0x99, 0xA6, 0x67, 0x78, 0x76, 0x78, 0x88, 0x66, 0x55, 0x44, 0x43,
- 0x23, 0x33, 0x33, 0x33, 0x34, 0x45, 0x56, 0x66, 0x88, 0xB0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xCD, 0xDC, 0xCD, 0xDC, 0xCC, 0x77, 0xC5, 0x53, 0x12, 0x23, 0x33,
- 0x33, 0x46, 0x65, 0x75, 0x8D, 0xDD, 0xDD, 0xDC, 0xDC, 0xD0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xCD, 0xCC, 0xCD, 0xDC, 0xCC, 0x8C, 0x85, 0x55, 0x33, 0x21, 0x23,
- 0x33, 0x44, 0x56, 0x56, 0x56, 0x8D, 0xDD, 0xCC, 0xDC, 0xD0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xDD, 0xDE, 0xDD, 0xDD, 0xDD, 0x87, 0x75, 0x55, 0x43, 0x22,
- 0x21, 0x25, 0x65, 0x55, 0x66, 0x77, 0xD8, 0x8D, 0xDD, 0x90, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xAA, 0x98, 0x77, 0x55, 0x43,
- 0x33, 0x33, 0x21, 0x33, 0x34, 0x66, 0x89, 0xAF, 0xFF, 0xC0, 0x00, 0x00,
- ],
- [
- 0x57, 0x77, 0x76, 0x66, 0x65, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
- 0x33, 0x44, 0x43, 0x44, 0x44, 0x45, 0x56, 0x66, 0x77, 0x50, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x57, 0x76, 0x66, 0x65, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x34,
- 0x45, 0x56, 0x67, 0x77, 0x77, 0x89, 0x88, 0x89, 0x99, 0x60, 0x00, 0x00,
- ],
- [
- 0x8A, 0x99, 0x88, 0x77, 0x66, 0x44, 0x43, 0x32, 0x32, 0x22, 0x33, 0x45,
- 0x67, 0x89, 0xEB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFB, 0xBA, 0xA7, 0x78, 0x66, 0x65, 0x54, 0x22, 0x21, 0x23, 0x44,
- 0x56, 0x8A, 0x9E, 0xAF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xAF, 0xFD, 0xDF, 0xAC, 0x98, 0x77, 0x66, 0x44, 0x31, 0x11, 0x35,
- 0x67, 0x88, 0x8A, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEF, 0xEE, 0xEF, 0xA8, 0x8E, 0x97, 0x66, 0x43, 0x22, 0x21, 0x23,
- 0x45, 0x67, 0x97, 0x7F, 0xFF, 0xEE, 0xE9, 0xEE, 0xEE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xAA, 0xA9, 0x97, 0x65, 0x45, 0x45, 0x67, 0x66, 0x55, 0x54, 0x44, 0x44,
- 0x33, 0x33, 0x33, 0x33, 0x44, 0x45, 0x56, 0x68, 0x8B, 0xB0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xED, 0xDE, 0xED, 0xDD, 0xD8, 0x77, 0x65, 0x43, 0x11, 0x22,
- 0x34, 0x66, 0x78, 0x87, 0xEE, 0xEE, 0xEE, 0x9D, 0xED, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xDC, 0xFF, 0xAE, 0xEA, 0x98, 0x76, 0x54, 0x31, 0x11,
- 0x34, 0x56, 0x88, 0x99, 0x9B, 0xFF, 0xFF, 0xBF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xCF, 0xDF, 0xFF, 0xFD, 0x9A, 0x76, 0x65, 0x43, 0x21,
- 0x12, 0x35, 0x56, 0x67, 0x89, 0x99, 0xAF, 0xAF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFE, 0xEF, 0xDB, 0xBA, 0xAA, 0x99, 0x76, 0x55, 0x43, 0x22,
- 0x22, 0x33, 0x33, 0x44, 0x55, 0x67, 0x8A, 0xFA, 0xFB, 0xA0, 0x00, 0x00,
- ],
- [
- 0x57, 0x77, 0x77, 0x66, 0x65, 0x55, 0x54, 0x44, 0x44, 0x44, 0x43, 0x33,
- 0x33, 0x34, 0x44, 0x44, 0x55, 0x55, 0x66, 0x77, 0x88, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x58, 0x77, 0x76, 0x66, 0x55, 0x54, 0x44, 0x33, 0x33, 0x23, 0x33, 0x33,
- 0x45, 0x56, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x99, 0x60, 0x00, 0x00,
- ],
- [
- 0x9A, 0xA9, 0xA9, 0x88, 0x76, 0x55, 0x44, 0x33, 0x22, 0x22, 0x23, 0x45,
- 0x56, 0x99, 0x9D, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFD, 0xBB, 0xAA, 0xBA, 0xA9, 0x87, 0x77, 0x54, 0x33, 0x21, 0x12, 0x45,
- 0x68, 0x8A, 0xAA, 0xCB, 0xFF, 0xCF, 0xFF, 0xFF, 0xFE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFE, 0xA9, 0x98, 0x87, 0x65, 0x41, 0x02, 0x45,
- 0x77, 0x88, 0xAC, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xBF, 0xFC, 0xAB, 0xFB, 0xBA, 0xAB, 0xB8, 0x88, 0x76, 0x52, 0x01, 0x35,
- 0x78, 0x99, 0xAB, 0xAA, 0xCF, 0xBB, 0xCF, 0xFC, 0xFC, 0xF0, 0x00, 0x00,
- ],
- [
- 0xBA, 0xCA, 0x98, 0x75, 0x21, 0x35, 0x77, 0x77, 0x76, 0x65, 0x54, 0x44,
- 0x44, 0x34, 0x44, 0x44, 0x45, 0x56, 0x78, 0x88, 0x9A, 0xC0, 0x00, 0x00,
- ],
- [
- 0xDF, 0xCF, 0xCC, 0xFF, 0xAB, 0xC9, 0xB9, 0x98, 0x97, 0x75, 0x20, 0x13,
- 0x56, 0x89, 0x89, 0xAA, 0xFC, 0xBC, 0xAF, 0xCC, 0xFF, 0xD0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xBB, 0xFB, 0xFF, 0xFB, 0xBA, 0xA8, 0x77, 0x54, 0x21, 0x11,
- 0x45, 0x67, 0x88, 0x8A, 0xEF, 0xBB, 0xFF, 0xBB, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFB, 0xCB, 0xB9, 0x88, 0x65, 0x31, 0x12,
- 0x23, 0x35, 0x67, 0x88, 0xAA, 0xAC, 0xFC, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFC, 0xEF, 0xFF, 0xBB, 0xAA, 0xA9, 0x76, 0x55, 0x32, 0x22,
- 0x22, 0x33, 0x34, 0x56, 0x67, 0x68, 0x9A, 0xAA, 0xCD, 0xE0, 0x00, 0x00,
- ],
- [
- 0x58, 0x77, 0x77, 0x66, 0x66, 0x55, 0x54, 0x44, 0x44, 0x43, 0x33, 0x33,
- 0x33, 0x34, 0x44, 0x55, 0x55, 0x66, 0x67, 0x78, 0x88, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x57, 0x77, 0x76, 0x66, 0x55, 0x55, 0x54, 0x43, 0x33, 0x22, 0x33, 0x34,
- 0x45, 0x55, 0x66, 0x67, 0x77, 0x77, 0x78, 0x88, 0x99, 0x50, 0x00, 0x00,
- ],
- [
- 0xAC, 0x99, 0x98, 0x87, 0x76, 0x66, 0x54, 0x43, 0x32, 0x21, 0x23, 0x45,
- 0x66, 0x89, 0x99, 0x99, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xB9, 0xAA, 0x98, 0x77, 0x65, 0x42, 0x21, 0x12, 0x45,
- 0x78, 0x8A, 0xBA, 0xAA, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFD, 0xBC, 0xBB, 0xB9, 0x98, 0x76, 0x32, 0x01, 0x46,
- 0x79, 0xAB, 0xBB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xAA, 0xAA, 0x99, 0x76, 0x42, 0x01, 0x36,
- 0x79, 0x9A, 0xAB, 0xBF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xCC, 0xDC, 0xB9, 0x75, 0x10, 0x47, 0x89, 0x99, 0x98, 0x87, 0x76, 0x66,
- 0x55, 0x55, 0x55, 0x56, 0x66, 0x67, 0x78, 0x99, 0xBE, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFC, 0xCC, 0xFF, 0xFB, 0xAB, 0x87, 0x64, 0x10, 0x23,
- 0x67, 0x99, 0x9A, 0xAD, 0xCE, 0xFF, 0xFC, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFD, 0xFA, 0xB9, 0x97, 0x65, 0x20, 0x13,
- 0x56, 0x78, 0xAA, 0x9B, 0xFB, 0xFC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xCF, 0xFC, 0xC9, 0xAC, 0x98, 0x87, 0x54, 0x31, 0x12,
- 0x23, 0x45, 0x67, 0x78, 0x9A, 0xAA, 0xEB, 0xFF, 0xFF, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFE, 0xCA, 0xFA, 0x99, 0x98, 0x88, 0x65, 0x44, 0x32, 0x22,
- 0x22, 0x33, 0x45, 0x56, 0x67, 0x78, 0x99, 0xBB, 0xAB, 0xA0, 0x00, 0x00,
- ],
- [
- 0x48, 0x77, 0x76, 0x66, 0x65, 0x55, 0x55, 0x44, 0x44, 0x43, 0x33, 0x33,
- 0x33, 0x34, 0x45, 0x55, 0x55, 0x66, 0x67, 0x77, 0x78, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x68, 0x87, 0x77, 0x77, 0x66, 0x55, 0x54, 0x43, 0x33, 0x22, 0x23, 0x34,
- 0x45, 0x55, 0x66, 0x78, 0x88, 0x98, 0x88, 0x88, 0x89, 0x60, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0xBA, 0x99, 0x87, 0x76, 0x54, 0x33, 0x21, 0x12, 0x46,
- 0x67, 0x89, 0x9A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x87, 0x76, 0x54, 0x21, 0x11, 0x45,
- 0x78, 0x8A, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xAA, 0x99, 0x76, 0x32, 0x01, 0x46,
- 0x78, 0x9A, 0xAB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xE9, 0x89, 0x76, 0x52, 0x01, 0x35,
- 0x68, 0x98, 0x9A, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xAD, 0xCB, 0xA9, 0x74, 0x10, 0x46, 0x89, 0x9A, 0xA9, 0x98, 0x77, 0x76,
- 0x66, 0x55, 0x55, 0x56, 0x66, 0x66, 0x78, 0x88, 0x8A, 0xD0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAA, 0xAA, 0x87, 0x63, 0x10, 0x24,
- 0x67, 0x89, 0xAF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x9A, 0x97, 0x64, 0x20, 0x13,
- 0x67, 0x89, 0x9A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x87, 0x76, 0x43, 0x21, 0x12,
- 0x34, 0x56, 0x67, 0x88, 0x89, 0xAE, 0xCF, 0xFD, 0xEF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAA, 0x87, 0x66, 0x54, 0x31, 0x12,
- 0x33, 0x44, 0x55, 0x67, 0x77, 0x89, 0xAB, 0xAB, 0xCF, 0xC0, 0x00, 0x00,
- ],
- [
- 0x58, 0x87, 0x87, 0x77, 0x76, 0x66, 0x55, 0x55, 0x44, 0x43, 0x32, 0x22,
- 0x33, 0x44, 0x55, 0x56, 0x67, 0x77, 0x78, 0x88, 0x88, 0x70, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x67, 0x76, 0x66, 0x76, 0x66, 0x55, 0x44, 0x44, 0x33, 0x22, 0x22, 0x34,
- 0x56, 0x67, 0x77, 0x89, 0x88, 0x99, 0xAB, 0x9A, 0xAB, 0x70, 0x00, 0x00,
- ],
- [
- 0x9B, 0xA9, 0x88, 0x88, 0x87, 0x77, 0x65, 0x54, 0x43, 0x21, 0x12, 0x45,
- 0x67, 0x9A, 0x9A, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFC, 0xCB, 0xBA, 0xAA, 0x98, 0x87, 0x65, 0x31, 0x02, 0x56,
- 0x89, 0xAB, 0xCB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xAA, 0x9A, 0x98, 0x76, 0x42, 0x01, 0x36,
- 0x79, 0xAF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0xA9, 0x98, 0x76, 0x52, 0x01, 0x35,
- 0x78, 0x8E, 0xCB, 0xBF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0x8C, 0xBA, 0x99, 0x74, 0x10, 0x36, 0x89, 0x9A, 0xA9, 0x99, 0x88, 0x87,
- 0x76, 0x66, 0x66, 0x66, 0x66, 0x56, 0x66, 0x78, 0x89, 0xC0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x8A, 0xA9, 0x88, 0x63, 0x10, 0x24,
- 0x67, 0x8B, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x99, 0x76, 0x54, 0x10, 0x24,
- 0x56, 0x78, 0x9A, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x87, 0x54, 0x20, 0x22,
- 0x45, 0x67, 0x77, 0x89, 0xAC, 0xAB, 0xFB, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xAB, 0x86, 0x54, 0x21, 0x12,
- 0x34, 0x45, 0x66, 0x77, 0x67, 0x77, 0x88, 0x99, 0x9A, 0x90, 0x00, 0x00,
- ],
- [
- 0x57, 0x77, 0x76, 0x66, 0x65, 0x55, 0x55, 0x55, 0x54, 0x43, 0x32, 0x23,
- 0x33, 0x44, 0x55, 0x55, 0x66, 0x67, 0x88, 0x77, 0x77, 0x50, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x35, 0x44, 0x45, 0x55, 0x54, 0x44, 0x44, 0x43, 0x33, 0x33, 0x23, 0x44,
- 0x68, 0x99, 0xAA, 0xAA, 0xCB, 0xAB, 0xAF, 0xFE, 0xEB, 0xE0, 0x00, 0x00,
- ],
- [
- 0x77, 0x66, 0x67, 0x66, 0x66, 0x66, 0x54, 0x44, 0x33, 0x22, 0x12, 0x45,
- 0x68, 0xAA, 0xBE, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEA, 0x98, 0x88, 0x87, 0x77, 0x65, 0x55, 0x44, 0x32, 0x02, 0x46,
- 0x78, 0x89, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xAB, 0x99, 0x76, 0x65, 0x42, 0x01, 0x45,
- 0x78, 0xAA, 0xAD, 0xAC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xEB, 0xBA, 0xA9, 0x86, 0x42, 0x01, 0x36,
- 0x77, 0x8A, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0x98, 0x74, 0x10, 0x36, 0x77, 0x89, 0x99, 0x99, 0x88, 0x77,
- 0x76, 0x66, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAA, 0xAB, 0xC0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xC9, 0x99, 0x99, 0x88, 0x64, 0x10, 0x24,
- 0x55, 0x68, 0x89, 0xBB, 0xAD, 0xBF, 0xBF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x65, 0x65, 0x54, 0x20, 0x23,
- 0x45, 0x56, 0x77, 0x77, 0x8E, 0xCB, 0xBE, 0xDF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x76, 0x53, 0x21, 0x13,
- 0x34, 0x55, 0x45, 0x55, 0x67, 0x79, 0xAB, 0xFA, 0xFB, 0xA0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0x87, 0x54, 0x21, 0x23,
- 0x33, 0x44, 0x55, 0x55, 0x44, 0x45, 0x57, 0x8A, 0xAA, 0x80, 0x00, 0x00,
- ],
- [
- 0x79, 0x99, 0x99, 0x97, 0x77, 0x76, 0x54, 0x44, 0x44, 0x44, 0x32, 0x33,
- 0x33, 0x33, 0x44, 0x45, 0x56, 0x67, 0x88, 0x77, 0x78, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x34, 0x54, 0x45, 0x55, 0x54, 0x44, 0x44, 0x33, 0x32, 0x43, 0x34, 0x44,
- 0x56, 0x77, 0xBB, 0xB6, 0xCC, 0xCC, 0xCC, 0xC8, 0xCB, 0x70, 0x00, 0x00,
- ],
- [
- 0x7E, 0x67, 0x55, 0x65, 0x44, 0x55, 0x44, 0x33, 0x22, 0x23, 0x23, 0x57,
- 0x98, 0xDD, 0xDD, 0xDE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEF, 0xEE, 0x97, 0x75, 0x54, 0x43, 0x33, 0x33, 0x32, 0x12, 0x58,
- 0x88, 0xEE, 0xAE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x88, 0x87, 0x66, 0x53, 0x22, 0x02, 0x57,
- 0x9D, 0xFF, 0xFF, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x78, 0x76, 0x42, 0x01, 0x36,
- 0x99, 0x9A, 0xFF, 0xDF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xAB, 0xAA, 0xA8, 0x75, 0x10, 0x26, 0x79, 0x88, 0x77, 0x77, 0x66, 0x66,
- 0x57, 0x78, 0x88, 0x89, 0x98, 0x9A, 0xBB, 0xBB, 0xDD, 0xC0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFE, 0xA8, 0x78, 0x76, 0x54, 0x20, 0x22,
- 0x45, 0x6E, 0x8E, 0xEF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFA, 0xE7, 0x66, 0x64, 0x20, 0x23,
- 0x34, 0x56, 0x78, 0x88, 0xAF, 0xFC, 0xFF, 0xFF, 0xAF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xED, 0xDE, 0xED, 0x8D, 0xDD, 0xD9, 0xE6, 0x63, 0x21, 0x23,
- 0x43, 0x34, 0x35, 0x55, 0x65, 0x47, 0xEE, 0xED, 0xED, 0xE0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xCD, 0xDC, 0xCD, 0xDD, 0xCC, 0xCC, 0xCD, 0xDD, 0x76, 0x43, 0x44,
- 0x44, 0x43, 0x34, 0x33, 0x22, 0x33, 0x35, 0xD8, 0xCC, 0xD0, 0x00, 0x00,
- ],
- [
- 0x6B, 0x77, 0xBB, 0xB6, 0x96, 0x55, 0x55, 0x54, 0x44, 0x44, 0x33, 0x43,
- 0x33, 0x33, 0x45, 0x34, 0x44, 0x68, 0x57, 0x78, 0x86, 0x50, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x4A, 0xAA, 0xAA, 0x9A, 0x44, 0x44, 0x45, 0x23, 0x24, 0x22, 0xA3, 0x3A,
- 0x44, 0x99, 0x99, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0xAA, 0x45, 0x34, 0x94, 0x4A, 0x4A, 0x32, 0x23, 0x32, 0x24, 0x4A, 0xAA,
- 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0xAA, 0xAA, 0xAA, 0xAA, 0x4A, 0xA4, 0x44, 0x21, 0x43, 0x32, 0x23, 0x5A,
- 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x7D, 0x8D, 0x74, 0x21, 0x11, 0x35, 0x7D,
- 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00,
- ],
- [
- 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE9, 0x64, 0x32, 0x01, 0x57,
- 0xE8, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xE9, 0x55, 0x10, 0x27, 0x98, 0x65, 0x48, 0xAE, 0x99, 0x88,
- 0x77, 0x87, 0x79, 0x89, 0xEA, 0xEE, 0xAE, 0xEE, 0xEE, 0xE0, 0x00, 0x00,
- ],
- [
- 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB6, 0x45, 0x11, 0x13,
- 0x44, 0x3B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xC0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5A, 0x31, 0x12,
- 0x23, 0x34, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xB0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xBB, 0xBB, 0xAB, 0xBB, 0xBB, 0xAA, 0xAB, 0xBB, 0xBB, 0xB5, 0x55,
- 0x64, 0x22, 0x24, 0x55, 0x32, 0x14, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
- ],
- [
- 0xAA, 0xAA, 0xA9, 0x9A, 0xAA, 0xA9, 0x99, 0x9A, 0x4A, 0xAA, 0xA3, 0x33,
- 0x32, 0x34, 0x35, 0x44, 0x42, 0x24, 0xA4, 0xAA, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0xAA, 0x9A, 0x99, 0x9A, 0xA9, 0x54, 0x94, 0x95, 0x44, 0x53, 0x34, 0x53,
- 0x23, 0x34, 0x34, 0x45, 0x33, 0x4A, 0x99, 0x99, 0xA9, 0xA0, 0x00, 0x00,
- ],
- ],
- ],
- [
- [
- [
- 0x57, 0xAB, 0x66, 0x52, 0x12, 0x44, 0x45, 0x43, 0x33, 0x45, 0x77, 0xA6,
- 0x77, 0xA7, 0xA7, 0x65, 0x77, 0xBB, 0xB7, 0xBB, 0x7B, 0xB0, 0x00, 0x00,
- ],
- [
- 0xBB, 0x5B, 0xBB, 0x5B, 0xBB, 0x21, 0x22, 0x45, 0x62, 0x26, 0x56, 0xBB,
- 0xBB, 0xBA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
- ],
- [
- 0xAA, 0x3A, 0x99, 0x93, 0x19, 0x99, 0x99, 0x99, 0x99, 0x24, 0x19, 0x33,
- 0x99, 0x93, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xA0, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x66, 0x67, 0x76, 0x66, 0x66, 0x67, 0x77, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x10, 0x77, 0x76, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x66, 0x67, 0x76, 0x66, 0x66, 0x67, 0x77, 0x66, 0x66, 0x66,
- 0x61, 0x66, 0x66, 0x67, 0x07, 0x76, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00,
- ],
- [
- 0xDD, 0xDD, 0xD6, 0xCD, 0xDD, 0xD9, 0x88, 0xC9, 0x64, 0x76, 0x34, 0x42,
- 0x12, 0x54, 0x53, 0x34, 0x54, 0x56, 0x66, 0x79, 0xDD, 0xD0, 0x00, 0x00,
- ],
- [
- 0x88, 0x78, 0x77, 0x78, 0x77, 0x77, 0x77, 0x78, 0x87, 0x07, 0x77, 0x77,
- 0x21, 0x77, 0x77, 0x78, 0x88, 0x87, 0x87, 0x88, 0x88, 0x80, 0x00, 0x00,
- ],
- [
- 0xAA, 0x9A, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x99, 0x01, 0x99, 0x99,
- 0x43, 0x99, 0x34, 0x99, 0x94, 0x99, 0x99, 0x99, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0x99, 0x89, 0x88, 0x89, 0x88, 0x88, 0x88, 0x89, 0x88, 0x82, 0x88, 0x21,
- 0x82, 0x82, 0x83, 0x88, 0x82, 0x88, 0x88, 0x88, 0x99, 0x90, 0x00, 0x00,
- ],
- [
- 0xDD, 0xDD, 0xDD, 0xCD, 0xDD, 0xDD, 0xCC, 0xCD, 0xDD, 0xDD, 0xD6, 0x74,
- 0x56, 0x64, 0x20, 0x54, 0x42, 0x38, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00,
- ],
- [
- 0x79, 0x87, 0x96, 0x76, 0x76, 0x55, 0x66, 0x44, 0x55, 0x44, 0x55, 0x32,
- 0x24, 0x88, 0x62, 0x55, 0x45, 0x43, 0x47, 0x66, 0x76, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x57, 0x66, 0x65, 0x54, 0x43, 0x34, 0x33, 0x33, 0x33, 0x33, 0x44, 0x45,
- 0x55, 0x66, 0x77, 0x77, 0x77, 0x77, 0x98, 0x88, 0x79, 0x60, 0x00, 0x00,
- ],
- [
- 0x88, 0x98, 0x8D, 0x65, 0x66, 0x32, 0x33, 0x22, 0x23, 0x33, 0x45, 0x67,
- 0x78, 0x68, 0x8D, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00,
- ],
- [
- 0x8D, 0xCD, 0xDC, 0xC5, 0x56, 0x46, 0x45, 0x54, 0x22, 0x22, 0x22, 0x45,
- 0x57, 0x6C, 0xCC, 0xCD, 0xDD, 0xDD, 0xDD, 0xDC, 0xCC, 0xD0, 0x00, 0x00,
- ],
- [
- 0xCC, 0xCC, 0xCB, 0xBC, 0xCC, 0xC7, 0xB5, 0x54, 0x12, 0x33, 0x22, 0x25,
- 0x56, 0xB6, 0x7B, 0xB7, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xAB, 0xBA, 0xAB, 0xBB, 0xA5, 0xA5, 0x55, 0x21, 0x2B, 0x33, 0x23,
- 0x44, 0x55, 0xA6, 0x5B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
- ],
- [
- 0xAC, 0xAB, 0xC6, 0x66, 0x87, 0x87, 0x77, 0x98, 0x66, 0x54, 0x43, 0x43,
- 0x33, 0x32, 0x33, 0x33, 0x44, 0x45, 0x66, 0x68, 0x79, 0xA0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xBB, 0xBB, 0xAB, 0xBB, 0xBB, 0xBA, 0x4B, 0x43, 0x22, 0x22, 0x32,
- 0x44, 0x34, 0xA5, 0xA6, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xAB, 0xAA, 0xAB, 0xBA, 0xAA, 0xA6, 0x65, 0x54, 0x43, 0x21, 0x23,
- 0x34, 0x34, 0x55, 0x56, 0x6B, 0xBB, 0xB6, 0xBA, 0xBA, 0xB0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xCD, 0xDC, 0xCD, 0xDD, 0xCC, 0xCC, 0xC6, 0x66, 0x44, 0x43, 0x32,
- 0x21, 0x25, 0x65, 0x46, 0x54, 0x8D, 0xDD, 0xDC, 0xD7, 0xC0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEF, 0xEE, 0xEF, 0xEE, 0xEE, 0xEE, 0x9A, 0xF7, 0x66, 0x55, 0x43,
- 0x33, 0x22, 0x22, 0x33, 0x34, 0x78, 0x98, 0xEE, 0xFE, 0x90, 0x00, 0x00,
- ],
- [
- 0x57, 0x67, 0x66, 0x76, 0x65, 0x55, 0x44, 0x54, 0x44, 0x43, 0x43, 0x34,
- 0x43, 0x44, 0x44, 0x44, 0x45, 0x45, 0x55, 0x67, 0x77, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x78, 0x88, 0x76, 0x66, 0x55, 0x54, 0x44, 0x33, 0x22, 0x23, 0x33, 0x44,
- 0x55, 0x67, 0x67, 0x78, 0x98, 0x98, 0x99, 0x9A, 0xA9, 0x90, 0x00, 0x00,
- ],
- [
- 0x99, 0xAA, 0xAB, 0x97, 0x65, 0x55, 0x44, 0x32, 0x22, 0x22, 0x33, 0x45,
- 0x67, 0x89, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFC, 0xBB, 0xA8, 0x88, 0x77, 0x76, 0x54, 0x32, 0x11, 0x23, 0x46,
- 0x77, 0x8A, 0xF8, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xED, 0xDE, 0xE9, 0xDD, 0x77, 0x65, 0x43, 0x21, 0x12, 0x34,
- 0x57, 0x7D, 0x78, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xE7, 0x7D, 0x96, 0x54, 0x22, 0x11, 0x24,
- 0x56, 0x87, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00,
- ],
- [
- 0xCB, 0xAA, 0x97, 0x65, 0x44, 0x45, 0x77, 0x76, 0x66, 0x55, 0x44, 0x33,
- 0x33, 0x33, 0x33, 0x33, 0x44, 0x55, 0x68, 0x99, 0x9A, 0xC0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xDD, 0xDD, 0x7D, 0xDD, 0xDC, 0xCC, 0x66, 0x66, 0x43, 0x11, 0x22,
- 0x34, 0x56, 0x8C, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEF, 0xFE, 0xEF, 0xFF, 0xEE, 0xE9, 0x88, 0x76, 0x54, 0x31, 0x11,
- 0x34, 0x57, 0x77, 0x8F, 0xAF, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFE, 0xEE, 0xEE, 0xEA, 0xAE, 0xEE, 0xA9, 0xE9, 0x87, 0x65, 0x43, 0x11,
- 0x22, 0x35, 0x56, 0x66, 0x88, 0x9A, 0xEE, 0xEA, 0xEE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xEA, 0xFF, 0xFB, 0xEA, 0x98, 0x76, 0x55, 0x43, 0x22,
- 0x22, 0x33, 0x33, 0x44, 0x46, 0x78, 0xAA, 0xFF, 0xFB, 0xB0, 0x00, 0x00,
- ],
- [
- 0x79, 0x99, 0x77, 0x77, 0x66, 0x55, 0x54, 0x44, 0x43, 0x43, 0x33, 0x33,
- 0x33, 0x34, 0x44, 0x55, 0x55, 0x66, 0x66, 0x79, 0x99, 0x80, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x68, 0x87, 0x77, 0x66, 0x55, 0x55, 0x54, 0x43, 0x32, 0x22, 0x33, 0x34,
- 0x45, 0x66, 0x77, 0x78, 0x88, 0x89, 0x98, 0x88, 0x88, 0x60, 0x00, 0x00,
- ],
- [
- 0xAA, 0xAB, 0xAB, 0xA9, 0x88, 0x66, 0x65, 0x43, 0x22, 0x21, 0x23, 0x46,
- 0x78, 0xA9, 0xBF, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFD, 0xFF, 0xFF, 0xBC, 0x99, 0x98, 0x76, 0x65, 0x42, 0x21, 0x12, 0x46,
- 0x67, 0x99, 0xFF, 0xEF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xFA, 0xB9, 0x87, 0x65, 0x31, 0x02, 0x56,
- 0x79, 0x9A, 0xAF, 0xEA, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAE, 0xBE, 0x9B, 0xBB, 0xAB, 0xAA, 0x98, 0x76, 0x52, 0x01, 0x35,
- 0x88, 0x99, 0x9A, 0xAC, 0xBA, 0xBB, 0xEA, 0xBA, 0xEA, 0xB0, 0x00, 0x00,
- ],
- [
- 0xCC, 0xBC, 0xA7, 0x65, 0x21, 0x46, 0x88, 0x87, 0x77, 0x65, 0x44, 0x44,
- 0x43, 0x33, 0x44, 0x45, 0x55, 0x56, 0x78, 0x9A, 0x9B, 0xC0, 0x00, 0x00,
- ],
- [
- 0x9E, 0x9E, 0xA9, 0xAB, 0xAA, 0xA9, 0x9D, 0x99, 0x87, 0x65, 0x10, 0x23,
- 0x68, 0x88, 0x98, 0x9A, 0xA9, 0xAA, 0xDA, 0xAD, 0xAA, 0x90, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFC, 0xBB, 0xA9, 0xA7, 0x65, 0x30, 0x12,
- 0x56, 0x78, 0x9A, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBA, 0x98, 0x76, 0x41, 0x11,
- 0x24, 0x47, 0x77, 0x89, 0xBB, 0xED, 0xCF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xCF, 0xFF, 0xEF, 0xCF, 0xCE, 0x9B, 0xA9, 0x87, 0x65, 0x42, 0x11,
- 0x23, 0x44, 0x55, 0x66, 0x67, 0x9A, 0xAB, 0xCF, 0xCC, 0xD0, 0x00, 0x00,
- ],
- [
- 0x68, 0x78, 0x77, 0x76, 0x66, 0x55, 0x55, 0x54, 0x44, 0x33, 0x33, 0x32,
- 0x33, 0x34, 0x55, 0x55, 0x66, 0x66, 0x77, 0x77, 0x88, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x68, 0x77, 0x76, 0x66, 0x55, 0x55, 0x54, 0x44, 0x32, 0x22, 0x33, 0x34,
- 0x55, 0x56, 0x66, 0x66, 0x67, 0x78, 0x88, 0x99, 0x99, 0x50, 0x00, 0x00,
- ],
- [
- 0xCB, 0xCA, 0xAA, 0xA9, 0x97, 0x77, 0x66, 0x54, 0x32, 0x21, 0x13, 0x46,
- 0x79, 0xAA, 0xAB, 0xBF, 0xCD, 0xFD, 0xCF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFC, 0xFF, 0xBB, 0xA9, 0xA8, 0x87, 0x65, 0x31, 0x02, 0x56,
- 0x89, 0xAB, 0xBB, 0xBB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFB, 0xFF, 0xCD, 0xCF, 0x99, 0x87, 0x65, 0x42, 0x01, 0x45,
- 0x67, 0x9A, 0xBB, 0xAF, 0xBD, 0xBF, 0xFC, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xF9, 0xA8, 0x86, 0x42, 0x01, 0x36,
- 0x78, 0x8A, 0xBF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00,
- ],
- [
- 0xCF, 0xDB, 0xBA, 0x85, 0x10, 0x47, 0x89, 0x99, 0x99, 0x87, 0x66, 0x65,
- 0x55, 0x55, 0x55, 0x56, 0x66, 0x77, 0x89, 0xAC, 0xCE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xBF, 0xBB, 0xFF, 0x98, 0x63, 0x10, 0x24,
- 0x59, 0x99, 0xBF, 0xFB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xAF, 0x97, 0x65, 0x20, 0x13,
- 0x56, 0x78, 0x99, 0xAB, 0xFD, 0xAF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBB, 0xAA, 0x97, 0x65, 0x30, 0x13,
- 0x44, 0x56, 0x88, 0x89, 0xA9, 0xBF, 0xFF, 0xCF, 0xFC, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFD, 0xFF, 0xFA, 0xBA, 0xBA, 0xB9, 0x87, 0x65, 0x32, 0x11,
- 0x23, 0x45, 0x56, 0x67, 0x77, 0x9A, 0xBA, 0xBF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0x57, 0x78, 0x77, 0x66, 0x66, 0x55, 0x55, 0x44, 0x44, 0x43, 0x33, 0x23,
- 0x33, 0x44, 0x45, 0x55, 0x56, 0x66, 0x66, 0x77, 0x78, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x68, 0x87, 0x87, 0x77, 0x66, 0x55, 0x54, 0x44, 0x32, 0x22, 0x23, 0x44,
- 0x45, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x00, 0x00,
- ],
- [
- 0x9A, 0xB9, 0xA9, 0xA8, 0x87, 0x76, 0x65, 0x54, 0x43, 0x21, 0x12, 0x45,
- 0x68, 0x88, 0xAA, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFC, 0xCF, 0xBA, 0x98, 0x77, 0x65, 0x31, 0x02, 0x56,
- 0x89, 0xAC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x87, 0x76, 0x42, 0x01, 0x36,
- 0x89, 0xAA, 0xBD, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xBF, 0xAC, 0x99, 0x87, 0x42, 0x01, 0x35,
- 0x79, 0xAA, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xCD, 0xCC, 0xB9, 0x74, 0x10, 0x46, 0x8A, 0xA9, 0x99, 0x98, 0x77, 0x66,
- 0x66, 0x55, 0x55, 0x55, 0x66, 0x67, 0x89, 0x9A, 0xAB, 0xD0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xDA, 0xA8, 0x53, 0x10, 0x24,
- 0x68, 0x9A, 0xAE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFB, 0x98, 0x74, 0x10, 0x23,
- 0x57, 0x89, 0xAB, 0xBC, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBA, 0x98, 0x65, 0x20, 0x13,
- 0x56, 0x78, 0x89, 0x9A, 0xAC, 0xEF, 0xFB, 0xFF, 0xDF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x99, 0x86, 0x54, 0x21, 0x12,
- 0x34, 0x45, 0x56, 0x67, 0x67, 0x99, 0xAB, 0xEB, 0xFF, 0xB0, 0x00, 0x00,
- ],
- [
- 0x57, 0x87, 0x77, 0x77, 0x66, 0x66, 0x65, 0x55, 0x44, 0x43, 0x32, 0x22,
- 0x33, 0x44, 0x55, 0x56, 0x67, 0x77, 0x77, 0x88, 0x99, 0x70, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x78, 0x88, 0x88, 0x77, 0x76, 0x65, 0x54, 0x44, 0x33, 0x32, 0x12, 0x34,
- 0x46, 0x78, 0x99, 0x9A, 0xBA, 0xAC, 0xAB, 0xCB, 0xAA, 0x90, 0x00, 0x00,
- ],
- [
- 0x9A, 0x98, 0x88, 0x98, 0x87, 0x77, 0x65, 0x54, 0x43, 0x21, 0x12, 0x45,
- 0x67, 0x8B, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xBD, 0xA9, 0x99, 0x87, 0x77, 0x55, 0x41, 0x02, 0x46,
- 0x79, 0xAB, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFE, 0xFF, 0xFF, 0xDB, 0x9A, 0xBA, 0x98, 0x76, 0x42, 0x01, 0x36,
- 0x79, 0xBB, 0xCB, 0xFC, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFA, 0x9A, 0xAA, 0x87, 0x42, 0x01, 0x35,
- 0x78, 0xDA, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCC, 0xA9, 0x74, 0x10, 0x36, 0x8A, 0xAA, 0xA9, 0x99, 0x88, 0x77,
- 0x76, 0x66, 0x65, 0x66, 0x55, 0x66, 0x78, 0x88, 0xAB, 0xC0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xAA, 0x97, 0x63, 0x10, 0x24,
- 0x67, 0x88, 0x9B, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFC, 0xBB, 0x97, 0x64, 0x10, 0x23,
- 0x67, 0x88, 0xAA, 0xAB, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xBD, 0xA7, 0x64, 0x20, 0x14,
- 0x55, 0x77, 0x78, 0x8A, 0xAA, 0xAB, 0xFD, 0xCC, 0xBF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x76, 0x54, 0x21, 0x12,
- 0x34, 0x45, 0x56, 0x67, 0x77, 0x8A, 0xAA, 0x99, 0xBA, 0x90, 0x00, 0x00,
- ],
- [
- 0x68, 0x88, 0x77, 0x66, 0x66, 0x55, 0x55, 0x55, 0x54, 0x43, 0x22, 0x23,
- 0x34, 0x44, 0x44, 0x56, 0x77, 0x77, 0x78, 0x99, 0x99, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x45, 0x56, 0x66, 0x65, 0x55, 0x54, 0x44, 0x44, 0x44, 0x42, 0x12, 0x35,
- 0x68, 0x8E, 0x9A, 0xBC, 0xEB, 0xBB, 0xEB, 0xBB, 0xBE, 0xB0, 0x00, 0x00,
- ],
- [
- 0x87, 0x77, 0x76, 0x76, 0x66, 0x66, 0x55, 0x54, 0x43, 0x31, 0x12, 0x45,
- 0x56, 0xA9, 0xEE, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xAF, 0x98, 0x97, 0x78, 0x75, 0x55, 0x44, 0x32, 0x02, 0x45,
- 0x68, 0x8E, 0x9C, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBA, 0x98, 0x77, 0x65, 0x42, 0x01, 0x45,
- 0x69, 0x9C, 0x9B, 0xDF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xCA, 0xAA, 0xA8, 0x76, 0x52, 0x01, 0x35,
- 0x67, 0x8A, 0xEA, 0xBF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xA9, 0xAB, 0x98, 0x74, 0x10, 0x36, 0x89, 0x99, 0x99, 0x88, 0x87, 0x87,
- 0x76, 0x66, 0x66, 0x55, 0x56, 0x67, 0x79, 0x9B, 0x9B, 0xB0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x88, 0x87, 0x54, 0x10, 0x24,
- 0x56, 0x77, 0x89, 0xBF, 0xFF, 0xEC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xDC, 0xFF, 0xFB, 0xDB, 0xB9, 0x86, 0x53, 0x20, 0x23,
- 0x44, 0x56, 0x88, 0x78, 0xAA, 0xFF, 0xAB, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBF, 0xFA, 0x97, 0x64, 0x20, 0x23,
- 0x44, 0x55, 0x56, 0x67, 0x77, 0x89, 0x9B, 0xB9, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xD9, 0x75, 0x43, 0x21, 0x23,
- 0x34, 0x44, 0x44, 0x55, 0x55, 0x66, 0x66, 0x78, 0x8A, 0x80, 0x00, 0x00,
- ],
- [
- 0x79, 0x89, 0x98, 0x88, 0x77, 0x77, 0x54, 0x44, 0x44, 0x43, 0x22, 0x33,
- 0x33, 0x44, 0x45, 0x45, 0x66, 0x68, 0x77, 0x98, 0x88, 0x60, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x25, 0x45, 0x57, 0x45, 0x45, 0x55, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44,
- 0x55, 0xBB, 0xBB, 0x6B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
- ],
- [
- 0x86, 0x76, 0x75, 0x55, 0x55, 0x65, 0x74, 0x44, 0x33, 0x32, 0x12, 0x35,
- 0x6C, 0xCC, 0xCC, 0xCD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xD0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xDD, 0x8E, 0x76, 0x55, 0x43, 0x44, 0x32, 0x32, 0x12, 0x46,
- 0x87, 0x99, 0x9D, 0xDE, 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xA9, 0x96, 0x55, 0x43, 0x32, 0x02, 0x45,
- 0x88, 0xEE, 0xE9, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xAF, 0x89, 0x66, 0x42, 0x01, 0x36,
- 0xD9, 0x8A, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xAA, 0xEA, 0xF9, 0x74, 0x10, 0x35, 0x79, 0x98, 0x87, 0x66, 0x66, 0x55,
- 0x56, 0x67, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xFC, 0xEE, 0xB0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xE9, 0x97, 0xF7, 0x65, 0x20, 0x13,
- 0x56, 0x79, 0xEA, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xEE, 0xED, 0xDE, 0xEE, 0xED, 0xDD, 0xDE, 0x75, 0x63, 0x11, 0x22,
- 0x34, 0x45, 0x67, 0x78, 0x9E, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xDD, 0xDE, 0xED, 0xD8, 0xDD, 0xDE, 0x87, 0x54, 0x20, 0x23,
- 0x46, 0x46, 0x56, 0x67, 0x76, 0x79, 0x8E, 0xED, 0xED, 0xE0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xDD, 0xDE, 0xDD, 0xDD, 0xDD, 0xD9, 0x98, 0x54, 0x32, 0x23,
- 0x45, 0x44, 0x34, 0x43, 0x23, 0x66, 0x36, 0xD8, 0xDD, 0x90, 0x00, 0x00,
- ],
- [
- 0x7B, 0x7B, 0xA7, 0x77, 0x6A, 0x57, 0x56, 0x55, 0x45, 0x43, 0x33, 0x33,
- 0x33, 0x33, 0x44, 0x43, 0x35, 0xBB, 0xBA, 0xAA, 0xB7, 0x50, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x24, 0xA3, 0x44, 0x44, 0xAA, 0x49, 0x34, 0x43, 0x24, 0x42, 0x35, 0xA9,
- 0x99, 0x49, 0x99, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0x99, 0x39, 0x94, 0x94, 0x39, 0x43, 0x92, 0x33, 0x29, 0x22, 0x39, 0x99,
- 0x99, 0x99, 0x88, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x90, 0x00, 0x00,
- ],
- [
- 0x99, 0x99, 0x99, 0x99, 0x49, 0x49, 0x33, 0x34, 0x33, 0x21, 0x23, 0x99,
- 0x99, 0x99, 0x98, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x90, 0x00, 0x00,
- ],
- [
- 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC6, 0x32, 0x21, 0x12, 0x45,
- 0xC7, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xD0, 0x00, 0x00,
- ],
- [
- 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD7, 0xDD, 0x75, 0x42, 0x01, 0x38,
- 0xDD, 0x7D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xE0, 0x00, 0x00,
- ],
- [
- 0xCC, 0x8C, 0x87, 0x64, 0x10, 0x37, 0x86, 0x66, 0x67, 0x69, 0x78, 0x77,
- 0x76, 0x66, 0x66, 0x67, 0x68, 0x77, 0x88, 0xCC, 0xCC, 0xC0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xAB, 0xAA, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA4, 0x20, 0x22,
- 0x44, 0xA5, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBA, 0xB0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x4B, 0x33, 0x03,
- 0x23, 0x46, 0x4B, 0x5B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xBB, 0xBB, 0xAB, 0xBB, 0xBB, 0xAA, 0xAB, 0xBB, 0xBB, 0xB2, 0x43,
- 0x44, 0x32, 0x13, 0x46, 0x34, 0x35, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
- ],
- [
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA9, 0x9A, 0xAA, 0xAA, 0xA4, 0x23,
- 0x32, 0xA5, 0x32, 0xA2, 0x24, 0xA3, 0xAA, 0x4A, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0xA9, 0x59, 0x99, 0x99, 0x99, 0x54, 0x49, 0x45, 0x55, 0x45, 0x43, 0x39,
- 0x52, 0x33, 0x43, 0x44, 0x25, 0x59, 0x59, 0x99, 0x59, 0xA0, 0x00, 0x00,
- ],
- ],
- ],
- [
- [
- [
- 0x58, 0x76, 0x5B, 0x53, 0x21, 0x25, 0x54, 0x43, 0x33, 0x48, 0x88, 0x56,
- 0x67, 0x6B, 0x87, 0xBC, 0x7C, 0x8C, 0xCC, 0xCC, 0x8C, 0xB0, 0x00, 0x00,
- ],
- [
- 0xCC, 0xCC, 0x6C, 0x4C, 0xCC, 0x12, 0x12, 0x45, 0x53, 0x35, 0x7C, 0xCC,
- 0xCC, 0xCC, 0xBB, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00,
- ],
- [
- 0xAA, 0xAA, 0xA4, 0xA1, 0x44, 0x55, 0xA9, 0x9A, 0xAA, 0xA2, 0x22, 0x24,
- 0xA5, 0xA4, 0x49, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0x99, 0x88, 0x33, 0x88, 0x88, 0x88, 0x88, 0x28, 0x88, 0x88, 0x88, 0x21,
- 0x33, 0x88, 0x83, 0x82, 0x88, 0x88, 0x88, 0x88, 0x89, 0x90, 0x00, 0x00,
- ],
- [
- 0x66, 0x56, 0x55, 0x56, 0x65, 0x55, 0x55, 0x56, 0x06, 0x65, 0x55, 0x55,
- 0x55, 0x55, 0x55, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x00, 0x00,
- ],
- [
- 0xEE, 0x9D, 0xA6, 0x9D, 0xDA, 0xD9, 0x97, 0x55, 0x42, 0x64, 0x43, 0x32,
- 0x24, 0x44, 0x33, 0x44, 0x66, 0x55, 0x58, 0x7D, 0xDD, 0xA0, 0x00, 0x00,
- ],
- [
- 0x88, 0x78, 0x77, 0x78, 0x77, 0x77, 0x77, 0x78, 0x82, 0x07, 0x77, 0x77,
- 0x72, 0x27, 0x77, 0x78, 0x87, 0x77, 0x87, 0x88, 0x88, 0x80, 0x00, 0x00,
- ],
- [
- 0xBB, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x44, 0x01, 0x3A, 0xAA,
- 0x4A, 0x4A, 0x45, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xB0, 0x00, 0x00,
- ],
- [
- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x89, 0x99, 0x92, 0x39, 0x21,
- 0x49, 0x43, 0x33, 0x99, 0x34, 0x39, 0x99, 0x99, 0x99, 0x90, 0x00, 0x00,
- ],
- [
- 0xEE, 0xEE, 0xED, 0xDE, 0xEE, 0xED, 0xDD, 0xDE, 0xEE, 0xEE, 0x97, 0x75,
- 0x55, 0x75, 0x20, 0x34, 0x63, 0x26, 0x8E, 0xEE, 0xEE, 0xE0, 0x00, 0x00,
- ],
- [
- 0x69, 0xB8, 0x77, 0x8B, 0x85, 0x56, 0x55, 0x44, 0x65, 0x44, 0x33, 0x32,
- 0x23, 0x67, 0xA4, 0x74, 0x45, 0x44, 0x45, 0x68, 0x86, 0x70, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x67, 0x76, 0x66, 0x54, 0x43, 0x43, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44,
- 0x55, 0x66, 0x67, 0x67, 0x77, 0x77, 0x89, 0x89, 0x99, 0x60, 0x00, 0x00,
- ],
- [
- 0xA9, 0x99, 0x99, 0x66, 0x66, 0x43, 0x33, 0x22, 0x22, 0x33, 0x34, 0x57,
- 0x78, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFE, 0xE9, 0xE9, 0x87, 0x65, 0x55, 0x44, 0x44, 0x32, 0x22, 0x22, 0x34,
- 0x56, 0x79, 0x8E, 0xEA, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xDD, 0xD8, 0xDD, 0x75, 0x54, 0x54, 0x33, 0x44, 0x31, 0x13,
- 0x45, 0x66, 0x88, 0x89, 0x8E, 0xDD, 0xDD, 0xDD, 0xED, 0xE0, 0x00, 0x00,
- ],
- [
- 0xCC, 0xBC, 0xBB, 0xBC, 0xCB, 0x75, 0x65, 0x45, 0x32, 0x24, 0x43, 0x12,
- 0x46, 0x54, 0x77, 0xBC, 0xCC, 0xCC, 0xCB, 0xCB, 0xCB, 0xC0, 0x00, 0x00,
- ],
- [
- 0xA9, 0x8B, 0x97, 0x56, 0x88, 0x76, 0x77, 0x66, 0x55, 0x44, 0x33, 0x33,
- 0x33, 0x33, 0x33, 0x33, 0x45, 0x56, 0x67, 0x8A, 0xCA, 0xC0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xCD, 0xCC, 0xCD, 0xDC, 0xCC, 0x68, 0x55, 0x53, 0x21, 0x23, 0x33,
- 0x33, 0x45, 0x77, 0x67, 0xDD, 0xDD, 0xDD, 0xDC, 0xDC, 0xD0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xDD, 0xDE, 0xE9, 0x8D, 0xD8, 0x67, 0x44, 0x32, 0x22, 0x22,
- 0x33, 0x44, 0x46, 0x87, 0xEE, 0xEE, 0xEE, 0xDD, 0xDD, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEF, 0xEE, 0xEF, 0xFE, 0xEE, 0xE9, 0x78, 0x67, 0x54, 0x43, 0x22,
- 0x12, 0x35, 0x53, 0x55, 0x56, 0x7A, 0xFE, 0xEE, 0xFE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xFB, 0x87, 0x66, 0x54, 0x33,
- 0x33, 0x22, 0x22, 0x33, 0x46, 0x67, 0x7A, 0xCF, 0xCF, 0xF0, 0x00, 0x00,
- ],
- [
- 0x67, 0x77, 0x77, 0x66, 0x66, 0x55, 0x55, 0x44, 0x43, 0x44, 0x33, 0x34,
- 0x43, 0x44, 0x43, 0x44, 0x44, 0x55, 0x66, 0x76, 0x88, 0x70, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x78, 0x77, 0x76, 0x66, 0x55, 0x44, 0x44, 0x33, 0x33, 0x22, 0x33, 0x34,
- 0x45, 0x67, 0x78, 0x88, 0x88, 0x99, 0x89, 0xA9, 0xA9, 0x70, 0x00, 0x00,
- ],
- [
- 0xA9, 0x9B, 0x99, 0x87, 0x77, 0x54, 0x44, 0x33, 0x22, 0x22, 0x23, 0x45,
- 0x67, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFD, 0xAA, 0x98, 0x87, 0x77, 0x65, 0x32, 0x11, 0x23, 0x44,
- 0x57, 0x9A, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x88, 0x77, 0x65, 0x54, 0x31, 0x11, 0x35,
- 0x57, 0x88, 0x8F, 0xDF, 0xFC, 0x9F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEF, 0xEE, 0xEF, 0xFE, 0x99, 0x87, 0x77, 0x54, 0x22, 0x11, 0x24,
- 0x66, 0x77, 0x78, 0xEA, 0xF9, 0xFF, 0xEE, 0xEE, 0xFE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xAB, 0xAA, 0x97, 0x65, 0x44, 0x45, 0x66, 0x65, 0x54, 0x44, 0x43, 0x33,
- 0x33, 0x33, 0x33, 0x44, 0x55, 0x66, 0x78, 0x8B, 0xAB, 0xB0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xED, 0xDE, 0x98, 0x8D, 0xDD, 0x67, 0x66, 0x43, 0x11, 0x22,
- 0x34, 0x57, 0x77, 0x8E, 0xEE, 0xEE, 0xEE, 0xED, 0xDD, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFB, 0xFF, 0xBB, 0x98, 0x66, 0x54, 0x31, 0x11,
- 0x34, 0x56, 0x98, 0xBF, 0xDC, 0xBF, 0xBF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xAA, 0x88, 0x66, 0x32, 0x11,
- 0x23, 0x35, 0x66, 0x77, 0x99, 0xCE, 0xFE, 0xCD, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCA, 0xA9, 0x76, 0x54, 0x42, 0x22,
- 0x22, 0x33, 0x34, 0x55, 0x56, 0x77, 0x9B, 0xBF, 0xFF, 0xC0, 0x00, 0x00,
- ],
- [
- 0x69, 0x88, 0x77, 0x77, 0x76, 0x65, 0x55, 0x44, 0x43, 0x43, 0x33, 0x33,
- 0x33, 0x34, 0x44, 0x44, 0x55, 0x67, 0x77, 0x88, 0x89, 0x70, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x79, 0x98, 0x87, 0x77, 0x66, 0x55, 0x44, 0x43, 0x33, 0x22, 0x23, 0x33,
- 0x45, 0x66, 0x77, 0x88, 0x89, 0x99, 0x9A, 0xA9, 0x99, 0x70, 0x00, 0x00,
- ],
- [
- 0xBB, 0xFB, 0xBA, 0xA9, 0x98, 0x76, 0x65, 0x44, 0x32, 0x21, 0x22, 0x35,
- 0x79, 0xAE, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xCF, 0xFA, 0xAA, 0x99, 0x88, 0x77, 0x65, 0x33, 0x21, 0x12, 0x44,
- 0x57, 0x89, 0xAB, 0xBE, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xBF, 0xDB, 0xA9, 0x99, 0x86, 0x65, 0x41, 0x02, 0x45,
- 0x78, 0x89, 0xCA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xA9, 0x98, 0x76, 0x52, 0x01, 0x35,
- 0x68, 0x89, 0x9E, 0xEF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00,
- ],
- [
- 0xDB, 0xCA, 0x98, 0x75, 0x21, 0x46, 0x77, 0x76, 0x66, 0x54, 0x44, 0x44,
- 0x33, 0x34, 0x44, 0x45, 0x66, 0x77, 0x89, 0xAC, 0xCB, 0xD0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x98, 0x77, 0x65, 0x10, 0x23,
- 0x56, 0x89, 0xAA, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xCA, 0x87, 0x65, 0x30, 0x12,
- 0x56, 0x78, 0xA9, 0xBA, 0xFD, 0xCF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, 0xAA, 0xA9, 0x97, 0x64, 0x31, 0x12,
- 0x23, 0x45, 0x56, 0x78, 0xA9, 0xAC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xCB, 0xA8, 0x65, 0x54, 0x32, 0x12,
- 0x23, 0x34, 0x45, 0x56, 0x77, 0x88, 0xAC, 0xDF, 0xDF, 0xE0, 0x00, 0x00,
- ],
- [
- 0x68, 0x98, 0x88, 0x77, 0x77, 0x66, 0x55, 0x54, 0x44, 0x43, 0x32, 0x22,
- 0x33, 0x44, 0x55, 0x56, 0x66, 0x77, 0x78, 0x89, 0x99, 0x70, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x8A, 0xA9, 0x88, 0x87, 0x66, 0x65, 0x54, 0x43, 0x33, 0x22, 0x23, 0x33,
- 0x45, 0x55, 0x67, 0x78, 0x88, 0x88, 0x88, 0x99, 0x99, 0x60, 0x00, 0x00,
- ],
- [
- 0xCF, 0xBF, 0xCA, 0xAA, 0x98, 0x87, 0x76, 0x54, 0x33, 0x21, 0x12, 0x45,
- 0x78, 0x8A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xEF, 0xBE, 0xBA, 0x99, 0x77, 0x65, 0x31, 0x02, 0x56,
- 0x89, 0x9B, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0x97, 0x76, 0x32, 0x01, 0x46,
- 0x88, 0x9B, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xA8, 0x97, 0x42, 0x01, 0x35,
- 0x78, 0x9A, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xDC, 0xCB, 0xB9, 0x75, 0x10, 0x47, 0x89, 0x89, 0x88, 0x76, 0x66, 0x55,
- 0x55, 0x55, 0x55, 0x66, 0x77, 0x78, 0x9A, 0xAC, 0xFE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xCA, 0xA9, 0x87, 0x63, 0x10, 0x24,
- 0x67, 0x8A, 0xCA, 0xFF, 0xFE, 0xCF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAA, 0x98, 0x74, 0x20, 0x13,
- 0x57, 0x8A, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xA9, 0x87, 0x65, 0x30, 0x13,
- 0x44, 0x56, 0x78, 0x9A, 0xBE, 0xEF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x98, 0x65, 0x54, 0x31, 0x12,
- 0x33, 0x44, 0x55, 0x67, 0x78, 0x9A, 0xAC, 0xFC, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0x68, 0x88, 0x87, 0x77, 0x77, 0x76, 0x55, 0x54, 0x44, 0x43, 0x32, 0x22,
- 0x33, 0x44, 0x45, 0x56, 0x67, 0x78, 0x89, 0x9A, 0xBB, 0x90, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x8A, 0x99, 0x88, 0x77, 0x76, 0x66, 0x55, 0x43, 0x33, 0x22, 0x22, 0x33,
- 0x45, 0x67, 0x77, 0x88, 0x88, 0x99, 0xAA, 0x9A, 0xAA, 0x80, 0x00, 0x00,
- ],
- [
- 0xBC, 0xAA, 0xAB, 0xA9, 0x98, 0x87, 0x66, 0x54, 0x33, 0x21, 0x12, 0x45,
- 0x89, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xEF, 0xFC, 0xCC, 0xBA, 0x98, 0x87, 0x65, 0x31, 0x02, 0x56,
- 0x79, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFD, 0xBA, 0x98, 0x76, 0x42, 0x01, 0x36,
- 0x78, 0x9A, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xBB, 0xA9, 0x87, 0x42, 0x01, 0x35,
- 0x78, 0xAB, 0xFB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xEC, 0xC9, 0x74, 0x10, 0x47, 0x89, 0x99, 0x99, 0x87, 0x76, 0x66,
- 0x55, 0x55, 0x55, 0x56, 0x67, 0x78, 0x89, 0xBC, 0xCD, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x98, 0x63, 0x10, 0x24,
- 0x58, 0x9A, 0xBF, 0xEF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0x97, 0x74, 0x10, 0x23,
- 0x57, 0x9A, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xA8, 0x65, 0x20, 0x13,
- 0x56, 0x77, 0x89, 0x9B, 0xCE, 0xCF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x9A, 0xAA, 0x76, 0x54, 0x21, 0x12,
- 0x34, 0x45, 0x56, 0x66, 0x78, 0x99, 0xAF, 0xEC, 0xEF, 0xB0, 0x00, 0x00,
- ],
- [
- 0x78, 0x88, 0x87, 0x77, 0x66, 0x66, 0x65, 0x55, 0x54, 0x43, 0x22, 0x22,
- 0x33, 0x44, 0x55, 0x67, 0x77, 0x88, 0x98, 0x99, 0xAA, 0x80, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x67, 0x77, 0x86, 0x66, 0x66, 0x65, 0x54, 0x44, 0x33, 0x32, 0x12, 0x34,
- 0x57, 0x99, 0xAC, 0x9A, 0xAC, 0xFB, 0xCF, 0xEE, 0xEB, 0xA0, 0x00, 0x00,
- ],
- [
- 0xAA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x66, 0x55, 0x43, 0x21, 0x12, 0x35,
- 0x8A, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFA, 0xDA, 0x99, 0x98, 0x77, 0x76, 0x65, 0x53, 0x32, 0x02, 0x45,
- 0x67, 0x9A, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xCF, 0xFB, 0xBB, 0xE9, 0x87, 0x76, 0x42, 0x01, 0x36,
- 0x89, 0xBB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xA9, 0x76, 0x52, 0x01, 0x35,
- 0x67, 0x8A, 0x9A, 0xC9, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xEC, 0xCC, 0xA9, 0x74, 0x10, 0x37, 0x88, 0x89, 0x99, 0x88, 0x87, 0x76,
- 0x66, 0x55, 0x55, 0x56, 0x77, 0x78, 0xAA, 0xFE, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xBA, 0x87, 0x64, 0x10, 0x24,
- 0x46, 0x77, 0xAB, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCF, 0xFF, 0x88, 0x64, 0x10, 0x24,
- 0x46, 0x78, 0x88, 0xAA, 0xBF, 0xCC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, 0xA7, 0x65, 0x20, 0x14,
- 0x55, 0x57, 0x77, 0x88, 0x9A, 0xAA, 0xBB, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0x97, 0x76, 0x53, 0x21, 0x13,
- 0x34, 0x45, 0x55, 0x66, 0x66, 0x77, 0x88, 0xAA, 0xDC, 0xA0, 0x00, 0x00,
- ],
- [
- 0x9D, 0xAC, 0xBA, 0x98, 0x88, 0x77, 0x65, 0x54, 0x54, 0x43, 0x21, 0x23,
- 0x34, 0x45, 0x55, 0x66, 0x67, 0x79, 0x99, 0x9D, 0xBB, 0x80, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x47, 0x7C, 0x65, 0x45, 0x45, 0x45, 0x45, 0x33, 0x43, 0x22, 0x23, 0x44,
- 0x57, 0x77, 0xCC, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00,
- ],
- [
- 0x89, 0x88, 0x67, 0x68, 0x67, 0x76, 0x55, 0x55, 0x43, 0x21, 0x12, 0x46,
- 0x8E, 0xEA, 0xEE, 0xEF, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDE, 0xD9, 0xD8, 0x87, 0x66, 0x64, 0x55, 0x44, 0x42, 0x02, 0x45,
- 0x67, 0x8D, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xED, 0xDD, 0xE0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFA, 0xFF, 0xCF, 0xB7, 0x98, 0x66, 0x54, 0x42, 0x01, 0x57,
- 0x89, 0xFA, 0xFF, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAA, 0x88, 0x76, 0x42, 0x01, 0x36,
- 0x78, 0xFF, 0xFF, 0xEA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xBC, 0xAA, 0xB8, 0x75, 0x10, 0x35, 0x78, 0x88, 0x87, 0x66, 0x66, 0x55,
- 0x55, 0x66, 0x77, 0x77, 0x88, 0x99, 0x9A, 0xDB, 0xBB, 0xD0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFD, 0x99, 0x87, 0x65, 0x10, 0x23,
- 0x56, 0x78, 0x9E, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEF, 0xFE, 0xEF, 0xFF, 0xEE, 0xE9, 0xE8, 0x65, 0x54, 0x20, 0x23,
- 0x34, 0x67, 0x7A, 0x99, 0x9F, 0xF9, 0xFF, 0xFE, 0xFE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEF, 0xEE, 0xEF, 0xFE, 0xEE, 0xE9, 0xEF, 0x87, 0x53, 0x20, 0x23,
- 0x55, 0x55, 0x56, 0x68, 0x98, 0x8A, 0x9F, 0xFE, 0xFE, 0xF0, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x8A, 0x77, 0x54, 0x31, 0x23,
- 0x44, 0x34, 0x44, 0x44, 0x43, 0x45, 0x57, 0xFA, 0xFB, 0xF0, 0x00, 0x00,
- ],
- [
- 0x7C, 0xB7, 0x8B, 0x76, 0x76, 0x66, 0x55, 0x54, 0x44, 0x43, 0x33, 0x32,
- 0x33, 0x44, 0x54, 0x44, 0x44, 0x57, 0x98, 0x87, 0xCB, 0x50, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x46, 0xAB, 0x6A, 0x6B, 0x65, 0x54, 0x54, 0x32, 0x22, 0x32, 0x43, 0x44,
- 0xA4, 0x6A, 0xAA, 0xAB, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA, 0xB0, 0x00, 0x00,
- ],
- [
- 0x67, 0x66, 0x6B, 0x6C, 0x56, 0xB5, 0x55, 0x34, 0x32, 0x21, 0x23, 0x64,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCB, 0xC0, 0x00, 0x00,
- ],
- [
- 0xCC, 0xCC, 0xCC, 0xBC, 0x76, 0x57, 0x55, 0x54, 0x43, 0x21, 0x12, 0x46,
- 0x7C, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x77, 0x43, 0x22, 0x02, 0x57,
- 0x8D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xCD, 0xCC, 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0x65, 0x42, 0x01, 0x3C,
- 0x7C, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0xD0, 0x00, 0x00,
- ],
- [
- 0xEE, 0x8E, 0xD9, 0x75, 0x10, 0x35, 0x77, 0x66, 0x68, 0x77, 0x66, 0x65,
- 0x66, 0x65, 0x66, 0x68, 0x88, 0xEE, 0xAE, 0xED, 0xDD, 0xE0, 0x00, 0x00,
- ],
- [
- 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD8, 0xDD, 0x55, 0x20, 0x14,
- 0x56, 0x4D, 0x7D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00,
- ],
- [
- 0xCC, 0xCC, 0xCC, 0xBC, 0xCC, 0xCC, 0xCB, 0xBC, 0xC7, 0x63, 0x20, 0x23,
- 0x44, 0x55, 0x76, 0x7C, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00,
- ],
- [
- 0xBB, 0xBB, 0xBA, 0xAB, 0xBB, 0xBA, 0xAA, 0xAB, 0xB5, 0xB6, 0x31, 0x22,
- 0x34, 0x43, 0x34, 0x54, 0x45, 0x4B, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
- ],
- [
- 0xCC, 0xBC, 0xCB, 0xBC, 0xCB, 0xBB, 0xBB, 0xB7, 0x66, 0x55, 0x42, 0x22,
- 0x23, 0x34, 0x43, 0x35, 0x54, 0x55, 0x6C, 0xCB, 0xCB, 0xC0, 0x00, 0x00,
- ],
- [
- 0xCB, 0xBB, 0x6B, 0xB7, 0xBB, 0x6B, 0x65, 0x55, 0x34, 0x33, 0x43, 0x32,
- 0x23, 0x34, 0x55, 0x44, 0x46, 0xBB, 0xBB, 0xB6, 0xBB, 0xC0, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x88, 0x78, 0x71, 0x78, 0x77, 0x77, 0x77, 0x78, 0x27, 0x71, 0x77, 0x17,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x77, 0x88, 0x87, 0x88, 0x80, 0x00, 0x00,
- ],
- [
- 0x99, 0x89, 0x88, 0x89, 0x88, 0x82, 0x88, 0x83, 0x83, 0x12, 0x22, 0x38,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x98, 0x90, 0x00, 0x00,
- ],
- [
- 0x99, 0x89, 0x88, 0x89, 0x88, 0x88, 0x38, 0x89, 0x22, 0x11, 0x28, 0x88,
- 0x88, 0x88, 0x88, 0x89, 0x98, 0x88, 0x88, 0x98, 0x98, 0x90, 0x00, 0x00,
- ],
- [
- 0xAA, 0x9A, 0x99, 0x9A, 0x39, 0x99, 0x99, 0x33, 0x99, 0x42, 0x02, 0x99,
- 0x99, 0x99, 0x99, 0x9A, 0xA9, 0x99, 0x99, 0x99, 0xA9, 0xA0, 0x00, 0x00,
- ],
- [
- 0xAA, 0x9A, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0xA9, 0x92, 0x01, 0x34,
- 0x99, 0x99, 0x99, 0x9A, 0xA9, 0x99, 0x9A, 0xA9, 0xA9, 0xA0, 0x00, 0x00,
- ],
- [
- 0xAA, 0xAA, 0xAA, 0xAA, 0x30, 0x4A, 0xAA, 0x9A, 0xAA, 0xA4, 0x43, 0x43,
- 0x35, 0x4A, 0x3A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0xAA, 0x9A, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x99, 0x93, 0x11, 0x13,
- 0x34, 0x99, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x99, 0xA9, 0xA0, 0x00, 0x00,
- ],
- [
- 0x99, 0x89, 0x88, 0x89, 0x88, 0x88, 0x88, 0x89, 0x88, 0x88, 0x31, 0x12,
- 0x88, 0x18, 0x88, 0x89, 0x98, 0x88, 0x89, 0x99, 0x98, 0x90, 0x00, 0x00,
- ],
- [
- 0x88, 0x78, 0x77, 0x78, 0x77, 0x77, 0x77, 0x78, 0x77, 0x77, 0x71, 0x11,
- 0x72, 0x77, 0x77, 0x78, 0x87, 0x77, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00,
- ],
- [
- 0xAA, 0x9A, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x39, 0x92, 0x21,
- 0x19, 0x39, 0x99, 0x94, 0x93, 0x99, 0x99, 0x99, 0xAA, 0xA0, 0x00, 0x00,
- ],
- [
- 0x88, 0x78, 0x77, 0x78, 0x77, 0x77, 0x77, 0x78, 0x77, 0x72, 0x77, 0x72,
- 0x17, 0x27, 0x77, 0x78, 0x87, 0x71, 0x78, 0x87, 0x88, 0x80, 0x00, 0x00,
- ],
- ],
- ],
-];
-
-const RALF_SHORT_CODES_TAB: [[[u8; 88]; 15]; 3] = [
- [
- [
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDD, 0xFC, 0xCD, 0xFF, 0xFF, 0xFF, 0xCC, 0xCB, 0xBC,
- 0xDF, 0xFF, 0xFD, 0xDB, 0xC9, 0x69, 0xBC, 0xFF, 0xFC, 0xFF, 0xB9, 0x42,
- 0x5A, 0xCD, 0xFF, 0xFD, 0xDC, 0x62, 0x03, 0x9B, 0xCF, 0xFF, 0xFD, 0xC9,
- 0x53, 0x4A, 0xCC, 0xFF, 0xFF, 0xFF, 0xBA, 0x9A, 0xBC, 0xFF, 0xFF, 0xFC,
- 0xDC, 0xBC, 0xBC, 0xFF, 0xFF, 0xFF, 0xFE, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xFF,
- 0xFF, 0xFF, 0xFC, 0xFC, 0xCC, 0xCF, 0xDF, 0xFF, 0xFF, 0xDB, 0xA9, 0x9B,
- 0xCF, 0xDF, 0xFF, 0xCB, 0x97, 0x67, 0x9B, 0xFF, 0xFF, 0xDC, 0xA7, 0x42,
- 0x47, 0xAD, 0xFF, 0xFF, 0xC9, 0x63, 0x03, 0x69, 0xBF, 0xFF, 0xFC, 0xA7,
- 0x53, 0x47, 0xAC, 0xDF, 0xFD, 0xDC, 0x97, 0x77, 0x8C, 0xBD, 0xFF, 0xFF,
- 0xCC, 0xAA, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC, 0xCF, 0xFF, 0xFF,
- 0xFF, 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xDC, 0xFF, 0xDF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xAF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF, 0xA6, 0x43,
- 0x47, 0xEF, 0xFF, 0xFF, 0xF9, 0x53, 0x03, 0x6A, 0xFF, 0xFF, 0xFF, 0xA6,
- 0x43, 0x46, 0xAF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xC9, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, 0xFF, 0xFF, 0xFD, 0xFF, 0xFD, 0xFD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDD, 0xDB, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFA, 0x43,
- 0x6B, 0xFF, 0xDF, 0xFF, 0xFD, 0xA3, 0x02, 0xAD, 0xFF, 0xFF, 0xFD, 0xFB,
- 0x52, 0x3A, 0xDF, 0xFF, 0xFF, 0xFF, 0xCB, 0xAA, 0xCE, 0xFF, 0xDF, 0xFF,
- 0xFE, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xCF, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xCC, 0xCA,
- 0xFF, 0xCF, 0xFB, 0xAA, 0xAA, 0xCF, 0xCB, 0xFC, 0xFF, 0xAA, 0xA9, 0x99,
- 0xAC, 0xBF, 0xFC, 0xA9, 0x98, 0x88, 0x99, 0xAA, 0xCF, 0xCA, 0xA8, 0x53,
- 0x58, 0x9F, 0xCC, 0xCC, 0xB9, 0x73, 0x02, 0x68, 0xAC, 0xCF, 0xCA, 0x98,
- 0x53, 0x37, 0x9B, 0xAC, 0xFB, 0xAA, 0x97, 0x78, 0x8A, 0xFB, 0xFF, 0xFA,
- 0xBB, 0x99, 0x9A, 0xAB, 0xFF, 0xFF, 0xEB, 0xBA, 0xAA, 0xAC, 0xCB, 0xFF,
- 0xBF, 0xBC, 0xBC, 0xCF, 0xFF, 0xFF, 0xCF, 0xFC, 0xFC, 0xFF, 0xFF, 0xCF,
- 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0xFF,
- 0xFF, 0xFF, 0xFC, 0xAB, 0xBA, 0xFC, 0xFF, 0xFF, 0xFF, 0xA9, 0x77, 0x78,
- 0xAF, 0xFF, 0xFF, 0xA8, 0x65, 0x45, 0x68, 0xFF, 0xFC, 0xFB, 0x74, 0x33,
- 0x35, 0x7B, 0xFF, 0xFF, 0xB7, 0x43, 0x23, 0x46, 0xAF, 0xFF, 0xCB, 0x75,
- 0x33, 0x35, 0x7A, 0xCC, 0xFF, 0xF8, 0x65, 0x45, 0x68, 0xAC, 0xCF, 0xCC,
- 0xA8, 0x77, 0x78, 0xBF, 0xFF, 0xFF, 0xFF, 0xB9, 0x99, 0xFC, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFC, 0xFF,
- 0xFF, 0xFC, 0xFB, 0x9A, 0x99, 0xBA, 0xFF, 0xFF, 0xFB, 0x97, 0x77, 0x77,
- 0x9C, 0xCF, 0xFC, 0x98, 0x65, 0x45, 0x68, 0xAF, 0xFF, 0xC9, 0x75, 0x33,
- 0x35, 0x79, 0xFF, 0xFB, 0x86, 0x43, 0x23, 0x47, 0x9F, 0xFF, 0xC9, 0x75,
- 0x33, 0x35, 0x7B, 0xBF, 0xFF, 0xA8, 0x65, 0x45, 0x68, 0xAF, 0xFF, 0xFA,
- 0xA8, 0x77, 0x78, 0x9B, 0xFF, 0xFF, 0xFF, 0xFB, 0x99, 0xBB, 0xFF, 0xFF,
- 0xFF, 0xFE, 0xCE, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xBC, 0xEF,
- 0xFF, 0xFF, 0xDB, 0x99, 0x89, 0xAC, 0xDF, 0xFF, 0xDB, 0x97, 0x66, 0x67,
- 0x9C, 0xFF, 0xEC, 0x97, 0x65, 0x45, 0x67, 0xAC, 0xFF, 0xB9, 0x65, 0x33,
- 0x35, 0x69, 0xBF, 0xFB, 0x86, 0x43, 0x33, 0x46, 0x9B, 0xEE, 0xB9, 0x65,
- 0x33, 0x35, 0x69, 0xBE, 0xFD, 0xA7, 0x65, 0x45, 0x67, 0xAC, 0xDF, 0xDB,
- 0x97, 0x66, 0x67, 0x9B, 0xDF, 0xFF, 0xDC, 0xA9, 0x89, 0x9B, 0xCF, 0xFF,
- 0xFF, 0xDC, 0xBB, 0xBC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xEF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBB, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xAA, 0x99, 0xAB, 0xFF, 0xFF, 0xFA, 0x98, 0x76, 0x67,
- 0xAC, 0xCF, 0xFA, 0xA7, 0x64, 0x45, 0x67, 0x9B, 0xFF, 0xF8, 0x74, 0x33,
- 0x34, 0x68, 0xAF, 0xFB, 0x96, 0x43, 0x33, 0x46, 0x8B, 0xFF, 0xF9, 0x75,
- 0x43, 0x35, 0x69, 0xBF, 0xCC, 0x98, 0x65, 0x45, 0x67, 0x9A, 0xBF, 0xFF,
- 0x98, 0x66, 0x68, 0x8F, 0xFF, 0xFF, 0xFF, 0x98, 0x88, 0xAF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xBA, 0xBA, 0xBE, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF,
- 0xFF, 0xAA, 0xFF, 0xF9, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x88, 0x7F,
- 0xAF, 0xFA, 0xFF, 0xF8, 0x75, 0x55, 0x79, 0xFF, 0xFF, 0xF9, 0x75, 0x32,
- 0x34, 0x8A, 0xFF, 0xFF, 0xB8, 0x43, 0x22, 0x58, 0xFF, 0xFF, 0xCF, 0x95,
- 0x33, 0x46, 0x7A, 0xFF, 0xFA, 0xFF, 0x75, 0x46, 0x79, 0xFA, 0xFF, 0xAF,
- 0xF9, 0x89, 0x8A, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xAA, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFA,
- 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xBA, 0xAA, 0x99, 0xAA, 0xBD, 0xBB, 0xBA, 0x99, 0x88, 0x89, 0x9B,
- 0xCC, 0xBA, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBA, 0x98, 0x76, 0x65, 0x66,
- 0x78, 0xAB, 0xA8, 0x76, 0x55, 0x45, 0x56, 0x79, 0xA9, 0x87, 0x55, 0x44,
- 0x44, 0x67, 0x8A, 0x98, 0x75, 0x44, 0x44, 0x45, 0x68, 0x9A, 0x87, 0x65,
- 0x44, 0x45, 0x67, 0x8A, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0x98,
- 0x76, 0x55, 0x56, 0x78, 0x9A, 0xBA, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xCD,
- 0xCB, 0xA9, 0x88, 0x89, 0xAA, 0xBB, 0xDD, 0xCA, 0xA9, 0x9A, 0xAB, 0xCC,
- 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xCA, 0xAA, 0xAA, 0xAB, 0xCE, 0xDC, 0xCB, 0xA9, 0x88, 0x89, 0x9B,
- 0xCD, 0xBB, 0x98, 0x87, 0x77, 0x78, 0xAB, 0xDA, 0xA8, 0x76, 0x65, 0x66,
- 0x78, 0xAC, 0xA9, 0x76, 0x55, 0x44, 0x56, 0x79, 0xAA, 0x97, 0x65, 0x44,
- 0x44, 0x67, 0x9A, 0xA8, 0x75, 0x44, 0x34, 0x45, 0x79, 0x9A, 0x87, 0x65,
- 0x44, 0x45, 0x67, 0x9A, 0xB9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xA8,
- 0x76, 0x65, 0x66, 0x78, 0xBB, 0xCB, 0xA8, 0x77, 0x77, 0x78, 0xAB, 0xBD,
- 0xCB, 0xA9, 0x98, 0x99, 0xAA, 0xCD, 0xFD, 0xFB, 0xAA, 0xAB, 0xAB, 0xCC,
- 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xCB, 0xAA, 0xAA, 0xAB, 0xCE, 0xED, 0xCB, 0xA9, 0x88, 0x89, 0xAB,
- 0xCE, 0xCB, 0x98, 0x77, 0x77, 0x78, 0x9B, 0xCB, 0xA8, 0x76, 0x65, 0x56,
- 0x78, 0xAB, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xBA, 0x87, 0x55, 0x44,
- 0x45, 0x57, 0x8A, 0xA8, 0x75, 0x44, 0x34, 0x45, 0x78, 0xAA, 0x87, 0x65,
- 0x44, 0x45, 0x67, 0x8A, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xA8,
- 0x76, 0x65, 0x66, 0x78, 0xAB, 0xCB, 0x98, 0x77, 0x77, 0x78, 0x9B, 0xCD,
- 0xCB, 0xA9, 0x88, 0x89, 0xAB, 0xCD, 0xED, 0xCB, 0xAA, 0xAA, 0xAB, 0xCD,
- 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xCB, 0xB9, 0xAA, 0xBB, 0xFF, 0xDD, 0xCB, 0xA9, 0x89, 0x89, 0x9B,
- 0xEF, 0xBB, 0xA8, 0x77, 0x77, 0x78, 0x9B, 0xFC, 0xA8, 0x76, 0x55, 0x56,
- 0x78, 0xAB, 0xB9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xBB, 0x97, 0x65, 0x44,
- 0x44, 0x57, 0x8A, 0xA8, 0x75, 0x44, 0x44, 0x45, 0x68, 0xAA, 0x87, 0x65,
- 0x44, 0x45, 0x57, 0x9A, 0xB9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xBB, 0x98,
- 0x76, 0x55, 0x66, 0x78, 0xAB, 0xFB, 0xA8, 0x77, 0x77, 0x78, 0xAB, 0xBD,
- 0xFB, 0xA9, 0x88, 0x89, 0xAC, 0xCC, 0xBC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB,
- 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xAB, 0xA9, 0xAA, 0xAB, 0xCC, 0xDC, 0xBA, 0x98, 0x88, 0x88, 0x9A,
- 0xBD, 0xBA, 0x98, 0x77, 0x77, 0x78, 0x9B, 0xCA, 0xA8, 0x76, 0x65, 0x56,
- 0x78, 0xAB, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xBA, 0x87, 0x55, 0x44,
- 0x45, 0x57, 0x89, 0x98, 0x75, 0x44, 0x44, 0x45, 0x68, 0x9A, 0x87, 0x55,
- 0x44, 0x45, 0x57, 0x89, 0xA8, 0x76, 0x55, 0x55, 0x56, 0x79, 0xAB, 0xA8,
- 0x76, 0x55, 0x56, 0x78, 0x9A, 0xCB, 0xA8, 0x77, 0x77, 0x78, 0x9B, 0xDC,
- 0xCB, 0xA9, 0x88, 0x89, 0x9A, 0xBD, 0xCB, 0xCB, 0xA9, 0xA9, 0xAA, 0xBB,
- 0xB0, 0x00, 0x00, 0x00,
- ],
- ],
- [
- [
- 0xAF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0xAF,
- 0xFF, 0xFF, 0xFF, 0xFB, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF, 0xA6, 0x32,
- 0x36, 0xAF, 0xFF, 0xFF, 0xF9, 0x63, 0x12, 0x6A, 0xFF, 0xFF, 0xFF, 0x96,
- 0x33, 0x36, 0xBF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9A, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xDA, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x56, 0xFC, 0xCF, 0xFF, 0xFF, 0xF6, 0x32,
- 0x39, 0xFF, 0xFF, 0xFF, 0xF8, 0x62, 0x12, 0x6F, 0xFF, 0xFF, 0xFF, 0xF6,
- 0x43, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x58, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF, 0xB6, 0x43,
- 0x36, 0xFF, 0xFF, 0xFF, 0xFB, 0x62, 0x12, 0x5B, 0xFF, 0xFF, 0xFF, 0xD6,
- 0x42, 0x36, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFA, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x43,
- 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x11, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x61, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x53,
- 0x5E, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x11, 0x8F, 0xFF, 0xFF, 0xFF, 0xFE,
- 0x51, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0xCF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x70, 0x00, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x70, 0x00, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x70, 0x00, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x70, 0x00, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x70, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xAA, 0xAA, 0xAC, 0xDE, 0xCB, 0xBA, 0xA9, 0x98, 0x99, 0xAB,
- 0xDE, 0xBA, 0x98, 0x77, 0x77, 0x78, 0xAB, 0xEA, 0xA8, 0x76, 0x65, 0x66,
- 0x79, 0xAC, 0xA9, 0x86, 0x54, 0x44, 0x56, 0x79, 0xAA, 0x87, 0x65, 0x44,
- 0x45, 0x57, 0x9A, 0xA9, 0x75, 0x44, 0x34, 0x45, 0x78, 0x9A, 0x87, 0x65,
- 0x44, 0x45, 0x67, 0x9A, 0xB9, 0x86, 0x55, 0x45, 0x56, 0x89, 0xAC, 0xA8,
- 0x76, 0x65, 0x66, 0x78, 0x9A, 0xCC, 0xA8, 0x87, 0x77, 0x89, 0x9B, 0xBF,
- 0xDB, 0xA9, 0x98, 0x99, 0x9B, 0xBC, 0xDF, 0xCB, 0xAA, 0xB9, 0xAB, 0xBB,
- 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCB, 0xAA, 0x9A, 0xAB, 0xCE, 0xCD, 0xCB, 0x99, 0x88, 0x89, 0x9B,
- 0xCD, 0xCA, 0x98, 0x77, 0x67, 0x78, 0x9B, 0xCB, 0xA8, 0x76, 0x65, 0x56,
- 0x78, 0xAB, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAA, 0x87, 0x65, 0x44,
- 0x45, 0x57, 0x8A, 0x98, 0x65, 0x44, 0x44, 0x45, 0x78, 0xAA, 0x87, 0x55,
- 0x44, 0x45, 0x57, 0x8A, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xA8,
- 0x76, 0x55, 0x66, 0x78, 0x9B, 0xCB, 0xA8, 0x77, 0x67, 0x78, 0x9B, 0xCD,
- 0xDB, 0xA9, 0x88, 0x89, 0x9B, 0xCD, 0xDC, 0xDB, 0xAA, 0xA9, 0xAB, 0xBE,
- 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xBB, 0xAA, 0xAA, 0xAB, 0xCD, 0xDC, 0xCB, 0x99, 0x88, 0x89, 0xAB,
- 0xCD, 0xBB, 0x98, 0x77, 0x77, 0x78, 0x9B, 0xCB, 0xA8, 0x76, 0x55, 0x56,
- 0x78, 0xAB, 0xA9, 0x76, 0x55, 0x44, 0x56, 0x79, 0xAA, 0x87, 0x65, 0x44,
- 0x45, 0x57, 0x8A, 0xA8, 0x75, 0x44, 0x44, 0x45, 0x68, 0xAA, 0x87, 0x55,
- 0x44, 0x45, 0x67, 0x89, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xA8,
- 0x76, 0x65, 0x66, 0x78, 0xAA, 0xCB, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBD,
- 0xCB, 0xA9, 0x88, 0x89, 0xAB, 0xBB, 0xDD, 0xCB, 0xAA, 0x9A, 0xAA, 0xBB,
- 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xEC, 0xBA, 0xAA, 0xBD, 0xEF, 0xDD, 0xCB, 0xA9, 0x99, 0x9A, 0xBD,
- 0xCF, 0xDB, 0x98, 0x77, 0x77, 0x88, 0xAC, 0xDE, 0xA9, 0x76, 0x55, 0x66,
- 0x79, 0x9F, 0xB9, 0x86, 0x55, 0x45, 0x56, 0x89, 0xBB, 0x97, 0x65, 0x44,
- 0x45, 0x67, 0x9B, 0xB8, 0x75, 0x44, 0x34, 0x45, 0x79, 0xAA, 0x97, 0x64,
- 0x44, 0x45, 0x57, 0x9B, 0xC9, 0x86, 0x55, 0x44, 0x56, 0x79, 0xBC, 0xA8,
- 0x76, 0x55, 0x66, 0x79, 0xBF, 0xFC, 0xA8, 0x87, 0x77, 0x78, 0xAA, 0xFF,
- 0xFC, 0xAA, 0x99, 0x99, 0xAC, 0xCF, 0xFF, 0xCB, 0xBA, 0xAB, 0xBC, 0xBE,
- 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xBB, 0xBB, 0x9B, 0xBB, 0xFE, 0xCD, 0xCC, 0xA9, 0x99, 0x99, 0xAC,
- 0xED, 0xCC, 0xA8, 0x87, 0x77, 0x88, 0xAB, 0xCB, 0xA8, 0x76, 0x56, 0x66,
- 0x79, 0xBC, 0xA9, 0x86, 0x55, 0x44, 0x56, 0x79, 0xCA, 0x97, 0x65, 0x44,
- 0x44, 0x67, 0x8A, 0xA9, 0x75, 0x44, 0x34, 0x45, 0x79, 0xBB, 0x97, 0x64,
- 0x44, 0x45, 0x67, 0x9A, 0xB9, 0x86, 0x54, 0x45, 0x56, 0x89, 0xBC, 0xA9,
- 0x76, 0x66, 0x66, 0x79, 0xAC, 0xFC, 0xA8, 0x87, 0x77, 0x79, 0x9B, 0xDE,
- 0xDC, 0xA9, 0x99, 0x9A, 0xAB, 0xBD, 0xBD, 0xDB, 0xBA, 0xAA, 0xBB, 0xCD,
- 0xB0, 0x00, 0x00, 0x00,
- ],
- ],
- [
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x7F, 0xFC, 0xAF, 0xFF, 0xFF, 0xF6, 0x32,
- 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x63, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xCC, 0xCF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x99, 0xBB,
- 0xFF, 0xFF, 0xFC, 0xBB, 0x86, 0x56, 0x9B, 0xFF, 0xFF, 0xFB, 0xA7, 0x42,
- 0x36, 0xAF, 0xFF, 0xFF, 0xF9, 0x62, 0x13, 0x59, 0xFF, 0xFF, 0xFF, 0xA6,
- 0x32, 0x47, 0xAF, 0xEF, 0xFF, 0xFF, 0x96, 0x57, 0x9A, 0xCC, 0xFF, 0xFF,
- 0xFB, 0xAA, 0xAA, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x99, 0x9B,
- 0xFF, 0xFF, 0xFF, 0xFA, 0x86, 0x56, 0x8B, 0xFF, 0xFF, 0xFF, 0xA6, 0x42,
- 0x36, 0xAF, 0xFF, 0xFF, 0xF9, 0x52, 0x13, 0x58, 0xFF, 0xFF, 0xFF, 0xA5,
- 0x33, 0x36, 0x9F, 0xFF, 0xFF, 0xFE, 0x86, 0x56, 0x8B, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xA8, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x7F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x75, 0x45, 0x68, 0xCF, 0xFF, 0xFF, 0xB5, 0x43,
- 0x35, 0x8F, 0xFF, 0xFF, 0xF8, 0x43, 0x23, 0x57, 0xCF, 0xFF, 0xFF, 0xA5,
- 0x32, 0x34, 0x8F, 0xFF, 0xFF, 0xFF, 0x64, 0x44, 0x6F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x87, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAF, 0xFF, 0xFF, 0xFF, 0xF3,
- 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x52, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x8F, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x88, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xF8, 0x67, 0x87,
- 0xFF, 0xFF, 0xFF, 0xF8, 0x76, 0x54, 0x77, 0xEF, 0xFF, 0xFF, 0x84, 0x33,
- 0x35, 0x7F, 0xFF, 0xF8, 0x86, 0x53, 0x23, 0x57, 0xFF, 0xFF, 0xFF, 0x65,
- 0x33, 0x35, 0x78, 0xFF, 0xFF, 0xF8, 0x55, 0x44, 0x58, 0xEE, 0xEE, 0xFE,
- 0xFE, 0x67, 0x88, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFC, 0xCC, 0xFC, 0xFF, 0xFF, 0xFF, 0xBC, 0xA9, 0xA9, 0xCF,
- 0xFF, 0xFC, 0xBA, 0x98, 0x77, 0x89, 0xBF, 0xFF, 0xB9, 0x87, 0x66, 0x67,
- 0x8A, 0xCF, 0xBA, 0x87, 0x65, 0x44, 0x67, 0x9F, 0xFB, 0xA8, 0x65, 0x43,
- 0x45, 0x69, 0xCF, 0xEA, 0x76, 0x43, 0x33, 0x46, 0x8F, 0xFC, 0xA8, 0x65,
- 0x43, 0x34, 0x68, 0xAF, 0xF9, 0x97, 0x64, 0x44, 0x57, 0xAF, 0xFF, 0xFA,
- 0x97, 0x66, 0x67, 0x9C, 0xFF, 0xFF, 0xFB, 0xA9, 0x99, 0x9B, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xCB, 0xCC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xDC, 0xCD, 0xCF, 0xFF,
- 0xFF, 0xCC, 0xCB, 0xA9, 0x9A, 0xBC, 0xFF, 0xFD, 0xDB, 0xA8, 0x76, 0x78,
- 0xAD, 0xFF, 0xDC, 0xA8, 0x65, 0x45, 0x68, 0xBF, 0xFE, 0xCA, 0x75, 0x33,
- 0x35, 0x7A, 0xCF, 0xFC, 0xA6, 0x43, 0x23, 0x47, 0x9C, 0xFF, 0xC9, 0x75,
- 0x33, 0x35, 0x79, 0xCE, 0xFD, 0xB8, 0x65, 0x45, 0x68, 0xAC, 0xDF, 0xFC,
- 0xA8, 0x76, 0x78, 0xAB, 0xDF, 0xFF, 0xFD, 0xBA, 0x99, 0xAB, 0xCF, 0xFF,
- 0xFF, 0xFD, 0xDD, 0xCD, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF,
- 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x9D, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xAF, 0x77, 0x8A,
- 0xFF, 0xFF, 0xFF, 0xF9, 0x75, 0x45, 0x68, 0xFF, 0xFF, 0xFF, 0x84, 0x33,
- 0x35, 0x9A, 0xFF, 0xFF, 0xF6, 0x43, 0x23, 0x47, 0xFF, 0xFF, 0xFF, 0x75,
- 0x33, 0x35, 0x7A, 0xFF, 0xFF, 0xF8, 0x64, 0x45, 0x69, 0xFF, 0xFF, 0xFF,
- 0x97, 0x86, 0x78, 0x9F, 0xFF, 0xFF, 0xAF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF,
- 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x70, 0x00, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x70, 0x00, 0x00, 0x00,
- ],
- [
- 0xEE, 0xDD, 0xDD, 0xDD, 0x5D, 0xDD, 0x4D, 0xDD, 0xDD, 0xD6, 0xDD, 0xD5,
- 0xDD, 0xDD, 0x5D, 0xDD, 0x6D, 0xDD, 0xDD, 0xD5, 0xDD, 0xDD, 0xD6, 0xDD,
- 0xDD, 0x6D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD6, 0xDD, 0xDD, 0xD6,
- 0xD5, 0xDD, 0x5D, 0x6D, 0x55, 0xDD, 0x0D, 0x55, 0x65, 0xDD, 0x5D, 0xDD,
- 0x66, 0xDD, 0xDD, 0xDD, 0xDD, 0xD5, 0xD5, 0x5D, 0x5D, 0xD6, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xD6, 0xD5, 0x6D, 0x6D, 0x6D, 0xD4, 0x6D, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x55, 0xD6, 0xDD, 0xDE,
- 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0x9B, 0xA9, 0x9B, 0xAC, 0xCC, 0xFA, 0xBA, 0xBB, 0xA9, 0xAA, 0xBF,
- 0xFF, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0xAD, 0xF9, 0x99, 0x88, 0x76, 0x66,
- 0x79, 0xAA, 0x99, 0x98, 0x75, 0x54, 0x56, 0x8F, 0xFA, 0xA9, 0x75, 0x43,
- 0x34, 0x68, 0xAB, 0xBA, 0x86, 0x53, 0x33, 0x56, 0x8A, 0xBC, 0xB8, 0x64,
- 0x33, 0x45, 0x79, 0xAC, 0xCB, 0x86, 0x54, 0x55, 0x67, 0x8A, 0xAC, 0xCA,
- 0x76, 0x67, 0x78, 0x89, 0xBB, 0xFF, 0xB9, 0x78, 0x88, 0x9A, 0xBB, 0x9F,
- 0xFD, 0xF9, 0xAB, 0x9A, 0xAB, 0xAA, 0xFF, 0xFC, 0xFA, 0xAB, 0x99, 0xAA,
- 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xCC, 0xBC, 0xBB, 0xBC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB4, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xB4, 0x44, 0xB4, 0x2B, 0xBC, 0xCC, 0xCB, 0xBB, 0x33,
- 0x4B, 0xBB, 0xBB, 0xBB, 0xB4, 0xBB, 0x44, 0x3B, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xB3, 0xB4, 0xBB, 0xBB, 0xBB, 0xBB, 0xB4, 0x44, 0x3B, 0xBB, 0xBB, 0xBB,
- 0xB4, 0xB3, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCB, 0xB4, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCB, 0xCC, 0xCC,
- 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x70, 0x00, 0x00, 0x00,
- ],
- ],
-];
-
-const RALF_LONG_CODES_TAB: [[[u8; 224]; 125]; 3] = [
- [
- [
- 0xBE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF,
- 0xFE, 0xED, 0xDD, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, 0xDC,
- 0xCB, 0xCB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFE, 0xED, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xDD, 0xFF, 0xFF, 0xFE, 0xDC, 0xBB, 0xA9, 0x99, 0x99,
- 0x99, 0xAB, 0xCD, 0xEF, 0xFE, 0xEC, 0xCB, 0xA9, 0x88, 0x87, 0x78, 0x89,
- 0xAB, 0xCD, 0xFF, 0xFE, 0xCB, 0xA9, 0x87, 0x77, 0x66, 0x77, 0x89, 0xAB,
- 0xDE, 0xFD, 0xDC, 0xAA, 0x87, 0x76, 0x65, 0x66, 0x67, 0x89, 0xBC, 0xEF,
- 0xDD, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xED, 0xDC,
- 0xA9, 0x87, 0x65, 0x54, 0x45, 0x56, 0x79, 0xAC, 0xDD, 0xDD, 0xCA, 0x98,
- 0x65, 0x54, 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xDE, 0xEB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x66, 0x89, 0xAB, 0xDD, 0xED, 0xCA, 0x98, 0x76, 0x55, 0x55,
- 0x56, 0x78, 0x9A, 0xCC, 0xDE, 0xFC, 0xBA, 0x87, 0x76, 0x65, 0x66, 0x77,
- 0x89, 0xBB, 0xDD, 0xFE, 0xDB, 0xA9, 0x87, 0x76, 0x67, 0x77, 0x89, 0xAB,
- 0xCD, 0xDF, 0xEF, 0xCB, 0xA9, 0x88, 0x87, 0x88, 0x89, 0xAB, 0xCC, 0xED,
- 0xFF, 0xED, 0xCB, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xEF, 0xFF,
- 0xFD, 0xDB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFD, 0xFF, 0xFF, 0xFD,
- 0xDC, 0xCC, 0xBC, 0xCC, 0xDC, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDE,
- 0xDD, 0xCD, 0xDD, 0xEE, 0xFF, 0xFE, 0xDF, 0xFF, 0xFF, 0xEF, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xFD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xCF, 0xFE,
- 0xDC, 0xDC, 0xCC, 0xBB, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xEE, 0xDD, 0xCC,
- 0xCB, 0xBA, 0xAA, 0xBB, 0xBC, 0xDD, 0xFF, 0xDC, 0xDD, 0xCB, 0xBA, 0xA9,
- 0x99, 0x9A, 0x9A, 0xBC, 0xDF, 0xFF, 0xBD, 0xDB, 0xBA, 0x99, 0x88, 0x88,
- 0x88, 0x9A, 0xBC, 0xEF, 0xDD, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x78, 0x9A,
- 0xCC, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x65, 0x66, 0x67, 0x88, 0xAB, 0xCC,
- 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xCC, 0xCA,
- 0x98, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xCC, 0xBB, 0xA9, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xBC, 0xCA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCC, 0xB9, 0x87, 0x66, 0x55, 0x55,
- 0x56, 0x77, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x67,
- 0x89, 0xAB, 0xBD, 0xDF, 0xCA, 0x98, 0x87, 0x76, 0x66, 0x77, 0x89, 0x9A,
- 0xBC, 0xCF, 0xDD, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xBC, 0xDD,
- 0xFF, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xDF, 0xFF,
- 0xDC, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xEC,
- 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xDC, 0xDF, 0xDF, 0xFF, 0xFD, 0xEE, 0xCC,
- 0xBC, 0xBB, 0xCC, 0xDD, 0xCE, 0xFE, 0xCF, 0xFF, 0xDD, 0xDD, 0xCD, 0xDC,
- 0xCB, 0xBD, 0xCD, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xDD, 0xEE,
- 0xDD, 0xCD, 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xDE, 0xDD, 0xCC,
- 0xBB, 0xBB, 0xBA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFD, 0xDD, 0xCC, 0xBA, 0xAA,
- 0x99, 0x9A, 0xAA, 0xBC, 0xDE, 0xFF, 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x88,
- 0x89, 0x9A, 0xBC, 0xDF, 0xED, 0xCC, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xDE, 0xCC, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x67, 0x78, 0x9A,
- 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x65, 0x56, 0x67, 0x89, 0xAB, 0xCC,
- 0xCC, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xCC, 0xCA,
- 0x98, 0x76, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCC, 0xCC, 0xB9, 0x87,
- 0x65, 0x55, 0x45, 0x56, 0x67, 0x89, 0xAC, 0xCC, 0xCB, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x66, 0x78, 0x9B, 0xCC, 0xCC, 0xBA, 0x87, 0x76, 0x55, 0x55,
- 0x56, 0x78, 0x99, 0xBC, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCC, 0xDD, 0xCB, 0x98, 0x87, 0x76, 0x66, 0x77, 0x89, 0x9B,
- 0xBC, 0xCE, 0xED, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89, 0x9A, 0xBC, 0xDC,
- 0xEE, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xBC, 0xCD, 0xCF, 0xFE,
- 0xDD, 0xBB, 0xAA, 0x99, 0x9A, 0xAA, 0xBC, 0xCC, 0xDC, 0xFF, 0xFE, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xDF, 0xFF, 0xFF, 0xED, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFD, 0xDF, 0xFF, 0xED, 0xDD, 0xDC, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xCD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xDD, 0xFF,
- 0xDF, 0xEC, 0xCC, 0xDC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xEE, 0xCC, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xAC, 0xCC, 0xEF, 0xEF, 0xFD, 0xDD, 0xCC, 0xBB, 0xAA,
- 0x99, 0x9A, 0xAB, 0xBC, 0xDF, 0xFF, 0xDD, 0xCB, 0xBA, 0x99, 0x98, 0x88,
- 0x89, 0x9A, 0xBC, 0xDD, 0xFC, 0xDB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xED, 0xBC, 0xBA, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x88, 0x9A,
- 0xBD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x65, 0x56, 0x67, 0x89, 0xAC, 0xCE,
- 0xCC, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x67, 0x8A, 0xBC, 0xDC, 0xDB,
- 0xA9, 0x76, 0x65, 0x55, 0x55, 0x56, 0x78, 0xAA, 0xCC, 0xCC, 0xB9, 0x87,
- 0x66, 0x55, 0x45, 0x55, 0x67, 0x89, 0xBC, 0xCC, 0xDB, 0xA8, 0x76, 0x65,
- 0x55, 0x55, 0x66, 0x78, 0x9B, 0xCC, 0xCC, 0xBA, 0x97, 0x66, 0x55, 0x55,
- 0x56, 0x78, 0x9A, 0xBC, 0xCF, 0xDC, 0xA9, 0x87, 0x66, 0x65, 0x66, 0x77,
- 0x89, 0xAB, 0xCC, 0xFD, 0xCB, 0xA8, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB,
- 0xBC, 0xCF, 0xFD, 0xCB, 0x99, 0x87, 0x77, 0x78, 0x89, 0xAA, 0xCC, 0xCC,
- 0xFF, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x99, 0x9A, 0xBC, 0xDD, 0xCF, 0xFE,
- 0xDD, 0xBB, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xBD, 0xDC, 0xFF, 0xFF, 0xDD,
- 0xBC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xFE, 0xCF, 0xFF, 0xFD, 0xFD, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFE, 0xCF, 0xFF, 0xDD, 0xCD, 0xDD, 0xCC,
- 0xCD, 0xCC, 0xCD, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBF, 0xEE, 0xDD, 0xDD, 0xCD, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xDE, 0xFF,
- 0xFD, 0xED, 0xDD, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0xDD,
- 0xCC, 0xCB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFE, 0xFD, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFF, 0xFF, 0xDC, 0xBA, 0xA9, 0x99, 0x89,
- 0x99, 0xAB, 0xCD, 0xFF, 0xFD, 0xDD, 0xCA, 0xA9, 0x88, 0x87, 0x78, 0x89,
- 0xAB, 0xCD, 0xFF, 0xDE, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB,
- 0xDF, 0xFE, 0xDC, 0xA9, 0x87, 0x76, 0x65, 0x56, 0x67, 0x89, 0xAC, 0xEF,
- 0xED, 0xCA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xED, 0xDB,
- 0xA9, 0x76, 0x65, 0x54, 0x55, 0x56, 0x79, 0xAB, 0xCE, 0xDD, 0xBA, 0x87,
- 0x66, 0x54, 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xDD, 0xDB, 0xA9, 0x86, 0x65,
- 0x54, 0x55, 0x66, 0x79, 0xAB, 0xCD, 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x55,
- 0x56, 0x78, 0x9A, 0xCD, 0xDF, 0xFC, 0xB9, 0x87, 0x66, 0x65, 0x66, 0x77,
- 0x89, 0xBC, 0xDD, 0xFF, 0xDC, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDF, 0xFF, 0xCB, 0xA9, 0x88, 0x87, 0x78, 0x89, 0xAB, 0xBC, 0xED,
- 0xFF, 0xFD, 0xCB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDF, 0xEF, 0xFF,
- 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xCD, 0xED, 0xFF, 0xFF, 0xFD,
- 0xDC, 0xCB, 0xBC, 0xCC, 0xCD, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xED,
- 0xDE, 0xDD, 0xDE, 0xDD, 0xDF, 0xFF, 0xBF, 0xFF, 0xEF, 0xDF, 0xED, 0xDC,
- 0xDD, 0xDD, 0xDE, 0xED, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xBC, 0xDC,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xBC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCD, 0xDB, 0xCB, 0xAA, 0xA9, 0x98,
- 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCC, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0xAB, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9,
- 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87,
- 0x66, 0x65, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x78, 0x99, 0xAA, 0xBA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA,
- 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCB,
- 0xBA, 0x99, 0x98, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xCB, 0xCC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBD, 0xDD, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xAA, 0x9A, 0x9A, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xCA, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x77,
- 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x67, 0x78, 0x89,
- 0xAA, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA,
- 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xA9, 0xA9,
- 0x88, 0x76, 0x66, 0x65, 0x66, 0x66, 0x77, 0x89, 0xAA, 0xAA, 0x98, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x67, 0x78, 0x9A, 0x99, 0xA9, 0x88, 0x76, 0x66,
- 0x65, 0x66, 0x66, 0x78, 0x89, 0xA9, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x78, 0x89, 0xAA, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xAA,
- 0xBB, 0xBA, 0x99, 0x88, 0x87, 0x78, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xCB,
- 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBA, 0xCC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC, 0xCC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBD, 0xCC, 0xBA, 0xAA, 0xA9, 0x99,
- 0xAA, 0xAA, 0xAB, 0xBB, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBB, 0xDC,
- 0xBB, 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xDD, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBB, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77,
- 0x78, 0x88, 0x99, 0xAB, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x76, 0x66, 0x67, 0x77, 0x89,
- 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA,
- 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x78, 0x99, 0x99, 0x99,
- 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x99, 0x99, 0x98, 0x77,
- 0x66, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0x99, 0xA9, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x66, 0x77, 0x89, 0x99, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0x9A, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x78, 0x89, 0xA9, 0xAA, 0x99, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA,
- 0xBB, 0xAA, 0x98, 0x88, 0x87, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB,
- 0xA9, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xCC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBC, 0xDC, 0xBB, 0xBA, 0xAA,
- 0x99, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xBC, 0xCB, 0xBA, 0xAA, 0x99, 0x99,
- 0x99, 0xAA, 0xAA, 0xBB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xCC,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDC, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xBC, 0xCB, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x78,
- 0x88, 0x88, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x66, 0x77, 0x78, 0x89,
- 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA,
- 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0x99, 0xA9,
- 0x88, 0x76, 0x66, 0x65, 0x66, 0x66, 0x77, 0x89, 0xA9, 0x9A, 0x98, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x67, 0x88, 0x9A, 0x99, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x66, 0x66, 0x78, 0x89, 0xA9, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0x9A, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x78, 0x99, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA,
- 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB,
- 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xCD, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBC, 0xCB, 0xBA, 0xAA, 0x9A, 0x99,
- 0x99, 0xAA, 0xAA, 0xBB, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xCC, 0xDC,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xED, 0xBC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCB, 0xCB, 0xAA, 0x99, 0x98,
- 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x78,
- 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9,
- 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87,
- 0x66, 0x65, 0x55, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67,
- 0x78, 0x99, 0xAA, 0xAB, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA,
- 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x78, 0x88, 0x89, 0x9A, 0xBB, 0xBC, 0xCB,
- 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xDD, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCD, 0xED, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xBD, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBF, 0xEE, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF,
- 0xFE, 0xED, 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFE, 0xDD,
- 0xCC, 0xCB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFE, 0xFE, 0xDC, 0xCB, 0xBA,
- 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xFF, 0xEE, 0xDD, 0xBB, 0xA9, 0x99, 0x99,
- 0x9A, 0xBC, 0xDE, 0xFF, 0xFD, 0xDC, 0xBB, 0xA9, 0x88, 0x77, 0x88, 0x99,
- 0xAC, 0xDF, 0xFF, 0xDD, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x78, 0x8A, 0xBC,
- 0xEF, 0xFD, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xFF,
- 0xDD, 0xBA, 0x98, 0x76, 0x55, 0x45, 0x56, 0x78, 0xAB, 0xDE, 0xFD, 0xDB,
- 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xEF, 0xED, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xEE, 0xDC, 0xA9, 0x86, 0x55,
- 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDD, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0xAB, 0xCE, 0xEF, 0xFD, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xCD, 0xEE, 0xFF, 0xDC, 0xBA, 0x88, 0x77, 0x77, 0x78, 0x9A, 0xBC,
- 0xDF, 0xEF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0x9A, 0xBC, 0xCD, 0xEF,
- 0xFF, 0xFE, 0xDC, 0xBA, 0xA9, 0x99, 0xAA, 0xBB, 0xCD, 0xEF, 0xEF, 0xFF,
- 0xFE, 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE,
- 0xDD, 0xDC, 0xCC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xEF, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED,
- 0xDE, 0xEE, 0xEF, 0xEF, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAD, 0xCD, 0xCB, 0xBC, 0xCB, 0xCC, 0xCD, 0xDD, 0xDE, 0xEF, 0xBD, 0xDE,
- 0xDD, 0xCC, 0xCC, 0xCC, 0xDC, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD, 0xDD, 0xCB,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xDD, 0xEF, 0xEF, 0xDD, 0xDC, 0xCC, 0xBB, 0xAA,
- 0xA9, 0xAA, 0xBB, 0xCC, 0xFF, 0xFE, 0xCD, 0xCC, 0xAA, 0x99, 0x98, 0x88,
- 0x99, 0xAB, 0xCE, 0xFE, 0xCC, 0xCB, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xFE, 0xCD, 0xBB, 0x99, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAC,
- 0xDE, 0xDC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x67, 0x8A, 0xBC, 0xFD,
- 0xCC, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCB,
- 0x99, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xBA, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCB, 0xA8, 0x76, 0x65,
- 0x54, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCD, 0xBA, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xCD, 0xEC, 0xB9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBB, 0xDC, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xCE, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xDD,
- 0xEF, 0xFD, 0xDB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xDF, 0xFD,
- 0xFD, 0xCC, 0xBB, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xFC, 0xEF, 0xEF, 0xED,
- 0xDD, 0xCC, 0xBC, 0xBC, 0xCC, 0xED, 0xEE, 0xDF, 0xFF, 0xFF, 0xFD, 0xED,
- 0xDC, 0xDC, 0xDD, 0xDD, 0xDD, 0xED, 0xBE, 0xDD, 0xDD, 0xDD, 0xDC, 0xDC,
- 0xCD, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xDD, 0xFE,
- 0xDD, 0xCC, 0xCC, 0xCB, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xDE, 0xDD, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFD, 0xDD, 0xCB, 0xAA, 0xA9,
- 0x99, 0x99, 0xAB, 0xBC, 0xEF, 0xFF, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCD, 0xEC, 0xCA, 0x99, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD,
- 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x55, 0x55, 0x66, 0x78, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x55, 0x45, 0x56, 0x67, 0x8A, 0xBC, 0xCC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x79, 0xAB, 0xCC, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCC, 0xDD, 0xCB, 0x99, 0x87, 0x76, 0x67, 0x77, 0x89, 0xAB,
- 0xCD, 0xDE, 0xDD, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x89, 0xAA, 0xBC, 0xDD,
- 0xEF, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x99, 0xAA, 0xBC, 0xDD, 0xDF, 0xFF,
- 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xED, 0xFF, 0xFE, 0xDC,
- 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xEF, 0xFF, 0xFF, 0xED, 0xDC,
- 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xFE, 0xDF, 0xFF, 0xFE, 0xED, 0xDD, 0xDC,
- 0xCD, 0xDD, 0xDD, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xEF, 0xCD, 0xFD,
- 0xED, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB,
- 0xBB, 0xBA, 0xAB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFD, 0xDD, 0xCB, 0xAA, 0xA9,
- 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xFE, 0xCD, 0xCB, 0xBA, 0x99, 0x88, 0x88,
- 0x89, 0xAA, 0xBD, 0xEF, 0xDC, 0xDC, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x89,
- 0x9A, 0xCD, 0xFD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xDD,
- 0xCC, 0xB9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xCC, 0xCA,
- 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x79, 0xAB, 0xDD, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x67, 0x8A, 0xBC, 0xCC, 0xCB, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x97, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xCD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xDC, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xED, 0xBA, 0xA9, 0x88, 0x77, 0x88, 0x89, 0x9B, 0xBC, 0xDD,
- 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xCE, 0xCF, 0xFE,
- 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xED, 0xFF, 0xEE, 0xED,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCE, 0xEE, 0xDF, 0xFF, 0xFF, 0xED, 0xDD,
- 0xDC, 0xCC, 0xCD, 0xDD, 0xFE, 0xFE, 0xBF, 0xFE, 0xDD, 0xDD, 0xCD, 0xCC,
- 0xDD, 0xCC, 0xDD, 0xEE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBF, 0xFF, 0xFE, 0xEE, 0xEE, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF,
- 0xFF, 0xEE, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED,
- 0xCC, 0xCB, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, 0xCB, 0xBA,
- 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF, 0xEE, 0xDC, 0xBB, 0xA9, 0x99, 0x99,
- 0x9A, 0xBC, 0xDF, 0xFF, 0xFE, 0xED, 0xCB, 0xA9, 0x88, 0x77, 0x88, 0x9A,
- 0xBC, 0xDF, 0xFF, 0xEE, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x78, 0x8A, 0xBC,
- 0xEF, 0xFD, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xFF,
- 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x45, 0x56, 0x78, 0xAB, 0xDF, 0xFE, 0xDC,
- 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xEF, 0xED, 0xCA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0x9B, 0xCE, 0xEE, 0xDC, 0xA9, 0x76, 0x55,
- 0x44, 0x55, 0x67, 0x89, 0xBC, 0xEE, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0xAB, 0xCE, 0xEF, 0xFD, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBD, 0xEF, 0xFF, 0xEC, 0xB9, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBC,
- 0xDF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x88, 0x9A, 0xBB, 0xDE, 0xFF,
- 0xFF, 0xFE, 0xDC, 0xBA, 0xA9, 0x99, 0xAA, 0xBB, 0xCD, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xEC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xED, 0xDC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xEE, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xBC, 0xDD,
- 0xCB, 0xBB, 0xBA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDD, 0xED, 0xCC, 0xCB, 0xBA,
- 0xAA, 0xA9, 0x99, 0xAA, 0xBB, 0xCC, 0xDE, 0xDB, 0xCB, 0xBA, 0xA9, 0x99,
- 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDC, 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x9A,
- 0xBC, 0xCA, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x89, 0x9A, 0xBB,
- 0xAA, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9,
- 0x98, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xBB, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x66, 0x65, 0x55,
- 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xBB, 0xAA, 0x98, 0x87, 0x77, 0x67, 0x77, 0x88, 0x9A,
- 0xBB, 0xBC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB,
- 0xCC, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC,
- 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xDE, 0xED, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCD, 0xEE, 0xDD, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xDC, 0xAE, 0xDD, 0xCC, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xBC, 0xDC, 0xAB, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xED, 0xBB, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xDA, 0xBA, 0xAA, 0x99, 0x98,
- 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77,
- 0x88, 0x89, 0xAA, 0xBC, 0xCA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x89, 0xAB, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x87, 0x66, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x66, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x67, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x99, 0x87, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0xBB, 0xA9, 0x88, 0x77, 0x76, 0x67, 0x77, 0x88, 0x99,
- 0xAB, 0xAB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA,
- 0xBB, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xAC, 0xDB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCC, 0xBB,
- 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBC, 0xED, 0xDC, 0xBB, 0xBA,
- 0xAA, 0xAA, 0xBA, 0xBB, 0xCC, 0xCC, 0xAC, 0xCC, 0xCB, 0xBB, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBB, 0xCC,
- 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDC, 0xBB, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x66, 0x66, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x99, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x67, 0x77, 0x78, 0x89,
- 0xAA, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB,
- 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBB, 0xCC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBC, 0xCB, 0xBB, 0xAA, 0xAA, 0x99,
- 0x9A, 0xAA, 0xAB, 0xBB, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xAB, 0xDC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xEC, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xCD, 0xCB, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x78,
- 0x88, 0x89, 0xAA, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x87, 0x66, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x66, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x67, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0x99, 0x87, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xAA, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0xAB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBA,
- 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x98, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCB, 0xBA,
- 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xCD, 0xED, 0xDC, 0xBB, 0xBB,
- 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xAC, 0xCC, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xCE, 0xAC, 0xDD,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xFE, 0xBC, 0xCB, 0xBA,
- 0xAA, 0x99, 0x9A, 0xAA, 0xAB, 0xCC, 0xDE, 0xDB, 0xCB, 0xBA, 0xA9, 0x99,
- 0x98, 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x9A,
- 0xBC, 0xCA, 0xAA, 0x98, 0x77, 0x66, 0x65, 0x66, 0x67, 0x88, 0x9A, 0xBB,
- 0xAA, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xAA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBB, 0xBB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBB, 0xBC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB,
- 0xCC, 0xCB, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xBD, 0xDC,
- 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCE, 0xFE, 0xDC, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEC, 0xBE, 0xDC, 0xCC, 0xCB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDE, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xBE, 0xFF,
- 0xEE, 0xDD, 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xED, 0xDC,
- 0xCC, 0xBC, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xFD, 0xED, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF, 0xDD, 0xDC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xBC, 0xDF, 0xFF, 0xFD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xBC, 0xEF, 0xFF, 0xDD, 0xCB, 0x98, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBD,
- 0xEF, 0xFD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xFF,
- 0xDD, 0xBA, 0x97, 0x66, 0x54, 0x45, 0x56, 0x79, 0xAC, 0xDE, 0xFE, 0xDB,
- 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xDD, 0xCA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCE, 0xEE, 0xDC, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x8A, 0xBD, 0xEF, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x79, 0xAB, 0xDE, 0xEF, 0xED, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBD, 0xFE, 0xEF, 0xEC, 0xBA, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBC,
- 0xDE, 0xEF, 0xFF, 0xDC, 0xBA, 0x99, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xEE,
- 0xFF, 0xFE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xEF, 0xFF,
- 0xFF, 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xED, 0xDD, 0xCD, 0xCD, 0xDD, 0xDF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xFE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xEE, 0xEE,
- 0xEE, 0xEF, 0xEF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFF, 0xCE, 0xFE,
- 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xDF, 0xED, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDF, 0xFF, 0xFE, 0xED, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAB, 0xCD, 0xDF, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xEF, 0xFD, 0xDB, 0xB9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xFE, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCD, 0xFC, 0xCB, 0x98, 0x77, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xDE,
- 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA,
- 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x79, 0xAB, 0xCD, 0xDC, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xBA, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xCC, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x89, 0xBC, 0xDD, 0xED, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCE, 0xDE, 0xEC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x89, 0xAB, 0xCD, 0xEE,
- 0xFF, 0xEC, 0xBB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xCC, 0xDF, 0xEF, 0xFF,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBD, 0xDE, 0xFF, 0xFF, 0xFF, 0xED,
- 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDD,
- 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xEF, 0xED, 0xDD,
- 0xDD, 0xDF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xCE, 0xFE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xEE, 0xDD, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFF, 0xFD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xDF, 0xED, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xEE, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x67, 0x89, 0x9B,
- 0xCD, 0xEC, 0xBA, 0x98, 0x76, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD,
- 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x67, 0x8A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x78, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCD, 0xDD, 0xCA, 0x98, 0x87, 0x77, 0x67, 0x77, 0x89, 0xAB,
- 0xCD, 0xDE, 0xEC, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x89, 0xAA, 0xBC, 0xDD,
- 0xEE, 0xDC, 0xBA, 0xA9, 0x98, 0x89, 0x99, 0xAA, 0xBC, 0xDE, 0xEF, 0xFE,
- 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFE, 0xFF, 0xFE, 0xED,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xED, 0xDC,
- 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xDF, 0xFF, 0xEE, 0xDD, 0xDD, 0xCD,
- 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDC, 0xDC, 0xCC, 0xBC, 0xCC, 0xCD, 0xDD, 0xDE, 0xEE, 0xBE, 0xFE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xEF, 0xFF, 0xFD, 0xDD, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xFE, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xCC, 0xEE, 0xEC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCE, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x56, 0x77, 0x8A, 0xAC, 0xDD,
- 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCC, 0xBA, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x99, 0xAC, 0xDC, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xEC, 0xCA, 0xA9, 0x88, 0x88, 0x88, 0x89, 0xAB, 0xBC, 0xDD,
- 0xDE, 0xDC, 0xCB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xDE, 0xFE,
- 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xDD, 0xEF, 0xEE, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xEF, 0xFF, 0xFE, 0xEE, 0xDD,
- 0xCD, 0xCD, 0xCD, 0xDD, 0xFF, 0xFE, 0xCE, 0xED, 0xEE, 0xDD, 0xDD, 0xCC,
- 0xDD, 0xCD, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xBE, 0xFF,
- 0xFE, 0xDD, 0xDC, 0xCD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xEF, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFD, 0xEE, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBC, 0xDE, 0xFF, 0xFF, 0xDD, 0xDC, 0xBA, 0x99, 0x98, 0x89,
- 0x9A, 0xAB, 0xDD, 0xFF, 0xFD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x99,
- 0xAC, 0xDE, 0xFF, 0xDD, 0xCB, 0x98, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC,
- 0xDF, 0xED, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xEE,
- 0xDC, 0xBA, 0x97, 0x66, 0x55, 0x45, 0x56, 0x78, 0xAB, 0xCE, 0xED, 0xDB,
- 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xDE, 0xDC, 0xBA, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xCE, 0xDD, 0xDB, 0xA9, 0x76, 0x65,
- 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDE, 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0xAB, 0xDD, 0xEE, 0xEC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBD, 0xEE, 0xEF, 0xDC, 0xB9, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBC,
- 0xDE, 0xEE, 0xFE, 0xDB, 0xAA, 0x98, 0x88, 0x88, 0x9A, 0xAB, 0xCE, 0xFE,
- 0xFF, 0xED, 0xDB, 0xBA, 0xAA, 0x99, 0xAA, 0xBB, 0xCD, 0xEF, 0xEF, 0xFF,
- 0xFE, 0xDC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE,
- 0xED, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE,
- 0xDE, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0xEE, 0xED, 0xDE,
- 0xED, 0xDE, 0xEE, 0xFE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xBC, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xCD, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xEC, 0xCB, 0xBA, 0xA9, 0x99,
- 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xBB, 0xCD, 0xDB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xDD, 0xBB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC,
- 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xA9,
- 0x98, 0x76, 0x65, 0x44, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xCC, 0xCB, 0xBA, 0x99, 0x88, 0x87, 0x88, 0x88, 0x9A, 0xAB, 0xCC,
- 0xDD, 0xCB, 0xBA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCD, 0xED,
- 0xCB, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xDF, 0xED, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDD, 0xDE, 0xFE, 0xED, 0xDC, 0xCB,
- 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFD, 0xAE, 0xDD, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBB, 0xCC,
- 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xBC, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBB,
- 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB,
- 0xAA, 0x99, 0x99, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xCC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCC, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDC, 0xAD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xAB, 0xAA, 0xA9,
- 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCA, 0xBA, 0x99, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x88, 0x87, 0x77, 0x77,
- 0x78, 0x88, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98,
- 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x88, 0x77,
- 0x66, 0x66, 0x56, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x98, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0x99, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x78, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89,
- 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB,
- 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCC, 0xBC, 0xCB, 0xBA, 0xAA, 0x99, 0x99,
- 0x9A, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xBC, 0xAB, 0xDC,
- 0xBB, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA,
- 0x9A, 0x98, 0x87, 0x66, 0x66, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9,
- 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB,
- 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB,
- 0xAA, 0xA9, 0x99, 0x89, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCC, 0xCB, 0xBA,
- 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xDD, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xAD, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCC, 0xBB, 0xBB, 0xAB, 0xAB, 0xBB, 0xBC, 0xCC, 0xDD, 0xAC, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xBA, 0xBB, 0xBC, 0xCD, 0xDE, 0xFD, 0xCD, 0xCB, 0xBA,
- 0xAA, 0xA9, 0xAA, 0xAA, 0xBC, 0xCD, 0xDE, 0xDB, 0xCC, 0xBA, 0xA9, 0x99,
- 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBB, 0xDC, 0xBB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC,
- 0xAA, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xAA,
- 0x98, 0x76, 0x65, 0x44, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCB, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xCC, 0xCB, 0xBA, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xAC, 0xCC,
- 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCD, 0xDD,
- 0xCB, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDC, 0xDE, 0xDD, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xDD, 0xFE, 0xED, 0xDC, 0xCB,
- 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xED, 0xBD, 0xED, 0xDC, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xFF, 0xFF, 0xEF, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF,
- 0xFF, 0xFE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE,
- 0xDD, 0xDC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xCC, 0xBB,
- 0xBB, 0xBC, 0xCE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xAA, 0x99, 0x9A,
- 0xAB, 0xCD, 0xFF, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAB,
- 0xCD, 0xFF, 0xFF, 0xEF, 0xDC, 0xA9, 0x87, 0x77, 0x77, 0x88, 0xAB, 0xCE,
- 0xFF, 0xFE, 0xED, 0xBA, 0x87, 0x66, 0x55, 0x66, 0x79, 0xAC, 0xDF, 0xFF,
- 0xFF, 0xCB, 0x98, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBC, 0xFF, 0xFF, 0xEC,
- 0xB9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xDE, 0xFF, 0xFE, 0xDB, 0x98,
- 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xFF, 0xED, 0xBA, 0x87, 0x65,
- 0x44, 0x55, 0x78, 0x9B, 0xCE, 0xFF, 0xFF, 0xDC, 0xA9, 0x86, 0x65, 0x55,
- 0x67, 0x8A, 0xBC, 0xEF, 0xFF, 0xFE, 0xDB, 0xA8, 0x87, 0x66, 0x77, 0x89,
- 0xAC, 0xDF, 0xFF, 0xFF, 0xED, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCD,
- 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0xA9, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xFF,
- 0xFF, 0xFF, 0xED, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFE, 0xDD, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xCC, 0xCC, 0xCC, 0xBC, 0xDC, 0xDD, 0xEE, 0xFF, 0xBD, 0xFD,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xFF, 0xED, 0xDC, 0xBB, 0xAA, 0x99,
- 0x99, 0x99, 0xAB, 0xBC, 0xDD, 0xEE, 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xDF, 0xEC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0x9B, 0xCD, 0xFD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCB, 0x98, 0x77, 0x66, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xDD,
- 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xCC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xDD, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBB, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xEC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xCC, 0xEE,
- 0xEE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEE, 0xFE,
- 0xDC, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0xFE, 0xDD,
- 0xCC, 0xBC, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xEF, 0xFF, 0xFE, 0xED, 0xDD,
- 0xCD, 0xCC, 0xCE, 0xDE, 0xFE, 0xFE, 0xAF, 0xFE, 0xEE, 0xDD, 0xDD, 0xCD,
- 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xCE, 0xFE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xEE, 0xDC, 0xCB,
- 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFD, 0xDC, 0xBB, 0xA9, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xDE, 0xCC, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCD, 0xDC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD,
- 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x79, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x77, 0x8A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x89, 0xAB, 0xDD, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x89, 0xAB, 0xCD, 0xEE,
- 0xEE, 0xDC, 0xBA, 0xA9, 0x98, 0x89, 0x99, 0xAA, 0xBC, 0xDE, 0xEE, 0xFE,
- 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFE, 0xDD,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xED, 0xDC,
- 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xBF, 0xFE,
- 0xED, 0xCC, 0xCC, 0xBB, 0xCC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFE, 0xED, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xEF, 0xFF, 0xFD, 0xED, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xBD, 0xDF, 0xFD, 0xDB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0x9B, 0xCD, 0xFF, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xEC, 0xBB, 0x98, 0x77, 0x65, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xDE,
- 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA,
- 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x55, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x99, 0xBC, 0xDD, 0xDD, 0xCA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xEE, 0xEC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x89, 0xAB, 0xCD, 0xDD,
- 0xFF, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF,
- 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFF, 0xFE, 0xED,
- 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD,
- 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDD,
- 0xDD, 0xDE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xEE, 0xEE, 0xDD, 0xDE, 0xDE, 0xEE, 0xEE, 0xFE, 0xEF, 0xAF, 0xFF,
- 0xFE, 0xED, 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFE, 0xDC,
- 0xCC, 0xCB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFE, 0xFE, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAB, 0xCC, 0xDE, 0xFF, 0xFF, 0xEE, 0xDC, 0xBA, 0xA9, 0x99, 0x99,
- 0x9A, 0xBC, 0xDE, 0xFF, 0xFE, 0xEC, 0xBA, 0x99, 0x87, 0x77, 0x88, 0x9A,
- 0xBC, 0xDF, 0xFF, 0xED, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBD,
- 0xEF, 0xFD, 0xDC, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xFF,
- 0xDD, 0xBA, 0x98, 0x66, 0x54, 0x45, 0x56, 0x89, 0xAC, 0xDE, 0xED, 0xDB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBD, 0xEE, 0xED, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xFE, 0xDC, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xEE, 0xED, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAC, 0xDE, 0xEE, 0xED, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78,
- 0x9B, 0xCD, 0xFE, 0xFF, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDF, 0xFF, 0xFE, 0xDC, 0xBA, 0x99, 0x98, 0x99, 0x9A, 0xBC, 0xDF, 0xFF,
- 0xFF, 0xFE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xEE, 0xDD, 0xDC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE,
- 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE,
- 0xEE, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCC, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xBC, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xFE, 0xCC, 0xCB, 0xBA,
- 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDE, 0xEB, 0xCB, 0xAA, 0x99, 0x98,
- 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xDD, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x9A, 0xAB, 0xCD, 0xDB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBC, 0xCA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, 0x89, 0xAB, 0xCC,
- 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x65, 0x44, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x98, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAB, 0xBB, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x77,
- 0x89, 0xAA, 0xBB, 0xBB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xCC, 0xCB, 0xAA, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xBB, 0xCC,
- 0xCD, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCD, 0xDD,
- 0xCB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDD, 0xDE, 0xDC, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDE, 0xFE, 0xED, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xED, 0xAE, 0xDD, 0xDC, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xCC, 0xCD, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xAB, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xBB, 0xBA, 0xA9,
- 0x99, 0x98, 0x89, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x65, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBB,
- 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB,
- 0xAA, 0xA9, 0x99, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xCD, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xAC, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xAB, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBB, 0xBA, 0xA9,
- 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0x99, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x88, 0x87, 0x77, 0x77,
- 0x78, 0x89, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xA9, 0x99, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98,
- 0x87, 0x76, 0x66, 0x65, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x88, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89,
- 0xAB, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA,
- 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xBB, 0xCB,
- 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xCC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCC, 0xDC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xAB, 0xCC,
- 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x56, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB,
- 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xCB,
- 0xAA, 0xA9, 0x99, 0x88, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCC, 0xBA,
- 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xCC, 0xDC, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xAD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDD, 0xAC, 0xDC,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xCC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDE, 0xEB, 0xCB, 0xAA, 0x99, 0x98,
- 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xDD, 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x78,
- 0x88, 0x99, 0xAB, 0xCD, 0xCB, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCC, 0xAB, 0xA9, 0x87, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBC, 0xCA, 0xA9, 0x98, 0x77, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9,
- 0x87, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x77,
- 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xBB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBC, 0xBC, 0xCB, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x89, 0x9A, 0xAB, 0xCC,
- 0xCC, 0xCB, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xCD, 0xDC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xDE, 0xEE, 0xDD, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0xBE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB,
- 0xBB, 0xBC, 0xCC, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF,
- 0xFF, 0xFE, 0xED, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED,
- 0xCC, 0xCC, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xBA,
- 0xAA, 0xBB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xDD, 0xBB, 0xA9, 0x99, 0x99,
- 0xAA, 0xBD, 0xEF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x77, 0x88, 0x9A,
- 0xCD, 0xFF, 0xFF, 0xFE, 0xDB, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xCD,
- 0xFF, 0xFF, 0xDC, 0xB9, 0x87, 0x65, 0x55, 0x56, 0x78, 0xAB, 0xDF, 0xFF,
- 0xFD, 0xCA, 0x98, 0x65, 0x54, 0x45, 0x56, 0x89, 0xBC, 0xEF, 0xFE, 0xDC,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFF, 0xFE, 0xCA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xDF, 0xFF, 0xEC, 0xB9, 0x87, 0x55,
- 0x44, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xFF, 0xDB, 0xA8, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAC, 0xDF, 0xFF, 0xFD, 0xCB, 0x98, 0x76, 0x66, 0x67, 0x89,
- 0xAB, 0xCF, 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xCD,
- 0xFF, 0xFF, 0xFF, 0xEC, 0xBB, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF,
- 0xFF, 0xFF, 0xDD, 0xCB, 0xBA, 0xAA, 0xAB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFE, 0xDC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xDE, 0xAF, 0xFE,
- 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xEF, 0xDD, 0xCB,
- 0xBB, 0xAA, 0xAB, 0xBB, 0xCD, 0xEE, 0xFF, 0xEE, 0xED, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xCD, 0xEE, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xEF, 0xED, 0xDC, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCE, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xDE, 0xEC, 0xCB, 0x98, 0x76, 0x65, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCB, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9B, 0xCD, 0xDD, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xDE, 0xED, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE,
- 0xDE, 0xEC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xEF, 0xEE, 0xFE,
- 0xED, 0xCB, 0xBB, 0xAA, 0xAB, 0xBB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xED,
- 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEE, 0xED,
- 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xAF, 0xEE, 0xEE, 0xED, 0xDD, 0xDD,
- 0xDD, 0xED, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xCC, 0xCC, 0xCC, 0xBC, 0xCC, 0xDD, 0xDD, 0xEE, 0xBE, 0xFE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFF, 0xFE, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xED, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xFE, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAB, 0xCC, 0xDE, 0xDC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDC, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x77, 0x8A, 0xBC, 0xDD,
- 0xBC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xDD, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD,
- 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xED, 0xEE,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFE, 0xEF, 0xFE, 0xDD,
- 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xEE, 0xFF, 0xEE, 0xED, 0xDC,
- 0xCC, 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xBE, 0xEE, 0xED, 0xDD, 0xDD, 0xCD,
- 0xCD, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDD, 0xCC, 0xCC, 0xDC, 0xDD, 0xDE, 0xEF, 0xEF, 0xAE, 0xFE,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDB,
- 0xBB, 0xBA, 0xAB, 0xBC, 0xCD, 0xEE, 0xFF, 0xED, 0xED, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xBB, 0xCD, 0xEF, 0xFE, 0xDD, 0xCB, 0xAA, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xEF, 0xED, 0xDB, 0xB9, 0x98, 0x77, 0x77, 0x78, 0x89,
- 0xAB, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAC,
- 0xDE, 0xDC, 0xCB, 0x98, 0x76, 0x65, 0x55, 0x56, 0x77, 0x9A, 0xBC, 0xED,
- 0xCC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDD, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xCD, 0xDD, 0xDC, 0xB9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xDE, 0xDB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xDD, 0xEE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE,
- 0xFF, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDE, 0xEE, 0xFF,
- 0xDD, 0xCC, 0xBB, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xEE, 0xFF, 0xFE, 0xED,
- 0xDC, 0xCB, 0xCC, 0xCC, 0xCD, 0xEE, 0xFF, 0xEE, 0xFF, 0xFF, 0xFE, 0xED,
- 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFF, 0xAE, 0xEE, 0xEE, 0xED, 0xED, 0xDD,
- 0xDD, 0xDE, 0xEE, 0xFE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF,
- 0xFF, 0xFF, 0xED, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD,
- 0xCC, 0xCC, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCB, 0xBA,
- 0xAA, 0xBB, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xA9, 0x99, 0x99,
- 0xAB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFD, 0xCA, 0xA9, 0x87, 0x77, 0x88, 0x9A,
- 0xBD, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xCD,
- 0xFF, 0xFF, 0xFC, 0xB9, 0x87, 0x65, 0x55, 0x56, 0x78, 0xAB, 0xDF, 0xFF,
- 0xFD, 0xCA, 0x97, 0x65, 0x54, 0x45, 0x56, 0x89, 0xAC, 0xFF, 0xFF, 0xDC,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCF, 0xFF, 0xFD, 0xCA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xDF, 0xFF, 0xFC, 0xB9, 0x86, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xFF, 0xDB, 0xA8, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAC, 0xEF, 0xFF, 0xFF, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x89,
- 0xAB, 0xCF, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x87, 0x77, 0x89, 0x9B, 0xCD,
- 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0xA9, 0x99, 0x99, 0xAB, 0xBC, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xED, 0xCB, 0xBA, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xDC, 0xCC, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xCC, 0xCC, 0xBC, 0xBC, 0xCC, 0xDD, 0xDE, 0xEE, 0xAE, 0xEE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFF, 0xFE, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xEF, 0xED, 0xDC, 0xBB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xFE, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xDF, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89,
- 0xAB, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x65,
- 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9A, 0xBC, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xAC, 0xDD, 0xDD, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xED,
- 0xEE, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xEE, 0xFE,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xEE, 0xEF, 0xFE, 0xDD,
- 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xDD, 0xEF, 0xEE, 0xFF, 0xFE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFE, 0x9E, 0xED, 0xDD, 0xDD, 0xDC, 0xCC,
- 0xDD, 0xDD, 0xDE, 0xEF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0x9C, 0xDC,
- 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xED, 0xBC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xDB, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xDC, 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x78,
- 0x88, 0x99, 0xAB, 0xBC, 0xCA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCC, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x9A,
- 0xAC, 0xCA, 0xA9, 0x98, 0x76, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xBB,
- 0xAA, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xBB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBC, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xCC, 0xCC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBD, 0xDC, 0xCD, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xCC, 0xEE, 0xDC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xED, 0x9D, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBC, 0xCC, 0xDD, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0x9B, 0xCB,
- 0xBA, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xBB, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAA, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x67, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBA,
- 0xAB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBC, 0xDC, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0x9C, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0x9B, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCD, 0xCA, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x99, 0xAA, 0xCC, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x99, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x9A,
- 0xAC, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBB,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xB9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x87, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xBA, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBA, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xCD, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCC, 0xDC, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xAB, 0xBB, 0xCC, 0xCD, 0xDC, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xEF, 0x9E, 0xFE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAB, 0xBB, 0xCD, 0xEE, 0xFF, 0xFD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xEF, 0xEC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89,
- 0xAB, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB,
- 0xDE, 0xEC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0x98, 0x76, 0x65,
- 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9B, 0xBD, 0xDD, 0xDB, 0xB9, 0x88, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xCD, 0xDD, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED,
- 0xEE, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEE, 0xFE,
- 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xEF, 0xFE, 0xDD,
- 0xDC, 0xCB, 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xFE, 0xFF, 0xFF, 0xEE, 0xDD,
- 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xAE, 0xFE, 0xEE, 0xED, 0xDD, 0xDD,
- 0xDD, 0xDE, 0xEE, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xED, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC,
- 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0xAB,
- 0xBC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0x99, 0x89, 0x9A, 0xBB,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xBC, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x65, 0x55, 0x67, 0x8A, 0xBC, 0xFF, 0xFF,
- 0xFF, 0xDC, 0xA9, 0x75, 0x44, 0x44, 0x67, 0x9B, 0xCF, 0xFF, 0xFF, 0xFE,
- 0xCA, 0x87, 0x54, 0x33, 0x45, 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xDC, 0xA9,
- 0x75, 0x43, 0x34, 0x57, 0x8A, 0xCE, 0xFF, 0xFF, 0xFF, 0xCB, 0x97, 0x64,
- 0x44, 0x45, 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xFD, 0xBA, 0x87, 0x65, 0x55,
- 0x68, 0x9B, 0xCD, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x87, 0x77, 0x78, 0x9A,
- 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x89, 0x9A, 0xBC, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, 0xBB, 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xCD, 0x9E, 0xFE,
- 0xDD, 0xDD, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFE, 0xFD, 0xDE, 0xED, 0xDC,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xEC, 0xDD, 0xCC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCD, 0xED, 0xED, 0xCD, 0xCC, 0xBA, 0xA9, 0x99, 0x99,
- 0x9A, 0xBB, 0xCD, 0xDF, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x9A,
- 0xBC, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9B, 0xBD, 0xED,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x66, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xED, 0xCD, 0xCA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9B, 0xCC, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xDC, 0xCC, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xED,
- 0xDE, 0xDD, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEE, 0xDC, 0xFE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xDF, 0xEE, 0xDD,
- 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xED, 0xFF, 0xEE, 0xED, 0xDD,
- 0xDD, 0xDE, 0xEF, 0xEF, 0xFF, 0xEE, 0x9D, 0xDD, 0xCD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDE, 0xEE, 0xFE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDD, 0xDE, 0xAE, 0xEE,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDD, 0xEF, 0xFE, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xEF, 0xED, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xEE, 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x99, 0xAA, 0xBC, 0xDE, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89,
- 0xAB, 0xCC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x56, 0x77, 0x9A, 0xBC, 0xDD,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x88, 0x76, 0x55, 0x55,
- 0x67, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD,
- 0xDD, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xED,
- 0xDC, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xDF, 0xEE, 0xDC,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFE, 0xFE, 0xFE, 0xDD, 0xDD,
- 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFE, 0xAE, 0xED, 0xDD, 0xDD, 0xCC, 0xCC,
- 0xCD, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDE, 0x9F, 0xFF,
- 0xED, 0xDD, 0xDD, 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0xEF, 0xED, 0xDC,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xCE, 0xEE, 0xFF, 0xED, 0xED, 0xDC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xFD, 0xDE, 0xDC, 0xBA, 0x99, 0x98, 0x89,
- 0x9A, 0xAB, 0xCD, 0xEF, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x9A,
- 0xBB, 0xCD, 0xED, 0xCD, 0xCB, 0xA8, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xED,
- 0xCD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x66, 0x79, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x76, 0x65,
- 0x45, 0x56, 0x67, 0x9A, 0xBC, 0xDD, 0xDD, 0xCA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x88,
- 0x9A, 0xBD, 0xDD, 0xDD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xCE, 0xDE, 0xED, 0xCB, 0xAA, 0x99, 0x88, 0x89, 0x9A, 0xBC, 0xCD, 0xED,
- 0xEF, 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEE, 0xDE, 0xFE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFE, 0xDF, 0xFE, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xCC, 0xDE, 0xEE, 0xEF, 0xEE, 0xFF, 0xEF, 0xEE, 0xDE,
- 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xAE, 0xDD, 0xDD, 0xED, 0xDD, 0xDD,
- 0xDD, 0xDE, 0xEE, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC,
- 0xCC, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCB, 0xAA, 0xAB,
- 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x99, 0x89, 0x9A, 0xBC,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xBC, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x66, 0x55, 0x67, 0x8A, 0xBD, 0xFF, 0xFF,
- 0xFF, 0xFC, 0xA9, 0x76, 0x44, 0x45, 0x67, 0x9B, 0xCD, 0xFF, 0xFF, 0xFF,
- 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAC, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9,
- 0x75, 0x43, 0x24, 0x57, 0x8A, 0xCE, 0xFF, 0xFF, 0xFF, 0xCB, 0x97, 0x65,
- 0x44, 0x46, 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xFD, 0xBA, 0x87, 0x65, 0x56,
- 0x68, 0x9B, 0xCD, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x87, 0x77, 0x78, 0x9A,
- 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x99, 0x89, 0x9A, 0xBC, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0x9E, 0xFE,
- 0xDD, 0xDC, 0xCC, 0xBC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFE, 0xDE, 0xDD, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xED, 0xED, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xEE, 0xDD, 0xCC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x88, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x99, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x34, 0x55, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x34, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x56, 0x68, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x77, 0x88,
- 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC,
- 0xDE, 0xDD, 0xEC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBB, 0xCD, 0xED,
- 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xED, 0xEE,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xEE, 0xEF, 0xFE, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xED, 0xFF, 0xEE, 0xED, 0xDD,
- 0xCD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0x8E, 0xDD, 0xDD, 0xCC, 0xCC, 0xCD,
- 0xDD, 0xDD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x9B, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xEC, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCD, 0xBB, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xAB, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBB,
- 0x9A, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xA9, 0xA9,
- 0x87, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x89, 0xAA, 0xBA, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xBB, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCC, 0xBC, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xCC, 0xDD, 0xDC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xEC, 0x8C, 0xBB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCB,
- 0xBA, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xAB, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x67, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x67, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBA,
- 0xAB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB,
- 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBB, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0x8B, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xDC, 0xBC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCB, 0xBA, 0x99, 0x98,
- 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x88,
- 0x88, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xBA,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xBC, 0xBB, 0xCB, 0xAA, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xCC, 0xCC, 0xBD, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xCD, 0xCC, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xDC, 0x8C, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xCD, 0xDD, 0x8E, 0xFE,
- 0xED, 0xDD, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFD, 0xDE, 0xED, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEE, 0xEF, 0xED, 0xDD, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xFD, 0xDD, 0xDC, 0xBA, 0xA9, 0x99, 0x99,
- 0x9A, 0xBB, 0xCD, 0xEE, 0xEC, 0xDC, 0xBA, 0xA9, 0x88, 0x77, 0x88, 0x9A,
- 0xBC, 0xCE, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xED,
- 0xCC, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x34, 0x45, 0x68, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98,
- 0x65, 0x44, 0x34, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x65,
- 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDD, 0xDD, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCE, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x77, 0x89,
- 0xAB, 0xCC, 0xDD, 0xDD, 0xDB, 0xAA, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC,
- 0xDE, 0xDD, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xED,
- 0xDE, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xED, 0xFF,
- 0xED, 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEE, 0xFE, 0xDF, 0xFE, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFD, 0xFF, 0xFE, 0xEE, 0xED,
- 0xDD, 0xDD, 0xEE, 0xEE, 0xFF, 0xFF, 0x9D, 0xDD, 0xDE, 0xDD, 0xDD, 0xCD,
- 0xDD, 0xEE, 0xDE, 0xEF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xFE, 0xEE, 0xDE, 0xDD, 0xDD, 0xDD, 0xED, 0xDD, 0xDD, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE,
- 0xDD, 0xDD, 0xCD, 0xDD, 0xDE, 0xEF, 0xFF, 0xEE, 0xFF, 0xED, 0xDC, 0xCB,
- 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xFE, 0xEF, 0xED, 0xCC, 0xBA, 0xAA, 0xAA,
- 0xBB, 0xCD, 0xEE, 0xFF, 0xFE, 0xEE, 0xDC, 0xBA, 0x98, 0x88, 0x99, 0xAB,
- 0xCD, 0xDE, 0xFE, 0xEF, 0xDC, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xFF, 0xEE, 0xED, 0xCA, 0x98, 0x76, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFF,
- 0xEE, 0xCB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBD, 0xDF, 0xEE, 0xED,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xDE, 0xCB, 0xA8,
- 0x75, 0x43, 0x24, 0x57, 0x8A, 0xBD, 0xEF, 0xED, 0xED, 0xBA, 0x97, 0x65,
- 0x44, 0x46, 0x78, 0xAB, 0xDD, 0xFE, 0xDF, 0xDC, 0xA9, 0x87, 0x65, 0x56,
- 0x78, 0x9A, 0xCD, 0xEF, 0xEE, 0xED, 0xDB, 0xA9, 0x87, 0x77, 0x78, 0x9A,
- 0xBC, 0xDF, 0xFE, 0xDF, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBB, 0xDD,
- 0xFF, 0xFD, 0xFE, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xFE, 0xFE,
- 0xDF, 0xEE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFD, 0xFE,
- 0xFE, 0xDD, 0xDC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xDF, 0xFE, 0xFF,
- 0xEE, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xED, 0xFE, 0xEF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0x9E, 0xFE,
- 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEE, 0xEE, 0xDE, 0xDD, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDD, 0xEF, 0xED, 0xDD, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xED, 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x89,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x78, 0x99, 0xAB,
- 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x97, 0x66, 0x54, 0x45, 0x66, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xDD, 0xCC, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x86, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xAA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9A, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x89, 0x9A, 0xBC, 0xCD, 0xEE,
- 0xDD, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xED, 0xEE,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xDE, 0xEE, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xED, 0xFF, 0xEE, 0xEE, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0x9D, 0xED, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDD, 0xAE, 0xEE,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xDE, 0xED, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xBC, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAA, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x56, 0x78, 0x89, 0xAB, 0xDC,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBC, 0xAA, 0x88, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9A, 0xBC, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xCD, 0xDC, 0xCC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xDD,
- 0xCD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xED,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xDE, 0xDD, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xED, 0xFE, 0xED, 0xDD, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFE, 0xAD, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC,
- 0xCD, 0xDD, 0xDE, 0xEE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0x9E, 0xFE,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xED, 0xDE, 0xED, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xDD, 0xED, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xED, 0xDD, 0xCC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xCD, 0xDE, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xCC, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9A, 0xBC, 0xDC, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBB, 0xCD, 0xED,
- 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xDD, 0xED,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xDF, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xDD, 0xEE, 0xEE, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFE, 0x9D, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCD, 0xDD, 0xDD, 0xDE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xFE, 0xFD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xEE, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xDD,
- 0xDD, 0xDD, 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFD, 0xCC, 0xBB, 0xBC,
- 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0xBA, 0xAA, 0xAB, 0xCD,
- 0xDE, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xCD, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xEC, 0xA9, 0x86, 0x66, 0x78, 0x9B, 0xCE, 0xFF, 0xFF,
- 0xFF, 0xED, 0xCA, 0x86, 0x54, 0x45, 0x78, 0xAC, 0xDE, 0xFF, 0xFF, 0xFF,
- 0xCB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xEF, 0xFE, 0xBA,
- 0x86, 0x42, 0x24, 0x68, 0xAC, 0xDE, 0xFF, 0xFF, 0xFE, 0xDC, 0xA8, 0x75,
- 0x44, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0x98, 0x76, 0x66,
- 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF, 0xED, 0xCA, 0x98, 0x88, 0x89, 0xAB,
- 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xBB, 0xAA, 0xAA, 0xAB, 0xCD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xED, 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xFE, 0xFF, 0xEF, 0xFF, 0xFE,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCD, 0xDD, 0x9D, 0xFE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xFE, 0xDE, 0xDD, 0xCC,
- 0xBB, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xEE, 0xED, 0xDD, 0xCB, 0xAA, 0xA9,
- 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xBC, 0xDE, 0xDC, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB,
- 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xBB, 0xA9, 0x87, 0x66, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xCB, 0xBA,
- 0x98, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xAB, 0xCC, 0xBC, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xCA, 0x98, 0x76, 0x65,
- 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xCA, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBB,
- 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xDD,
- 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDE, 0xDD, 0xED,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xFE, 0xDE, 0xED, 0xDC,
- 0xCC, 0xCB, 0xBB, 0xCC, 0xDD, 0xDE, 0xEF, 0xED, 0xEF, 0xEE, 0xDD, 0xDD,
- 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFE, 0x8D, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xCD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0x9C, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCB, 0xAA, 0x99, 0x98,
- 0x88, 0x99, 0x99, 0xAB, 0xBC, 0xDC, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xBB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCB, 0xDC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDE, 0xCC, 0xED, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xED, 0x8C, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDB, 0xBB, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78,
- 0x88, 0x89, 0xAA, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAA, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x67, 0x77,
- 0x89, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB,
- 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBA, 0xCB,
- 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xCC, 0xCB, 0xBB, 0xBA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0x9C, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x98,
- 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x78,
- 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9,
- 0x87, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x56,
- 0x67, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xBC, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDB, 0xBD, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCC, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDC, 0x8C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCD, 0x8D, 0xEE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xEE, 0xFD, 0xDD, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xEF, 0xDD, 0xDC, 0xCB, 0xAA, 0xA9,
- 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xED, 0xCC, 0xCB, 0xAA, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xBC, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAB, 0xCC, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xCB, 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xBB, 0xA9, 0x87, 0x66, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x54, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xBC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x88, 0x9B, 0xBD, 0xCC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCD, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xAB,
- 0xCD, 0xCC, 0xDC, 0xBB, 0xA9, 0x98, 0x88, 0x89, 0x99, 0xAB, 0xCD, 0xDD,
- 0xDD, 0xCC, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDE, 0xDD, 0xED,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xEE, 0xDE, 0xDD, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xFF, 0xDE, 0xDD, 0xDC,
- 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0x9D, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCD, 0xDD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xFF, 0xFE, 0xEF, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xEE, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD,
- 0xDD, 0xDD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFD, 0xDC, 0xCC,
- 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFE, 0xFF, 0xFE, 0xDC, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xCD, 0xEF, 0xFF, 0xEF, 0xDC, 0xBA, 0x98, 0x76, 0x77, 0x89, 0xAB, 0xCD,
- 0xFF, 0xEE, 0xED, 0xCA, 0x98, 0x66, 0x55, 0x66, 0x89, 0xAB, 0xDE, 0xFF,
- 0xEE, 0xDB, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xCD, 0xFF, 0xFE, 0xFD,
- 0xBA, 0x86, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xDE, 0xDB, 0xA8,
- 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xEF, 0xFE, 0xFD, 0xBA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xEE, 0xDC, 0xA9, 0x87, 0x65, 0x55,
- 0x68, 0x9A, 0xCD, 0xFF, 0xFE, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x9A,
- 0xBC, 0xEF, 0xFF, 0xEF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDF,
- 0xFF, 0xFD, 0xFE, 0xDC, 0xCB, 0xAA, 0x9A, 0xAA, 0xBC, 0xDF, 0xFF, 0xFF,
- 0xDF, 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xCD, 0xDD, 0xFF, 0xFF, 0xFD, 0xFF,
- 0xFE, 0xED, 0xDC, 0xDC, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xEE,
- 0xEF, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xCD, 0xDE, 0xDD, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xDD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0x9E, 0xFE,
- 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFD, 0xEE, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xED, 0xCC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFD, 0xDE, 0xCC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xCD, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0xA8, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCD, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAC, 0xCE, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x89,
- 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xEC, 0xDD, 0xCB, 0xAA, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xDE, 0xEE,
- 0xDD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEF, 0xEC, 0xED,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFE, 0xDF, 0xEE, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCD, 0xED, 0xFE, 0xFF, 0xFC, 0xFF, 0xFE, 0xED, 0xDD,
- 0xDD, 0xDD, 0xEE, 0xFE, 0xFF, 0xFF, 0x9D, 0xED, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xED, 0xDE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDD, 0xAE, 0xEE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xEE, 0xDE, 0xDD, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xED, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xBC, 0xCD, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89,
- 0xAA, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xDC,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBC, 0xAA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9A, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED,
- 0xCD, 0xCC, 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xED, 0xED,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFE, 0xDE, 0xDD, 0xCC,
- 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFF, 0xED, 0xFE, 0xED, 0xDD, 0xCC,
- 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFF, 0xAD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC,
- 0xCD, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0x9E, 0xFF,
- 0xEE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFD, 0xEF, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xDD, 0xED, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xCC, 0xDD, 0xED, 0xDE, 0xDC, 0xBA, 0xA9, 0x98, 0x89,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0xA8, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBB,
- 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC,
- 0xCD, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBB, 0xCD, 0xDD,
- 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xDD, 0xED,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0xDE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xDD, 0xFE, 0xEE, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFE, 0x9D, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC,
- 0xDD, 0xDD, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDD, 0xDC, 0xCC, 0xDD, 0xCD, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xDE, 0xEE, 0xDF, 0xEF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFF,
- 0xDD, 0xDC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFF, 0xDF, 0xFF, 0xEE, 0xDC, 0xCB,
- 0xBB, 0xBC, 0xCD, 0xDD, 0xFF, 0xFE, 0xFF, 0xFD, 0xDC, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xCD, 0xEE, 0xFF, 0xEE, 0xEE, 0xCC, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xCC, 0xEF, 0xFF, 0xFF, 0xDC, 0xBA, 0x88, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xEF, 0xFE, 0xED, 0xCA, 0x97, 0x65, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFE,
- 0xEE, 0xDB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xEE, 0xED, 0xFC,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9B, 0xDE, 0xFF, 0xDD, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBC, 0xEF, 0xFD, 0xDC, 0xBA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xDE, 0xDC, 0xA9, 0x87, 0x65, 0x55,
- 0x68, 0x9A, 0xCD, 0xEF, 0xFD, 0xED, 0xCB, 0xA9, 0x87, 0x77, 0x78, 0x9A,
- 0xBC, 0xEF, 0xFF, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDD,
- 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xEF, 0xFF,
- 0xEF, 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFE, 0xFE,
- 0xEE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDF, 0xEF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF,
- 0xEE, 0xED, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDE, 0xED, 0xDE, 0xFF,
- 0xEF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xDD, 0xDC, 0xCC, 0xCC, 0xCB, 0xCC, 0xCC, 0xCC, 0xCD, 0x8E, 0xFE,
- 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xEE, 0xEF, 0xFD, 0xDE, 0xED, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xED, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFD, 0xDD, 0xCC, 0xBA, 0x99, 0x99, 0x99,
- 0x9A, 0xAB, 0xCD, 0xEE, 0xDC, 0xDC, 0xBA, 0x98, 0x88, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xCC, 0xCA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBB,
- 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x98, 0x66, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x34, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x56, 0x68, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9A, 0xBC, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBC, 0xCD, 0xEE,
- 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xDF, 0xED, 0xED,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xDE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xED, 0xFE, 0xEE, 0xED, 0xDD,
- 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xCC, 0xCC, 0xDC, 0xCD,
- 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0x8C, 0xDD,
- 0xCB, 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDC, 0xCC, 0xCB, 0xBA,
- 0xAA, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xDD, 0xCB, 0xCB, 0xBA, 0xA9, 0x99,
- 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xCC, 0xBB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBC, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCB,
- 0xAA, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAB, 0xBA, 0xA9,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0x9A, 0xBB, 0xAA, 0x99, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x78, 0x99, 0xAB, 0xBA, 0xAA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x89, 0xAA, 0xBB, 0xAA, 0xA9, 0x88, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x89, 0xAB, 0xCB, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xBC, 0xBB, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC,
- 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x89, 0x99, 0xAA, 0xBB, 0xCD, 0xCB, 0xCC,
- 0xCB, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xBD, 0xDC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDE, 0xCC, 0xDD, 0xDC, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xCC, 0xCD, 0xDD, 0xED, 0x8C, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x9B, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBC, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBB, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78,
- 0x88, 0x99, 0xAA, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAA, 0xBA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB,
- 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xDC, 0xCB, 0xBB, 0xBA,
- 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBC, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0x8C, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0xBD, 0xCB, 0xBA,
- 0xAA, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCB, 0xCB, 0xBA, 0xA9, 0x99,
- 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDB, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x88,
- 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBB, 0xBA, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBB,
- 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xBB, 0xBA, 0xA9,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAA, 0xBB, 0xAA, 0x99, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x99, 0xAB, 0xBA, 0xAA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x89, 0x9A, 0xBB, 0xAB, 0xA9, 0x88, 0x76, 0x65, 0x56,
- 0x67, 0x78, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x89, 0xAB, 0xBB, 0xBB, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xBC, 0xBB, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xCB, 0xDC,
- 0xBB, 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDC, 0xCD, 0xCC, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDD, 0xCC, 0xDD, 0xCC, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xCC, 0xCC, 0xDE, 0xED, 0x8C, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xEE, 0xED, 0xDC, 0xCC, 0xBC, 0xCC, 0xCC, 0xDC, 0xCD, 0x7E, 0xFF,
- 0xEE, 0xDD, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xEF, 0xFD, 0xEF, 0xED, 0xDC,
- 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xEE, 0xFF, 0xED, 0xEE, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFE, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99,
- 0x9A, 0xAB, 0xCD, 0xEF, 0xED, 0xEC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x9A,
- 0xBB, 0xDD, 0xED, 0xDD, 0xCB, 0x99, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xBC,
- 0xCE, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xED,
- 0xCC, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x34, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x34, 0x56, 0x79, 0xAB, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCE, 0xDD, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x77, 0x89,
- 0xAB, 0xCD, 0xED, 0xDD, 0xCB, 0xAA, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC,
- 0xDF, 0xED, 0xED, 0xCB, 0xAA, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xDE, 0xEF,
- 0xDE, 0xDD, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFE, 0xFD, 0xFE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xDF, 0xEF, 0xED,
- 0xDD, 0xCC, 0xCC, 0xCD, 0xEE, 0xFE, 0xFF, 0xFD, 0xEF, 0xEE, 0xFE, 0xDD,
- 0xDD, 0xED, 0xEE, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xED, 0xFE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, 0xDD, 0xDD, 0xDD, 0xCC, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xCD, 0xDC, 0xDD, 0xDD, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDC, 0xCC,
- 0xBC, 0xBC, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xBB, 0xAA, 0xAA,
- 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xCC, 0xDE, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAB, 0xDD,
- 0xFF, 0xFF, 0xFE, 0xCB, 0x98, 0x65, 0x55, 0x67, 0x89, 0xAC, 0xDF, 0xFF,
- 0xFF, 0xDB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xCD, 0xFF, 0xFF, 0xFD,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFF, 0xEF, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBD, 0xFF, 0xFE, 0xFD, 0xCA, 0x97, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDD, 0xFF, 0xEF, 0xDC, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x9A, 0xCE, 0xFF, 0xFE, 0xFF, 0xDB, 0xA9, 0x87, 0x76, 0x77, 0x9A,
- 0xBC, 0xFF, 0xFF, 0xEF, 0xFC, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDF,
- 0xFF, 0xFE, 0xFE, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDE, 0xFF, 0xFF,
- 0xDF, 0xFE, 0xDC, 0xDC, 0xBB, 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFD, 0xFF,
- 0xFE, 0xED, 0xDD, 0xDC, 0xDE, 0xFE, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF,
- 0xEF, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDC, 0xDC, 0xDE, 0xFE, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xEE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF,
- 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xFE, 0xED, 0xFF, 0xFE, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xDD, 0xEE, 0xDC, 0xCB, 0xBB,
- 0xAB, 0xBB, 0xBC, 0xCD, 0xDE, 0xED, 0xDE, 0xDD, 0xCB, 0xAA, 0x99, 0x99,
- 0xAA, 0xBC, 0xCD, 0xEE, 0xDD, 0xDD, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0x9A,
- 0xBC, 0xDD, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDD, 0xDC, 0xBA, 0x87, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDD,
- 0xCD, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xAC, 0xDE, 0xDC, 0xDB,
- 0xA9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xCD, 0xDD, 0xCD, 0xCA, 0x98,
- 0x75, 0x43, 0x34, 0x56, 0x89, 0xAC, 0xCE, 0xDC, 0xDC, 0xBA, 0x87, 0x65,
- 0x44, 0x55, 0x78, 0x9A, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x8A, 0xBC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x76, 0x77, 0x89,
- 0xAB, 0xCD, 0xEE, 0xCD, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xCD,
- 0xDF, 0xDC, 0xED, 0xCB, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xBC, 0xEF, 0xFE,
- 0xCE, 0xDD, 0xCC, 0xBB, 0xAA, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xED, 0xED,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xDE, 0xEE, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFD, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xED, 0xEE, 0xEF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xAE, 0xFE,
- 0xED, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xEE, 0xDD, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDC, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xDB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED,
- 0xCD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEC, 0xDD,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFE, 0xCE, 0xDD, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFC, 0xEE, 0xDD, 0xDC, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0x9D, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xDD, 0xDE, 0xEE, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF,
- 0xEE, 0xDD, 0xDC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEE, 0xED, 0xFF, 0xFD, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDF, 0xFE, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFD, 0xEF, 0xDC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDE, 0xEC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xAB, 0xCD, 0xED, 0xDD, 0xCB, 0xA8, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xDD, 0xDD, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDD,
- 0xDD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xED, 0xCD, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xDE, 0xEC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0xAB, 0xCD, 0xEE, 0xDD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xEF, 0xED, 0xDD, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBC, 0xDE, 0xFE,
- 0xDD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFD, 0xFE,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xDE, 0xDD, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFD, 0xFE, 0xED, 0xDD, 0xED,
- 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDC, 0xDD, 0xCD, 0xDD, 0xDE,
- 0xDE, 0xEF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, 0xDC, 0xDD, 0xCC, 0xCC, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xDD, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xDD, 0xCB,
- 0xBB, 0xBC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xBA, 0xAA, 0xAA,
- 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xCC, 0xDF, 0xFF, 0xFF, 0xDC, 0xBA, 0x97, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xFF, 0xFF, 0xFD, 0xCB, 0x98, 0x65, 0x55, 0x67, 0x89, 0xBC, 0xDF, 0xFF,
- 0xFF, 0xDC, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xFF, 0xFD,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xDC, 0x98,
- 0x75, 0x43, 0x34, 0x56, 0x8A, 0xCD, 0xFF, 0xFF, 0xFD, 0xCA, 0x97, 0x65,
- 0x44, 0x45, 0x78, 0xAC, 0xDF, 0xFF, 0xEF, 0xDC, 0xA9, 0x87, 0x65, 0x55,
- 0x68, 0x9A, 0xCE, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x87, 0x77, 0x78, 0x9A,
- 0xBC, 0xDF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDF,
- 0xFF, 0xFD, 0xFF, 0xDD, 0xBB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDE, 0xFF, 0xFF,
- 0xDF, 0xFD, 0xDD, 0xCB, 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFF, 0xFD, 0xFF,
- 0xDF, 0xDD, 0xDC, 0xDC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE,
- 0xEF, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xCD, 0xDD, 0xED, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xEF, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD, 0x7F, 0xFF,
- 0xFF, 0xFE, 0xED, 0xEE, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xDC, 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFF, 0xEF, 0xFF, 0xFD, 0xDC, 0xCB,
- 0xBB, 0xBC, 0xCD, 0xCF, 0xFF, 0xFE, 0xFF, 0xFD, 0xDB, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFD, 0xDC, 0xAA, 0x99, 0x89, 0x99, 0xAB,
- 0xBC, 0xDF, 0xFF, 0xFD, 0xDC, 0xBA, 0x98, 0x77, 0x78, 0x89, 0xAB, 0xCD,
- 0xFF, 0xEF, 0xED, 0xCA, 0x98, 0x76, 0x56, 0x67, 0x89, 0xBC, 0xDE, 0xFE,
- 0xDE, 0xCB, 0xA9, 0x76, 0x54, 0x45, 0x68, 0x9A, 0xBC, 0xEF, 0xEE, 0xED,
- 0xBA, 0x87, 0x64, 0x23, 0x46, 0x78, 0xAB, 0xDD, 0xFE, 0xFE, 0xDB, 0xA9,
- 0x76, 0x43, 0x24, 0x57, 0x8A, 0xBD, 0xDE, 0xED, 0xFD, 0xBA, 0x98, 0x65,
- 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xFF, 0xDD, 0xDC, 0xB9, 0x87, 0x66, 0x56,
- 0x78, 0x9A, 0xBD, 0xEF, 0xFD, 0xFD, 0xCB, 0xA9, 0x88, 0x77, 0x78, 0x9A,
- 0xBC, 0xDE, 0xFF, 0xDE, 0xDC, 0xBB, 0xA9, 0x98, 0x89, 0x9A, 0xAC, 0xDE,
- 0xFF, 0xFE, 0xFE, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xFF,
- 0xDF, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xDD, 0xFF, 0xFF, 0xFD, 0xFF,
- 0xEF, 0xDD, 0xDC, 0xCC, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xEE,
- 0xEE, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xED,
- 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xCC, 0xDD, 0xDC, 0xCE,
- 0xEF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBA, 0xBB, 0xBB, 0x8D, 0xED,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEC, 0xCD, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCC, 0xDC, 0xBA, 0xA9, 0x99,
- 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDC, 0xBC, 0xBA, 0xA9, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xCD, 0xBB, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89,
- 0x9A, 0xBC, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x66, 0x67, 0x78, 0x89, 0x9A,
- 0xBC, 0xBB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCB,
- 0xAB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xBA, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCB, 0xAB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xBA, 0xBA, 0x98, 0x77, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0xA9, 0x87, 0x77, 0x66, 0x66, 0x78,
- 0x89, 0xAB, 0xCC, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xBC, 0xCB, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x89, 0xAA, 0xBC, 0xDC,
- 0xBC, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xDD, 0xDB, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xED, 0xCD, 0xCC, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xEC, 0xDD, 0xDD, 0xCC, 0xCC,
- 0xCB, 0xCC, 0xCD, 0xDE, 0xEE, 0xFE, 0x8C, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB,
- 0xCC, 0xCC, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x9B, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBC, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xBC, 0xBB, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78,
- 0x88, 0x99, 0x9A, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAA, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xBA, 0xBA, 0x99, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB,
- 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBB,
- 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCC, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCC, 0xCB, 0xBB, 0xBA,
- 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBC, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAB, 0xAB, 0xBB, 0xBC, 0x8D, 0xED,
- 0xCC, 0xCB, 0xBA, 0xBA, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0xCD, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCC, 0xCB, 0xBA, 0xA9, 0x99,
- 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89,
- 0x9A, 0xAB, 0xCB, 0xBB, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBC, 0xBA, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCB,
- 0xAB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBA, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xBB, 0xAA, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xAB, 0xBA, 0xBA, 0x98, 0x77, 0x65,
- 0x55, 0x56, 0x67, 0x89, 0xAB, 0xBB, 0xAB, 0xA9, 0x88, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9A, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x78,
- 0x89, 0xAB, 0xCB, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAA,
- 0xBC, 0xCB, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xDC,
- 0xBC, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xCB, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xBD, 0xCC, 0xCC,
- 0xBB, 0xBA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDE, 0xDC, 0xED, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0x8C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xCC, 0xCD, 0xDD, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xEF, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xDD, 0xDC, 0xDE, 0xDE, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE,
- 0xDD, 0xCC, 0xBC, 0xCC, 0xDE, 0xEE, 0xFF, 0xEF, 0xFE, 0xED, 0xCB, 0xBB,
- 0xAB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFE, 0xEF, 0xED, 0xCB, 0xAA, 0x99, 0x9A,
- 0xAB, 0xBC, 0xDE, 0xEF, 0xED, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9A,
- 0xBC, 0xDE, 0xFD, 0xEE, 0xDB, 0xA9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xEF, 0xED, 0xEC, 0xBA, 0x87, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xEE,
- 0xDE, 0xCB, 0x98, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDF, 0xED, 0xDC,
- 0xB9, 0x86, 0x54, 0x33, 0x45, 0x78, 0x9B, 0xCD, 0xED, 0xDD, 0xCB, 0x98,
- 0x75, 0x43, 0x34, 0x57, 0x89, 0xBC, 0xDE, 0xFD, 0xDD, 0xBA, 0x87, 0x65,
- 0x44, 0x46, 0x78, 0x9B, 0xCD, 0xEF, 0xEE, 0xCB, 0xA9, 0x87, 0x65, 0x56,
- 0x67, 0x8A, 0xBC, 0xDF, 0xFE, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x89,
- 0xAC, 0xCE, 0xEF, 0xDE, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCD,
- 0xEF, 0xFD, 0xED, 0xDC, 0xBB, 0xA9, 0xA9, 0x9A, 0xBB, 0xCD, 0xEF, 0xFF,
- 0xEF, 0xED, 0xCC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xFF,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xDE, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0xEE,
- 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDE, 0xDC, 0xED, 0xDD, 0xDE,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xCC, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB,
- 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xAA, 0xAB, 0xBC,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x98, 0x89, 0xAB, 0xCD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x87, 0x66, 0x78, 0xAB, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDB, 0x97, 0x54, 0x45, 0x79, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFC, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA,
- 0x96, 0x42, 0x24, 0x68, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, 0x75,
- 0x43, 0x57, 0x9A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xA8, 0x76, 0x67,
- 0x89, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x9A, 0xBC,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0xAA, 0xAB, 0xBD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBB, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xDC, 0xDD, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xDF, 0xDD, 0xDD, 0xCC, 0xDB, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF,
- 0xFE, 0xFD, 0xDD, 0xCC, 0xCC, 0xDD, 0xDD, 0xDE, 0xFD, 0xFF, 0xFF, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xDD, 0xDD, 0xFF, 0xDF, 0xFD, 0xDD, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xAC, 0xCC, 0xFF, 0xFD, 0xFF, 0xDD, 0xCA, 0xA9, 0x99, 0x99,
- 0x9A, 0xAB, 0xCD, 0xEF, 0xDF, 0xDD, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x99,
- 0xAC, 0xCD, 0xFD, 0xDE, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x78, 0x9A, 0xBC,
- 0xDF, 0xED, 0xEC, 0xA9, 0x87, 0x66, 0x55, 0x67, 0x78, 0x9B, 0xBE, 0xFF,
- 0xDD, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAC, 0xDF, 0xFD, 0xCB,
- 0xA9, 0x86, 0x54, 0x34, 0x45, 0x78, 0x9A, 0xBD, 0xEF, 0xDC, 0xBA, 0x98,
- 0x65, 0x43, 0x34, 0x56, 0x89, 0xAC, 0xDE, 0xFC, 0xDB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x78, 0x9A, 0xBD, 0xDF, 0xDD, 0xBB, 0xA8, 0x77, 0x65, 0x55,
- 0x67, 0x8A, 0xAC, 0xDF, 0xFC, 0xDC, 0xBA, 0x98, 0x77, 0x76, 0x77, 0x89,
- 0xAB, 0xCE, 0xEF, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88, 0x89, 0xAB, 0xCD,
- 0xDF, 0xFD, 0xED, 0xCB, 0xBA, 0xA9, 0x99, 0x9A, 0xAA, 0xCD, 0xFF, 0xFF,
- 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFD, 0xFD,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xDD, 0xFE, 0xFF, 0xFF, 0xCE, 0xED, 0xED,
- 0xDC, 0xCC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xEF, 0xEF,
- 0xEF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDE, 0xEF, 0xDF, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xAF, 0xFF,
- 0xED, 0xDC, 0xCC, 0xBB, 0xBC, 0xCC, 0xCD, 0xDE, 0xED, 0xFF, 0xED, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xEF, 0xFD, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xDD, 0xEE, 0xDB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xCD, 0xDD, 0xDC, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCB, 0x98, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAC, 0xCD,
- 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9B, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xEE, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAC,
- 0xDE, 0xFC, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A, 0xAB, 0xCE, 0xFF,
- 0xDD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xFD, 0xED,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xEF, 0xFF, 0xDE, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFD, 0xFE, 0xED, 0xDD, 0xDC,
- 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xAD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xEE, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xDD, 0xDD, 0xDD, 0xDC, 0xCC, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xDD, 0xDE, 0xED, 0xDD, 0xDD, 0xFF, 0xFD, 0xFF, 0xFF, 0xFD,
- 0xCC, 0xCC, 0xCC, 0xCB, 0xCD, 0xDE, 0xEF, 0xDF, 0xFF, 0xEC, 0xDB, 0xBB,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xDF, 0xFD, 0xFF, 0xFD, 0xCB, 0xA9, 0x99, 0x99,
- 0xAA, 0xBC, 0xDD, 0xEF, 0xDF, 0xED, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x9A,
- 0xBC, 0xCC, 0xFD, 0xFE, 0xDB, 0xA9, 0x87, 0x76, 0x77, 0x78, 0x9A, 0xBC,
- 0xDE, 0xDF, 0xFC, 0xBA, 0x87, 0x66, 0x55, 0x67, 0x78, 0x9B, 0xBD, 0xFE,
- 0xEF, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCE, 0xED, 0xDC,
- 0xA9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9A, 0xBC, 0xED, 0xED, 0xBA, 0x98,
- 0x75, 0x43, 0x34, 0x57, 0x89, 0xAC, 0xDD, 0xED, 0xDC, 0xA9, 0x87, 0x65,
- 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xFF, 0xFF, 0xCB, 0xA9, 0x87, 0x65, 0x56,
- 0x67, 0x89, 0xBC, 0xDF, 0xED, 0xDC, 0xBA, 0x98, 0x87, 0x76, 0x77, 0x89,
- 0xAB, 0xCE, 0xFF, 0xCE, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xDD,
- 0xFF, 0xFF, 0xFD, 0xCB, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xCD, 0xDF, 0xFF,
- 0xDF, 0xEE, 0xCC, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDF, 0xFF, 0xFE, 0xFD,
- 0xDD, 0xCC, 0xBB, 0xCC, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xDD, 0xDE, 0xDD,
- 0xDC, 0xCD, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFC, 0xFF, 0xED, 0xDD, 0xDD,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xCD, 0xCD, 0xDD, 0xEE, 0xDE,
- 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xBC, 0xCD,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x99, 0x99, 0xAB, 0xCF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x97, 0x77, 0x89, 0xBC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDC, 0x97, 0x54, 0x46, 0x8A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xB9, 0x74, 0x12, 0x57, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB,
- 0x97, 0x42, 0x24, 0x79, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xB9, 0x86,
- 0x44, 0x57, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, 0x87, 0x77,
- 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xAA, 0x99, 0x9A, 0xCF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCC, 0xBB, 0xBB, 0xCF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFD, 0xDC, 0xDD, 0xCD, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
- 0xCC, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBB, 0xBC,
- 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xA9, 0xAA, 0xBC,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xA9, 0x88, 0x88, 0x9A, 0xBD, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFB, 0xB9, 0x87, 0x66, 0x78, 0x9A, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xCA, 0x87, 0x54, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xDB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA,
- 0x86, 0x42, 0x24, 0x68, 0xAB, 0xCD, 0xFF, 0xFF, 0xFF, 0xDB, 0xA8, 0x75,
- 0x44, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x98, 0x76, 0x66,
- 0x79, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xCF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xBA, 0xAA, 0x9A, 0xAC, 0xCC, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCB, 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDD, 0xDF, 0xDC, 0xCC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xDC, 0xDC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCB, 0xCC, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xA9, 0x9A, 0xBC, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x77, 0x89, 0xBF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFC, 0xA8, 0x54, 0x46, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xCA, 0x74, 0x12, 0x47, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
- 0xA7, 0x42, 0x24, 0x7A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x86,
- 0x44, 0x58, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0x87, 0x78,
- 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x99, 0xAB, 0xCF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCC, 0xCC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCC, 0xCB, 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0x9C, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDC, 0xCC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBB, 0xBB, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0xAA, 0xBB, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xCC,
- 0xBB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xCB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCC, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xDC, 0xCB, 0xBB, 0xBB,
- 0xBA, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xBB, 0xBB, 0xCC, 0xDD, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xED, 0xEE, 0xED, 0xDD, 0xDC, 0xCD, 0xDC, 0x7F, 0xFF,
- 0xFF, 0xFE, 0xED, 0xDD, 0xDD, 0xFD, 0xFF, 0xEE, 0xFD, 0xFF, 0xFF, 0xDE,
- 0xDD, 0xCC, 0xCC, 0xDD, 0xDD, 0xFF, 0xFF, 0xEF, 0xFF, 0xDD, 0xDC, 0xCC,
- 0xBB, 0xCC, 0xBD, 0xDD, 0xEF, 0xFE, 0xFF, 0xFD, 0xDC, 0xBB, 0xAA, 0xAA,
- 0xBB, 0xCD, 0xDE, 0xEF, 0xDF, 0xFE, 0xDC, 0xBA, 0x99, 0x99, 0x99, 0xAB,
- 0xCC, 0xDE, 0xFD, 0xFD, 0xEC, 0xCA, 0x98, 0x87, 0x78, 0x89, 0xAB, 0xCD,
- 0xFF, 0xDE, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x78, 0x9A, 0xBC, 0xDD, 0xFE,
- 0xDD, 0xCB, 0xA9, 0x86, 0x54, 0x45, 0x78, 0x9A, 0xCE, 0xDF, 0xEE, 0xDC,
- 0xBA, 0x97, 0x64, 0x23, 0x46, 0x79, 0xAB, 0xDD, 0xFD, 0xEE, 0xDB, 0xA9,
- 0x76, 0x42, 0x24, 0x67, 0x9A, 0xBC, 0xDE, 0xEF, 0xEE, 0xCA, 0x98, 0x75,
- 0x44, 0x56, 0x89, 0xAB, 0xDE, 0xFE, 0xEE, 0xDC, 0xBA, 0x88, 0x76, 0x66,
- 0x78, 0x9B, 0xCD, 0xEF, 0xDD, 0xFD, 0xCB, 0xA9, 0x98, 0x77, 0x88, 0x9A,
- 0xBC, 0xDF, 0xFF, 0xDF, 0xDD, 0xCB, 0xA9, 0x99, 0x99, 0x9A, 0xBC, 0xDE,
- 0xFF, 0xFD, 0xEE, 0xDD, 0xCB, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFF, 0xFF,
- 0xDF, 0xFD, 0xDC, 0xCC, 0xBC, 0xCB, 0xCC, 0xCE, 0xFF, 0xFF, 0xFD, 0xEF,
- 0xFE, 0xDD, 0xDC, 0xCD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xCF, 0xEE, 0xDD,
- 0xEE, 0xDE, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xDF, 0xFF,
- 0xFE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCD, 0xCC, 0xDD, 0xEE, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCF, 0xDF, 0xDC, 0xCB, 0xCD, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD,
- 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xBC,
- 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0xBB, 0xBC,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, 0x98, 0x89, 0xAB, 0xCD, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x87, 0x66, 0x78, 0xAB, 0xCF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xCB, 0x97, 0x54, 0x45, 0x79, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xFC, 0xB9, 0x64, 0x22, 0x46, 0x9A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA,
- 0x86, 0x42, 0x23, 0x68, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x75,
- 0x44, 0x57, 0x9B, 0xCF, 0xDF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA8, 0x76, 0x67,
- 0x8A, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xA9, 0x88, 0x9A, 0xBC,
- 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0xBB, 0xAB, 0xBC, 0xCF, 0xFF,
- 0xFF, 0xFD, 0xFF, 0xFD, 0xDF, 0xCC, 0xCC, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xDD, 0xDF, 0xFD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFD, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xDD,
- 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xBB, 0xBB, 0xCF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0xA9, 0xAA, 0xBC, 0xDD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x97, 0x77, 0x89, 0xAC, 0xDF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFC, 0xA8, 0x64, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xB9, 0x74, 0x12, 0x47, 0x9B, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB,
- 0x97, 0x42, 0x24, 0x79, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xBA, 0x86,
- 0x44, 0x58, 0x9C, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xA9, 0x87, 0x78,
- 0x9A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBA, 0x99, 0xAB, 0xBD,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xCC, 0xBB, 0xBC, 0xCE, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xDC, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xED, 0xCC, 0xED, 0xBB, 0xCB, 0xBB, 0xCC, 0xBC, 0xCC, 0x6D, 0xFF,
- 0xED, 0xDC, 0xCC, 0xBD, 0xCC, 0xDC, 0xEE, 0xFF, 0xFC, 0xED, 0xDF, 0xCD,
- 0xCC, 0xCB, 0xCC, 0xCD, 0xCD, 0xDE, 0xFF, 0xCF, 0xED, 0xEC, 0xCB, 0xBA,
- 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xFC, 0xDD, 0xDC, 0xBA, 0xBA, 0xA9, 0x9A,
- 0xAA, 0xBB, 0xCD, 0xEF, 0xDC, 0xDC, 0xCB, 0xA9, 0x98, 0x88, 0x99, 0x9B,
- 0xBC, 0xCD, 0xFD, 0xBC, 0xCB, 0xAA, 0x98, 0x77, 0x77, 0x89, 0xAA, 0xBD,
- 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xDC,
- 0xBC, 0xBB, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xCE, 0xDC, 0xDB,
- 0xB9, 0x87, 0x64, 0x23, 0x46, 0x78, 0xAB, 0xBC, 0xEC, 0xCC, 0xBA, 0x98,
- 0x76, 0x43, 0x34, 0x57, 0x89, 0xBB, 0xCD, 0xDB, 0xCB, 0xBA, 0x97, 0x65,
- 0x44, 0x56, 0x78, 0x9B, 0xBD, 0xDD, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x56,
- 0x78, 0x9A, 0xBB, 0xDF, 0xEB, 0xDC, 0xBA, 0xA9, 0x87, 0x77, 0x78, 0x8A,
- 0xBB, 0xCD, 0xFD, 0xCC, 0xDB, 0xBB, 0x99, 0x98, 0x88, 0x9A, 0xAA, 0xBC,
- 0xDF, 0xDC, 0xDD, 0xBC, 0xBB, 0xAA, 0x99, 0xAA, 0xAB, 0xBC, 0xCE, 0xFE,
- 0xDF, 0xFD, 0xCC, 0xBB, 0xAA, 0xBB, 0xBB, 0xCC, 0xDC, 0xFF, 0xEC, 0xFF,
- 0xDC, 0xDC, 0xCC, 0xBB, 0xBC, 0xCD, 0xED, 0xED, 0xFE, 0xDE, 0xEE, 0xED,
- 0xCD, 0xCC, 0xCC, 0xDD, 0xDD, 0xEF, 0xEF, 0xEC, 0xEF, 0xFE, 0xED, 0xED,
- 0xDE, 0xED, 0xEE, 0xFE, 0xFF, 0xFF, 0x6C, 0xCC, 0xDD, 0xDD, 0xDD, 0xBC,
- 0xCC, 0xED, 0xDD, 0xEF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xCF, 0xFF,
- 0xFF, 0xDD, 0xDC, 0xCC, 0xCD, 0xDE, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC,
- 0xCB, 0xBA, 0xAA, 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0xA9,
- 0x99, 0x9A, 0xAA, 0xBC, 0xEF, 0xFF, 0xFD, 0xDC, 0xBA, 0x98, 0x88, 0x88,
- 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xDD, 0xBA, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xBC, 0xFF, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xED, 0xDB, 0xA8, 0x76, 0x65, 0x55, 0x56, 0x78, 0x89, 0xBC, 0xDF,
- 0xDC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xED, 0xCA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xEF, 0xDC, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xFD, 0xDA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDF, 0xDC, 0xB9, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0xAB, 0xDF, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBE, 0xEF, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xBC,
- 0xDF, 0xFE, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x9A, 0xBC, 0xFE, 0xFF,
- 0xFE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xFF, 0xFD,
- 0xDC, 0xBB, 0xBB, 0xAA, 0xBB, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE,
- 0xDC, 0xCC, 0xCD, 0xCE, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xDD,
- 0xED, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFE, 0xFF, 0xFD, 0xEC, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFD, 0xDD, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD,
- 0xED, 0xCC, 0xCD, 0xFF, 0xED, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFD, 0xCC, 0xCB, 0xBB,
- 0xBD, 0xFD, 0xEF, 0xFF, 0xDF, 0xEE, 0xFD, 0xCB, 0xBA, 0xA9, 0xAB, 0xBC,
- 0xDD, 0xDF, 0xFF, 0xFF, 0xDC, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDF,
- 0xFF, 0xFF, 0xFE, 0xDC, 0xA9, 0x87, 0x66, 0x78, 0x9B, 0xCC, 0xDD, 0xFE,
- 0xED, 0xDC, 0xBA, 0x97, 0x54, 0x45, 0x79, 0xAB, 0xDD, 0xFF, 0xFD, 0xDD,
- 0xCB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBC, 0xDF, 0xFE, 0xDD, 0xDC, 0xBA,
- 0x86, 0x42, 0x24, 0x68, 0xAB, 0xCD, 0xFF, 0xED, 0xDD, 0xCB, 0xA9, 0x75,
- 0x44, 0x57, 0x8A, 0xBD, 0xDF, 0xFF, 0xDF, 0xDD, 0xCB, 0x98, 0x76, 0x67,
- 0x89, 0xBC, 0xCD, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xCD, 0xDE, 0xFE, 0xDF, 0xFD, 0xED, 0xBB, 0xA9, 0xAA, 0xBC, 0xCD, 0xDF,
- 0xFF, 0xEF, 0xFF, 0xFF, 0xDC, 0xCA, 0xBB, 0xBC, 0xCD, 0xDF, 0xFF, 0xFF,
- 0xDF, 0xFF, 0xDC, 0xDD, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF,
- 0xFF, 0xEF, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF,
- 0xDF, 0xDD, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFD, 0xED, 0xFF, 0xFE, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6C, 0xDD, 0xDC, 0xCC, 0xFD, 0xFD,
- 0xDD, 0xDF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xDF, 0xFD, 0xCD, 0xDC, 0xFD, 0xDD, 0xDD, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xCD, 0xFF, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC,
- 0xCC, 0xCD, 0xDE, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0xBB, 0xCB,
- 0xCC, 0xCF, 0xFD, 0xFF, 0xFF, 0xFD, 0xFD, 0xCB, 0xAA, 0xA9, 0xAA, 0xBC,
- 0xCD, 0xFF, 0xFF, 0xFF, 0xDF, 0xBB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x78, 0x9A, 0xCC, 0xFF, 0xFD,
- 0xFF, 0xDC, 0xBA, 0x87, 0x54, 0x45, 0x79, 0xAB, 0xDC, 0xDF, 0xFF, 0xFD,
- 0xCA, 0x98, 0x64, 0x22, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xDF, 0xDC, 0xB9,
- 0x86, 0x42, 0x24, 0x68, 0x9C, 0xCF, 0xDF, 0xFF, 0xFF, 0xCB, 0xA9, 0x75,
- 0x44, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xDD, 0xBB, 0x98, 0x76, 0x66,
- 0x79, 0xAB, 0xDF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBA, 0x99, 0x88, 0x89, 0xAB,
- 0xDD, 0xFF, 0xFF, 0xEF, 0xFF, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xCD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xBB, 0xBC, 0xCD, 0xFF, 0xFF, 0xFF,
- 0xDF, 0xFF, 0xDD, 0xDC, 0xDD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xFF, 0xDD, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF,
- 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xDD, 0xDF, 0xFD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBC, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xA9, 0x9A, 0xBF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x98, 0x77, 0x89, 0xAF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFB, 0xA8, 0x64, 0x46, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xB9, 0x74, 0x12, 0x47, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB,
- 0x97, 0x42, 0x24, 0x79, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x86,
- 0x44, 0x57, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x87, 0x78,
- 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x99, 0xAA, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFB, 0xBB, 0xEF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xCC, 0xCF, 0xBB, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE,
- 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBC,
- 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x99, 0xAA, 0xBC,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x98, 0x88, 0xAA, 0xBF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xCD, 0xB9, 0x87, 0x66, 0x78, 0x9A, 0xCF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xCA, 0x87, 0x54, 0x45, 0x79, 0xAB, 0xDF, 0xFF, 0xFF, 0xFD,
- 0xFB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9,
- 0x86, 0x42, 0x24, 0x68, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA8, 0x75,
- 0x44, 0x56, 0x9B, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x98, 0x76, 0x66,
- 0x89, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x98, 0x88, 0x89, 0xBB,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFB, 0xCB, 0xAA, 0xAA, 0xBC, 0xDF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xAB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFC, 0xCD, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6C, 0xBC, 0xCF, 0xFF, 0xCD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDC, 0xDB, 0xBA, 0xAA, 0xA9, 0xAA, 0xA9, 0xAB, 0xBB, 0xCC, 0xAF, 0xFD,
- 0xBB, 0xBA, 0xA9, 0xAA, 0x9A, 0xAB, 0xBB, 0xCD, 0xDC, 0xCB, 0xBB, 0xAA,
- 0x99, 0x99, 0x89, 0x9A, 0xAA, 0xBB, 0xCC, 0xCC, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xAB, 0xCB, 0xBB, 0xB9, 0x88, 0x87, 0x77, 0x77,
- 0x88, 0x89, 0xAA, 0xBB, 0xCA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAB, 0xCA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A,
- 0xAB, 0xBB, 0xAA, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBB,
- 0xAA, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x77, 0x89, 0x9B, 0xAA, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9C, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0x9A, 0xBA, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x67, 0x77,
- 0x88, 0x9B, 0xBC, 0xAA, 0x99, 0x98, 0x77, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xCA, 0xAA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x89, 0x99, 0xAB, 0xDD,
- 0xCB, 0xCB, 0xA9, 0x89, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xDC,
- 0xBA, 0xA9, 0x99, 0x98, 0x99, 0x9A, 0xBA, 0xBC, 0xDC, 0xEC, 0xCC, 0xAB,
- 0xBA, 0x9A, 0x9A, 0xAA, 0xAB, 0xBC, 0xEF, 0xEC, 0xEC, 0xCB, 0xBB, 0xBB,
- 0xBA, 0xBB, 0xBB, 0xCC, 0xDC, 0xEE, 0xAC, 0xBC, 0xCB, 0xBA, 0xCA, 0xBA,
- 0xBC, 0xBB, 0xDD, 0xDD, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBF, 0xDF, 0xCC, 0xED, 0xBA, 0xBC, 0xCB, 0xBB, 0xBB, 0xCF, 0x6F, 0xFF,
- 0xDC, 0xFF, 0xEF, 0xED, 0xFD, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, 0xFF, 0xFD,
- 0xFF, 0xDC, 0xDF, 0xFD, 0xFD, 0xFD, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDC,
- 0xBB, 0xCB, 0xFC, 0xFF, 0xFF, 0xFC, 0xCF, 0xFC, 0xFF, 0xCB, 0xBB, 0xAB,
- 0xCC, 0xBF, 0xFD, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xA9, 0xA9, 0xAC, 0xBE,
- 0xEE, 0xFE, 0xED, 0xCF, 0xFF, 0xDA, 0xA9, 0x88, 0x88, 0xAA, 0xCD, 0xCD,
- 0xFF, 0xDC, 0xFF, 0xFB, 0xA9, 0x86, 0x66, 0x78, 0xAB, 0xCC, 0xFD, 0xFC,
- 0xCF, 0xDD, 0xDA, 0x86, 0x54, 0x46, 0x79, 0xAD, 0xCF, 0xFF, 0xCC, 0xFF,
- 0xCB, 0xA9, 0x64, 0x22, 0x47, 0x8A, 0xCB, 0xFF, 0xFF, 0xCF, 0xFD, 0xB9,
- 0x86, 0x42, 0x24, 0x68, 0x9B, 0xCE, 0xFD, 0xCC, 0xFD, 0xBB, 0xA9, 0x76,
- 0x44, 0x57, 0x8A, 0xBC, 0xEE, 0xDE, 0xED, 0xFF, 0xDB, 0xA8, 0x76, 0x66,
- 0x78, 0xAC, 0xCD, 0xDF, 0xFD, 0xFF, 0xFB, 0xCB, 0xA9, 0x88, 0x89, 0x9B,
- 0xCF, 0xCF, 0xFF, 0xDF, 0xFC, 0xDF, 0xCA, 0xA9, 0xAA, 0xAA, 0xCF, 0xDD,
- 0xFF, 0xFC, 0xFF, 0xFD, 0xCC, 0xCC, 0xBB, 0xAB, 0xCC, 0xCF, 0xFF, 0xFC,
- 0xCF, 0xDD, 0xFC, 0xFF, 0xCB, 0xCD, 0xFF, 0xDF, 0xFF, 0xFF, 0xFC, 0xFF,
- 0xDF, 0xDF, 0xCF, 0xFC, 0xCF, 0xFF, 0xFF, 0xDF, 0xFD, 0xCF, 0xFF, 0xCF,
- 0xFF, 0xFC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xFF, 0xFF, 0xFF, 0xCF,
- 0xFD, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x6D, 0xCC, 0xCD, 0xBD, 0xDC, 0xFD,
- 0xCD, 0xCF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
- 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xCB, 0xCC,
- 0xCC, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBA, 0xA9, 0xAA, 0xCF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xA9, 0x88, 0x88, 0x9A, 0xBF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFB, 0xB9, 0x86, 0x66, 0x78, 0x9A, 0xCF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xB9, 0x87, 0x54, 0x45, 0x78, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBC, 0xFF, 0xFF, 0xFF, 0xFC, 0xCA,
- 0x86, 0x42, 0x24, 0x68, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA8, 0x75,
- 0x44, 0x56, 0x8A, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x98, 0x76, 0x66,
- 0x89, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x98, 0x88, 0x89, 0xAC,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xCB, 0xAA, 0xA9, 0xBB, 0xCF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBB, 0xCF, 0xEF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0x9F, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0x9C, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0x94, 0x12, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF8, 0x52, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
- 0x54, 0x78, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x87,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xF9, 0x74, 0x57, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFA, 0x85, 0x12, 0x59, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF9, 0x52, 0x14, 0x89, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97,
- 0x54, 0x67, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x89,
- 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF,
- 0xFF, 0xFF, 0xF6, 0xF6, 0x6F, 0x68, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6,
- 0x66, 0xF6, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF6, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0xF6, 0x6F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0x6F, 0x66, 0x66, 0xFF, 0x6F, 0xF6,
- 0xFF, 0xFF, 0x6F, 0xCF, 0xFF, 0x6F, 0xFF, 0xF6, 0x6F, 0x6F, 0xFF, 0x6F,
- 0xFF, 0xF6, 0x56, 0xF6, 0xF6, 0x56, 0xFF, 0xFF, 0x66, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x65, 0x56, 0x6F, 0xFF, 0xF6, 0xFF, 0x6F, 0xFF, 0xFF,
- 0xF6, 0x66, 0xF6, 0xFF, 0x66, 0x6F, 0xFF, 0x6F, 0xFF, 0x6F, 0xF6, 0xFF,
- 0x66, 0x6F, 0x56, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x6F,
- 0x46, 0xF5, 0x6F, 0x6F, 0xFF, 0xF5, 0x6B, 0xAF, 0xFF, 0x5F, 0xFF, 0xFF,
- 0x6F, 0x6F, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xF6, 0x66, 0xF5, 0xFF,
- 0x5F, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xF5, 0x55, 0xF6, 0xF6, 0xFF,
- 0xFF, 0x6F, 0xFF, 0xFF, 0x6F, 0xF6, 0xFF, 0xF6, 0xF6, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xF6, 0x6F, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xF6, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0x6F,
- 0xF6, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0x6F, 0x6F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0x9F, 0x4F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF9,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x98, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF8, 0x67, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xF8, 0x97, 0x54, 0x47, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x8F, 0x74, 0x12, 0x57, 0x8F, 0xF9, 0xFF, 0xFF, 0x9F, 0xFF, 0x9F,
- 0x98, 0x52, 0x24, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7,
- 0x54, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF8,
- 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0x89, 0xFF,
- 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xF9, 0x99, 0xFF, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xBA, 0xFF, 0xFF, 0xBF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x77, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xF8, 0x54, 0x45, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFA, 0x84, 0x22, 0x47, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xA8, 0x42, 0x14, 0x7A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96,
- 0x44, 0x59, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x97, 0x78,
- 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFA, 0xBF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBF, 0xFB, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0x5F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x76, 0xF7, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x6F, 0x67, 0x6F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF7, 0x55, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xF7, 0x55, 0x44, 0x46, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF7, 0xF5, 0x54, 0x44, 0x57, 0x66, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6,
- 0x75, 0x44, 0x34, 0x46, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x55,
- 0x45, 0x45, 0x56, 0xFF, 0xFF, 0xFF, 0xFD, 0xCF, 0x6F, 0x7F, 0x75, 0x57,
- 0x56, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x66, 0x7F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x7F, 0xF7, 0x7F, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x5F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFC, 0x44, 0x45, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0x73, 0x22, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF7, 0x42, 0x24, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86,
- 0x43, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x77,
- 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF9, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xF7, 0x7F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x75, 0x67, 0x78, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xF9, 0x76, 0x43, 0x46, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF6, 0x63, 0x23, 0x58, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xAF, 0x43, 0x23, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0x85,
- 0x54, 0x45, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xF7, 0x55,
- 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xBF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xAF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x88, 0x9F, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x87, 0x66, 0x78, 0xAF, 0xBF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xBF, 0xA7, 0x54, 0x45, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF7, 0x64, 0x22, 0x46, 0x89, 0xDF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF,
- 0x76, 0x42, 0x24, 0x68, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x75,
- 0x44, 0x57, 0xA9, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0x97, 0x76, 0x67,
- 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBA, 0x98, 0x8A, 0xBB,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFA, 0xAF, 0xBF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x9F, 0xFF, 0xCF, 0x99, 0xFF, 0x3F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFA, 0x84, 0x22, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF7, 0x42, 0x14, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7,
- 0x44, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x88,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xEF, 0xFF, 0xFF, 0x3F, 0xFF,
- 0xFE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F,
- 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xF3, 0x12, 0x46, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0x52, 0x24, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0x44, 0x6E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0x83, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xF4, 0x12, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF7, 0x42, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7,
- 0x44, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x8F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- ],
- [
- [
- 0xBE, 0xDD, 0xEC, 0xDD, 0xDD, 0xDC, 0xDE, 0xEE, 0xFF, 0xFF, 0xCD, 0xFE,
- 0xFD, 0xDD, 0xDC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0xDE, 0xFD, 0xCC,
- 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xFF, 0xFF, 0xFD, 0xED, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCD, 0xFF, 0xFF, 0xDF, 0xEC, 0xBB, 0xA9, 0x99, 0x99,
- 0x99, 0xAB, 0xCD, 0xFF, 0xFD, 0xEC, 0xBB, 0xA9, 0x88, 0x77, 0x78, 0x89,
- 0xAB, 0xCD, 0xFE, 0xED, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xFC, 0xDC, 0xA9, 0x87, 0x76, 0x65, 0x66, 0x67, 0x89, 0xBC, 0xDF,
- 0xDC, 0xCA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDD, 0xDB,
- 0xA9, 0x87, 0x65, 0x54, 0x55, 0x56, 0x79, 0xAC, 0xDD, 0xDC, 0xBA, 0x97,
- 0x65, 0x54, 0x44, 0x55, 0x67, 0x8A, 0xBD, 0xDE, 0xCB, 0xA9, 0x76, 0x65,
- 0x54, 0x55, 0x66, 0x79, 0xAB, 0xCD, 0xED, 0xCA, 0x98, 0x76, 0x55, 0x55,
- 0x56, 0x78, 0x9A, 0xBD, 0xDE, 0xDC, 0xB9, 0x87, 0x66, 0x65, 0x66, 0x77,
- 0x89, 0xAC, 0xDC, 0xEF, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDF, 0xFE, 0xCB, 0xA9, 0x88, 0x77, 0x78, 0x89, 0xAB, 0xCC, 0xED,
- 0xFF, 0xED, 0xCB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDF, 0xDF, 0xFF,
- 0xED, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFD, 0xFF, 0xFF, 0xFE,
- 0xDC, 0xCB, 0xBB, 0xBC, 0xCC, 0xEE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFE, 0xEE,
- 0xCC, 0xDD, 0xDD, 0xDF, 0xEF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xDE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAD, 0xCB, 0xBB, 0xBC, 0xCB, 0xFC, 0xDB, 0xCD, 0xFF, 0xFF, 0xCF, 0xFF,
- 0xBD, 0xCC, 0xDC, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xCC, 0xDC,
- 0xBB, 0xAB, 0xBA, 0xBC, 0xCD, 0xDD, 0xDD, 0xFB, 0xDD, 0xFB, 0xAB, 0xAA,
- 0x9A, 0xAA, 0xAA, 0xBC, 0xFF, 0xFF, 0xCF, 0xFC, 0xCB, 0xBA, 0x99, 0x99,
- 0x99, 0xAB, 0xBC, 0xCF, 0xFB, 0xDB, 0xBA, 0xA9, 0x98, 0x87, 0x78, 0x88,
- 0xAA, 0xBC, 0xDF, 0xCF, 0xFB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, 0xAA,
- 0xBF, 0xCF, 0xCC, 0xA9, 0x98, 0x76, 0x65, 0x56, 0x67, 0x89, 0xAB, 0xFC,
- 0xCB, 0xDA, 0xA8, 0x76, 0x65, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xFB,
- 0xA9, 0x87, 0x65, 0x44, 0x45, 0x56, 0x79, 0x9B, 0xCC, 0xBF, 0xBA, 0x97,
- 0x75, 0x54, 0x44, 0x56, 0x68, 0x9A, 0xBE, 0xFB, 0xDB, 0xA9, 0x86, 0x65,
- 0x44, 0x45, 0x67, 0x89, 0xAA, 0xCC, 0xDF, 0xBB, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xAC, 0xDC, 0xFC, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x8A, 0xAB, 0xBB, 0xFC, 0xBC, 0xB9, 0x87, 0x76, 0x77, 0x77, 0x89, 0xAB,
- 0xDC, 0xBC, 0xFC, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xCB, 0xCB,
- 0xFF, 0xFC, 0xCA, 0xAA, 0x99, 0x99, 0xA9, 0x9B, 0xBC, 0xCD, 0xDF, 0xFF,
- 0xCF, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCF, 0xDD, 0xFF, 0xFF, 0xFD,
- 0xCC, 0xCB, 0xBB, 0xCC, 0xBB, 0xDB, 0xFF, 0xCF, 0xFF, 0xFF, 0xDD, 0xFD,
- 0xBF, 0xDC, 0xCB, 0xBF, 0xDF, 0xFC, 0xFF, 0xFF, 0xFE, 0xED, 0xFF, 0xCB,
- 0xBC, 0xDC, 0xBC, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xDF, 0xDD, 0xDD, 0xDC, 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xDF, 0xFF,
- 0xFE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFF, 0xFF, 0xEF, 0xFD, 0xDC,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xFE, 0xDC, 0xBB, 0xAA,
- 0x9A, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xDF, 0xDC, 0xBA, 0xA9, 0x98, 0x88,
- 0x89, 0xAA, 0xBD, 0xDF, 0xFD, 0xEC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xEF, 0xDD, 0xCB, 0x99, 0x87, 0x76, 0x66, 0x67, 0x88, 0xAB,
- 0xCD, 0xFD, 0xDB, 0xA9, 0x87, 0x66, 0x65, 0x56, 0x67, 0x89, 0xAB, 0xED,
- 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x77, 0x8A, 0xBD, 0xDD, 0xCB,
- 0xA8, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0xAB, 0xCD, 0xDC, 0xB9, 0x87,
- 0x65, 0x55, 0x44, 0x55, 0x67, 0x89, 0xBD, 0xDD, 0xCB, 0xA8, 0x76, 0x65,
- 0x55, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55,
- 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xDB, 0xA9, 0x87, 0x66, 0x65, 0x66, 0x67,
- 0x89, 0xAB, 0xDD, 0xED, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0x9B,
- 0xCC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x78, 0x89, 0x9A, 0xBC, 0xED,
- 0xFF, 0xDD, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0xAA, 0xBC, 0xDD, 0xDF, 0xFF,
- 0xFD, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xED, 0xFF, 0xFE, 0xFD,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xBC, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0xFE, 0xDC,
- 0xCC, 0xCC, 0xCC, 0xDE, 0xDF, 0xFE, 0xDF, 0xFF, 0xFF, 0xFE, 0xDD, 0xDC,
- 0xCD, 0xDD, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xED, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x4D, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xE3, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x3E, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0x44, 0x44, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0x44, 0x4D, 0xDD, 0xD4, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD4, 0xD3,
- 0x3D, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xE4, 0xE4, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0x44, 0xEE,
- 0xE4, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xED, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xED, 0xED, 0xED, 0xEE, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0xFD, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF,
- 0xDF, 0xDD, 0xCC, 0xCC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xEF, 0xDD, 0xDC,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDF, 0xFF, 0xFE, 0xFD, 0xEC, 0xBB, 0xAA,
- 0x9A, 0xAA, 0xAB, 0xCD, 0xDF, 0xFF, 0xCD, 0xCD, 0xBA, 0xA9, 0x98, 0x88,
- 0x99, 0x9A, 0xCD, 0xDF, 0xFD, 0xDC, 0xBA, 0xA9, 0x88, 0x77, 0x78, 0x89,
- 0x9A, 0xBD, 0xFF, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0x9A,
- 0xDF, 0xFC, 0xDB, 0xB9, 0x87, 0x66, 0x65, 0x66, 0x67, 0x89, 0xAC, 0xDD,
- 0xDD, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x8A, 0xCD, 0xED, 0xCB,
- 0xA8, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9B, 0xDE, 0xDC, 0xBA, 0x87,
- 0x65, 0x55, 0x45, 0x55, 0x67, 0x8A, 0xBD, 0xCD, 0xCB, 0xA8, 0x76, 0x55,
- 0x54, 0x55, 0x56, 0x78, 0xAB, 0xCD, 0xED, 0xBA, 0x98, 0x76, 0x55, 0x55,
- 0x56, 0x78, 0x9A, 0xBC, 0xCD, 0xFB, 0xA9, 0x87, 0x66, 0x65, 0x66, 0x67,
- 0x89, 0xAB, 0xCD, 0xFF, 0xDB, 0xA8, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB,
- 0xCC, 0xDF, 0xFD, 0xCA, 0x98, 0x88, 0x77, 0x77, 0x89, 0x9A, 0xBC, 0xED,
- 0xFF, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x99, 0xAA, 0xBC, 0xDD, 0xDF, 0xFF,
- 0xDC, 0xCB, 0xAA, 0xAA, 0x9A, 0xAB, 0xBC, 0xCE, 0xED, 0xFF, 0xFF, 0xFD,
- 0xCC, 0xBB, 0xBC, 0xBB, 0xCC, 0xDD, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDC,
- 0xCC, 0xCD, 0xDC, 0xDF, 0xFF, 0xEF, 0xDF, 0xFF, 0xFE, 0xFC, 0xEC, 0xCD,
- 0xCC, 0xDD, 0xCD, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCB, 0xBB, 0xBB, 0xBA, 0xAB, 0xBB, 0xCC, 0xCC, 0xEF, 0xBC, 0xDD,
- 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xEE, 0xFE, 0xCC, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xEC, 0xCC, 0xBA, 0xAA, 0x99,
- 0x98, 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xBC, 0xDB, 0xBB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x78,
- 0x99, 0xAB, 0xCC, 0xBB, 0xAA, 0x98, 0x77, 0x76, 0x66, 0x77, 0x78, 0x9A,
- 0xAC, 0xCB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBB,
- 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBB, 0xBA,
- 0x98, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAB, 0xBB, 0x99, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAA, 0xAB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x67,
- 0x88, 0x9A, 0xBB, 0xCC, 0xAA, 0x98, 0x77, 0x76, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xBC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB,
- 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBD, 0xDD,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xEE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCF, 0xFE, 0xDD, 0xCC, 0xBB,
- 0xBA, 0xBB, 0xBB, 0xBC, 0xCD, 0xDC, 0xCE, 0xDD, 0xDC, 0xCB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDD, 0xBC, 0xDC,
- 0xCC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCB, 0xCD, 0xEE, 0xBD, 0xCC, 0xBB,
- 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xDB, 0xCC, 0xAA, 0xA9, 0x99,
- 0x88, 0x89, 0x99, 0x9A, 0xBC, 0xDC, 0xBC, 0xBA, 0x99, 0x98, 0x88, 0x77,
- 0x88, 0x89, 0x9A, 0xBC, 0xCB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0xAB, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBA,
- 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x89, 0xAA, 0xAA, 0xA9,
- 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xAB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67,
- 0x88, 0x9A, 0xAA, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xAB, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0xAB, 0xBB,
- 0xCC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xBC, 0xCB,
- 0xBA, 0x99, 0x99, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xDD, 0xDC, 0xBA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xBE, 0xEE, 0xCC, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDB, 0xCD, 0xEC, 0xBB, 0xBB, 0xBA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBB, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xCA, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77,
- 0x88, 0x88, 0x9A, 0xAB, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x77, 0x89,
- 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA,
- 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0x99, 0xA9,
- 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0xA9, 0x9A, 0x98, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x67, 0x78, 0x9A, 0x99, 0xA9, 0x87, 0x76, 0x66,
- 0x65, 0x66, 0x66, 0x77, 0x89, 0xA9, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0x9A, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x78, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0x9A, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xAA,
- 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x78, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xCB,
- 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xCD, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xCC, 0xCB, 0xBA, 0xAA, 0x99, 0x99,
- 0x99, 0xAA, 0xAA, 0xBB, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xCC, 0xCB,
- 0xBC, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xAC, 0xCD, 0xDE, 0xBD, 0xCB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCA, 0xBC, 0xBA, 0x99, 0x98,
- 0x88, 0x89, 0x89, 0x9A, 0xBB, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xCC, 0xAA, 0xA9, 0x88, 0x87, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xBA, 0xB9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, 0x78, 0x99, 0xAA,
- 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9,
- 0x87, 0x76, 0x66, 0x65, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87,
- 0x66, 0x65, 0x55, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67,
- 0x78, 0x9A, 0xBA, 0xAB, 0xA9, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAA, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0xAB, 0xBA,
- 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBD, 0xBB,
- 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBB, 0xDD, 0xCB, 0xAB,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xBC, 0xBD, 0xDC, 0xBB, 0xBB, 0xAA,
- 0xA9, 0xAA, 0xAA, 0xBB, 0xDC, 0xDC, 0xBE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0x9C, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xCB, 0xEC,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xEE, 0xBD, 0xCB, 0xBA,
- 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCE, 0xDB, 0xCB, 0xBA, 0xA9, 0x99,
- 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xDC, 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88,
- 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xBB, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x78,
- 0x89, 0xAB, 0xBC, 0xAB, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBB,
- 0xAA, 0x99, 0x87, 0x76, 0x66, 0x55, 0x66, 0x67, 0x89, 0x9A, 0xAA, 0xA9,
- 0x88, 0x76, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x66, 0x78, 0x99, 0xAA, 0xAB, 0x99, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x77, 0x89, 0x9A, 0xAB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xAA, 0xBB, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xBB, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB,
- 0xCC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBC, 0xDC,
- 0xBA, 0xA9, 0x99, 0x88, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xDC, 0xBB,
- 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xBD, 0xED, 0xCC, 0xBB, 0xBB,
- 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBD, 0xDC, 0xCB, 0xBB, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xED, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xEF, 0xBF, 0xFF,
- 0xFD, 0xDD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xED, 0xDC,
- 0xCC, 0xCC, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xDC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xCC, 0xEF, 0xFF, 0xFF, 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0x99,
- 0xAA, 0xBC, 0xDF, 0xFF, 0xED, 0xEC, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x9A,
- 0xBD, 0xEF, 0xFF, 0xDD, 0xCB, 0xA9, 0x88, 0x76, 0x67, 0x78, 0x9A, 0xCD,
- 0xEF, 0xFD, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xEE,
- 0xDE, 0xCB, 0x98, 0x76, 0x54, 0x44, 0x56, 0x79, 0xAC, 0xDE, 0xED, 0xDC,
- 0xB9, 0x87, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xED, 0xDE, 0xCB, 0x98,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xDE, 0xFC, 0xB9, 0x87, 0x55,
- 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xEE, 0xDB, 0xA8, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAB, 0xCE, 0xEF, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x78,
- 0x9B, 0xBD, 0xED, 0xFF, 0xFD, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDF, 0xFE, 0xDC, 0xBA, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED,
- 0xFF, 0xFF, 0xEC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xFE, 0xEF, 0xFF,
- 0xFF, 0xEC, 0xDC, 0xBB, 0xBB, 0xCC, 0xCC, 0xDE, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xED, 0xDC, 0xCD, 0xDD, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xEE, 0xFE, 0xDE, 0xEE, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xEE, 0xDD, 0xDE,
- 0xFE, 0xDD, 0xDE, 0xEE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xBF, 0xDD, 0xDC, 0xCC, 0xBC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xCD, 0xDF,
- 0xDC, 0xCB, 0xCB, 0xCB, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xDE, 0xDC, 0xCC,
- 0xBB, 0xBA, 0xAB, 0xBB, 0xCD, 0xFF, 0xFF, 0xFC, 0xDD, 0xBB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xCD, 0xDF, 0xFF, 0xDC, 0xBB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAB, 0xBC, 0xDF, 0xFC, 0xCC, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x89,
- 0xAB, 0xBD, 0xFF, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xDD, 0xFC, 0xCA, 0x99, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xFF,
- 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBE, 0xEC, 0xBA,
- 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x78, 0xAB, 0xCC, 0xCC, 0xBA, 0x97, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xDF, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCD, 0xDD, 0xDB, 0xA8, 0x87, 0x77, 0x67, 0x77, 0x89, 0xAA,
- 0xBD, 0xFF, 0xDD, 0xCA, 0xA9, 0x88, 0x77, 0x88, 0x89, 0x9A, 0xBC, 0xDC,
- 0xFF, 0xFD, 0xCB, 0xAA, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xCF, 0xCF, 0xFF,
- 0xFD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDC, 0xFF, 0xFF, 0xFF, 0xFD,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDC,
- 0xCC, 0xCC, 0xDD, 0xCC, 0xFE, 0xDF, 0xDF, 0xFF, 0xFF, 0xDD, 0xCC, 0xCD,
- 0xCC, 0xCF, 0xDD, 0xDD, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xBF, 0xDD, 0xED, 0xED, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xCE, 0xFF,
- 0xFF, 0xFE, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFE, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFE, 0xFE, 0xED, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xCD, 0xEF, 0xFF, 0xFF, 0xDE, 0xDD, 0xBB, 0xAA, 0x99, 0x99,
- 0xAB, 0xCD, 0xED, 0xFF, 0xFE, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x9A,
- 0xBD, 0xEF, 0xFF, 0xDF, 0xDC, 0xB9, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xCE,
- 0xFF, 0xFE, 0xDD, 0xBA, 0x97, 0x76, 0x55, 0x56, 0x78, 0x9B, 0xCE, 0xFF,
- 0xED, 0xDB, 0xA8, 0x76, 0x54, 0x44, 0x56, 0x79, 0xAC, 0xEF, 0xEE, 0xEC,
- 0xB9, 0x86, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFE, 0xEE, 0xCB, 0x98,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xEF, 0xFD, 0xEC, 0xB9, 0x87, 0x55,
- 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFD, 0xEF, 0xDB, 0xA8, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAC, 0xDF, 0xEE, 0xFD, 0xCB, 0x98, 0x76, 0x66, 0x67, 0x78,
- 0xAB, 0xCD, 0xEE, 0xFF, 0xFD, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDF, 0xEF, 0xFF, 0xED, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xEE,
- 0xFF, 0xFF, 0xDC, 0xCB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEE, 0xEF, 0xFF,
- 0xFF, 0xED, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFE, 0xFF, 0xFF, 0xFF,
- 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xEE, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xEE, 0xED, 0xEE,
- 0xED, 0xFE, 0xFE, 0xEE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCB, 0xBB, 0xBB, 0xBB, 0xAB, 0xBB, 0xCC, 0xCD, 0xDE, 0xBC, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDF, 0xFD, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xEB, 0xCB, 0xBA, 0xA9, 0x99,
- 0x99, 0x99, 0xAA, 0xAB, 0xCD, 0xDD, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xCC, 0xBB, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x65, 0x66, 0x77, 0x89, 0xAB, 0xBB,
- 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA,
- 0x98, 0x76, 0x65, 0x54, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xBC, 0xCB, 0xBA, 0x99, 0x88, 0x87, 0x78, 0x88, 0x9A, 0xAB, 0xCB,
- 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCD, 0xDD,
- 0xCB, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xDE, 0xDD, 0xCB,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCE, 0xEE, 0xDD, 0xCC, 0xCB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEC, 0xBD, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xCC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xAA, 0x99, 0xA9, 0xAA, 0xBB, 0xBD, 0xDC, 0xAB, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xCA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x88, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0x99, 0xA9, 0x88, 0x76, 0x66,
- 0x65, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0x9A, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x99, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89,
- 0xAA, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xAA,
- 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xCB,
- 0xAA, 0xA9, 0x98, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xBB, 0xCC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBD, 0xDD, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBB, 0xCB,
- 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xCC, 0xDC, 0xAB, 0xAA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCA, 0xBA, 0x99, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x88, 0x77, 0x77,
- 0x78, 0x89, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x67, 0x88, 0x9A, 0x99, 0x99, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x9A, 0x98, 0x77, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x78, 0x89, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x67, 0x77, 0x78, 0x89,
- 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xAA,
- 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xAB, 0xBB,
- 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBB, 0xBD, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xCD, 0xCB, 0xBB, 0xAA, 0xAA, 0x99,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xAB, 0xCC,
- 0xBB, 0xBB, 0xAA, 0xAA, 0xBA, 0xBC, 0xCD, 0xED, 0xEC, 0xBC, 0xBB, 0xBA,
- 0xA9, 0xA9, 0xA9, 0xAA, 0xAB, 0xBC, 0xDE, 0xDB, 0xBB, 0xBA, 0x99, 0x99,
- 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xCC, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x78,
- 0x89, 0xAB, 0xCC, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x9A,
- 0xBB, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x89, 0x9A, 0xBA,
- 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xAA,
- 0x98, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x99, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAA, 0xBA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x89, 0xAA, 0xAB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xAA, 0xBB, 0xA9, 0x98, 0x87, 0x77, 0x67, 0x77, 0x88, 0x9A,
- 0xAB, 0xAC, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x78, 0x89, 0x99, 0xAA, 0xBA,
- 0xCC, 0xCB, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xAC, 0xCC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBB, 0xCB, 0xCE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xBE, 0xED, 0xDC, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xAA, 0xBC, 0xCC, 0xDB, 0xAD, 0xDD, 0xBB, 0xBB, 0xBB, 0xBA,
- 0xAA, 0xBB, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCD, 0xAB, 0xCC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xFD, 0xBC, 0xBB, 0xAA,
- 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xDB, 0xBB, 0xAA, 0x99, 0x99,
- 0x89, 0x99, 0x9A, 0xAB, 0xCD, 0xDC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xBB, 0xCC, 0xCA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBC, 0xCA, 0xAA, 0x98, 0x77, 0x66, 0x65, 0x66, 0x67, 0x89, 0xAA, 0xCB,
- 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xAA,
- 0x98, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0xA9, 0x87,
- 0x66, 0x55, 0x45, 0x56, 0x67, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBB, 0xBC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xBC, 0xCB, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB,
- 0xCD, 0xCB, 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xBD, 0xED,
- 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCB, 0xDE, 0xED, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCD, 0xBD, 0xFE, 0xED, 0xCC, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDB, 0xAD, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB,
- 0xAB, 0xBB, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0xAF, 0xDF, 0xDF, 0xFD, 0xDD, 0xCD, 0xDF, 0xFD, 0xFF, 0xDD, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, 0xCC, 0xCD, 0xFD, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xFF, 0xFF, 0xFD, 0xBA, 0x88, 0xAC, 0xDF, 0xFD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xCA, 0x74, 0x46, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xDF, 0xFC, 0x85, 0x22, 0x47, 0xDF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xD8, 0x42, 0x13, 0x7B, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xA6,
- 0x43, 0x58, 0xCF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xA8, 0x78,
- 0xAB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDB, 0xBC, 0xDF,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xDD, 0xFD, 0xDF, 0xDF,
- 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFD,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF,
- 0xDD, 0xFD, 0xFF, 0xDD, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFD, 0xDD, 0xCD, 0xDE, 0xDD, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF,
- 0xFF, 0xED, 0xDC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDD,
- 0xBB, 0xBA, 0xBB, 0xBD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xAA,
- 0x99, 0xAA, 0xBB, 0xCE, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0x99, 0x88, 0x89,
- 0x9A, 0xAB, 0xCE, 0xFF, 0xFE, 0xFC, 0xCA, 0x98, 0x87, 0x77, 0x78, 0x99,
- 0xAB, 0xDD, 0xFF, 0xDD, 0xBB, 0x98, 0x77, 0x66, 0x66, 0x77, 0x99, 0xBC,
- 0xDF, 0xED, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xFF,
- 0xFC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0xAB, 0xCF, 0xFC, 0xDB,
- 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xED, 0xDC, 0xCA, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9B, 0xCE, 0xFE, 0xDB, 0xA9, 0x76, 0x55,
- 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDD, 0xDC, 0xCA, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0xAB, 0xCF, 0xED, 0xFD, 0xBA, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBE, 0xEF, 0xDF, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x9A, 0xBC,
- 0xCF, 0xFE, 0xFF, 0xDC, 0xA9, 0x98, 0x88, 0x88, 0x9A, 0xBC, 0xDF, 0xEF,
- 0xFF, 0xFE, 0xCB, 0xBA, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xCD, 0xCB, 0xBB, 0xBB, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xED, 0xDC, 0xDC, 0xDD, 0xCF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xEF,
- 0xDD, 0xEE, 0xFF, 0xDE, 0xFF, 0xFF, 0xBF, 0xFF, 0xFD, 0xFF, 0xFE, 0xED,
- 0xFE, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xEE, 0xED, 0xDD, 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFF, 0xDE, 0xFF,
- 0xED, 0xCC, 0xCC, 0xBC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0xEF, 0xED, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFE, 0xFD, 0xCB, 0xAA, 0xA9,
- 0x99, 0x99, 0xAB, 0xBC, 0xEF, 0xFF, 0xDD, 0xCB, 0xAA, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xBC, 0xEF, 0xFD, 0xDB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0x9B, 0xCD, 0xEE, 0xDD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCE, 0xEC, 0xCB, 0x98, 0x77, 0x66, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xDE,
- 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x77, 0x9A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xCD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xED, 0xED, 0xCB, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDE, 0xEC, 0xBA, 0x99, 0x88, 0x87, 0x88, 0x89, 0xAB, 0xCD, 0xEF,
- 0xFF, 0xDD, 0xBB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xCC, 0xEF, 0xFF, 0xFF,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xED,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xDC, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xED,
- 0xDC, 0xDD, 0xED, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xED, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xCD, 0xDC, 0xCC, 0xCD, 0xDE, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD, 0xFE,
- 0xDC, 0xCC, 0xCB, 0xCC, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xCB,
- 0xBB, 0xBA, 0xBB, 0xBC, 0xCD, 0xEF, 0xEF, 0xFD, 0xFC, 0xCB, 0xA9, 0xA9,
- 0x99, 0x9A, 0xAB, 0xCD, 0xDF, 0xFE, 0xCE, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xEF, 0xFC, 0xCB, 0xAA, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCE, 0xFE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAC,
- 0xDE, 0xEC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x56, 0x77, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xEC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xB9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xCD, 0xDD, 0xDC, 0xB9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x99, 0xBB, 0xDF, 0xDE, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xED, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x89, 0xAA, 0xBD, 0xDD,
- 0xFF, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xEF, 0xFF,
- 0xFD, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEE, 0xFF, 0xFF, 0xED,
- 0xDC, 0xCB, 0xBC, 0xCB, 0xCD, 0xCD, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDD,
- 0xEC, 0xDC, 0xCC, 0xEF, 0xEF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFD, 0xED, 0xDD,
- 0xDC, 0xDD, 0xDD, 0xDF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBF, 0xEE, 0xED, 0xEF, 0xED, 0xEE, 0xFE, 0xEF, 0xFE, 0xFF, 0xAE, 0xFF,
- 0xFE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xED, 0xCC, 0xCB,
- 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA,
- 0xBB, 0xCD, 0xEF, 0xFF, 0xFE, 0xFE, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0xAB,
- 0xCD, 0xFF, 0xFF, 0xEE, 0xDC, 0xA9, 0x88, 0x77, 0x77, 0x89, 0xAB, 0xDE,
- 0xFF, 0xFF, 0xFD, 0xBA, 0x97, 0x76, 0x55, 0x66, 0x89, 0xAC, 0xDF, 0xFE,
- 0xEE, 0xDB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xEE, 0xED,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xDF, 0xFE, 0xFF, 0xDB, 0xA8,
- 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xEE, 0xFD, 0xCA, 0x87, 0x65,
- 0x44, 0x45, 0x68, 0x9B, 0xCE, 0xFF, 0xFF, 0xEC, 0xB9, 0x86, 0x65, 0x55,
- 0x67, 0x8A, 0xBD, 0xEF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x77, 0x89,
- 0xAB, 0xCF, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCD,
- 0xEF, 0xFF, 0xFF, 0xFE, 0xCB, 0xAA, 0x99, 0x9A, 0xAA, 0xBC, 0xDE, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xDC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xED, 0xDD, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xEF, 0xEF, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xEF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAE, 0xDD, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xFE, 0xEE, 0xFF, 0xBD, 0xFF,
- 0xEE, 0xED, 0xED, 0xEE, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE, 0xEE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xEE, 0xEE, 0xDC, 0xCB, 0xBB,
- 0xBB, 0xBC, 0xDD, 0xEE, 0xFF, 0xFE, 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0xAA,
- 0xBB, 0xCD, 0xEF, 0xFF, 0xED, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0xAB,
- 0xCD, 0xEF, 0xFE, 0xDD, 0xDB, 0xA9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCE,
- 0xFF, 0xED, 0xDC, 0xBA, 0x97, 0x76, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFE,
- 0xDD, 0xCB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBC, 0xEF, 0xDD, 0xDC,
- 0xB9, 0x87, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCD, 0xEE, 0xDE, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xDF, 0xDD, 0xED, 0xBA, 0x97, 0x65,
- 0x44, 0x45, 0x78, 0x9A, 0xCD, 0xEE, 0xDE, 0xDC, 0xB9, 0x87, 0x65, 0x55,
- 0x67, 0x89, 0xBC, 0xDE, 0xDD, 0xEE, 0xDB, 0xA9, 0x87, 0x66, 0x77, 0x89,
- 0xAB, 0xCD, 0xFD, 0xDE, 0xED, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0x9A, 0xBC,
- 0xDF, 0xDD, 0xFE, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE,
- 0xDF, 0xFF, 0xED, 0xCC, 0xBB, 0xAB, 0xBB, 0xBC, 0xDE, 0xEF, 0xDD, 0xFF,
- 0xFF, 0xEE, 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFE, 0xDF, 0xFF, 0xFF,
- 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDE, 0xFE, 0xED, 0xFF, 0xFF, 0xFF, 0xEF,
- 0xEE, 0xEE, 0xFE, 0xFF, 0xFF, 0xFE, 0x9D, 0xEE, 0xDD, 0xDE, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xFE, 0xED, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xAB, 0xBA, 0xA9,
- 0x99, 0x88, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77,
- 0x88, 0x89, 0x99, 0xAB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98,
- 0x87, 0x76, 0x66, 0x55, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x99, 0x87, 0x76, 0x66,
- 0x65, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x67, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89,
- 0xAA, 0xAA, 0xA9, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xAB, 0xCB,
- 0xA9, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAA, 0xAB, 0xCB, 0xBC, 0xBA, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBC, 0xCC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xAC, 0xBB, 0xBA, 0xAA, 0x99, 0x99,
- 0xAA, 0xAA, 0xAB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xAB, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCC, 0xAB, 0xBA, 0xA9,
- 0x99, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x78, 0x89, 0x99, 0xAB, 0xA9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98,
- 0x87, 0x76, 0x66, 0x56, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x88, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x98, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x99, 0xAA, 0x9A, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x89,
- 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA,
- 0xAB, 0xA9, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB,
- 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xBC, 0xDC, 0xBB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xAC, 0xBB, 0xBA, 0xAA, 0xA9, 0x99,
- 0xAA, 0xAA, 0xAB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xBD, 0xAB, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xDC, 0xBC, 0xBA, 0xA9,
- 0x99, 0x89, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xBC, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77,
- 0x78, 0x89, 0x9A, 0xBC, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98,
- 0x87, 0x76, 0x66, 0x65, 0x66, 0x66, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x67, 0x88, 0x9A, 0x99, 0x99, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x87, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x99, 0xAA, 0x9A, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89,
- 0xAA, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xBB, 0xCB,
- 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCB, 0xCC, 0xCB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBC, 0xDC, 0xBC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xAD, 0xCB, 0xBA, 0xAA, 0xAA, 0x9A,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCC, 0xCC, 0xBC, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xDD, 0x9C, 0xED,
- 0xCD, 0xCC, 0xCB, 0xCC, 0xCC, 0xCD, 0xEE, 0xEF, 0xFD, 0xCD, 0xCC, 0xCB,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xDC, 0xCC, 0xBA, 0xAA, 0x99,
- 0x9A, 0xAA, 0xBB, 0xBC, 0xDE, 0xFD, 0xCD, 0xBB, 0xA9, 0x98, 0x88, 0x89,
- 0x9A, 0xAB, 0xCC, 0xEE, 0xDC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xBC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x89, 0xBB,
- 0xCE, 0xDC, 0xCB, 0xA8, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xBC, 0xBA, 0x87, 0x66, 0x55, 0x45, 0x66, 0x78, 0x9A, 0xCD, 0xCC, 0xCB,
- 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAC, 0xCC, 0xCC, 0xBA, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xCD, 0xCC, 0xAA, 0x98, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDC, 0xDD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xED, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xDC,
- 0xDE, 0xDD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xDD, 0xEE,
- 0xDD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0xDF, 0xFE, 0xEE,
- 0xDC, 0xCC, 0xCB, 0xCC, 0xCC, 0xCD, 0xDE, 0xDE, 0xFF, 0xFF, 0xEE, 0xDD,
- 0xDC, 0xCD, 0xDD, 0xDD, 0xED, 0xED, 0xAE, 0xDD, 0xDD, 0xCD, 0xCC, 0xCC,
- 0xCC, 0xCD, 0xDD, 0xDD, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFE, 0xEE, 0xDD, 0xDD, 0xDD, 0xEE, 0xEF, 0xEF, 0xFF, 0xBF, 0xFF,
- 0xFF, 0xDD, 0xDD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD,
- 0xCC, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFE, 0xDC, 0xCB, 0xAA,
- 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, 0xEF, 0xDC, 0xBB, 0xA9, 0x99, 0x99,
- 0x9A, 0xBC, 0xDE, 0xFF, 0xFE, 0xED, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x9A,
- 0xBC, 0xDF, 0xFF, 0xED, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC,
- 0xEF, 0xFD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xCE, 0xFF,
- 0xED, 0xBA, 0x97, 0x65, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xDE, 0xFD, 0xCB,
- 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xEF, 0xDD, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xEE, 0xDC, 0xA9, 0x76, 0x55,
- 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xEF, 0xEE, 0xCA, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAC, 0xDF, 0xFE, 0xED, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78,
- 0x9B, 0xCD, 0xEE, 0xFF, 0xDC, 0xBA, 0x98, 0x77, 0x77, 0x88, 0x9A, 0xBC,
- 0xEF, 0xFF, 0xFE, 0xDC, 0xBA, 0x99, 0x88, 0x89, 0xAA, 0xBC, 0xDE, 0xFF,
- 0xFF, 0xFF, 0xDC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xDC, 0xCB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xED, 0xDD, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xAF, 0xFA, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0x9F, 0xAA, 0xBA, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0x98, 0x89, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x76, 0x78, 0x78, 0x8F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xF7, 0x64, 0x56, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xA9, 0x74, 0x22, 0x57, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x97, 0x52, 0x14, 0x69, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x86,
- 0x44, 0x57, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x76, 0x77,
- 0x89, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x89, 0x99, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAF, 0xFA, 0xFF, 0xFF,
- 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA,
- 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xAF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x79, 0xFA, 0xCF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xEE, 0xEE, 0xCD, 0xEE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xFF, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFD, 0xDC, 0xBB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE, 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x88, 0xAB,
- 0xCD, 0xDC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xBB, 0xA9, 0x87,
- 0x65, 0x55, 0x45, 0x56, 0x77, 0x9A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x99, 0xAC, 0xDD, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xDC, 0xBA, 0x99, 0x88, 0x78, 0x88, 0x89, 0xAA, 0xBC, 0xDD,
- 0xEE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xDE, 0xFE,
- 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDD, 0xED, 0xFF, 0xFE, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xED, 0xDD,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFE, 0xCF, 0xFF, 0xEE, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDE, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEF, 0xFF, 0xBF, 0xEF,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xCB,
- 0xBB, 0xBA, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFD, 0xED, 0xCB, 0xBA, 0xA9,
- 0x99, 0x9A, 0xBB, 0xCD, 0xEF, 0xFF, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x88,
- 0x89, 0xAB, 0xCD, 0xEF, 0xED, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89,
- 0xAB, 0xDE, 0xFF, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAC,
- 0xDE, 0xED, 0xCB, 0xA9, 0x77, 0x66, 0x55, 0x56, 0x67, 0x8A, 0xBC, 0xDE,
- 0xDC, 0xBA, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCE, 0xED, 0xCB,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xDC, 0xB9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xEC, 0xCB, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDF, 0xDD, 0xBA, 0x97, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0xAB, 0xCD, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x9A, 0xBD, 0xDF, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xAC,
- 0xDF, 0xDF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xBB, 0xCD, 0xEE,
- 0xFF, 0xFC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xEF, 0xFF, 0xFE,
- 0xEC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xED, 0xEF, 0xFF, 0xED,
- 0xDD, 0xCB, 0xCB, 0xCC, 0xDD, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xED,
- 0xDD, 0xDE, 0xEE, 0xEE, 0xFF, 0xFE, 0xAE, 0xFF, 0xEE, 0xEE, 0xEE, 0xED,
- 0xFD, 0xED, 0xFE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xFE, 0xFF, 0xEE, 0xEF, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF,
- 0xFF, 0xFE, 0xEE, 0xDD, 0xDF, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFD,
- 0xDD, 0xCB, 0xBC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCB, 0xBA,
- 0xAA, 0xBB, 0xBC, 0xDF, 0xFF, 0xFF, 0xEF, 0xDD, 0xCB, 0xA9, 0x99, 0x99,
- 0x9A, 0xBC, 0xDF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x77, 0x88, 0x9A,
- 0xBC, 0xDF, 0xFF, 0xFE, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBD,
- 0xFF, 0xFE, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9B, 0xDE, 0xFF,
- 0xEE, 0xCA, 0x98, 0x65, 0x54, 0x45, 0x56, 0x79, 0xAC, 0xEF, 0xFF, 0xDC,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xCD, 0xFF, 0xED, 0xCA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xDF, 0xFE, 0xEC, 0xA9, 0x86, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAC, 0xDF, 0xFF, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x89,
- 0xAB, 0xCE, 0xEF, 0xFF, 0xEC, 0xBA, 0x98, 0x87, 0x77, 0x89, 0x9B, 0xCD,
- 0xEF, 0xFF, 0xFF, 0xEC, 0xBA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF,
- 0xFF, 0xFE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xDD, 0xCB, 0xCB, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBB, 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xAB, 0xCC, 0xCD, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xEE, 0xBC, 0xBB, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBC, 0xCA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x99,
- 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB,
- 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xB9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAB, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xAA, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0xAA, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xBB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB,
- 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBC, 0xCC,
- 0xBB, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xA9, 0xAA, 0xAB, 0xBB, 0xCD, 0xCD, 0xDD, 0xDC, 0xCB, 0xBB,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xEC, 0xAE, 0xDD, 0xCC, 0xBB, 0xAA, 0xAA,
- 0xAB, 0xBB, 0xBC, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCB, 0x9B, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBC, 0xCC, 0xAB, 0xA9, 0x98, 0x88, 0x87, 0x77,
- 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xAA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xB9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB,
- 0x9A, 0x98, 0x87, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x87, 0x76, 0x65,
- 0x55, 0x66, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66,
- 0x67, 0x78, 0x89, 0xAA, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x67, 0x77,
- 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBB,
- 0xBB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCC, 0xBB,
- 0xAA, 0xA9, 0x99, 0xAA, 0xAB, 0xBB, 0xDD, 0xBC, 0xDC, 0xCC, 0xCB, 0xBA,
- 0xAA, 0xBA, 0xBB, 0xBC, 0xCC, 0xDC, 0x9C, 0xCC, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAB, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xAB, 0xBA, 0xA9,
- 0x99, 0x98, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x78, 0x89, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98,
- 0x87, 0x76, 0x66, 0x55, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x88, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBA,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xAB, 0xBB,
- 0xAA, 0x99, 0x99, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xCB, 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0x9C, 0xDC,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEC, 0xBC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCE, 0xCB, 0xCB, 0xBA, 0x99, 0x98,
- 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xDC, 0xBB, 0xBA, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0xAA, 0xBC, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x99,
- 0xBC, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x89, 0x9A, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x87, 0x76, 0x65, 0x66,
- 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xCB, 0xBB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xCC,
- 0xBC, 0xBB, 0x99, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xCC, 0xDC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xDD, 0xDC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCC, 0xCD, 0xDD, 0xDE, 0xCD, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCD, 0xDD, 0xED, 0x9D, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAE, 0xDE, 0xDD, 0xED, 0xDC, 0xCC, 0xDC, 0xDD, 0xDD, 0xDD, 0x9E, 0xFF,
- 0xFF, 0xFD, 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEF, 0xFD, 0xEF, 0xEE, 0xED,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEF, 0xEE, 0xEF, 0xDE, 0xEF, 0xDD, 0xDC, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFD, 0xDF, 0xED, 0xCC, 0xBB, 0xBB, 0xBB,
- 0xBC, 0xCD, 0xDD, 0xFF, 0xDE, 0xEE, 0xDC, 0xBA, 0x99, 0x99, 0x9A, 0xBC,
- 0xCE, 0xFE, 0xFD, 0xDF, 0xDC, 0xBA, 0x98, 0x87, 0x88, 0x9A, 0xBC, 0xDE,
- 0xFE, 0xDD, 0xEE, 0xCB, 0xA8, 0x76, 0x66, 0x67, 0x9A, 0xBC, 0xEE, 0xFD,
- 0xDE, 0xDC, 0xA9, 0x86, 0x54, 0x45, 0x68, 0x9B, 0xCD, 0xEF, 0xED, 0xED,
- 0xCB, 0x97, 0x64, 0x32, 0x46, 0x79, 0xBC, 0xDE, 0xFE, 0xDE, 0xEC, 0xB9,
- 0x86, 0x42, 0x24, 0x57, 0x9A, 0xCD, 0xEF, 0xDD, 0xED, 0xCB, 0x98, 0x75,
- 0x44, 0x56, 0x79, 0xAC, 0xDE, 0xEE, 0xDF, 0xED, 0xCA, 0x98, 0x76, 0x66,
- 0x78, 0x9B, 0xCD, 0xFF, 0xED, 0xEF, 0xDC, 0xBA, 0x98, 0x77, 0x78, 0x9A,
- 0xBC, 0xDE, 0xFE, 0xDF, 0xED, 0xDC, 0xBA, 0x99, 0x99, 0x9A, 0xBC, 0xDD,
- 0xEF, 0xEE, 0xFF, 0xED, 0xCC, 0xBB, 0xAA, 0xBB, 0xBC, 0xDD, 0xEF, 0xFE,
- 0xDF, 0xFE, 0xEE, 0xDC, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xEE, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xDD, 0xDD, 0xED, 0xEE, 0xEE, 0xFE, 0xEE, 0xEF, 0xFF,
- 0xEE, 0xEE, 0xDE, 0xEE, 0xFE, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFE, 0xEF,
- 0xEF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xDD, 0xDD, 0xEE, 0xDD, 0xDD,
- 0xEE, 0xDE, 0xEE, 0xFE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0xFE, 0xEF, 0xFF, 0xEF, 0xAF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xEE, 0xDE, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xEC, 0xCC,
- 0xCC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEC, 0xBA, 0xAA, 0xAA,
- 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xDE, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAC, 0xDF,
- 0xFF, 0xFF, 0xFE, 0xCB, 0x98, 0x66, 0x55, 0x66, 0x89, 0xBC, 0xDF, 0xFF,
- 0xFF, 0xDC, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xCD, 0xFF, 0xFF, 0xFD,
- 0xCA, 0x86, 0x54, 0x33, 0x45, 0x68, 0xAC, 0xDF, 0xFF, 0xFF, 0xDC, 0xA8,
- 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xEF, 0xFE, 0xFE, 0xCA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAC, 0xDF, 0xFF, 0xFF, 0xED, 0xB9, 0x86, 0x65, 0x55,
- 0x67, 0x9B, 0xCE, 0xFF, 0xFF, 0xFF, 0xDB, 0xA9, 0x87, 0x66, 0x77, 0x8A,
- 0xBD, 0xEF, 0xFF, 0xFF, 0xFF, 0xDB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, 0xBA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xDD, 0xCC, 0xBC, 0xCD, 0xDE, 0xEF, 0xFF, 0xFE, 0xFF,
- 0xFF, 0xFF, 0xED, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDE, 0xDD, 0xDD, 0xCC, 0xDD, 0xDD, 0xEE, 0xDE, 0xEF, 0xAE, 0xFE,
- 0xEE, 0xDD, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xDF, 0xDE, 0xDC,
- 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xFE, 0xEF, 0xEE, 0xFD, 0xDC, 0xBA, 0xAA,
- 0x9A, 0xAA, 0xBC, 0xDD, 0xEF, 0xFF, 0xDD, 0xDC, 0xBA, 0xA9, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xFF, 0xFC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAC, 0xDD, 0xFE, 0xDD, 0xCA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xBC,
- 0xDE, 0xFC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xEF,
- 0xDD, 0xBA, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0xAB, 0xDE, 0xEC, 0xCB,
- 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBD, 0xEF, 0xCC, 0xBA, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xDD, 0xDB, 0xA8, 0x76, 0x55,
- 0x44, 0x55, 0x67, 0x89, 0xBC, 0xEE, 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAB, 0xCE, 0xED, 0xDC, 0xB9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xFE, 0xED, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xED, 0xEE, 0xCB, 0xAA, 0x98, 0x88, 0x89, 0x9A, 0xBC, 0xDD, 0xEE,
- 0xEF, 0xED, 0xCC, 0xBA, 0xA9, 0x99, 0xAA, 0xBB, 0xCD, 0xEF, 0xED, 0xFE,
- 0xED, 0xDC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xFE, 0xFF, 0xFF, 0xED,
- 0xDD, 0xDC, 0xCD, 0xCD, 0xDD, 0xEE, 0xFF, 0xEE, 0xFF, 0xFF, 0xFE, 0xEE,
- 0xDE, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0x9F, 0xEE, 0xED, 0xFE, 0xEF, 0xEE,
- 0xDF, 0xEE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDC, 0xCC, 0xCB, 0xCC, 0xCC, 0xDD, 0xEE, 0xEE, 0xBE, 0xFE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xFD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xEE, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xBC, 0xDE, 0xEC, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCD, 0xEC, 0xCA, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xDD,
- 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCC, 0xDC, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xBA, 0x87, 0x66, 0x55, 0x55,
- 0x67, 0x78, 0x9A, 0xCD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xDD, 0xCA, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xCD, 0xDD, 0xEC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD,
- 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEE, 0xEE,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xEF, 0xFE, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xEE, 0xFF, 0xFF, 0xED, 0xDD,
- 0xDC, 0xCD, 0xDD, 0xDE, 0xEF, 0xFE, 0xBE, 0xFE, 0xEE, 0xED, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xEE, 0xEE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0xDD, 0x9D, 0xFF,
- 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xEF, 0xFD, 0xEE, 0xDD, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEF, 0xDE, 0xED, 0xCB, 0xBA, 0xA9,
- 0x99, 0x9A, 0xAB, 0xCD, 0xDE, 0xFE, 0xDD, 0xCB, 0xAA, 0x99, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xEF, 0xDC, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xFD, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCE, 0xEC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x56, 0x77, 0x8A, 0xBD, 0xED,
- 0xCC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCB,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xBB, 0xDD, 0xCC, 0xB9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xDB, 0x98, 0x76, 0x55,
- 0x45, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xBA, 0x97, 0x76, 0x55, 0x55,
- 0x67, 0x88, 0xAA, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xAB,
- 0xCD, 0xDE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xDD,
- 0xEE, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xEE, 0xDE, 0xFD,
- 0xDD, 0xCB, 0xBA, 0xBA, 0xAB, 0xBB, 0xCC, 0xDD, 0xFD, 0xFF, 0xFE, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xCC, 0xDC, 0xDD, 0xFE, 0xEF, 0xFF, 0xEF, 0xEE, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDF, 0xFF, 0xEF, 0xAD, 0xDD, 0xDD, 0xDE, 0xDC, 0xDD,
- 0xDD, 0xDC, 0xDD, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xDD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC,
- 0xBC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0xAA, 0xAA,
- 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAC,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x88, 0x76, 0x77, 0x89, 0xAC, 0xDF,
- 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x66, 0x55, 0x67, 0x89, 0xBC, 0xFF, 0xFF,
- 0xFF, 0xFC, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xCF, 0xFF, 0xFF, 0xFD,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x68, 0xAB, 0xDF, 0xFF, 0xFF, 0xDC, 0xA8,
- 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xCA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xFC, 0xB9, 0x86, 0x65, 0x55,
- 0x67, 0x9A, 0xCD, 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x77, 0x8A,
- 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x88, 0x88, 0x99, 0xBC, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xAA, 0xAA, 0xBC, 0xCF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xEC, 0xCC, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDD, 0xCD, 0xCC, 0xCC, 0xDD, 0xDE, 0xDE, 0xEE, 0x9E, 0xFF,
- 0xED, 0xDD, 0xDC, 0xCC, 0xCD, 0xDE, 0xFE, 0xFF, 0xFF, 0xDF, 0xED, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFE, 0xEE, 0xDC, 0xBA, 0xAA,
- 0x9A, 0xAA, 0xBB, 0xCD, 0xDF, 0xFE, 0xDD, 0xDC, 0xBA, 0xA9, 0x98, 0x89,
- 0x9A, 0xAB, 0xCD, 0xEF, 0xED, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xEE, 0xCC, 0xCB, 0xA8, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xDE, 0xEC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xED,
- 0xCC, 0xBA, 0x98, 0x76, 0x54, 0x55, 0x66, 0x79, 0xAB, 0xCE, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x34, 0x45, 0x67, 0x8A, 0xBC, 0xED, 0xDC, 0xBA, 0x87,
- 0x65, 0x54, 0x34, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x65,
- 0x44, 0x56, 0x67, 0x9A, 0xBC, 0xDD, 0xCD, 0xCA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCD, 0xDD, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9A, 0xBC, 0xED, 0xDE, 0xDC, 0xA9, 0x98, 0x77, 0x77, 0x89, 0x9A, 0xBC,
- 0xDD, 0xDD, 0xFD, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBC, 0xCD, 0xFE,
- 0xEF, 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xED, 0xFF,
- 0xED, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xFE, 0xEF, 0xFF, 0xED,
- 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDF, 0xFF, 0xED, 0xFF, 0xFF, 0xEE, 0xED,
- 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFE, 0x9E, 0xDD, 0xED, 0xDD, 0xDD, 0xDD,
- 0xED, 0xDD, 0xDE, 0xEE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0x9B, 0xDC,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xED, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xCB, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xDC, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0xAA, 0xCC, 0xCA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAB, 0xCB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x9A,
- 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x87, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66,
- 0x67, 0x78, 0x89, 0xAB, 0xBA, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBB, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xBB, 0xBB, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCC, 0xDC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xCD, 0xDC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xCC, 0xDD, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEC, 0x8D, 0xCC, 0xCB, 0xBB, 0xBA, 0xAA,
- 0xBB, 0xBB, 0xBC, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0x9B, 0xCC,
- 0xBB, 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xAB, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCC, 0xCA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBB, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x66, 0x66, 0x66,
- 0x67, 0x78, 0x89, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x77,
- 0x89, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBB,
- 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xA9, 0x9A, 0xAA, 0xAB, 0xBB, 0xCC, 0xBC, 0xDC, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xDC, 0x9C, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xAB, 0xBB, 0xCC, 0x8B, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xCB, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77,
- 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xAA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAB, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x9A,
- 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66,
- 0x67, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x67, 0x77,
- 0x89, 0xAA, 0xBA, 0xAB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xAB, 0xBB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xBB,
- 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xCC,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xCD, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xCD, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBA, 0xBB, 0xBB, 0xBC, 0xCD, 0xDC, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDC, 0xCC, 0xCC, 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xDD, 0x8D, 0xEE,
- 0xDD, 0xCC, 0xCC, 0xCB, 0xCC, 0xDD, 0xEF, 0xEE, 0xFE, 0xDE, 0xDC, 0xCC,
- 0xBB, 0xAB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xED, 0xDD, 0xCB, 0xBA, 0xA9,
- 0x99, 0xAA, 0xAB, 0xBC, 0xDD, 0xFD, 0xCD, 0xCB, 0xAA, 0x99, 0x88, 0x88,
- 0x99, 0xAA, 0xBC, 0xDE, 0xDC, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAA, 0xCD, 0xDD, 0xCC, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCE, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x8A, 0xBC, 0xDD,
- 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9B, 0xBC, 0xDB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAC, 0xCC, 0xCB, 0xB9, 0x87,
- 0x65, 0x54, 0x34, 0x56, 0x78, 0x9A, 0xCC, 0xCC, 0xCA, 0x98, 0x76, 0x55,
- 0x54, 0x56, 0x67, 0x89, 0xAB, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x89, 0x9A, 0xCC, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBB,
- 0xCD, 0xDD, 0xEC, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xDD,
- 0xDD, 0xEC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDD, 0xDD, 0xFE,
- 0xDC, 0xCB, 0xBB, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xED, 0xEF, 0xEE, 0xDD,
- 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFF, 0xEE, 0xDE, 0xDD,
- 0xCD, 0xDC, 0xDD, 0xED, 0xEF, 0xEE, 0x9E, 0xEE, 0xDD, 0xDD, 0xDC, 0xCC,
- 0xCC, 0xCD, 0xDD, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xED, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xCB,
- 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xDC, 0xBA, 0xAA, 0xAA,
- 0xBB, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xCD, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0x98, 0x76, 0x67, 0x89, 0xAB, 0xDD,
- 0xFF, 0xFF, 0xED, 0xCA, 0x98, 0x66, 0x55, 0x66, 0x89, 0xBC, 0xDF, 0xFF,
- 0xFF, 0xDB, 0xA8, 0x76, 0x54, 0x44, 0x67, 0x8A, 0xBC, 0xFF, 0xFF, 0xFD,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x68, 0xAB, 0xEF, 0xFF, 0xFF, 0xDB, 0xA8,
- 0x65, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xEF, 0xFE, 0xFD, 0xCA, 0x87, 0x64,
- 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xFF, 0xEF, 0xDC, 0xB9, 0x86, 0x65, 0x56,
- 0x67, 0x9A, 0xCD, 0xFF, 0xFE, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x77, 0x8A,
- 0xBC, 0xDF, 0xFF, 0xEF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBB, 0xDE,
- 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0xAA, 0xA9, 0xAA, 0xBB, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDD, 0xDC, 0xCB, 0xBB, 0xBC, 0xCE, 0xFF, 0xFF, 0xFD, 0xFF,
- 0xFF, 0xFF, 0xDD, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDF, 0xEE, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xED, 0xED, 0xDD, 0xCC, 0xCD, 0xDD, 0xDD, 0xED, 0xDE, 0x9E, 0xFF,
- 0xFE, 0xDD, 0xDC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFE, 0xFE, 0xFE, 0xED, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xEF, 0xED, 0xFE, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xFF, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99,
- 0x9A, 0xBC, 0xCD, 0xEF, 0xEC, 0xDC, 0xBB, 0xA9, 0x88, 0x77, 0x88, 0x9A,
- 0xBC, 0xCE, 0xEE, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC,
- 0xEF, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xEE,
- 0xDC, 0xBA, 0x98, 0x66, 0x54, 0x45, 0x56, 0x89, 0xAC, 0xCD, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xDD, 0xDD, 0xDB, 0xA9, 0x86, 0x55,
- 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xDD, 0xDE, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAB, 0xDE, 0xED, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x89,
- 0xAB, 0xCD, 0xEE, 0xDE, 0xDC, 0xAA, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC,
- 0xDE, 0xED, 0xED, 0xDB, 0xBA, 0x99, 0x99, 0x99, 0x9A, 0xBC, 0xDD, 0xEF,
- 0xEE, 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xEF, 0xFD, 0xEF,
- 0xDD, 0xDC, 0xCB, 0xBB, 0xBB, 0xCC, 0xDE, 0xEE, 0xFF, 0xDF, 0xFF, 0xED,
- 0xDD, 0xCC, 0xDD, 0xCD, 0xDE, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEE, 0xEE,
- 0xDF, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0x9D, 0xED, 0xDE, 0xDE, 0xDE, 0xED,
- 0xEE, 0xEE, 0xFF, 0xEF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xED, 0xDC, 0xCC, 0xBC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xAE, 0xFE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDE, 0xEF, 0xFE, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEF, 0xED, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xEE, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x89,
- 0xAA, 0xCC, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDC, 0xBA, 0x98, 0x87, 0x65, 0x55, 0x56, 0x77, 0x89, 0xBC, 0xDD,
- 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xBA, 0x87, 0x76, 0x55, 0x55,
- 0x67, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB,
- 0xCD, 0xDD, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDE,
- 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEE, 0xEE,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xDF, 0xED, 0xDD,
- 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xED, 0xFF, 0xEE, 0xED, 0xDD,
- 0xCD, 0xCD, 0xDD, 0xEE, 0xFF, 0xFF, 0xAE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDE, 0xEE, 0xEF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xED, 0xDD, 0xDC, 0xDC, 0xDC, 0xCC, 0xCD, 0xDD, 0xDD, 0x8E, 0xFE,
- 0xEE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDD, 0xEE, 0xEE, 0xFE, 0xEF, 0xEE, 0xDC,
- 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xEF, 0xDE, 0xFE, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0xED, 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99,
- 0x9A, 0xBB, 0xCD, 0xDF, 0xDD, 0xEC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x9A,
- 0xBB, 0xDD, 0xFD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC,
- 0xDD, 0xEC, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xEC,
- 0xCC, 0xBA, 0x98, 0x75, 0x54, 0x45, 0x56, 0x89, 0xAB, 0xCE, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xDC, 0xA9, 0x86, 0x55,
- 0x44, 0x55, 0x78, 0x9A, 0xBC, 0xDD, 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x56,
- 0x67, 0x89, 0xAC, 0xDD, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x77, 0x89,
- 0xAB, 0xBD, 0xED, 0xCD, 0xDC, 0xB9, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC,
- 0xDE, 0xED, 0xDE, 0xCB, 0xBA, 0x99, 0x98, 0x99, 0xAB, 0xBB, 0xCD, 0xEE,
- 0xDE, 0xED, 0xDC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEE, 0xDD, 0xEE,
- 0xDC, 0xDC, 0xBC, 0xBC, 0xBB, 0xCC, 0xCD, 0xDD, 0xFD, 0xDF, 0xEE, 0xDE,
- 0xDC, 0xCD, 0xCD, 0xDD, 0xDD, 0xDE, 0xEE, 0xED, 0xEF, 0xEF, 0xFF, 0xEE,
- 0xED, 0xDE, 0xED, 0xDD, 0xFF, 0xFD, 0x9D, 0xDD, 0xDE, 0xCD, 0xDC, 0xDD,
- 0xDD, 0xED, 0xDE, 0xEF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFD, 0xDF, 0xDD, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC,
- 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBB, 0xBB,
- 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xA9, 0x99, 0x9A, 0xBC,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x87, 0x78, 0x8A, 0xBC, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xCB, 0xA8, 0x76, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xB9, 0x76, 0x54, 0x45, 0x68, 0x9B, 0xCF, 0xFF, 0xFF, 0xFF,
- 0xCB, 0x97, 0x54, 0x23, 0x45, 0x79, 0xBC, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9,
- 0x75, 0x43, 0x24, 0x57, 0x9B, 0xCF, 0xFF, 0xFF, 0xFF, 0xDB, 0x98, 0x65,
- 0x44, 0x56, 0x79, 0xBC, 0xFF, 0xFF, 0xFF, 0xFD, 0xCA, 0x87, 0x65, 0x56,
- 0x78, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x88, 0x77, 0x78, 0x9A,
- 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x99, 0x99, 0xAA, 0xCD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xBA, 0xBB, 0xCD, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDD, 0xFC, 0xCC, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0x9E, 0xEF,
- 0xDD, 0xCC, 0xCB, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFE, 0xDE, 0xED, 0xCC,
- 0xCB, 0xBA, 0xBA, 0xBB, 0xCD, 0xCD, 0xEE, 0xEE, 0xED, 0xCC, 0xBA, 0xA9,
- 0x99, 0x9A, 0xBB, 0xBD, 0xDD, 0xFE, 0xDE, 0xCB, 0xBA, 0x99, 0x88, 0x88,
- 0x99, 0xAB, 0xBC, 0xDE, 0xDC, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAB, 0xCD, 0xEE, 0xCD, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x78, 0x89, 0xBB,
- 0xCE, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x87, 0x66, 0x54, 0x45, 0x56, 0x78, 0x9B, 0xCD, 0xCB, 0xCB,
- 0x98, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xCD, 0xCC, 0xB9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA8, 0x76, 0x65,
- 0x44, 0x56, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x88,
- 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xEC, 0xBB, 0xA9, 0x98, 0x88, 0x99, 0x99, 0xBB, 0xCD, 0xDD,
- 0xCE, 0xDC, 0xCB, 0xAA, 0xA9, 0x99, 0xAA, 0xBB, 0xBD, 0xDF, 0xDD, 0xEE,
- 0xDD, 0xCB, 0xBB, 0xBA, 0xAB, 0xBC, 0xCD, 0xDE, 0xFE, 0xDE, 0xEE, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xED, 0xFF, 0xEE, 0xDD, 0xDD,
- 0xDC, 0xDE, 0xDD, 0xEE, 0xEF, 0xFD, 0x8D, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC,
- 0xDC, 0xDD, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0x8C, 0xDC,
- 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xBA,
- 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xCB, 0xCB, 0xBA, 0xA9, 0x98,
- 0x88, 0x99, 0x99, 0xAB, 0xBC, 0xDC, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xCC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBC, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xBB,
- 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9,
- 0x87, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x77,
- 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x66, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x89, 0xAB, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCC, 0xCC,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xEC, 0xCD, 0xDC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDE, 0xCC, 0xED, 0xCC, 0xCC, 0xCB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xDD, 0x8C, 0xCB, 0xCB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xCB, 0xCC, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCB,
- 0xBA, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xAB, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0xAA, 0xBB, 0xA9, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x67, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x67, 0x77,
- 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBA,
- 0xAB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xBB,
- 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBB, 0xCC, 0xCB, 0xBB, 0xBA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8B, 0xDC,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xDB, 0xBC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x99, 0x9A, 0xAB, 0xBB, 0xDB, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBA,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9,
- 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87,
- 0x65, 0x54, 0x55, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xAA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAB, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x67, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x89, 0xAA, 0xBA, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xBB, 0xBA, 0xBB, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xCB, 0xBC, 0xCC, 0xBB,
- 0xAB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xBC, 0xDC, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0x8B, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBE, 0xDD, 0xCC, 0xCC, 0xCC, 0xBC, 0xCC, 0xCC, 0xCC, 0xDC, 0x8E, 0xEE,
- 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFD, 0xEE, 0xED, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDD, 0xED, 0xCC, 0xBA, 0xAA,
- 0xA9, 0xAA, 0xAB, 0xCC, 0xDE, 0xFD, 0xCD, 0xDC, 0xBA, 0x99, 0x98, 0x89,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x99,
- 0xAB, 0xCD, 0xED, 0xCD, 0xBB, 0x99, 0x87, 0x66, 0x66, 0x78, 0x8A, 0xBB,
- 0xCD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xBC, 0xBA, 0x97, 0x66, 0x54, 0x45, 0x66, 0x89, 0xAB, 0xCD, 0xCC, 0xCB,
- 0x98, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xDD, 0xBC, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0x9A, 0xCD, 0xCC, 0xCB, 0xA9, 0x86, 0x65,
- 0x44, 0x56, 0x67, 0x9A, 0xAC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xA9, 0x98, 0x76, 0x66, 0x67, 0x88,
- 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xDD, 0xCB, 0xA9, 0x99, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xDD,
- 0xCD, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xDD, 0xEE,
- 0xDC, 0xCB, 0xBB, 0xBA, 0xBB, 0xBC, 0xCC, 0xDE, 0xEE, 0xEE, 0xFE, 0xDD,
- 0xCC, 0xBC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xED, 0xFE, 0xEE, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFD, 0x9D, 0xED, 0xCC, 0xDC, 0xCC, 0xDC,
- 0xDD, 0xDD, 0xEE, 0xED, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xEE, 0xFE, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDC,
- 0xDC, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xBB, 0xBB,
- 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDB, 0xAA, 0x9A, 0xAB, 0xCC,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBD, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x78, 0x9B, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xBA, 0x86, 0x54, 0x45, 0x78, 0xAC, 0xDE, 0xFF, 0xFF, 0xFF,
- 0xDB, 0x98, 0x64, 0x22, 0x46, 0x89, 0xBC, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA,
- 0x86, 0x42, 0x24, 0x68, 0x9B, 0xDE, 0xFF, 0xFD, 0xFF, 0xCC, 0xA8, 0x75,
- 0x44, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0x98, 0x76, 0x66,
- 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCA, 0x98, 0x88, 0x89, 0xAB,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0x9A, 0xAB, 0xCD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xCB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFF,
- 0xEF, 0xFE, 0xFE, 0xDD, 0xDC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF,
- 0xFF, 0xFF, 0xEF, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF,
- 0xEF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDE, 0xDE, 0xDE,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xCC, 0xDD, 0x9E, 0xEE,
- 0xEE, 0xED, 0xDC, 0xCD, 0xCD, 0xDD, 0xDD, 0xEF, 0xED, 0xEE, 0xDD, 0xCC,
- 0xCC, 0xBB, 0xCB, 0xCC, 0xDD, 0xDE, 0xEF, 0xDD, 0xEE, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAB, 0xBC, 0xCC, 0xDE, 0xEE, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99,
- 0xAA, 0xBC, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x78, 0x88, 0x9A,
- 0xBC, 0xCD, 0xDD, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x56, 0x78, 0xAB, 0xCD, 0xED,
- 0xCD, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x57, 0x89, 0xBB, 0xCD, 0xDC, 0xDB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x68, 0x9A, 0xBC, 0xDD, 0xDD, 0xBA, 0x98,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x55,
- 0x44, 0x55, 0x68, 0x9A, 0xCC, 0xED, 0xCC, 0xCB, 0xA8, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAB, 0xDD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x89,
- 0xAB, 0xCD, 0xED, 0xCD, 0xCC, 0xBA, 0x98, 0x88, 0x78, 0x89, 0x9A, 0xCC,
- 0xDE, 0xEC, 0xDC, 0xCB, 0xBA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xEE,
- 0xDD, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDE, 0xEE, 0xED, 0xED,
- 0xDD, 0xDC, 0xCB, 0xBB, 0xBB, 0xBD, 0xCD, 0xFE, 0xEE, 0xCE, 0xEE, 0xDD,
- 0xDD, 0xDC, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEC, 0xFE, 0xEE, 0xFE, 0xFD,
- 0xDD, 0xDD, 0xEE, 0xEF, 0xEF, 0xFE, 0x8D, 0xDC, 0xDD, 0xDD, 0xCD, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xFE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDD, 0xAD, 0xEE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xDE, 0xFD, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xBC, 0xDD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAC, 0xCC,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xBB, 0xB9, 0x88, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xED,
- 0xCD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xDD, 0xDD,
- 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xDE, 0xDD, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xEE, 0xED, 0xDD, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFF, 0xAD, 0xDD, 0xCD, 0xCC, 0xCC, 0xCC,
- 0xCD, 0xDD, 0xDE, 0xEE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCB, 0xCC, 0xCC, 0xCC, 0xDC, 0x9D, 0xFE,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDE, 0xED, 0xDE, 0xED, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xDD, 0xEC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xDC, 0xCD, 0xDC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xBC, 0xDE, 0xCC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xAB, 0xCC, 0xDC, 0xCC, 0xBA, 0xA8, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBB,
- 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xCC, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x68, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0xAA, 0xBC, 0xDC, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xDC, 0xBB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBB, 0xCD, 0xED,
- 0xCD, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xDC, 0xED,
- 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xED, 0xDE, 0xDD, 0xDC,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xDD, 0xEE, 0xED, 0xDD, 0xDD,
- 0xDC, 0xDD, 0xDD, 0xEE, 0xEF, 0xFE, 0x9D, 0xDC, 0xDC, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xDD, 0xDD, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD, 0xDD, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xEE, 0xED, 0xDF, 0xDE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xED,
- 0xDC, 0xDD, 0xDC, 0xDD, 0xDE, 0xFF, 0xFF, 0xEE, 0xFF, 0xDD, 0xDC, 0xCB,
- 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFE, 0xFF, 0xED, 0xDC, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xCD, 0xDE, 0xFF, 0xED, 0xFE, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xCD, 0xEF, 0xFF, 0xDF, 0xDC, 0xBA, 0x98, 0x76, 0x77, 0x89, 0xAB, 0xCD,
- 0xFF, 0xFE, 0xED, 0xCA, 0x98, 0x66, 0x55, 0x67, 0x89, 0xBC, 0xDE, 0xFE,
- 0xED, 0xDB, 0xA8, 0x76, 0x44, 0x44, 0x67, 0x8A, 0xBD, 0xDF, 0xFD, 0xFC,
- 0xBA, 0x86, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFE, 0xEE, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x57, 0x89, 0xBC, 0xFF, 0xFE, 0xED, 0xBA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xDF, 0xDC, 0xA9, 0x87, 0x65, 0x56,
- 0x68, 0x9A, 0xCD, 0xEF, 0xFE, 0xEE, 0xCB, 0xA9, 0x87, 0x76, 0x78, 0x8A,
- 0xBC, 0xDF, 0xFF, 0xDE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDE,
- 0xFF, 0xFE, 0xEE, 0xDD, 0xCB, 0xAA, 0x99, 0xAA, 0xBC, 0xCE, 0xFF, 0xFF,
- 0xEF, 0xFF, 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFE, 0xFE,
- 0xEF, 0xDD, 0xDC, 0xCD, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF,
- 0xEE, 0xED, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xDF, 0xFF, 0xFF, 0xFD, 0xFE,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0x9E, 0xFF,
- 0xEE, 0xDE, 0xDC, 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0xFF, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xDD, 0xFE, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCD, 0xDD, 0xEE, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99,
- 0x9A, 0xAB, 0xDE, 0xDE, 0xDD, 0xEC, 0xCA, 0x99, 0x88, 0x77, 0x88, 0x9A,
- 0xBB, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xED,
- 0xCC, 0xCA, 0x98, 0x65, 0x54, 0x45, 0x66, 0x89, 0xAB, 0xDD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBD, 0xDC, 0xCC, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xEC, 0xCB, 0xA9, 0x86, 0x65,
- 0x44, 0x55, 0x68, 0x9A, 0xBD, 0xDD, 0xCD, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x89,
- 0xAB, 0xCD, 0xFD, 0xCE, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xBC,
- 0xEE, 0xDC, 0xDD, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE,
- 0xDE, 0xDD, 0xCC, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xED, 0xEE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xDE, 0xEE, 0xDE,
- 0xDD, 0xCC, 0xCD, 0xDE, 0xEE, 0xEF, 0xFF, 0xED, 0xFF, 0xFE, 0xEE, 0xDD,
- 0xDD, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0x8D, 0xCD, 0xCD, 0xDD, 0xDC, 0xCD,
- 0xED, 0xEE, 0xEE, 0xFF, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8B, 0xCC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xAA,
- 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x88,
- 0x89, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xAA, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xBA, 0xCB, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xCB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBC, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xCC, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xED, 0x8C, 0xBB, 0xBB, 0xBB, 0xAB, 0xAB,
- 0xBB, 0xBC, 0xCC, 0xCD, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x8B, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBB, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x88,
- 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAA, 0xBA, 0x9A, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0x9A, 0x98, 0x87,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x99, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAB, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBA, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB,
- 0xAB, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBA, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xDC, 0xCB, 0xBB, 0xBA,
- 0xAA, 0xBB, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8B, 0xCC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDB, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x98,
- 0x88, 0x99, 0x99, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xBB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xAA, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBB,
- 0xAA, 0xA8, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xA9,
- 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBB, 0xBA, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCB, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xDC, 0x8B, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA,
- 0xAB, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xEC, 0xCC, 0xCB, 0xCB, 0xBB, 0xCC, 0xCC, 0xCC, 0xCD, 0x8D, 0xED,
- 0xED, 0xDC, 0xCB, 0xBB, 0xBC, 0xCD, 0xCD, 0xEF, 0xFD, 0xDE, 0xED, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xCE, 0xEE, 0xDD, 0xDD, 0xCB, 0xBA, 0x99,
- 0x99, 0x9A, 0xAA, 0xBC, 0xDE, 0xED, 0xDD, 0xCB, 0xBA, 0x99, 0x88, 0x88,
- 0x99, 0xAA, 0xBC, 0xDD, 0xDC, 0xDB, 0xAA, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAB, 0xBC, 0xDC, 0xCD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB,
- 0xCD, 0xCB, 0xCA, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x99, 0xBC, 0xDC,
- 0xBB, 0xA9, 0x87, 0x66, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xCC, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDB, 0xCB, 0x98, 0x76, 0x65,
- 0x54, 0x55, 0x67, 0x89, 0xAC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xDD,
- 0xCD, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDE, 0xEC, 0xED,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xED, 0xDE, 0xED, 0xDC,
- 0xCC, 0xBC, 0xBC, 0xCC, 0xDD, 0xDE, 0xFF, 0xED, 0xFF, 0xDD, 0xDD, 0xDD,
- 0xCD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFE, 0x9D, 0xDD, 0xDD, 0xDD, 0xCC, 0xCC,
- 0xCC, 0xDD, 0xEE, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFE, 0xED, 0xDE, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, 0xDD, 0x9F, 0xFF,
- 0xFF, 0xEE, 0xDE, 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFD, 0xEF, 0xEF, 0xEE,
- 0xDD, 0xCC, 0xCC, 0xCD, 0xCD, 0xEE, 0xFF, 0xDF, 0xFF, 0xED, 0xCC, 0xCB,
- 0xBB, 0xBB, 0xCC, 0xDD, 0xDE, 0xFE, 0xDE, 0xDD, 0xCC, 0xAA, 0xAA, 0xAA,
- 0xAB, 0xBC, 0xDD, 0xFF, 0xEE, 0xFD, 0xCB, 0xBA, 0x98, 0x88, 0x89, 0xAA,
- 0xBC, 0xDF, 0xFF, 0xEE, 0xDC, 0xB9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xEF, 0xEE, 0xEC, 0xBA, 0x97, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCE, 0xFE,
- 0xDE, 0xCB, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDE, 0xED, 0xEC,
- 0xB9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9B, 0xCE, 0xEE, 0xDD, 0xCB, 0x98,
- 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBC, 0xDF, 0xED, 0xEC, 0xCA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xEE, 0xDD, 0xDB, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x9A, 0xCD, 0xFF, 0xED, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x8A,
- 0xBC, 0xEF, 0xFF, 0xDF, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x9A, 0xBB, 0xCE,
- 0xEF, 0xFD, 0xED, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xFF,
- 0xDF, 0xED, 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFD, 0xEE,
- 0xDD, 0xDD, 0xCC, 0xCD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xDF, 0xEF, 0xEF,
- 0xDD, 0xEE, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0xFE,
- 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDD, 0xDE, 0xDE, 0xED, 0xDD,
- 0xEE, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0x9D, 0xFE,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xED, 0xDE, 0xDD, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xDD, 0xDD, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xED, 0xCD, 0xDB, 0xBA, 0x99, 0x98, 0x89,
- 0x9A, 0xAB, 0xCC, 0xEE, 0xDC, 0xDC, 0xBA, 0x98, 0x88, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xDD, 0xCC, 0xBA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xAB,
- 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDD,
- 0xCC, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCE, 0xDB, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCE, 0xDC, 0xCC, 0xAA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9B, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xEE, 0xDC, 0xDD, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0xAA, 0xBC, 0xDE, 0xEE,
- 0xCD, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xEC, 0xDD,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFE, 0xCF, 0xEE, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFF, 0xED, 0xEE, 0xED, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xEE, 0xFE, 0xFF, 0xFE, 0x8C, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xEE, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCC, 0x9E, 0xEE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xDE, 0xED, 0xDE, 0xDC, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDD, 0xCB, 0xAA, 0xA9,
- 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88,
- 0x99, 0xAA, 0xBC, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89,
- 0xAB, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x89, 0xAB,
- 0xCC, 0xCC, 0xCB, 0x99, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xCB, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x67, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x87, 0x65,
- 0x54, 0x55, 0x67, 0x89, 0xAC, 0xDC, 0xBC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0x9B, 0xCD, 0xCB, 0xCB, 0xA9, 0x88, 0x77, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xCD, 0xDC, 0xCC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD,
- 0xCD, 0xCC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDE, 0xEC, 0xDD,
- 0xCC, 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xEE, 0xDE, 0xDD, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xEF, 0xED, 0xEE, 0xDD, 0xDD, 0xCC,
- 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0xAD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCD, 0xDD, 0xDE, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9D, 0xFF,
- 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFD, 0xDE, 0xED, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xDD, 0xDD, 0xCC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEC, 0xDD, 0xDC, 0xBA, 0x99, 0x99, 0x99,
- 0x9A, 0xAB, 0xCD, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xAC,
- 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9A, 0xCC, 0xDD, 0xCD, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xDD, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED,
- 0xCD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEE, 0xDC, 0xED,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFD, 0xCE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xDE, 0xDD,
- 0xDD, 0xDE, 0xDE, 0xEE, 0xFF, 0xFE, 0x9D, 0xDC, 0xCD, 0xDD, 0xCC, 0xCD,
- 0xDD, 0xDD, 0xDE, 0xEE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xFF, 0xEE, 0xDD, 0xCD, 0xCC, 0xDC, 0xCC, 0xDD, 0xCD, 0x8F, 0xFF,
- 0xFF, 0xFE, 0xED, 0xEE, 0xDD, 0xDE, 0xEE, 0xFF, 0xFD, 0xEF, 0xFF, 0xEE,
- 0xDD, 0xCC, 0xCD, 0xDD, 0xDE, 0xEE, 0xEF, 0xDE, 0xFE, 0xED, 0xDC, 0xCB,
- 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xFE, 0xEE, 0xEE, 0xCC, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xCC, 0xCE, 0xEF, 0xED, 0xED, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAA,
- 0xCD, 0xDE, 0xFE, 0xDE, 0xDC, 0xBA, 0x88, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xEF, 0xEE, 0xED, 0xCB, 0x98, 0x65, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFE,
- 0xEE, 0xDB, 0xA9, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xEF, 0xED, 0xEC,
- 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFE, 0xDD, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBD, 0xEF, 0xED, 0xDC, 0xBA, 0x97, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xEE, 0xDE, 0xCB, 0xA9, 0x87, 0x65, 0x55,
- 0x68, 0x9A, 0xCD, 0xEF, 0xFD, 0xED, 0xCB, 0xA9, 0x87, 0x76, 0x78, 0x9A,
- 0xBC, 0xEE, 0xFF, 0xDF, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDE,
- 0xEF, 0xED, 0xFE, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xBC, 0xDE, 0xDE, 0xFE,
- 0xDF, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xCC, 0xDE, 0xEE, 0xFF, 0xED, 0xEF,
- 0xED, 0xDD, 0xCD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFE, 0xFE, 0xDF, 0xFE, 0xDE,
- 0xEE, 0xEE, 0xDE, 0xEE, 0xFF, 0xEF, 0xFE, 0xFE, 0xFF, 0xEE, 0xEE, 0xEF,
- 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xDD, 0xDD, 0xDD, 0xDD, 0xEE,
- 0xEE, 0xFE, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDC, 0xCC, 0xBB, 0xBB, 0xCC, 0xCC, 0xBC, 0xBC, 0xCD, 0x8D, 0xEE,
- 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xED, 0xDE, 0xED, 0xDC,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDF, 0xDC, 0xDC, 0xCC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xED, 0xCD, 0xCC, 0xBA, 0x99, 0x99, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDC,
- 0xCD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCD, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAC, 0xCE, 0xCC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x89,
- 0x9A, 0xBC, 0xED, 0xCC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xBC,
- 0xDF, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xED,
- 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xDC, 0xED,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xEE, 0xDE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDF, 0xEF, 0xED, 0xFF, 0xEE, 0xED, 0xDC,
- 0xDD, 0xDD, 0xEE, 0xEE, 0xFF, 0xFE, 0x7C, 0xCD, 0xCC, 0xCC, 0xCC, 0xCD,
- 0xDD, 0xDD, 0xED, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0x8B, 0xDC,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x98,
- 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x98, 0x88, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xA9, 0xA9,
- 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x98, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBB, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xAB, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xCB,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCB, 0xDD, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0x8B, 0xBB, 0xBB, 0xBB, 0xBA, 0xAA,
- 0xBB, 0xBB, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x8B, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBB, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78,
- 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB,
- 0xAB, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCB, 0xBC, 0xBB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCC, 0xCB, 0xBB, 0xBA,
- 0xAA, 0xAB, 0xBB, 0xBC, 0xCC, 0xDC, 0x8B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8C, 0xDC,
- 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCC, 0xBB, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xCB, 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x88,
- 0x89, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBB,
- 0xAA, 0x98, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xA9,
- 0x88, 0x76, 0x55, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBB, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDB, 0xBD, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xCB, 0xDC, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xDC, 0x8C, 0xBB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDD, 0xCD, 0xCB, 0xCB, 0xBB, 0xCB, 0xCB, 0xCC, 0xCC, 0x7D, 0xFF,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCD, 0xDD, 0xDE, 0xED, 0xDD, 0xDC, 0xCC,
- 0xBB, 0xAB, 0xAB, 0xBB, 0xCC, 0xDD, 0xEE, 0xDD, 0xDD, 0xCB, 0xBA, 0xA9,
- 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xEC, 0xCD, 0xCB, 0xAA, 0x99, 0x88, 0x89,
- 0x99, 0xAA, 0xBC, 0xDD, 0xDC, 0xDB, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x99,
- 0xAB, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x89, 0xAB,
- 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xBC, 0xB9, 0x87, 0x65, 0x54, 0x55, 0x67, 0x79, 0x9B, 0xBC, 0xCC, 0xBA,
- 0x98, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xAC, 0xCD, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xBD, 0xDB, 0xCA, 0xA8, 0x87, 0x65,
- 0x54, 0x55, 0x67, 0x89, 0xBB, 0xCD, 0xBB, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAA, 0xCD, 0xDC, 0xCB, 0xA9, 0x88, 0x77, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBB, 0xA9, 0x98, 0x77, 0x77, 0x88, 0x9A, 0xBB,
- 0xDE, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xBB, 0xDD, 0xED,
- 0xDD, 0xDC, 0xBB, 0xAA, 0xA9, 0x99, 0xAA, 0xBC, 0xCD, 0xEF, 0xDC, 0xED,
- 0xDC, 0xBB, 0xBB, 0xAA, 0xBB, 0xBC, 0xCC, 0xEE, 0xEE, 0xDE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xEF, 0xFD, 0xFE, 0xDD, 0xDD, 0xDC,
- 0xDD, 0xDD, 0xDE, 0xED, 0xFF, 0xFE, 0x8D, 0xCD, 0xCD, 0xCC, 0xCC, 0xCC,
- 0xCD, 0xDD, 0xEE, 0xEF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, 0xDD, 0xDD, 0xDC, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xEE, 0xED, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xDC,
- 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xBB, 0xAB,
- 0xBC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xBB, 0xA9, 0x99, 0x9A, 0xAB,
- 0xCD, 0xFF, 0xFF, 0xEF, 0xFD, 0xCA, 0x98, 0x77, 0x77, 0x89, 0xAC, 0xDF,
- 0xFF, 0xFF, 0xFE, 0xDB, 0xA8, 0x76, 0x56, 0x67, 0x8A, 0xBD, 0xDF, 0xFF,
- 0xFF, 0xFC, 0xB9, 0x76, 0x54, 0x45, 0x68, 0x9B, 0xCD, 0xFF, 0xFF, 0xFD,
- 0xCB, 0x97, 0x54, 0x23, 0x46, 0x79, 0xAC, 0xEF, 0xFF, 0xFF, 0xEC, 0xA9,
- 0x76, 0x43, 0x24, 0x57, 0x9B, 0xCD, 0xFF, 0xFF, 0xFD, 0xCB, 0x98, 0x65,
- 0x44, 0x46, 0x79, 0xBC, 0xEF, 0xFF, 0xEF, 0xDD, 0xBA, 0x87, 0x66, 0x56,
- 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xFE, 0xDC, 0xA9, 0x88, 0x77, 0x78, 0x9A,
- 0xCD, 0xFF, 0xFF, 0xDF, 0xFD, 0xCB, 0xAA, 0x99, 0x99, 0xAB, 0xBD, 0xDF,
- 0xFF, 0xFD, 0xFF, 0xDD, 0xCB, 0xBB, 0xAA, 0xBB, 0xCC, 0xFE, 0xFF, 0xFF,
- 0xEF, 0xFD, 0xED, 0xDC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF,
- 0xEF, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF,
- 0xEF, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCD, 0xDD, 0xDD, 0xFD, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xEE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0xFF,
- 0xEE, 0xED, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFD, 0xEF, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xDD, 0xED, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xFE, 0xDE, 0xDC, 0xBA, 0x99, 0x99, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x88, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xDD, 0xCA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xED,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAC, 0xDE, 0xEC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78,
- 0x9B, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xEF, 0xEC, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE,
- 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xEC, 0xED,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xCF, 0xED, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFF, 0xFC, 0xFE, 0xFE, 0xDD, 0xDD,
- 0xDE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xCD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xEE, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0x9E, 0xFE,
- 0xED, 0xCC, 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xEE, 0xDD, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDD, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBB, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCC,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE,
- 0xCD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEC, 0xDD,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xCE, 0xDD, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFD, 0xEE, 0xDD, 0xCD, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xAD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xDD, 0xDE, 0xEF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xED, 0xEE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9F, 0xFF,
- 0xFE, 0xED, 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xED, 0xEF, 0xEE, 0xDC,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDE, 0xEE, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xED, 0xDE, 0xDC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xDD, 0xDD, 0xCB, 0xA8, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xDD, 0xCC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAC, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9B, 0xCD, 0xDD, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDF, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xDD, 0xED,
- 0xCD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEF, 0xED, 0xED,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xFE, 0xCD, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFD, 0xFE, 0xEE, 0xED, 0xDD,
- 0xDD, 0xEE, 0xDE, 0xFE, 0xFF, 0xFE, 0x9C, 0xCD, 0xCC, 0xCC, 0xCC, 0xDD,
- 0xDD, 0xDE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDD, 0xDD, 0xDD, 0xCC, 0xCD, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xEE, 0xFE, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xEF, 0xDC, 0xDD, 0xDD, 0xFF, 0xEF, 0xFF, 0xDF, 0xFF, 0xFE, 0xDD, 0xCC,
- 0xBB, 0xBC, 0xCD, 0xDD, 0xDF, 0xFE, 0xFF, 0xFF, 0xDC, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xCC, 0xDF, 0xFF, 0xEF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x99, 0xAB,
- 0xCD, 0xDF, 0xFE, 0xFF, 0xFC, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xFF, 0xFF, 0xFD, 0xCB, 0x97, 0x65, 0x55, 0x67, 0x89, 0xBB, 0xDF, 0xFF,
- 0xFF, 0xDC, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFF, 0xFF, 0xFD,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFE, 0xDB, 0xA8,
- 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBD, 0xFF, 0xFF, 0xED, 0xBA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x9B, 0xCF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x78, 0x9A,
- 0xBC, 0xDF, 0xFF, 0xEF, 0xEC, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDF,
- 0xFF, 0xFE, 0xFF, 0xCD, 0xCB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF,
- 0xEF, 0xFF, 0xDD, 0xCB, 0xBB, 0xBB, 0xDC, 0xEE, 0xFF, 0xFF, 0xFD, 0xFE,
- 0xEF, 0xDD, 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDC, 0xDD, 0xDE, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xDE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDC, 0xCC, 0xCD, 0x8F, 0xFF,
- 0xEE, 0xDC, 0xDC, 0xBC, 0xCD, 0xDE, 0xDD, 0xEF, 0xED, 0xEE, 0xEE, 0xDC,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xED, 0xEE, 0xED, 0xFE, 0xDC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xCC, 0xDD, 0xED, 0xDE, 0xCC, 0xBA, 0x99, 0x88, 0x89,
- 0x99, 0xAB, 0xBC, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99,
- 0xAB, 0xCE, 0xDD, 0xDD, 0xCA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x99, 0xAB,
- 0xCE, 0xDD, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9B, 0xBD, 0xDD,
- 0xCC, 0xBA, 0x87, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCE, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xCD, 0xCC, 0xBA, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x8A, 0xBC, 0xDD, 0xCD, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78,
- 0x9A, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBC, 0xDD, 0xEE,
- 0xCE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xED, 0xEE,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEE, 0xFE, 0xDE, 0xEE, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xEE, 0xFF, 0xEC, 0xEF, 0xEE, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFE, 0x8D, 0xDD, 0xDC, 0xDC, 0xDD, 0xDD,
- 0xDD, 0xDE, 0xEF, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xAA, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xAB, 0xBB, 0x8B, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDB, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x88,
- 0x88, 0x99, 0x99, 0xAA, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x88,
- 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBB, 0xAA, 0xA9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBA,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xA9,
- 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x89, 0x9A, 0xAB, 0xCB,
- 0xAC, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCB, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xCB, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xDB, 0xDC, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCD, 0xDD, 0xEC, 0x8B, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA,
- 0xBB, 0xBB, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0x9B, 0xCC,
- 0xBB, 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xBC, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x99, 0x9A, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0x9A, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBB,
- 0xAB, 0xAA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBB,
- 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCB, 0xBC, 0xBB, 0xBA,
- 0xAA, 0xA9, 0x9A, 0xAA, 0xAB, 0xBB, 0xCD, 0xCB, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8C, 0xDD,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xDC, 0xCD, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xCB, 0xCB, 0xAA, 0x99, 0x98,
- 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xCB, 0xBC, 0xAA, 0x98, 0x88, 0x77, 0x78,
- 0x88, 0x99, 0xAB, 0xBC, 0xBB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBB,
- 0xAA, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9,
- 0x87, 0x76, 0x55, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBC, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x89, 0x9A, 0xAB, 0xCC,
- 0xBC, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCB, 0xCC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xCC, 0xDC, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0x8B, 0xBB, 0xBB, 0xBA, 0xAA, 0xBB,
- 0xBB, 0xBC, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xED, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7E, 0xFF,
- 0xFE, 0xDD, 0xDC, 0xCD, 0xDD, 0xCE, 0xEE, 0xFF, 0xFD, 0xDF, 0xDD, 0xDC,
- 0xDC, 0xCC, 0xBC, 0xCC, 0xCD, 0xDD, 0xFE, 0xDD, 0xEE, 0xDC, 0xBB, 0xBB,
- 0xAA, 0xBB, 0xBB, 0xDD, 0xDE, 0xED, 0xDE, 0xDD, 0xBA, 0xA9, 0x99, 0x99,
- 0xAA, 0xBB, 0xCD, 0xDD, 0xDD, 0xDC, 0xBB, 0xA9, 0x88, 0x88, 0x89, 0x9A,
- 0xBC, 0xDE, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDD, 0xDC, 0xBA, 0x87, 0x65, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDC,
- 0xDD, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xBC, 0xCE, 0xDC, 0xDB,
- 0xA9, 0x86, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xCD, 0xDD, 0xCD, 0xCA, 0x98,
- 0x75, 0x43, 0x34, 0x57, 0x89, 0xAC, 0xCE, 0xCC, 0xDB, 0xB9, 0x87, 0x65,
- 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xFD, 0xCD, 0xCB, 0xA9, 0x87, 0x65, 0x56,
- 0x67, 0x89, 0xBC, 0xDD, 0xDC, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xCD,
- 0xDF, 0xEC, 0xED, 0xDB, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xDE,
- 0xCF, 0xDD, 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xDF, 0xED, 0xFE,
- 0xDD, 0xCC, 0xCB, 0xCB, 0xCC, 0xCD, 0xDE, 0xEE, 0xFD, 0xDF, 0xEF, 0xFD,
- 0xDD, 0xDD, 0xDC, 0xED, 0xED, 0xEE, 0xFF, 0xFD, 0xFF, 0xFD, 0xEE, 0xED,
- 0xDD, 0xDF, 0xEE, 0xFE, 0xFF, 0xFF, 0x8D, 0xDD, 0xDC, 0xCD, 0xDD, 0xCD,
- 0xCD, 0xDD, 0xED, 0xEE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xCF, 0xCD, 0xCC, 0xCC, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD,
- 0xFF, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xCC, 0xBB,
- 0xCC, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBA, 0xAA, 0xAB, 0xBC,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xA9, 0x87, 0x66, 0x78, 0x9B, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xDC, 0xBA, 0x86, 0x54, 0x45, 0x78, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xFB, 0xA8, 0x64, 0x22, 0x46, 0x89, 0xBD, 0xFF, 0xFF, 0xDF, 0xDC, 0xB9,
- 0x86, 0x42, 0x24, 0x68, 0x9B, 0xDD, 0xFF, 0xFF, 0xFF, 0xCC, 0xA8, 0x75,
- 0x44, 0x56, 0x8A, 0xBF, 0xFF, 0xFF, 0xFF, 0xCF, 0xCA, 0x98, 0x76, 0x66,
- 0x79, 0xAD, 0xFF, 0xFF, 0xFF, 0xFD, 0xFD, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xDC, 0xFF, 0xFF, 0xDF, 0xFF, 0xDC, 0xCA, 0xAA, 0xAA, 0xAB, 0xCF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xCC, 0xBB, 0xCC, 0xFD, 0xDF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xFF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFD, 0xDD, 0xDC, 0xCC, 0xCB, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF,
- 0xEE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDC, 0xED, 0xDF, 0xFC, 0xFF, 0xEE, 0xDC,
- 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xDF, 0xFD, 0xCC, 0xBB, 0xAB,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xED, 0xDD, 0xDC, 0xBB, 0xAA, 0x99, 0x99,
- 0x9A, 0xBC, 0xCD, 0xDD, 0xDD, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0x9A,
- 0xBB, 0xCD, 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xED,
- 0xCC, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAC, 0xDE, 0xDC, 0xCB,
- 0xA9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xBC, 0xDD, 0xDC, 0xBA, 0x98,
- 0x75, 0x43, 0x34, 0x56, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x89, 0xBC, 0xDE, 0xDC, 0xCC, 0xBA, 0x98, 0x87, 0x76, 0x77, 0x89,
- 0xAB, 0xCD, 0xEE, 0xCD, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xCD,
- 0xDE, 0xFC, 0xED, 0xBB, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xBD, 0xDF, 0xFE,
- 0xCD, 0xED, 0xCB, 0xBB, 0xBA, 0xAA, 0xBB, 0xCC, 0xED, 0xFF, 0xEC, 0xEE,
- 0xDC, 0xCC, 0xCC, 0xBC, 0xCC, 0xDD, 0xDF, 0xEF, 0xFF, 0xCD, 0xED, 0xDD,
- 0xCD, 0xCD, 0xDC, 0xDD, 0xDF, 0xEF, 0xFF, 0xFC, 0xFF, 0xFD, 0xEE, 0xED,
- 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDC, 0xCD, 0xCD, 0xDD, 0xED,
- 0xEE, 0xFE, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xAF, 0xFF,
- 0xFD, 0xDC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFE, 0xFF, 0xED, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xEE, 0xED, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xFE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xDD, 0xDD, 0xDB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xDD,
- 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9B, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDE, 0xCC, 0xBA, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xDF, 0xED, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A, 0xAB, 0xCD, 0xFF,
- 0xDD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xFF, 0xFD, 0xED,
- 0xCC, 0xBB, 0xBA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xFF, 0xDF, 0xED, 0xDC,
- 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xFD, 0xFF, 0xED, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xAD, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD,
- 0xDE, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xED, 0xDC, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0x9F, 0xFF,
- 0xFE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFD, 0xFE, 0xEE, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xDE, 0xEE, 0xDE, 0xFF, 0xDC, 0xBB, 0xAA,
- 0x99, 0xAA, 0xAB, 0xCC, 0xCE, 0xDD, 0xED, 0xEC, 0xBA, 0x99, 0x88, 0x88,
- 0x9A, 0xAB, 0xBC, 0xEE, 0xCD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAB, 0xCC, 0xED, 0xDD, 0xCA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xDC, 0xBA, 0x97, 0x65, 0x54, 0x55, 0x66, 0x78, 0xAB, 0xBD, 0xCC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xCC, 0xA9, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCB, 0xA8, 0x76, 0x65,
- 0x54, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBD, 0xDD, 0xDD, 0xCB, 0xA9, 0x88, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDF, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xBC, 0xCE, 0xFE,
- 0xDD, 0xDC, 0xBB, 0xBA, 0xA9, 0xAA, 0xAA, 0xBC, 0xDE, 0xDF, 0xFD, 0xFD,
- 0xCC, 0xCB, 0xBB, 0xBA, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xDF, 0xDD, 0xDC,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFD, 0xEE, 0xDE, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0x9C, 0xCC, 0xCC, 0xCD, 0xDC, 0xED,
- 0xEE, 0xEF, 0xFF, 0xFE, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xED, 0xDD, 0xCC, 0xDD, 0x8F, 0xFF,
- 0xFF, 0xFE, 0xFE, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xDD, 0xDD, 0xDC, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xCC,
- 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xFF, 0xDE, 0xDC, 0xBB, 0xAA, 0xAA,
- 0xAA, 0xCC, 0xCF, 0xFF, 0xDF, 0xFF, 0xCC, 0xBA, 0x98, 0x88, 0x99, 0xAB,
- 0xCD, 0xFD, 0xFF, 0xED, 0xED, 0xBA, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xFF, 0xDD, 0xED, 0xCB, 0x97, 0x65, 0x55, 0x67, 0x89, 0xBC, 0xFF, 0xEF,
- 0xEF, 0xDB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xEF, 0xED, 0xEC,
- 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDF, 0xFE, 0xDE, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x57, 0x89, 0xCD, 0xEF, 0xFD, 0xEC, 0xCA, 0x97, 0x65,
- 0x44, 0x45, 0x79, 0xAB, 0xDE, 0xDF, 0xFE, 0xDC, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x9A, 0xCD, 0xFF, 0xFE, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x78, 0x9A,
- 0xBC, 0xEF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDE,
- 0xFF, 0xFF, 0xDF, 0xCC, 0xBB, 0xAA, 0xA9, 0xAB, 0xBC, 0xDD, 0xFE, 0xFF,
- 0xDF, 0xEE, 0xEC, 0xCC, 0xBB, 0xBC, 0xBD, 0xED, 0xFF, 0xFF, 0xFF, 0xEF,
- 0xFD, 0xDD, 0xCC, 0xDC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xCF, 0xDE, 0xEF,
- 0xDE, 0xFD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xEE,
- 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCB, 0xCD, 0xDE, 0xFF, 0xEE,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xED, 0xDB, 0xCC, 0xBA, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0x7F, 0xFD,
- 0xCD, 0xCB, 0xBA, 0xBB, 0xBB, 0xBF, 0xDC, 0xDC, 0xFD, 0xDD, 0xDC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xED, 0xCF, 0xEC, 0xDC, 0xBA, 0xAA, 0x99,
- 0x98, 0x99, 0xAA, 0xBB, 0xCD, 0xDF, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88,
- 0x99, 0x9A, 0xBC, 0xCE, 0xDC, 0xDB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xCD, 0xCF, 0xCC, 0xB9, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAA,
- 0xCC, 0xDC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAC, 0xCC,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDB, 0xCA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAA, 0xCC, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9A, 0xBD, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x89, 0xAC, 0xCF, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xCC, 0xDB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xDD,
- 0xDF, 0xCB, 0xAA, 0xA9, 0x98, 0x99, 0x9A, 0xAB, 0xBD, 0xDF, 0xFC, 0xEE,
- 0xDB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBD, 0xDE, 0xFF, 0xCF, 0xDD, 0xDD,
- 0xBC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xDD, 0xDD, 0xED, 0xCD, 0xCD,
- 0xDC, 0xCC, 0xCE, 0xDF, 0xFF, 0xFF, 0x8D, 0xBB, 0xED, 0xCC, 0xCB, 0xCD,
- 0xCF, 0xDD, 0xDF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xCB, 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xAA, 0xBB, 0x7C, 0xDC,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDC, 0xCC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xCB, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBC, 0xDC, 0xBB, 0xAA, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x99, 0xAA, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xAB, 0xB9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAB,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xB9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xB9, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAC, 0xBA, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCC,
- 0xBB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAB, 0xCD, 0xCB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCC, 0xDE, 0xBC, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xCE, 0xDB, 0xDE, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xED, 0x9C, 0xCB, 0xBB, 0xAB, 0xAA, 0xBA,
- 0xBB, 0xBB, 0xCD, 0xDD, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9C, 0xCC,
- 0xBB, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x65, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xBB,
- 0xAA, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xDC, 0xBC, 0xBB, 0xAA,
- 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCD, 0xDB, 0xCD, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0x9C, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xCC, 0xDD, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCC, 0xCB, 0xBA, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xBB, 0x8C, 0xCD,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xCC, 0xBA, 0xBA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xCC, 0xCC, 0xCB, 0xA9, 0x99, 0x88,
- 0x88, 0x89, 0x99, 0x9A, 0xBB, 0xCB, 0xBB, 0xAA, 0x98, 0x88, 0x77, 0x78,
- 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xBB,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9,
- 0x87, 0x76, 0x55, 0x55, 0x56, 0x67, 0x79, 0x9A, 0xBB, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBC, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x9A, 0xBB, 0xCB,
- 0xAB, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xCB, 0xDB,
- 0xAA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDB, 0xCC, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xCE, 0xDD, 0x7B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xBB, 0xCB, 0xCC, 0xCC, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDC, 0xFE, 0xCD, 0xCC, 0xDD, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xFF, 0xDF, 0xFF, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDC,
- 0xBD, 0xDF, 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDC, 0xCC, 0xBB,
- 0xCC, 0xFF, 0xDF, 0xFF, 0xFD, 0xFF, 0xFD, 0xCB, 0xAA, 0xAA, 0xAC, 0xBB,
- 0xBE, 0xDF, 0xFF, 0xEF, 0xDF, 0xDC, 0xA9, 0x98, 0x89, 0xAA, 0xCB, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xCC, 0xA9, 0x86, 0x66, 0x78, 0xAB, 0xCD, 0xFF, 0xFD,
- 0xFF, 0xFD, 0xBA, 0x86, 0x54, 0x45, 0x79, 0xAC, 0xCF, 0xDF, 0xFF, 0xFF,
- 0xCC, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBE, 0xDF, 0xFF, 0xFF, 0xFD, 0xCA,
- 0x86, 0x42, 0x24, 0x68, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x75,
- 0x44, 0x56, 0x8A, 0xCD, 0xDF, 0xFE, 0xFF, 0xFD, 0xDB, 0x98, 0x76, 0x66,
- 0x89, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x99, 0x88, 0x89, 0xBB,
- 0xDD, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xA9, 0x9A, 0xBC, 0xDD, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBC, 0xBB, 0xCC, 0xCC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDC, 0xFD, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDC, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xCD, 0xDF, 0xFD, 0xEE, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xDF, 0xFF, 0xFD, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD,
- 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xCC, 0xCF,
- 0xDD, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xCF, 0xDD, 0xBB, 0xBA, 0xAC, 0xCB,
- 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x99, 0x89, 0xAA, 0xAF, 0xFF,
- 0xFF, 0xFF, 0xCF, 0xFC, 0xBA, 0x87, 0x66, 0x79, 0xAB, 0xDD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xCB, 0x97, 0x54, 0x45, 0x79, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xB9, 0x64, 0x22, 0x46, 0x8A, 0xDD, 0xDD, 0xFF, 0xFF, 0xFD, 0xDC,
- 0x96, 0x42, 0x23, 0x69, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFC, 0xB9, 0x75,
- 0x44, 0x57, 0x9B, 0xBF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xA9, 0x76, 0x66,
- 0x89, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xA9, 0x88, 0x99, 0xAD,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xAA, 0xAB, 0xCC, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xDB, 0xBB, 0xBF, 0xCF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDD, 0xFD, 0xFD, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDC, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xDF, 0xFD, 0xFF, 0xFA, 0xBD,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x89, 0x99, 0x98, 0x88, 0x88, 0x88, 0x88, 0x98, 0x98, 0x9A, 0x6A, 0xCB,
- 0x9A, 0xA9, 0x99, 0x99, 0xAA, 0x9A, 0xAB, 0xAA, 0xDA, 0x9A, 0xA9, 0x89,
- 0x99, 0x89, 0x99, 0x89, 0x8A, 0x99, 0xAA, 0x9A, 0xAA, 0x99, 0x88, 0x88,
- 0x88, 0x88, 0x89, 0xA9, 0xAA, 0xAA, 0x89, 0xA9, 0x98, 0x88, 0x88, 0x88,
- 0x88, 0x89, 0x9A, 0xB9, 0xA9, 0xA9, 0x98, 0x78, 0x77, 0x77, 0x77, 0x88,
- 0x89, 0x9A, 0xA9, 0x89, 0x98, 0x87, 0x76, 0x76, 0x77, 0x77, 0x88, 0x99,
- 0x9A, 0xA8, 0x98, 0x88, 0x76, 0x66, 0x66, 0x77, 0x77, 0x88, 0x89, 0x98,
- 0x89, 0x98, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x88, 0x9B, 0xA8, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x66, 0x77, 0x88, 0x98, 0xA8, 0x89, 0x88, 0x87,
- 0x76, 0x65, 0x56, 0x67, 0x77, 0x88, 0x99, 0x98, 0x99, 0x78, 0x77, 0x66,
- 0x65, 0x66, 0x67, 0x78, 0x8A, 0x99, 0x89, 0x98, 0x78, 0x77, 0x66, 0x66,
- 0x67, 0x77, 0x88, 0xAB, 0x98, 0x99, 0x89, 0x87, 0x77, 0x76, 0x67, 0x77,
- 0x88, 0x89, 0xA9, 0x9A, 0x9A, 0x98, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89,
- 0x9B, 0x98, 0xA9, 0x99, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x9A, 0xA9,
- 0x8A, 0x99, 0x99, 0x89, 0x88, 0x88, 0x88, 0x99, 0x8A, 0xAA, 0xA9, 0xAB,
- 0xAA, 0x98, 0x88, 0x89, 0x88, 0x89, 0x9A, 0xBA, 0xA9, 0xAC, 0xBA, 0xB9,
- 0xAA, 0x99, 0x99, 0x9A, 0x99, 0xAA, 0xAD, 0xA9, 0xBA, 0xAB, 0xAB, 0xA9,
- 0x9A, 0x9A, 0xBA, 0xAA, 0x9C, 0xBB, 0x8B, 0xA9, 0xA8, 0x99, 0x98, 0x88,
- 0x99, 0x9A, 0xAA, 0xAB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFE, 0xDD, 0xCC, 0xCC, 0xDC, 0xDD, 0xED, 0xEF, 0xDF, 0xFF,
- 0xED, 0xDC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFE, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, 0xFD, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xFF, 0xFD, 0xCB, 0xA9, 0x98, 0x87, 0x88,
- 0x89, 0x9A, 0xBC, 0xFF, 0xFE, 0xDC, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xDF, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCD, 0xEE, 0xBB, 0x98, 0x76, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDF,
- 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x45, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCB, 0xA9, 0x87,
- 0x65, 0x55, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9B, 0xCD, 0xEC, 0xCA, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDF, 0xDC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xDF, 0xFF, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xFF,
- 0xFE, 0xCB, 0xBA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xFF, 0xFF, 0xFD,
- 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xFF, 0xFF, 0xFF, 0xEF, 0xDD,
- 0xCB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD,
- 0xDD, 0xDE, 0xDE, 0xFF, 0xFF, 0xFF, 0xCF, 0xFE, 0xFE, 0xFE, 0xEF, 0xDD,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAA, 0x99, 0xA9, 0x89, 0x89, 0x99, 0x98, 0x99, 0xBB, 0x6B, 0xAB,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xBA, 0xAB, 0xBE, 0xFB, 0x9B, 0xAA, 0x99,
- 0x99, 0x99, 0x99, 0xA9, 0xAC, 0x9B, 0xBA, 0xC9, 0xB9, 0xA9, 0x99, 0x88,
- 0x89, 0x88, 0x89, 0xAA, 0xAA, 0xBA, 0x99, 0x99, 0x88, 0x88, 0x77, 0x87,
- 0x88, 0x89, 0xAA, 0xAA, 0xA9, 0x9A, 0x88, 0x87, 0x77, 0x77, 0x78, 0x88,
- 0x99, 0xAA, 0xA9, 0x9A, 0x99, 0x87, 0x76, 0x66, 0x67, 0x77, 0x88, 0x99,
- 0xBB, 0xA9, 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x78, 0x88, 0x99, 0xB9,
- 0x9A, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x77, 0x78, 0x8A, 0xA9, 0x99, 0x99, 0x87,
- 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xA8, 0x99, 0x98, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x99, 0xA9, 0x99, 0x98, 0x98, 0x77, 0x66, 0x66,
- 0x67, 0x78, 0x98, 0x9B, 0xA9, 0x99, 0x98, 0x87, 0x77, 0x66, 0x77, 0x77,
- 0x89, 0x99, 0xCA, 0x9A, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0x99, 0xBA, 0x99, 0x88, 0x88, 0x87, 0x88, 0x88, 0x89, 0x9B, 0xB9,
- 0xAB, 0xA9, 0xAA, 0x88, 0x88, 0x88, 0x88, 0x9A, 0xBA, 0xAB, 0xA9, 0xEA,
- 0xAA, 0x9A, 0xA9, 0x9A, 0x89, 0x99, 0x9A, 0xAC, 0xAB, 0xAC, 0xDA, 0xBA,
- 0xAA, 0x9A, 0x99, 0xAA, 0xAB, 0xBA, 0xCC, 0xAA, 0xFB, 0xDB, 0xBA, 0xAA,
- 0xAA, 0xBA, 0xBB, 0xBB, 0xFC, 0xFB, 0x7A, 0x99, 0x99, 0x99, 0x99, 0x99,
- 0x99, 0x9A, 0xAA, 0xAB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xA9, 0xAA, 0xBB, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x98, 0x77, 0x89, 0xAF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xA8, 0x54, 0x46, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xDA, 0x74, 0x12, 0x47, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xA7, 0x42, 0x24, 0x79, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x86,
- 0x44, 0x57, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x87, 0x77,
- 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBA, 0x9A, 0xAB, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x8A, 0x98, 0x88, 0x87, 0x77, 0xF7, 0x6F, 0x88, 0x8F, 0xAA, 0x59, 0xFA,
- 0xAF, 0xAF, 0x8A, 0x87, 0x8A, 0xA8, 0xFA, 0xA9, 0xF9, 0x9A, 0xAF, 0x98,
- 0x9A, 0x79, 0x89, 0x78, 0x9A, 0xFA, 0xFF, 0xAC, 0x88, 0x8F, 0x87, 0x88,
- 0xA8, 0x89, 0x9A, 0x87, 0xAF, 0xFA, 0x7A, 0xA9, 0x87, 0x78, 0x77, 0x98,
- 0x78, 0x89, 0xAA, 0xFA, 0xA8, 0x98, 0x99, 0x87, 0x78, 0x87, 0x77, 0x87,
- 0x87, 0xFA, 0xE8, 0x8B, 0x97, 0x76, 0x88, 0x77, 0x67, 0x77, 0x78, 0x78,
- 0x8A, 0x87, 0xA9, 0x8F, 0x77, 0x77, 0x67, 0x97, 0x88, 0x78, 0x99, 0xA8,
- 0x79, 0x89, 0x77, 0x76, 0x66, 0x76, 0x77, 0x77, 0x8F, 0x89, 0x98, 0xF9,
- 0x88, 0x97, 0x66, 0x57, 0x67, 0x78, 0x77, 0xA9, 0x88, 0x78, 0x87, 0x87,
- 0x66, 0x66, 0x66, 0x67, 0x68, 0x97, 0xF9, 0x88, 0xA8, 0x78, 0x87, 0x76,
- 0x66, 0x77, 0x68, 0x77, 0x88, 0x89, 0x99, 0xA8, 0x78, 0x77, 0x77, 0x76,
- 0x67, 0x76, 0x77, 0x89, 0xA9, 0x8A, 0x87, 0x87, 0x77, 0x68, 0x76, 0x76,
- 0x88, 0x9A, 0x9A, 0xAA, 0xA7, 0x97, 0x87, 0x87, 0x87, 0x77, 0x99, 0x77,
- 0x9A, 0x87, 0x9A, 0x99, 0x79, 0x79, 0x76, 0x87, 0x98, 0x99, 0xA8, 0x88,
- 0x98, 0x9A, 0xA9, 0x99, 0x97, 0x98, 0x8A, 0x98, 0x9A, 0xFF, 0xA8, 0xFA,
- 0x7F, 0x8A, 0x8F, 0x98, 0x8A, 0xA8, 0xFF, 0xF9, 0xA8, 0xAF, 0x99, 0x99,
- 0x88, 0x99, 0xAA, 0x98, 0x9A, 0xAA, 0xAF, 0xAA, 0xFA, 0xF9, 0x9A, 0xFA,
- 0xF9, 0x8A, 0xA8, 0x98, 0xAF, 0xA9, 0x9F, 0xFA, 0x89, 0x87, 0x78, 0x98,
- 0x87, 0x8A, 0x87, 0x99, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xBF, 0xFF, 0xFF, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xBF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x88, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xF8, 0x65, 0x57, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0x84, 0x12, 0x58, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF8, 0x52, 0x14, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x96,
- 0x54, 0x68, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0x89,
- 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFB, 0xFF, 0xFF, 0xFF, 0xBF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xEF, 0xFE, 0xEF, 0xFF, 0xFE, 0xEE, 0xE5, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE,
- 0xEE, 0xEE, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0x5F, 0xFF,
- 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0x5E,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xE5,
- 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0x55, 0xF5, 0x5F, 0xF5, 0xFF, 0x5F, 0x5F,
- 0xFF, 0xFF, 0xF4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF5, 0xFF, 0xF5, 0xFF, 0x5F, 0x4F, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xE3, 0xE5, 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xE5, 0x4E,
- 0xEE, 0x5E, 0x5E, 0xE5, 0x5E, 0x5E, 0x55, 0xEE, 0xEE, 0x54, 0xEE, 0xE5,
- 0x5E, 0xE5, 0xE6, 0x5E, 0xEE, 0xEE, 0xEE, 0xEF, 0xF5, 0xFF, 0xF5, 0xFF,
- 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xF5, 0xFF, 0x5F, 0xFF,
- 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0x5F, 0xF5, 0x5F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0x5F,
- 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFE, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x78, 0xF6, 0x66, 0x68, 0x76, 0x67, 0x67, 0x98, 0x78, 0x7F, 0x68, 0x98,
- 0x9F, 0xF8, 0xF7, 0xFE, 0x8F, 0xFF, 0x9F, 0xFF, 0x9F, 0x88, 0x7F, 0x88,
- 0x9F, 0x79, 0x9F, 0xFF, 0x8F, 0x9F, 0xF9, 0x96, 0x99, 0x97, 0x78, 0x67,
- 0xF7, 0x98, 0xFF, 0x79, 0x99, 0xF8, 0x77, 0xF8, 0x89, 0x97, 0x78, 0x89,
- 0xF7, 0x8F, 0xFF, 0xFF, 0x78, 0x99, 0x79, 0x97, 0x97, 0x77, 0x99, 0x7F,
- 0x79, 0x99, 0x98, 0x77, 0x9F, 0x67, 0x67, 0x67, 0x78, 0x98, 0x9F, 0x99,
- 0x89, 0xF6, 0x9F, 0x79, 0x78, 0x76, 0x66, 0xF8, 0x78, 0x89, 0x78, 0xF8,
- 0x87, 0x88, 0x99, 0x87, 0x77, 0x69, 0x79, 0x78, 0xF7, 0x9F, 0x77, 0xF9,
- 0x99, 0x76, 0x77, 0x77, 0x68, 0x87, 0x78, 0x9F, 0x97, 0x88, 0x78, 0x89,
- 0x97, 0x76, 0x77, 0x77, 0x89, 0x8F, 0x8F, 0x67, 0x89, 0x98, 0x89, 0x78,
- 0x77, 0x87, 0x78, 0x79, 0x78, 0x96, 0x68, 0x9F, 0xA8, 0x97, 0x78, 0x78,
- 0x8F, 0x89, 0x79, 0x8F, 0x67, 0xFF, 0x8F, 0x99, 0x77, 0x66, 0x66, 0x76,
- 0x86, 0xF8, 0xF6, 0x99, 0x9F, 0x7F, 0x89, 0x97, 0x79, 0x88, 0x6F, 0x88,
- 0x89, 0x68, 0xFF, 0xFF, 0xF9, 0x98, 0x89, 0xF8, 0xFF, 0x98, 0x9F, 0xF7,
- 0x78, 0x79, 0xF9, 0x77, 0x89, 0xF8, 0x97, 0x89, 0xF9, 0x98, 0x77, 0x9F,
- 0x9F, 0x89, 0x9F, 0x99, 0x98, 0x9F, 0x99, 0x9F, 0x98, 0x89, 0x98, 0xFF,
- 0x9F, 0xF8, 0xF9, 0x88, 0x9F, 0x7F, 0xF9, 0x67, 0xFF, 0x99, 0x98, 0xF9,
- 0xFF, 0x89, 0x9F, 0xFF, 0x9F, 0xF9, 0x59, 0x77, 0x98, 0x68, 0x96, 0x77,
- 0x68, 0x89, 0xF7, 0x6F, 0x60, 0x00, 0x00, 0x00,
- ],
- [
- 0x68, 0x89, 0x78, 0x77, 0x67, 0x88, 0x88, 0xFF, 0x79, 0x99, 0x69, 0xF9,
- 0xF9, 0x88, 0x87, 0x79, 0x8F, 0xF9, 0xF8, 0xF9, 0xF7, 0x8F, 0x98, 0x78,
- 0x79, 0xF9, 0xF8, 0x88, 0x79, 0x7F, 0xF9, 0x97, 0xFF, 0x8F, 0x98, 0x78,
- 0x77, 0x67, 0xF8, 0xF9, 0xFF, 0xF9, 0x78, 0xF8, 0x88, 0x87, 0x88, 0x77,
- 0x98, 0xF7, 0x98, 0xFF, 0x98, 0x9F, 0xF8, 0x98, 0x87, 0x76, 0x79, 0x97,
- 0x78, 0x89, 0x8C, 0x77, 0x88, 0x78, 0x77, 0x77, 0x88, 0x77, 0x78, 0x79,
- 0x9F, 0x88, 0x79, 0x77, 0x77, 0x77, 0x67, 0x77, 0x77, 0x8F, 0x99, 0x97,
- 0x87, 0x77, 0x78, 0x87, 0x78, 0x76, 0x77, 0x78, 0x9F, 0x99, 0xF7, 0x77,
- 0x98, 0x76, 0x76, 0x77, 0x68, 0x7F, 0x78, 0xFF, 0xF9, 0x78, 0x88, 0x87,
- 0x88, 0x76, 0x67, 0x88, 0x79, 0x78, 0xF9, 0x87, 0x89, 0x97, 0x77, 0x68,
- 0x67, 0x77, 0x77, 0x77, 0x8E, 0x78, 0x78, 0x8A, 0x88, 0x77, 0x87, 0x77,
- 0x67, 0x88, 0x88, 0x8F, 0x87, 0x89, 0x88, 0x77, 0x76, 0x77, 0x79, 0x77,
- 0x77, 0x8F, 0x88, 0x79, 0xF8, 0x77, 0x78, 0x77, 0x88, 0x77, 0x78, 0x98,
- 0x89, 0x89, 0xFF, 0xF8, 0x88, 0x99, 0x77, 0x98, 0x78, 0x87, 0x99, 0x99,
- 0x98, 0xF8, 0x98, 0xFF, 0xFF, 0x79, 0x88, 0x77, 0x79, 0x8F, 0x88, 0xF8,
- 0x88, 0xFF, 0x88, 0x78, 0x99, 0x9F, 0x88, 0xF9, 0xF8, 0x88, 0x99, 0xB9,
- 0xF7, 0x88, 0x99, 0xF9, 0x99, 0x9F, 0xFF, 0x99, 0xFF, 0x8F, 0x98, 0x8F,
- 0x89, 0x99, 0xF8, 0x99, 0x8F, 0xF9, 0x5F, 0x89, 0x77, 0x87, 0x99, 0x78,
- 0x88, 0x77, 0xF8, 0x8F, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x5E, 0xDE, 0xE5, 0xDE, 0xEE, 0xED, 0xDD, 0xDE, 0xEE, 0xEE, 0x4E, 0xED,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED,
- 0xDD, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xDD,
- 0x5D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD5, 0x45, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE,
- 0x5E, 0xEE, 0xEE, 0xEE, 0xE5, 0xE5, 0xEE, 0xE5, 0x54, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0x45, 0xEE, 0xEE, 0x55, 0xEE, 0xEE, 0xE5, 0xED, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x5D, 0xDD, 0xDD, 0xDD, 0x55, 0xDD, 0xDD,
- 0x55, 0x5D, 0x4D, 0xDD, 0xDD, 0x45, 0xDD, 0x5D, 0xDD, 0xDD, 0xDD, 0xDD,
- 0x54, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0x5E, 0xEE, 0x5E, 0xEE,
- 0xEE, 0x5E, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0x4E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xEE, 0xE4, 0xE5, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE, 0xEE, 0x5E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xED,
- 0xEE, 0xED, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xED, 0xED,
- 0xEE, 0xEE, 0xEE, 0x5E, 0xEE, 0xEE, 0xED, 0xED, 0xEE, 0xE5, 0xEE, 0xEE,
- 0xED, 0xED, 0xED, 0xEE, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xF9, 0xF8, 0xF9, 0x4F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xF8, 0x64, 0x68, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0x85, 0x12, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x52, 0x14, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9,
- 0x54, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x59, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xF7, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x7F, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xF6,
- 0xF6, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF7, 0xF6, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0x66, 0xF6,
- 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x67, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFD, 0xBF, 0xF7, 0xF7, 0x6F, 0x66, 0x6F, 0x66, 0xF6, 0xFF,
- 0xFF, 0xF6, 0xF6, 0xFF, 0x75, 0x76, 0xF5, 0x66, 0x66, 0x66, 0xFF, 0xFF,
- 0xF6, 0xFF, 0xFF, 0xF5, 0x57, 0x66, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xF6,
- 0xFF, 0x56, 0x56, 0x75, 0x77, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xF7, 0xF6,
- 0xF6, 0xF6, 0x44, 0xF5, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66,
- 0x56, 0x75, 0x56, 0xF6, 0xFF, 0xFD, 0xC6, 0xAF, 0xF6, 0x6F, 0xFF, 0x55,
- 0x57, 0x5F, 0x7F, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x65, 0x6F, 0xFF, 0x68,
- 0x7F, 0xFF, 0xFF, 0x6F, 0xFF, 0xF6, 0xF6, 0x5F, 0x65, 0x6F, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF6, 0x6F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF,
- 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x7F, 0x7F, 0xFF, 0xFF, 0x7F,
- 0xFF, 0x7F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFD, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x61, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- ],
- [
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xED,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED,
- 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xED,
- 0xD5, 0x55, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xE5, 0xE5, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xEE, 0xE5, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0x5E, 0x5E, 0xEE, 0x55, 0x54, 0xEE, 0xEE, 0xEE, 0xEE, 0xED,
- 0xDD, 0xDD, 0xD5, 0x5D, 0x44, 0x5D, 0xDD, 0xDD, 0xDD, 0xDD, 0x5D, 0xD5,
- 0xD5, 0x5D, 0xDD, 0xD3, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x5D,
- 0xD4, 0x35, 0x5D, 0xDD, 0xDD, 0xDD, 0xDD, 0xD5, 0x5E, 0xE4, 0x54, 0x53,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE, 0x5E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xEE, 0x5E, 0xEE, 0xE5, 0x5E, 0xEE, 0x5E,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xE5, 0xEE, 0xEE, 0xED, 0xEE, 0xED, 0xDD, 0xED, 0xED, 0xED, 0xED, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xEE, 0xEE, 0xED,
- 0xEE, 0xED, 0xED, 0xEE, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDC, 0xCD, 0xCC, 0xCC, 0xDC, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD, 0xEF,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDF, 0xEF, 0xFF, 0xFF, 0xDF, 0xFD, 0xDC,
- 0xBB, 0xBB, 0xAA, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xED, 0xCC, 0xBB, 0xA9,
- 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xCD, 0xCC, 0xBA, 0x99, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xDF, 0xEC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xEE, 0xDD, 0xBA, 0xA8, 0x87, 0x76, 0x66, 0x67, 0x88, 0x9A,
- 0xCD, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x67, 0x89, 0xAB, 0xCD,
- 0xCC, 0xA9, 0x87, 0x76, 0x55, 0x55, 0x56, 0x77, 0x89, 0xBD, 0xDC, 0xCB,
- 0x98, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xCC, 0xA9, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAD, 0xCD, 0xCA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x66, 0x78, 0x9A, 0xCC, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x55,
- 0x56, 0x77, 0x8A, 0xBC, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x67,
- 0x89, 0xAB, 0xCD, 0xEC, 0xCA, 0x98, 0x87, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBC, 0xDE, 0xDC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x89, 0x9A, 0xBC, 0xDC,
- 0xFE, 0xEC, 0xBA, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xCD, 0xDF, 0xFE,
- 0xDC, 0xBB, 0xA9, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xEE, 0xFF, 0xFF, 0xDC,
- 0xCB, 0xBA, 0xAB, 0xBB, 0xCC, 0xDD, 0xDE, 0xDF, 0xFF, 0xFF, 0xED, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xED, 0xDF, 0xFF, 0xDF, 0xDD, 0xDD, 0xDC,
- 0xCC, 0xCD, 0xED, 0xCE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xED, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E,
- 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD4, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0x4E, 0x4E, 0x4E, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xE4, 0xE3, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0x4D, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0x44, 0x4D, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0x4E, 0xE4, 0xEE, 0x3E, 0x4E,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE3, 0xEE, 0xE5, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E, 0x3E, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xED, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x9C, 0xBB, 0xAA, 0xAA, 0xAA, 0x9A, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xCC,
- 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xAB, 0xCD, 0xDB, 0xCB, 0xAA, 0x99, 0x99,
- 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC, 0xAB, 0xAA, 0xA9, 0x98, 0x88, 0x88,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9,
- 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87,
- 0x66, 0x65, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x66, 0x78, 0x99, 0xAA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x99, 0xAA, 0xAB, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA,
- 0xBB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCC,
- 0xBA, 0x99, 0x98, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xDD, 0xCC, 0xBA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBD, 0xDD, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xBC, 0xCB, 0xBA, 0xAA, 0xA9, 0x9A,
- 0xAA, 0xAA, 0xBA, 0xBC, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCC, 0xBB, 0xCC,
- 0xCA, 0xAA, 0xAA, 0x9A, 0xA9, 0xAA, 0xBB, 0xBD, 0xDC, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x98, 0x99, 0xA9, 0xAB, 0xBB, 0xCB, 0xBA, 0xAA, 0x99, 0x88,
- 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBB, 0xAA, 0xA9, 0x98, 0x88, 0x88, 0x77,
- 0x88, 0x88, 0x9A, 0xAB, 0xAA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x88, 0x99, 0xBA, 0x9A, 0x99, 0x88, 0x77, 0x76, 0x66, 0x77, 0x77, 0x89,
- 0x9A, 0xA9, 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, 0x78, 0x89, 0xAA,
- 0x99, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x99,
- 0x88, 0x76, 0x66, 0x66, 0x66, 0x67, 0x77, 0x89, 0x99, 0x99, 0x98, 0x77,
- 0x66, 0x66, 0x56, 0x66, 0x67, 0x78, 0x99, 0x99, 0xA9, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x66, 0x77, 0x89, 0xA9, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x99, 0x99, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x78, 0x89, 0xA9, 0xAA, 0x99, 0x88, 0x77, 0x76, 0x67, 0x77, 0x78, 0x89,
- 0x9A, 0x9A, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, 0x88, 0x9A, 0xB9,
- 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77, 0x88, 0x89, 0x99, 0xAB, 0xAB, 0xCA,
- 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBB, 0xBB, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xBC, 0xCC, 0xCB, 0xAA, 0x9A,
- 0x99, 0x9A, 0x9A, 0xAB, 0xBC, 0xCC, 0xBC, 0xCA, 0xAA, 0xA9, 0x99, 0x99,
- 0x99, 0x9A, 0xAA, 0xAB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCC, 0xBC, 0xBA, 0xAA,
- 0x99, 0x99, 0x89, 0x99, 0x99, 0xAA, 0xBC, 0xBA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xA9, 0x98, 0x88, 0x87, 0x77,
- 0x88, 0x88, 0x99, 0xAA, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77, 0x77, 0x77,
- 0x88, 0x99, 0xAA, 0x9A, 0x99, 0x88, 0x77, 0x77, 0x67, 0x77, 0x77, 0x89,
- 0x9A, 0x99, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77, 0x78, 0x89, 0xA9,
- 0x99, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x78, 0x99, 0x99, 0x98,
- 0x87, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x99, 0x99, 0x88, 0x77,
- 0x76, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0x99, 0x99, 0x87, 0x77, 0x66,
- 0x66, 0x66, 0x67, 0x77, 0x89, 0x99, 0x99, 0x98, 0x77, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x99, 0x99, 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x78, 0x89, 0xA9, 0x9A, 0x98, 0x87, 0x77, 0x77, 0x67, 0x77, 0x78, 0x89,
- 0x9A, 0x9A, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, 0x88, 0x99, 0xA9,
- 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, 0x88, 0x88, 0x99, 0xAB, 0xAA, 0xBA,
- 0xA9, 0x98, 0x88, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBA, 0xBB, 0xBA, 0xA9,
- 0x99, 0x99, 0x89, 0x99, 0x99, 0xAA, 0xBB, 0xBC, 0xCB, 0xBB, 0xAA, 0xA9,
- 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCB, 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x99,
- 0x99, 0x9A, 0xAA, 0xBB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9C, 0xBA, 0xAA, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCB, 0xAB, 0xCC,
- 0xBA, 0xAA, 0xA9, 0x99, 0xA9, 0xAA, 0xAA, 0xBC, 0xCC, 0xAC, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xBB, 0xCB, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77,
- 0x78, 0x88, 0x99, 0xAA, 0xAA, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xAA, 0x9A, 0x99, 0x88, 0x77, 0x76, 0x67, 0x77, 0x77, 0x88,
- 0x9A, 0x99, 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9,
- 0x99, 0x98, 0x77, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x89, 0x99, 0x98,
- 0x87, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0xA9, 0x99, 0x98, 0x87,
- 0x66, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0x99, 0x99, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x77, 0x89, 0x99, 0x9A, 0x88, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0x99, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x78, 0x89, 0xA9, 0xAA, 0x99, 0x87, 0x77, 0x77, 0x67, 0x77, 0x77, 0x89,
- 0x9A, 0xAA, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x99, 0xAA,
- 0xAB, 0xAA, 0x98, 0x88, 0x87, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xAA, 0xBA,
- 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAA, 0xBB, 0xCC, 0xBA, 0xA9,
- 0xA9, 0x99, 0x98, 0x99, 0x99, 0xAB, 0xAB, 0xAC, 0xCC, 0xBA, 0xAA, 0xA9,
- 0x99, 0x9A, 0x9A, 0xBB, 0xBC, 0xCB, 0xBC, 0xBB, 0xAA, 0xA9, 0x99, 0x99,
- 0x9A, 0x9A, 0xAA, 0xBB, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xCB, 0xDC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xCC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xDB, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBC, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9,
- 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87,
- 0x66, 0x65, 0x55, 0x66, 0x67, 0x88, 0x9A, 0xA9, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xB9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67,
- 0x78, 0x99, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0x9A, 0xAA, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA,
- 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xAC, 0xCB,
- 0xBA, 0x99, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xDC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA,
- 0x9A, 0xAA, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDC, 0xDD, 0xCC, 0xCC, 0xCD, 0xDE, 0xED, 0xFF, 0xFF, 0xCF, 0xFF,
- 0xEE, 0xDD, 0xDC, 0xCD, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFE, 0xDC, 0xBB, 0xAA,
- 0xA9, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xEF, 0xFD, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x89,
- 0xAB, 0xCE, 0xFE, 0xDD, 0xCA, 0x98, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB,
- 0xDF, 0xFD, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x77, 0x9A, 0xBC, 0xEE,
- 0xDC, 0xBA, 0x97, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xED, 0xCB,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xDC, 0xB9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0xA8, 0x76, 0x55,
- 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDD, 0xBA, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xCD, 0xDE, 0xDC, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xFD, 0xDB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAC,
- 0xCD, 0xDF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEF,
- 0xFF, 0xFD, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xDF, 0xFE,
- 0xED, 0xCB, 0xBA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFD,
- 0xDC, 0xBC, 0xCB, 0xCC, 0xCD, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xEE,
- 0xDD, 0xDE, 0xDE, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xEE, 0xED, 0xDD,
- 0xEE, 0xDF, 0xEE, 0xFE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDC, 0xCC, 0xCC, 0xCB, 0xCC, 0xCC, 0xEF, 0xFF, 0xDF, 0xCD, 0xFF,
- 0xCD, 0xCC, 0xCC, 0xCC, 0xBD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xBB,
- 0xBB, 0xAB, 0xBA, 0xBC, 0xDC, 0xDF, 0xFF, 0xFD, 0xDC, 0xCB, 0xAA, 0xA9,
- 0x99, 0x9A, 0xBB, 0xBC, 0xFF, 0xFF, 0xCC, 0xDB, 0xA9, 0x99, 0x88, 0x88,
- 0x89, 0xAB, 0xCC, 0xDF, 0xFC, 0xDC, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAB, 0xCD, 0xFF, 0xBC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCF, 0xFC, 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xCF,
- 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xFC, 0xBB,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA8, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xEC, 0xBA, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCC, 0xDD, 0xDB, 0x99, 0x87, 0x77, 0x77, 0x77, 0x89, 0xAB,
- 0xBC, 0xCF, 0xFD, 0xBB, 0xA9, 0x88, 0x88, 0x88, 0x89, 0x9B, 0xCC, 0xFC,
- 0xFF, 0xDD, 0xBA, 0x9A, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xFD, 0xDF, 0xFD,
- 0xFD, 0xCB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCF, 0xFD, 0xFF, 0xFF, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDD, 0xDF, 0xDF, 0xFF, 0xFF, 0xFD, 0xFD,
- 0xCC, 0xCC, 0xFC, 0xCD, 0xFE, 0xFE, 0xDF, 0xFF, 0xFD, 0xDD, 0xFC, 0xDC,
- 0xDD, 0xCC, 0xCE, 0xFD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xDD, 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFD, 0xFE,
- 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCE, 0xFF, 0xFF, 0xFF, 0xEF, 0xDD, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xDF, 0xFF, 0xFD, 0xED, 0xCB, 0xAA, 0xA9,
- 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xDD, 0xCB, 0xAA, 0x99, 0x88, 0x88,
- 0x89, 0x9A, 0xBD, 0xEF, 0xFC, 0xDB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x88,
- 0x9A, 0xBD, 0xFF, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCD, 0xFC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDF,
- 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA,
- 0x98, 0x76, 0x55, 0x55, 0x55, 0x66, 0x78, 0xAB, 0xCD, 0xCC, 0xA9, 0x87,
- 0x65, 0x55, 0x45, 0x56, 0x67, 0x8A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x79, 0xAB, 0xCD, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xDE, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0xAC, 0xCD, 0xFD, 0xCB, 0x98, 0x87, 0x76, 0x67, 0x77, 0x89, 0xAB,
- 0xCD, 0xDF, 0xFD, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x89, 0xAA, 0xBC, 0xDD,
- 0xFF, 0xFD, 0xBA, 0xA9, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xDD, 0xEF, 0xFF,
- 0xED, 0xCB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xFF, 0xFF, 0xED,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0xFE, 0xDD,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFD, 0xED, 0xDD,
- 0xDD, 0xDD, 0xED, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAE, 0xCD, 0xCC, 0xEC, 0xCD, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xDD, 0xFD,
- 0xDC, 0xDC, 0xCD, 0xCC, 0xDD, 0xED, 0xDF, 0xFF, 0xFF, 0xCF, 0xDF, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDF, 0xFF, 0xFD, 0xFD, 0xCB, 0xBB, 0xAA,
- 0x99, 0xA9, 0xAB, 0xCD, 0xFF, 0xFF, 0xDE, 0xCB, 0xBA, 0x99, 0x88, 0x88,
- 0x89, 0xAA, 0xCD, 0xFF, 0xFD, 0xDC, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x88,
- 0x9A, 0xBD, 0xFD, 0xCC, 0xBA, 0x99, 0x87, 0x66, 0x66, 0x67, 0x88, 0xAC,
- 0xCF, 0xEC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xDD,
- 0xDD, 0xBA, 0x97, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xCB,
- 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x79, 0xAB, 0xDD, 0xDC, 0xB9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x77, 0x9A, 0xBC, 0xDD, 0xCB, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xBD, 0xDC, 0xB9, 0x97, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xCD, 0xCD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x99, 0xAC, 0xDC, 0xFE, 0xCA, 0x98, 0x87, 0x76, 0x67, 0x78, 0x99, 0xAC,
- 0xCD, 0xCD, 0xED, 0xBA, 0x99, 0x88, 0x78, 0x88, 0x99, 0xAB, 0xCD, 0xDC,
- 0xFF, 0xFC, 0xBA, 0xA9, 0x99, 0x89, 0x99, 0xAB, 0xBC, 0xDD, 0xCF, 0xFF,
- 0xFD, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCB, 0xCD, 0xDC, 0xFF, 0xFF, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xFF, 0xDF, 0xFF, 0xFF, 0xEE, 0xDE,
- 0xDC, 0xCD, 0xDF, 0xEE, 0xFF, 0xFD, 0xDF, 0xFF, 0xEE, 0xDC, 0xDD, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xFD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAE, 0xED, 0xDE, 0xDD, 0xDD, 0xDE, 0xDF, 0xFF, 0xFF, 0xFF, 0xCD, 0xFE,
- 0xFF, 0xEE, 0xDD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xEE, 0xDC,
- 0xCB, 0xCB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFD, 0xFE, 0xDC, 0xCB, 0xAA,
- 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xFF, 0xDF, 0xDC, 0xBB, 0xA9, 0x99, 0x99,
- 0x9A, 0xAB, 0xDF, 0xFF, 0xFD, 0xDD, 0xBA, 0xA9, 0x88, 0x77, 0x78, 0x89,
- 0xAB, 0xDE, 0xFF, 0xDD, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xBC,
- 0xFE, 0xFD, 0xDB, 0xB9, 0x87, 0x66, 0x55, 0x56, 0x77, 0x9A, 0xBD, 0xFF,
- 0xDD, 0xCA, 0x98, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCE, 0xFD, 0xEB,
- 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBD, 0xFF, 0xDD, 0xBA, 0x97,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xED, 0xDB, 0xA9, 0x76, 0x55,
- 0x44, 0x55, 0x67, 0x89, 0xBC, 0xFD, 0xED, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0xAB, 0xDF, 0xFD, 0xEC, 0xB9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xED, 0xDF, 0xFC, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xAC,
- 0xDE, 0xEF, 0xFF, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x9A, 0xBB, 0xCE, 0xFE,
- 0xFF, 0xFE, 0xCB, 0xBA, 0x99, 0x99, 0xAA, 0xAB, 0xCD, 0xEF, 0xEF, 0xFF,
- 0xED, 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF,
- 0xDE, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xDD, 0xED, 0xCD,
- 0xDD, 0xCC, 0xDD, 0xDE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xAC, 0xDC,
- 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDD, 0xFE, 0xCC, 0xCB, 0xBA,
- 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDE, 0xDB, 0xCB, 0xAA, 0xA9, 0x99,
- 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xED, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xCC, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x99, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xBC, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x66, 0x65, 0x56,
- 0x66, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBB, 0xBB, 0xA9, 0x98, 0x77, 0x77, 0x67, 0x77, 0x88, 0x9A,
- 0xBB, 0xBC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xCB,
- 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCC, 0xEE, 0xDC, 0xCB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCD, 0xFD, 0xDC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEC, 0xBD, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xCB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x8A, 0xA9, 0x99, 0x99, 0x98, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xAA, 0xBB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xDC, 0xAB, 0xBA, 0xA9,
- 0x99, 0x99, 0x88, 0x99, 0x9A, 0xAA, 0xBC, 0xC9, 0xAA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x78, 0x88, 0x99, 0xAB, 0xB9, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77,
- 0x88, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89,
- 0xAA, 0xA9, 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x78, 0x89, 0xA9,
- 0x99, 0x98, 0x87, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x99,
- 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0x99, 0x89, 0x88, 0x77,
- 0x66, 0x66, 0x66, 0x66, 0x77, 0x78, 0x9A, 0x99, 0x98, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0x99, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x99, 0x99, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x78, 0x89, 0xA9, 0x9A, 0x99, 0x87, 0x77, 0x77, 0x67, 0x77, 0x78, 0x89,
- 0x9A, 0x9A, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA,
- 0xAB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0xAB, 0xAB, 0xBB,
- 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBA, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xAD, 0xDD, 0xBB, 0xAA, 0xA9,
- 0xA9, 0x9A, 0xAA, 0xAB, 0xBB, 0xDB, 0xAC, 0xCB, 0xAA, 0xA9, 0x99, 0x99,
- 0x99, 0x9A, 0xAA, 0xAB, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBA, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xAB, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0x9A, 0x99, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0x9A, 0x98, 0x87, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x66, 0x66, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x56, 0x66, 0x67, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x67, 0x77, 0x88, 0x89,
- 0xAB, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA,
- 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xAB, 0xCB,
- 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xBB, 0xCC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xBD, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBC, 0xCB, 0xBB, 0xAA, 0xAA, 0x9A,
- 0xAA, 0xAA, 0xAA, 0xBB, 0x90, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAA, 0xBC, 0xBD, 0xBB, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xA9, 0xA9, 0xAA, 0xBB, 0xCD, 0xDD, 0xBC, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBD, 0xCB, 0xBB, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0x9A, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x67, 0x88, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x65, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x67, 0x77, 0x78, 0x99,
- 0xAB, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB,
- 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0xAA, 0xBB, 0xBC, 0xCC,
- 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0x9A, 0xBB, 0xCB, 0xCD, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xBD, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDB, 0xAD, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xBC, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xFD, 0xBC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCE, 0xDB, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xDD, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x99, 0xAB, 0xBC, 0xCB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x89, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x9A,
- 0xAB, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB,
- 0xAA, 0x99, 0x87, 0x66, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x99, 0xBB, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBB, 0xBB, 0xAA, 0x98, 0x77, 0x76, 0x67, 0x77, 0x88, 0x9A,
- 0xAB, 0xBB, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB,
- 0xCC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBC, 0xCC,
- 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xDD, 0xDC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCE, 0xFD, 0xDC, 0xCB, 0xBB,
- 0xAB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0xBD, 0xDC, 0xCC, 0xBB, 0xBB, 0xAA,
- 0xAB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xBE, 0xFF,
- 0xED, 0xDD, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xED, 0xDC,
- 0xCC, 0xBC, 0xBC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFD, 0xDD, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99,
- 0x9A, 0xBC, 0xDE, 0xFF, 0xFD, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A,
- 0xBC, 0xDF, 0xFF, 0xDD, 0xCB, 0xA9, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xBD,
- 0xFF, 0xFD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xFE,
- 0xDD, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x56, 0x89, 0xAB, 0xEE, 0xFD, 0xDB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBD, 0xEE, 0xDD, 0xBA, 0x98,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xED, 0xEC, 0xA9, 0x87, 0x55,
- 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xED, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAB, 0xCE, 0xEE, 0xFD, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBD, 0xEE, 0xFF, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xEF, 0xFE, 0xDC, 0xBA, 0x99, 0x88, 0x99, 0x9A, 0xBB, 0xCD, 0xFE,
- 0xEF, 0xFE, 0xDC, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xEF, 0xFF,
- 0xFE, 0xDC, 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xED, 0xDD, 0xCC, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xDE, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xBE, 0xFF, 0xFF, 0xEE, 0xEE, 0xDE,
- 0xED, 0xDD, 0xEE, 0xFE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDF, 0xFE, 0xFF, 0xBC, 0xED,
- 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF, 0xCD, 0xDC, 0xCC,
- 0xBB, 0xAB, 0xAB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFC, 0xDC, 0xCB, 0xAA, 0xA9,
- 0x99, 0x9A, 0xAB, 0xCC, 0xFF, 0xFE, 0xCD, 0xCB, 0xAA, 0x99, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xEF, 0xFC, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89,
- 0xAB, 0xCE, 0xFE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xDE, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x77, 0x8A, 0xBC, 0xDE,
- 0xCC, 0xB9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xB9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xDD, 0xCB, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xCD, 0xCC, 0xBA, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xCC, 0xCD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xDD, 0xDE, 0xED, 0xBB, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xDD,
- 0xFF, 0xEC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xDD, 0xDF, 0xFF,
- 0xFE, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xED, 0xDD, 0xFF, 0xFF, 0xEE,
- 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xEE, 0xDF, 0xFF, 0xFF, 0xFE, 0xED,
- 0xDC, 0xCD, 0xCD, 0xDD, 0xDE, 0xED, 0xCF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDD,
- 0xCD, 0xCC, 0xDD, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xDD, 0xED,
- 0xDC, 0xCC, 0xCB, 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xDE, 0xDD, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xDC, 0xBB, 0xAA, 0x99,
- 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xFF, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xBC, 0xEF, 0xFC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0x9B, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCD, 0xEC, 0xCA, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xDE,
- 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x99, 0xAB, 0xDD, 0xDD, 0xCA, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDE, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x89, 0xAA, 0xBC, 0xDD,
- 0xEE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xDF, 0xFF,
- 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xFD, 0xFF, 0xFF, 0xED,
- 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xDF, 0xFF, 0xFE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFE, 0xCF, 0xFF, 0xFF, 0xDE, 0xDD, 0xDD,
- 0xCD, 0xDD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xEE, 0xFF, 0xFF, 0xCD, 0xDE,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xDC, 0xCB, 0xBA, 0xA9,
- 0x99, 0xAA, 0xAB, 0xCD, 0xFF, 0xFF, 0xCC, 0xBB, 0xA9, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xCF, 0xFF, 0xFC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCE, 0xFF, 0xCD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xDD, 0xFC, 0xCB, 0x98, 0x87, 0x65, 0x55, 0x56, 0x77, 0x8A, 0xBD, 0xFF,
- 0xCC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xED, 0xCB,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xB9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDD, 0xCB, 0xA8, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xED, 0xBA, 0x98, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xCD, 0xFC, 0xB9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x99, 0xAB, 0xFD, 0xFF, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDF, 0xFD, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x89, 0xAB, 0xCC, 0xDD,
- 0xFF, 0xDE, 0xCC, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xCF, 0xFF,
- 0xDD, 0xCB, 0xBB, 0xBA, 0xAA, 0xBB, 0xBC, 0xCD, 0xED, 0xFF, 0xFF, 0xDD,
- 0xDD, 0xCC, 0xBB, 0xCC, 0xCC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFE, 0xED,
- 0xDC, 0xCD, 0xED, 0xDE, 0xDF, 0xEE, 0xBF, 0xFF, 0xFF, 0xFE, 0xED, 0xDC,
- 0xDD, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDD, 0xDC, 0xCC, 0xDC, 0xCD, 0xDD, 0xDE, 0xFF, 0xEF, 0xBE, 0xEE,
- 0xDD, 0xDC, 0xCC, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFE, 0xDE, 0xDD, 0xCB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFD, 0xDD, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAB, 0xBC, 0xCE, 0xFF, 0xFE, 0xCD, 0xDB, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAC, 0xDD, 0xFF, 0xFD, 0xDC, 0xBA, 0x99, 0x87, 0x77, 0x78, 0x99,
- 0xBC, 0xDE, 0xEE, 0xDC, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x78, 0x9A, 0xBC,
- 0xDF, 0xFC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xFE,
- 0xCC, 0xBA, 0x98, 0x66, 0x55, 0x45, 0x56, 0x78, 0xAB, 0xCE, 0xDD, 0xCB,
- 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDE, 0xDD, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xDD, 0xDB, 0xA9, 0x86, 0x55,
- 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDE, 0xDD, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDE, 0xFC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xFF, 0xDC, 0xAA, 0x98, 0x77, 0x77, 0x88, 0x99, 0xAB,
- 0xCD, 0xDE, 0xFE, 0xDB, 0xBA, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xDE,
- 0xEF, 0xEE, 0xCC, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xCC, 0xED, 0xEF, 0xFF,
- 0xFD, 0xDC, 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFE,
- 0xDD, 0xCD, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFE, 0xED,
- 0xDD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFE, 0xBF, 0xEE, 0xEE, 0xFE, 0xED, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9C, 0xCB, 0xBB, 0xBA, 0xBA, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xAC, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFE, 0xCD, 0xCB, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xDB, 0xCB, 0xBA, 0xA9, 0x99,
- 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED, 0xBC, 0xBA, 0xA9, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xBB, 0xCD, 0xDB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xDC, 0xBB, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC,
- 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xBB, 0xBA,
- 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x88, 0xAA, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xBB, 0xBA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCB, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xBC, 0xBC, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC,
- 0xCD, 0xCB, 0xAA, 0x99, 0x98, 0x89, 0x99, 0x9A, 0xBB, 0xCD, 0xCC, 0xDD,
- 0xCB, 0xBA, 0xAA, 0xA9, 0x9A, 0xAA, 0xBC, 0xCC, 0xDC, 0xDE, 0xED, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xCD, 0xCD, 0xFE, 0xED, 0xDC, 0xCC,
- 0xBB, 0xCB, 0xCC, 0xCD, 0xDD, 0xEC, 0xAD, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xCB, 0xCC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0xA9, 0xA9, 0x9A, 0xAA, 0xAB, 0xBB, 0xCC, 0xAB, 0xDC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xED, 0xBB, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xDC, 0xAB, 0xAA, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBB,
- 0x9A, 0x98, 0x87, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB,
- 0xBC, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBC, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCB, 0xBB,
- 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xEC, 0xDC, 0xBB, 0xBB,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xAD, 0xCC, 0xCB, 0xBA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xAB, 0xCB,
- 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDC, 0xBC, 0xBA, 0xA9,
- 0x99, 0x99, 0x89, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x78, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x88, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA,
- 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xBB, 0xCB,
- 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAA, 0xAB, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xAC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xAB, 0xCC,
- 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xAB, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCD, 0xCA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA,
- 0x9A, 0x98, 0x77, 0x66, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x67, 0x77, 0x89, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA,
- 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xAC, 0xBB, 0xCB,
- 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBD, 0xCB, 0xBA,
- 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xCD, 0xCD, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDC, 0xAC, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCC, 0x9B, 0xCC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xED, 0xBC, 0xCB, 0xBA,
- 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xCB, 0xCB, 0xAA, 0x99, 0x99,
- 0x89, 0x99, 0x9A, 0xAB, 0xCC, 0xDC, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x9A, 0xAB, 0xCD, 0xCA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xBC, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBB,
- 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAB, 0xBA, 0xA9,
- 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x99, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBA, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAB, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xBC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xAB, 0xBB, 0xCB, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xCC, 0xCB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xBC, 0xDC,
- 0xCB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xCE, 0xDC, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCD, 0xED, 0xDD, 0xCC, 0xCB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEC, 0xAD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xFE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xBF, 0xFF,
- 0xFE, 0xFD, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xED,
- 0xCC, 0xCB, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xEE, 0xFF, 0xEC, 0xCB, 0xBA,
- 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xFE, 0xEF, 0xED, 0xCB, 0xAA, 0x99, 0x99,
- 0xAA, 0xBC, 0xDE, 0xFF, 0xEE, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0x9A,
- 0xBC, 0xDE, 0xFF, 0xDE, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x78, 0x9A, 0xBD,
- 0xEF, 0xED, 0xEC, 0xB9, 0x87, 0x66, 0x55, 0x66, 0x79, 0xAB, 0xCE, 0xFE,
- 0xDD, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAC, 0xDE, 0xED, 0xDB,
- 0xA9, 0x86, 0x54, 0x43, 0x45, 0x68, 0x9A, 0xCD, 0xEE, 0xDD, 0xBA, 0x98,
- 0x75, 0x43, 0x34, 0x56, 0x79, 0xAB, 0xDE, 0xED, 0xDC, 0xB9, 0x87, 0x65,
- 0x44, 0x55, 0x78, 0x9A, 0xCD, 0xEE, 0xDD, 0xCB, 0xA9, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xBC, 0xDF, 0xED, 0xED, 0xBA, 0x98, 0x77, 0x66, 0x77, 0x89,
- 0xAB, 0xCD, 0xFE, 0xDE, 0xEC, 0xBA, 0x99, 0x88, 0x78, 0x89, 0xAB, 0xBD,
- 0xEF, 0xED, 0xFE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0xAB, 0xBC, 0xDF, 0xFE,
- 0xEF, 0xFE, 0xDC, 0xBB, 0xBA, 0xAA, 0xBB, 0xCD, 0xDE, 0xEF, 0xFD, 0xFE,
- 0xEE, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xEF, 0xFF, 0xEE,
- 0xEE, 0xDD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xEE,
- 0xFE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xAE, 0xEE, 0xEE, 0xEE, 0xDD, 0xDE,
- 0xEF, 0xFE, 0xEE, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBE, 0xDC, 0xDC, 0xCC, 0xCB, 0xCB, 0xCC, 0xCC, 0xDD, 0xCD, 0xAD, 0xED,
- 0xDD, 0xCC, 0xCC, 0xCC, 0xBC, 0xCD, 0xCE, 0xEF, 0xFE, 0xEE, 0xDC, 0xCB,
- 0xBB, 0xBA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDF, 0xDC, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xCD, 0xDE, 0xFD, 0xCD, 0xCB, 0xA9, 0x99, 0x88, 0x88,
- 0x99, 0xAA, 0xBC, 0xEF, 0xDC, 0xDB, 0xAA, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xDE, 0xDC, 0xCB, 0x98, 0x77, 0x65, 0x55, 0x56, 0x77, 0x89, 0xBC, 0xDD,
- 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xBC, 0xDB, 0xCA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xBA, 0x88, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDC, 0xCD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAC,
- 0xCE, 0xDC, 0xDD, 0xCA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED,
- 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAC, 0xCD, 0xEE, 0xDD, 0xEF,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xED, 0xFD, 0xEE, 0xEE, 0xDD,
- 0xDC, 0xCB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xFF, 0xED, 0xED, 0xDD,
- 0xDC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0xAD, 0xED, 0xDD, 0xDD, 0xCD, 0xDC,
- 0xDD, 0xDE, 0xED, 0xED, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xDD, 0xCC, 0xCC, 0xBB, 0xBC, 0xCC, 0xCD, 0xDE, 0xEF, 0xCE, 0xFE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCE, 0xFF, 0xED, 0xDC, 0xBB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x88, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xDE, 0xCC, 0xB9, 0x98, 0x77, 0x66, 0x66, 0x67, 0x88, 0x9B,
- 0xCD, 0xDC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDB, 0xBA,
- 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0xAB, 0xCC, 0xCB, 0xA9, 0x87,
- 0x65, 0x55, 0x55, 0x56, 0x77, 0x8A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x89, 0xAC, 0xDD, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x89, 0xAB, 0xBD, 0xDD,
- 0xDE, 0xDC, 0xBA, 0x99, 0x98, 0x89, 0x99, 0xAB, 0xBC, 0xDE, 0xED, 0xFD,
- 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFE, 0xEF, 0xEE, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFE, 0xFF, 0xEE, 0xDD, 0xDC,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFF, 0xCF, 0xEE, 0xED, 0xDD, 0xDD, 0xCC,
- 0xCD, 0xDD, 0xDF, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBC, 0xBC, 0xCC, 0xCC, 0xDD, 0xAC, 0xDD,
- 0xDD, 0xCC, 0xCC, 0xBC, 0xBC, 0xCC, 0xDD, 0xDF, 0xFD, 0xDE, 0xEC, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xDE, 0xCC, 0xDD, 0xCB, 0xAA, 0xA9,
- 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xED, 0xCD, 0xBB, 0xAA, 0x99, 0x88, 0x88,
- 0x99, 0xAA, 0xBC, 0xDD, 0xDB, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAB, 0xCC, 0xED, 0xBC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x77, 0x89, 0xAB,
- 0xCD, 0xCB, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xBC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xCA,
- 0x98, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xB9, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xCA, 0xA8, 0x76, 0x65,
- 0x44, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDC, 0xCD, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x9A, 0xAB,
- 0xCD, 0xCC, 0xDC, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDC,
- 0xCD, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCD, 0xCC, 0xED,
- 0xDC, 0xCB, 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xDD, 0xDE, 0xDD, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xCC, 0xCC, 0xCD, 0xDF, 0xDD, 0xFF, 0xED, 0xDD, 0xDC,
- 0xCC, 0xCD, 0xDD, 0xEE, 0xEE, 0xFD, 0xAD, 0xDC, 0xDC, 0xCC, 0xCC, 0xBC,
- 0xCC, 0xCC, 0xDC, 0xDE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAE, 0xED, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD, 0xDD, 0xDD, 0xDD, 0x9E, 0xFF,
- 0xFF, 0xED, 0xED, 0xDD, 0xEE, 0xEF, 0xFE, 0xFF, 0xFD, 0xDF, 0xEE, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDD, 0xEF, 0xFE, 0xFF, 0xED, 0xFE, 0xDD, 0xCC, 0xCB,
- 0xBC, 0xCC, 0xDE, 0xEE, 0xEE, 0xFE, 0xDF, 0xDD, 0xCB, 0xBA, 0xAA, 0xAB,
- 0xBC, 0xDD, 0xDF, 0xEF, 0xED, 0xED, 0xDB, 0xBA, 0x99, 0x88, 0x99, 0xAB,
- 0xCD, 0xEF, 0xFD, 0xDE, 0xDC, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAB, 0xDD,
- 0xFF, 0xDD, 0xED, 0xBA, 0x98, 0x76, 0x55, 0x67, 0x89, 0xBC, 0xDD, 0xFE,
- 0xDE, 0xCB, 0xA9, 0x76, 0x54, 0x45, 0x67, 0x9A, 0xCD, 0xEF, 0xED, 0xED,
- 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xED, 0xDE, 0xDB, 0xA8,
- 0x75, 0x43, 0x24, 0x57, 0x8A, 0xBC, 0xDE, 0xED, 0xED, 0xCA, 0x97, 0x65,
- 0x44, 0x46, 0x78, 0xAC, 0xCD, 0xED, 0xDE, 0xDD, 0xBA, 0x87, 0x65, 0x56,
- 0x68, 0x9A, 0xBD, 0xEF, 0xDD, 0xFE, 0xDC, 0xA9, 0x87, 0x77, 0x78, 0x8A,
- 0xBC, 0xDE, 0xEE, 0xEF, 0xFD, 0xDB, 0xAA, 0x98, 0x88, 0x9A, 0xAB, 0xCD,
- 0xFF, 0xDD, 0xFE, 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFE,
- 0xDF, 0xFE, 0xED, 0xDC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xEE, 0xFF,
- 0xFF, 0xFE, 0xDD, 0xCD, 0xDD, 0xDD, 0xEF, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE,
- 0xFE, 0xEE, 0xED, 0xEE, 0xEE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF,
- 0xFE, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE, 0xAD, 0xDD, 0xDD, 0xDD, 0xED, 0xDE,
- 0xDE, 0xEE, 0xDD, 0xEE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xDC, 0xCB, 0xBB, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xCD, 0xAD, 0xED,
- 0xCC, 0xBB, 0xAA, 0xBA, 0xAB, 0xBC, 0xCD, 0xDF, 0xFD, 0xDD, 0xCC, 0xBB,
- 0xAA, 0xA9, 0x9A, 0xAA, 0xBB, 0xCD, 0xEE, 0xDC, 0xDB, 0xBA, 0xA9, 0x99,
- 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDD, 0xBC, 0xBA, 0xA9, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xBB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBB, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC,
- 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAC, 0xCA, 0xA9,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xAB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x89, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9A, 0xAC, 0xBB, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x89, 0xAB, 0xCC, 0xBC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xBC, 0xCC, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC,
- 0xCD, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xCC, 0xDD,
- 0xCB, 0xBA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xDD, 0xCE, 0xDD, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xBB, 0xBC, 0xCD, 0xEE, 0xDD, 0xFD, 0xED, 0xCC, 0xCC,
- 0xBC, 0xBC, 0xCC, 0xDD, 0xEE, 0xFE, 0x9D, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB,
- 0xBC, 0xCC, 0xDD, 0xEE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0x9B, 0xDC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBB, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xDC, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78,
- 0x88, 0x89, 0xAA, 0xBC, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x99, 0xAB, 0xBB, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x9A,
- 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x45, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBA, 0xAB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xBB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB,
- 0xBB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xBB, 0xCC,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCC, 0xCC, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCC, 0xDD, 0xDC, 0xCB, 0xBB,
- 0xAA, 0xAB, 0xBB, 0xBC, 0xCC, 0xDD, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAB, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xCC, 0xAB, 0xBA, 0xA9,
- 0x99, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77,
- 0x78, 0x89, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAA, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x77, 0x78, 0x99, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98,
- 0x87, 0x76, 0x66, 0x55, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x88, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xBB,
- 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0x9A,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xA9, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xBC, 0xDC, 0xBC, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xBA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x9A, 0x98, 0x77, 0x66, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x67, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xAA,
- 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBB, 0xCC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0x9C, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAD, 0xCC, 0xCC, 0xCC, 0xCB, 0xBB, 0xBC, 0xBC, 0xCC, 0xDC, 0x9D, 0xED,
- 0xED, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xED, 0xDF, 0xDD, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDD, 0xEE, 0xDC, 0xDD, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEC, 0xCC, 0xCB, 0xBA, 0x99, 0x99, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xCC, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A,
- 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xBB,
- 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x66, 0x56, 0x67, 0x88, 0xAA, 0xBC, 0xDC,
- 0xBC, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xCB,
- 0xA9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xBC, 0xDC, 0xBC, 0xBA, 0x98,
- 0x76, 0x43, 0x34, 0x56, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xCD, 0xBA, 0x99, 0x87, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCC, 0xBA, 0x98, 0x87, 0x76, 0x77, 0x88,
- 0x9A, 0xBC, 0xDC, 0xCD, 0xCC, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xBB,
- 0xCD, 0xDC, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDC,
- 0xCE, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xDD, 0xDD,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDD, 0xED, 0xDF, 0xEE, 0xDD,
- 0xDC, 0xCB, 0xCC, 0xCC, 0xCC, 0xEE, 0xEF, 0xDD, 0xEE, 0xEE, 0xED, 0xDD,
- 0xCD, 0xCD, 0xDE, 0xEE, 0xEE, 0xFE, 0x9D, 0xCD, 0xCD, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xDD, 0xDD, 0xDE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xFF, 0xFE, 0xFF, 0xEE, 0xDE, 0xDE, 0xEF, 0xEE, 0xEE, 0xAF, 0xFF,
- 0xFF, 0xFE, 0xEE, 0xED, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xDD, 0xCD, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xEF, 0xFF, 0xEE, 0xDC, 0xBB,
- 0xBB, 0xBB, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xBA, 0x99, 0x9A,
- 0xAB, 0xCD, 0xFE, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9B,
- 0xCD, 0xEF, 0xFE, 0xFF, 0xDC, 0xB9, 0x87, 0x76, 0x77, 0x78, 0xAB, 0xCD,
- 0xEF, 0xFE, 0xED, 0xBA, 0x97, 0x66, 0x55, 0x67, 0x79, 0xAB, 0xDE, 0xFF,
- 0xEF, 0xCB, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xBC, 0xEF, 0xFE, 0xEC,
- 0xB9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCE, 0xFF, 0xFE, 0xCB, 0x98,
- 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xFE, 0xED, 0xB9, 0x87, 0x65,
- 0x44, 0x55, 0x78, 0x9B, 0xCE, 0xFF, 0xFF, 0xDB, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x8A, 0xBD, 0xFF, 0xFF, 0xED, 0xCB, 0x98, 0x87, 0x66, 0x77, 0x89,
- 0xAC, 0xEF, 0xFF, 0xFF, 0xED, 0xCB, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xCE,
- 0xEF, 0xFE, 0xFF, 0xDD, 0xCB, 0xA9, 0x99, 0x9A, 0xAB, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xED, 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xEE, 0xDC, 0xCC, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF,
- 0xEE, 0xEE, 0xDE, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xEE, 0xFE, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0x9E, 0xEE,
- 0xDD, 0xCC, 0xCC, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFE, 0xEF, 0xDD, 0xCC,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xDD, 0xEC, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xED, 0xDD, 0xCB, 0xAA, 0x98, 0x88, 0x88,
- 0x89, 0xAB, 0xBC, 0xDF, 0xEC, 0xDB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCE, 0xEC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x77, 0x8A, 0xBC, 0xDD,
- 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xBA, 0x88, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9B, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xBC,
- 0xDE, 0xED, 0xED, 0xCA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD,
- 0xDE, 0xDC, 0xCB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xFD, 0xFE,
- 0xDC, 0xBB, 0xBB, 0xAA, 0xAA, 0xBC, 0xCC, 0xDE, 0xFE, 0xDF, 0xEE, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xFF, 0xED, 0xFE, 0xFE, 0xED, 0xDD,
- 0xCD, 0xDD, 0xDE, 0xFE, 0xFF, 0xFF, 0xAE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xEE, 0xFE, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xDD, 0xDC, 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xEE, 0xBE, 0xEE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFE, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEF, 0xED, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xEE, 0xDC, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x67, 0x89, 0xAB,
- 0xCD, 0xDC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD,
- 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDB, 0xBA,
- 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCB, 0xA9, 0x87,
- 0x65, 0x55, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78,
- 0x99, 0xAC, 0xDD, 0xDC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDD, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE,
- 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xEE, 0xED,
- 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFE, 0xDF, 0xEE, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFE, 0xFF, 0xEE, 0xED, 0xDC,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0xBF, 0xEE, 0xDD, 0xDD, 0xDC, 0xDD,
- 0xDD, 0xDE, 0xEF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xEE, 0xDD, 0xDD, 0xCC, 0xDD, 0xCD, 0xDE, 0xEF, 0xFE, 0xAF, 0xFF,
- 0xFD, 0xDC, 0xCC, 0xCC, 0xCC, 0xED, 0xEE, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC,
- 0xBB, 0xAA, 0xBB, 0xBB, 0xCD, 0xEE, 0xFF, 0xFE, 0xED, 0xCB, 0xAA, 0xA9,
- 0x99, 0x9A, 0xAB, 0xCD, 0xEE, 0xFE, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xCD, 0xEF, 0xED, 0xDC, 0xAA, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCD, 0xFD, 0xDD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCF, 0xEC, 0xCB, 0xA8, 0x77, 0x65, 0x55, 0x56, 0x77, 0x8A, 0xBC, 0xDE,
- 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCE, 0xDC, 0xCA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xDC, 0xBA, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0x9B, 0xCD, 0xDD, 0xDC, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDE, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xBB,
- 0xCD, 0xED, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE,
- 0xEE, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xED, 0xFF,
- 0xDD, 0xCB, 0xBB, 0xAA, 0xAA, 0xBC, 0xCD, 0xDE, 0xFF, 0xEF, 0xFF, 0xFD,
- 0xDC, 0xCB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEE, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xAE, 0xEE, 0xED, 0xED, 0xDD, 0xDD,
- 0xDE, 0xEE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xEE, 0xFE, 0xDE, 0xEE, 0xFF, 0xDE, 0xFF, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xDC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xBA,
- 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x99, 0x99,
- 0x9A, 0xBC, 0xDF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x87, 0x77, 0x88, 0x9A,
- 0xBD, 0xFF, 0xFF, 0xEF, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xCD,
- 0xFF, 0xFF, 0xFC, 0xB9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9B, 0xCE, 0xFF,
- 0xEE, 0xCA, 0x98, 0x65, 0x54, 0x45, 0x56, 0x89, 0xAC, 0xDF, 0xFE, 0xDC,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFF, 0xED, 0xCA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xDF, 0xFE, 0xDC, 0xA9, 0x86, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAC, 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x88,
- 0xAB, 0xCE, 0xFF, 0xFF, 0xFC, 0xBA, 0x98, 0x87, 0x77, 0x89, 0x9B, 0xCD,
- 0xFF, 0xFE, 0xFF, 0xDC, 0xBA, 0x99, 0x98, 0x99, 0xAB, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xED, 0xCB, 0xBA, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xDD, 0xCC, 0xCC, 0xCC, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFE, 0xED, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xEE, 0xDE, 0xFE,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBE, 0xEE, 0xDD, 0xDD, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xED, 0x9F, 0xFF,
- 0xFE, 0xDD, 0xDD, 0xCD, 0xDD, 0xEF, 0xEE, 0xFF, 0xFE, 0xEF, 0xED, 0xDC,
- 0xCC, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xFF, 0xEE, 0xEE, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAB, 0xBC, 0xDD, 0xEF, 0xFE, 0xDD, 0xCC, 0xCA, 0xA9, 0x99, 0x99,
- 0x9A, 0xBC, 0xCD, 0xEF, 0xDE, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A,
- 0xBC, 0xDE, 0xFE, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xBC,
- 0xDE, 0xED, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xEE,
- 0xDD, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAC, 0xDF, 0xED, 0xDB,
- 0xA9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xCC, 0xFD, 0xDC, 0xCA, 0x98,
- 0x75, 0x43, 0x34, 0x56, 0x89, 0xAB, 0xCE, 0xDD, 0xDC, 0xA9, 0x87, 0x65,
- 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xEE, 0xDD, 0xCA, 0xA9, 0x77, 0x65, 0x56,
- 0x67, 0x89, 0xAC, 0xDE, 0xED, 0xED, 0xCA, 0x98, 0x77, 0x76, 0x77, 0x89,
- 0xAB, 0xCD, 0xFE, 0xEE, 0xDC, 0xBA, 0x98, 0x88, 0x78, 0x89, 0x9A, 0xBC,
- 0xDE, 0xED, 0xFE, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xEE,
- 0xEF, 0xFD, 0xDC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xEE, 0xFF,
- 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xCD, 0xDD, 0xEF, 0xFF, 0xEF, 0xFF, 0xFE,
- 0xED, 0xDD, 0xDC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xDE, 0xDD, 0xDE, 0xDD, 0xCD,
- 0xDD, 0xFE, 0xEF, 0xFF, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0x8B, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xCA, 0xBB, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0xAA, 0xBC, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAB, 0xCB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xB9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x87, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0xAB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBB,
- 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCB, 0xBD, 0xCB, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCC, 0xDD, 0xCC, 0xBB, 0xBA,
- 0xAA, 0xBB, 0xBB, 0xBB, 0xCC, 0xDC, 0x9C, 0xCC, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAB, 0xCB,
- 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDC, 0xBB, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77,
- 0x78, 0x89, 0x9A, 0xBB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89,
- 0xAB, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77, 0x66, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBA,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xCB,
- 0xAA, 0x99, 0x99, 0x88, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBC, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDC, 0x9C, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xAA, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCC, 0x9C, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xDD, 0xED, 0xBC, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCB, 0xBB, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0xAA, 0xBC, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x99, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xAA, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBB, 0xAB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xAB, 0xBB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xCB,
- 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xCC, 0xCD, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCC, 0xED, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xAB, 0xBB, 0xBC, 0xDC, 0xDD, 0x9C, 0xCB, 0xBB, 0xBB, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBC, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xDC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0x9D, 0xED,
- 0xCC, 0xBB, 0xBA, 0xAB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFE, 0xDD, 0xCC, 0xBA,
- 0xAA, 0xAA, 0x9A, 0xAA, 0xBC, 0xCD, 0xDF, 0xEC, 0xDC, 0xAA, 0x99, 0x99,
- 0x89, 0x99, 0x9A, 0xBB, 0xCD, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xBB, 0xCD, 0xDB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDD, 0xBB, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9B,
- 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC,
- 0xBB, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDB, 0xA9,
- 0x88, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0x9B, 0xCC, 0xBB, 0xA9, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0xAA, 0xCC, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBB, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAA,
- 0xBC, 0xDC, 0xDC, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xDD,
- 0xCD, 0xCC, 0xBA, 0x99, 0x98, 0x89, 0x99, 0xAA, 0xBC, 0xCD, 0xCD, 0xED,
- 0xCB, 0xBA, 0xAA, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xED, 0xDF, 0xED, 0xCC,
- 0xBB, 0xBB, 0xAB, 0xBB, 0xBB, 0xCD, 0xDE, 0xED, 0xEE, 0xDD, 0xDC, 0xCC,
- 0xBB, 0xCC, 0xCC, 0xDD, 0xEE, 0xEE, 0x9D, 0xCD, 0xCC, 0xCC, 0xCB, 0xBC,
- 0xCC, 0xCC, 0xCD, 0xDD, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFE, 0xFF, 0xFD, 0xDD, 0xDC, 0xED, 0xDD, 0xDD, 0x9F, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE,
- 0xED, 0xDD, 0xCD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xBB,
- 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xDC, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xCD, 0xDE, 0xFF, 0xEF, 0xFD, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB,
- 0xCD, 0xEF, 0xFF, 0xFF, 0xED, 0xBA, 0x88, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x66, 0x55, 0x67, 0x89, 0xAC, 0xDF, 0xFF,
- 0xEF, 0xCB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xFF, 0xFC,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x68, 0xAB, 0xDF, 0xFF, 0xFF, 0xDB, 0xA8,
- 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xEF, 0xFF, 0xFD, 0xBA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xEC, 0xA9, 0x87, 0x65, 0x55,
- 0x68, 0x9A, 0xCD, 0xFF, 0xFF, 0xFF, 0xCC, 0xA9, 0x87, 0x76, 0x77, 0x8A,
- 0xBC, 0xFF, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xDE, 0xCB, 0xBA, 0xA9, 0xAA, 0xBC, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDD, 0xDC, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFE, 0xFF,
- 0xFF, 0xFE, 0xDD, 0xCC, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF,
- 0xFF, 0xED, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xFE, 0xED, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0x9D, 0xEE,
- 0xEE, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xDD, 0xED, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xDD, 0xCB, 0xBA, 0x99, 0x99, 0x89,
- 0x9A, 0xAB, 0xCD, 0xEE, 0xDC, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xDD, 0xCD, 0xBA, 0x99, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x97, 0x66, 0x54, 0x45, 0x66, 0x79, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x88,
- 0x9A, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xDD, 0xCB, 0xAA, 0x99, 0x98, 0x89, 0x9A, 0xBB, 0xCD, 0xEE,
- 0xDE, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xDF, 0xED, 0xED,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xFF, 0xFE, 0xCE, 0xFF, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFD, 0xFE, 0xFF, 0xDE, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFE, 0x9D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xEE, 0xEF, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xCC, 0xCC, 0xBB, 0xBC, 0xCC, 0xCC, 0xDD, 0xDD, 0xAE, 0xFE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xFE, 0xDE, 0xDD, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xED, 0xDD, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0xAA, 0xBC, 0xDE, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAB, 0xCC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCA, 0x98, 0x77, 0x66, 0x55, 0x56, 0x77, 0x89, 0xBC, 0xDD,
- 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55,
- 0x67, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xCD, 0xDD, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED,
- 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDE, 0xED, 0xED,
- 0xDC, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xDF, 0xEE, 0xDD,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xFF, 0xEE, 0xDD, 0xDD,
- 0xCC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xAE, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC,
- 0xDD, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0x9F, 0xFE,
- 0xED, 0xDD, 0xCD, 0xDC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFD, 0xEF, 0xDE, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xEF, 0xDD, 0xED, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xCD, 0xEF, 0xFD, 0xDD, 0xDB, 0xBA, 0x99, 0x98, 0x89,
- 0x9A, 0xAB, 0xCD, 0xEE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x99,
- 0xAB, 0xCD, 0xFD, 0xDD, 0xCB, 0x98, 0x77, 0x66, 0x66, 0x78, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDD,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x55, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x55, 0x44, 0x55, 0x67, 0x8A, 0xBC, 0xED, 0xCC, 0xBA, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x76, 0x55,
- 0x44, 0x55, 0x67, 0x8A, 0xBC, 0xDC, 0xCD, 0xCA, 0x98, 0x76, 0x55, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x88,
- 0x9A, 0xCC, 0xDD, 0xDD, 0xCC, 0xAA, 0x98, 0x77, 0x77, 0x88, 0x9A, 0xBC,
- 0xDD, 0xDC, 0xED, 0xCB, 0xA9, 0x99, 0x88, 0x89, 0x9A, 0xBC, 0xCE, 0xED,
- 0xDF, 0xDC, 0xCB, 0xBA, 0xA9, 0xAA, 0xAA, 0xBC, 0xDD, 0xEF, 0xED, 0xEE,
- 0xDD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBC, 0xDD, 0xEE, 0xEE, 0xEF, 0xFE, 0xED,
- 0xDC, 0xDC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, 0xEE, 0xFD, 0xDD,
- 0xDD, 0xDD, 0xED, 0xDF, 0xFF, 0xFF, 0x9D, 0xDD, 0xCD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDE, 0xDE, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFE, 0xFE, 0xDE, 0xCD, 0xDD, 0xED, 0xDD, 0xDE, 0x8F, 0xFF,
- 0xFF, 0xEF, 0xED, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xDD, 0xDC, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xA9, 0x9A,
- 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFE, 0xDC, 0xA9, 0x88, 0x88, 0x89, 0xAA,
- 0xCD, 0xFF, 0xFF, 0xEF, 0xEC, 0xB9, 0x87, 0x76, 0x77, 0x88, 0xAB, 0xCE,
- 0xFF, 0xFF, 0xFD, 0xBA, 0x97, 0x66, 0x55, 0x66, 0x89, 0xAC, 0xDF, 0xFF,
- 0xEE, 0xDB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xFD, 0xDD,
- 0xB9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCF, 0xFF, 0xEF, 0xCB, 0x98,
- 0x65, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xFF, 0xFD, 0xED, 0xBA, 0x87, 0x65,
- 0x44, 0x55, 0x78, 0x9B, 0xDD, 0xFE, 0xEF, 0xDC, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x9A, 0xBD, 0xFF, 0xFF, 0xFD, 0xCB, 0xA8, 0x87, 0x66, 0x77, 0x89,
- 0xBC, 0xDF, 0xFF, 0xFF, 0xDD, 0xBB, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCF,
- 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xAA, 0xA9, 0x9A, 0xBB, 0xDD, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xED, 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xED, 0xDC, 0xCD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xEF, 0xEE, 0xED, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xDE, 0xEF, 0xFE, 0xED, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0x9D, 0xED,
- 0xDC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDF, 0xED, 0xDD, 0xDC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xDC, 0xCC, 0xBB, 0xA9, 0x99,
- 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDD, 0xCC, 0xBA, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xCD, 0xDB, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xBC, 0xCC, 0xBB, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAA,
- 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCB,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xAA, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9A, 0xBC, 0xBB, 0xBA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x89, 0xAB, 0xCC, 0xBC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xBC, 0xDC, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC,
- 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x99, 0x9A, 0xAB, 0xBB, 0xDD, 0xCC, 0xDC,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xCD, 0xDD, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xBD, 0xDD, 0xEF, 0xDD, 0xED, 0xDD, 0xCC, 0xCC,
- 0xBC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFD, 0x8D, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB,
- 0xCB, 0xCC, 0xDD, 0xDE, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xBB, 0x8B, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x78,
- 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78,
- 0x99, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x9A,
- 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xBA,
- 0x9A, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x65, 0x56,
- 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBA, 0xAB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x88, 0x88, 0x9A, 0xAB, 0xCB,
- 0xBB, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCC, 0xBC, 0xCB, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xCB, 0xDC, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0x8C, 0xBB, 0xBA, 0xAB, 0xAA, 0xAA,
- 0xAB, 0xBB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCB,
- 0xBB, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xBC, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x99, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66,
- 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB,
- 0xAB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xA9, 0x99, 0xAA, 0xAB, 0xBB, 0xCC, 0xCB, 0xDC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0x8C, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xCB, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x78,
- 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xCB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x67, 0x88, 0x9A,
- 0xBC, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9,
- 0x87, 0x76, 0x55, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x77,
- 0x65, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x66,
- 0x67, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xBB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x78, 0x88, 0x9A,
- 0xBB, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCC, 0xCD, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCC, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xCE, 0xEC, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xBB, 0xBC, 0xCC, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBF, 0xDC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCD, 0x7D, 0xFD,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFD, 0xDE, 0xDC, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xCE, 0xEE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xCC, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x99, 0x88, 0x88,
- 0x99, 0xAB, 0xBC, 0xDE, 0xCC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89,
- 0xAA, 0xBD, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB,
- 0xCD, 0xCC, 0xCA, 0xA8, 0x77, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xBC, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xCB, 0xBA,
- 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xCA, 0x98, 0x76, 0x65,
- 0x54, 0x56, 0x67, 0x89, 0xAC, 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56,
- 0x67, 0x88, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDC, 0xCD, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x99, 0xAB,
- 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xFD,
- 0xDD, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xED, 0xED,
- 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xDF, 0xEE, 0xDC,
- 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xEE, 0xFD, 0xDD, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xEE, 0x8D, 0xDC, 0xDC, 0xCC, 0xCC, 0xCC,
- 0xCD, 0xDD, 0xDD, 0xEE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xEF, 0xFD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD, 0x8F, 0xFF,
- 0xFF, 0xFE, 0xFD, 0xDE, 0xFE, 0xFE, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEE,
- 0xDC, 0xCD, 0xDC, 0xDD, 0xEE, 0xFF, 0xFF, 0xDF, 0xFF, 0xED, 0xDC, 0xCB,
- 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xFE, 0xEF, 0xEE, 0xCC, 0xBA, 0xA9, 0x9A,
- 0xAB, 0xCC, 0xDE, 0xFF, 0xEE, 0xFE, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0x9B,
- 0xCD, 0xDE, 0xFF, 0xDE, 0xDC, 0xBA, 0x97, 0x76, 0x77, 0x89, 0xAB, 0xCD,
- 0xFF, 0xDD, 0xED, 0xBA, 0x97, 0x66, 0x55, 0x66, 0x89, 0xAC, 0xCD, 0xFE,
- 0xDE, 0xDB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBC, 0xEE, 0xED, 0xEC,
- 0xB9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCE, 0xFE, 0xDD, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBC, 0xEF, 0xEE, 0xEC, 0xBA, 0x87, 0x65,
- 0x44, 0x46, 0x78, 0xAB, 0xCD, 0xFE, 0xED, 0xDB, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x9A, 0xBD, 0xDF, 0xFD, 0xED, 0xCB, 0xA9, 0x87, 0x66, 0x77, 0x8A,
- 0xBC, 0xDE, 0xFF, 0xDE, 0xDD, 0xBA, 0xA9, 0x88, 0x88, 0x99, 0xAB, 0xDD,
- 0xEF, 0xFD, 0xFE, 0xDC, 0xCB, 0xAA, 0x99, 0xAA, 0xBC, 0xCD, 0xFF, 0xFF,
- 0xDF, 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xED, 0xFF,
- 0xEE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFF, 0xDF, 0xFE, 0xEE,
- 0xEE, 0xED, 0xEE, 0xDF, 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xEF, 0xEF, 0xFE,
- 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDE, 0xFF, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xED, 0xDD, 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0x9E, 0xFE,
- 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFD, 0xEF, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xDF, 0xDD, 0xED, 0xCC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xED, 0xDD, 0xDC, 0xBA, 0x99, 0x98, 0x89,
- 0x9A, 0xAB, 0xCD, 0xDD, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xCC, 0xCA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xAC,
- 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78,
- 0x9B, 0xBC, 0xDD, 0xCC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xEC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBC, 0xDD, 0xFE,
- 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCE, 0xEF, 0xFC, 0xED,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xDE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xFD, 0xFE, 0xEE, 0xED, 0xED,
- 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0x9D, 0xDD, 0xDC, 0xDC, 0xDD, 0xDD,
- 0xDD, 0xEE, 0xEF, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xAE, 0xEE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xED, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x99, 0xAA, 0xBC, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89,
- 0xAB, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xCB, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xAC, 0xDC,
- 0xBB, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED,
- 0xCD, 0xCC, 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xED,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xDE, 0xDD, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFD, 0xEE, 0xED, 0xDD, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0x9D, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC,
- 0xCD, 0xDE, 0xEE, 0xEF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDE, 0xEE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0x9E, 0xFE,
- 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEF, 0xFD, 0xDF, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xDE, 0xDE, 0xED, 0xCC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xED, 0xDE, 0xDC, 0xBA, 0x99, 0x99, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xDD, 0xCD, 0xBA, 0xA8, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBB,
- 0xDD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xCD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9B, 0xCC, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC,
- 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0xAA, 0xBC, 0xCD, 0xED,
- 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xDE, 0xEC, 0xDD,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFE, 0xDE, 0xEE, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFD, 0xEE, 0xEE, 0xDD, 0xDC,
- 0xDD, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0x9D, 0xDC, 0xDC, 0xCC, 0xCC, 0xCD,
- 0xDD, 0xED, 0xEE, 0xEE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xEF, 0xED, 0xDD, 0xCD, 0xDC, 0xCC, 0xCD, 0xDD, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xEE, 0xDD, 0xDE, 0xEF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEE,
- 0xDD, 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFF, 0xDF, 0xFF, 0xED, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xCD, 0xDE, 0xFF, 0xFE, 0xEF, 0xFD, 0xCB, 0xAA, 0x99, 0x9A,
- 0xAB, 0xBC, 0xDE, 0xFF, 0xEE, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9B,
- 0xCC, 0xEE, 0xFD, 0xEF, 0xDB, 0xA9, 0x87, 0x76, 0x67, 0x88, 0x9B, 0xCD,
- 0xFF, 0xFD, 0xDD, 0xBA, 0x97, 0x66, 0x55, 0x66, 0x89, 0xAB, 0xDE, 0xFF,
- 0xDD, 0xCB, 0x98, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBC, 0xDF, 0xFE, 0xEC,
- 0xA9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCD, 0xFE, 0xDD, 0xCB, 0x98,
- 0x65, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xDF, 0xED, 0xDC, 0xBA, 0x87, 0x65,
- 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xEE, 0xDE, 0xCB, 0xA9, 0x76, 0x65, 0x56,
- 0x67, 0x8A, 0xBD, 0xDF, 0xFD, 0xFD, 0xCB, 0x98, 0x87, 0x66, 0x77, 0x89,
- 0xAC, 0xEF, 0xFF, 0xDF, 0xDD, 0xBB, 0xA9, 0x88, 0x88, 0x99, 0xAB, 0xCE,
- 0xFF, 0xFD, 0xEF, 0xDD, 0xCB, 0xAA, 0x99, 0x9A, 0xBB, 0xCD, 0xEF, 0xFF,
- 0xEF, 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFE, 0xFF,
- 0xDE, 0xDD, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF,
- 0xEE, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0x9D, 0xDD, 0xDD, 0xEE, 0xDD, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0x8D, 0xEE,
- 0xCC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xED, 0xCD, 0xDC, 0xCB,
- 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0xCC, 0xDC, 0xBB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xCC, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89,
- 0x9A, 0xBC, 0xDC, 0xBB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xDC,
- 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xBB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xAB, 0xCC, 0xBC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB,
- 0xCD, 0xCC, 0xCC, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xDC,
- 0xCD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xCC, 0xDD, 0xDC, 0xED,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xED, 0xCE, 0xED, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEE, 0xDC, 0xEE, 0xED, 0xDC, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFE, 0x7C, 0xCC, 0xCC, 0xCB, 0xCB, 0xBB,
- 0xCC, 0xCC, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xAB, 0xBB, 0x8C, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDC, 0xBC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xBB, 0xAA, 0x99, 0x99,
- 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88,
- 0x88, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBB, 0xBA, 0xAA, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xA9,
- 0x98, 0x76, 0x55, 0x45, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A,
- 0xBC, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCB,
- 0xBC, 0xBA, 0xAA, 0x99, 0x98, 0x89, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCB,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDD, 0xCB, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0x8B, 0xBB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0x9B, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x9B, 0xCB,
- 0xBB, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBB, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78,
- 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBA,
- 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xCB,
- 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xCC, 0xCB, 0xBB, 0xBA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBB, 0xAA, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xBB, 0x8B, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDB, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBB, 0xBB, 0xAA, 0x99, 0x88,
- 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xCB, 0xAB, 0xAA, 0x98, 0x88, 0x87, 0x88,
- 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAB, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A,
- 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xBA,
- 0x9A, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xA9, 0xA9,
- 0x87, 0x76, 0x55, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0x9A, 0x98, 0x87,
- 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBA, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBB, 0xBA, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x88, 0x9A, 0xAB, 0xCB,
- 0xAC, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xCB,
- 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCB, 0xBC, 0xCB, 0xBB,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCB, 0xDD, 0xCC, 0xBB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xDC, 0xDC, 0x8B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0x7D, 0xFE,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xED, 0xDD, 0xDC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDC, 0xDC, 0xCB, 0xA9, 0x99,
- 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xED, 0xCD, 0xBA, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xAC, 0xCD, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDD, 0xBC, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCC, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCC,
- 0xBB, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55,
- 0x67, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78,
- 0x99, 0xBB, 0xCC, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCC, 0xCC, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xDD,
- 0xCC, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xDC, 0xDD,
- 0xCC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xED, 0xDE, 0xDD, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xED, 0xED, 0xEE, 0xEC, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFE, 0x8D, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFF, 0xFF, 0xED, 0xDC, 0xDD, 0xDD, 0xCD, 0xCC, 0xCC, 0x8F, 0xFF,
- 0xFF, 0xEE, 0xEE, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE,
- 0xDD, 0xDD, 0xCD, 0xCD, 0xEE, 0xEF, 0xEF, 0xEE, 0xFF, 0xED, 0xDD, 0xCB,
- 0xBB, 0xBC, 0xCD, 0xDD, 0xEF, 0xFD, 0xEF, 0xDE, 0xDC, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xCD, 0xDE, 0xFF, 0xDE, 0xFE, 0xDC, 0xA9, 0x98, 0x88, 0x99, 0xAB,
- 0xCC, 0xEF, 0xFD, 0xEF, 0xDC, 0xB9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xEF, 0xEE, 0xDD, 0xCA, 0x98, 0x66, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFE,
- 0xED, 0xDB, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xEF, 0xDD, 0xED,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFE, 0xDE, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xED, 0xED, 0xCA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xCE, 0xEE, 0xDD, 0xDC, 0xA9, 0x87, 0x65, 0x55,
- 0x68, 0x9A, 0xCD, 0xDF, 0xFD, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x89,
- 0xBC, 0xDE, 0xEF, 0xCE, 0xDC, 0xCB, 0xA9, 0x98, 0x88, 0x99, 0xBB, 0xDD,
- 0xFF, 0xED, 0xEF, 0xEC, 0xCB, 0xAA, 0xA9, 0xAA, 0xBB, 0xDD, 0xEF, 0xFF,
- 0xCD, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xDD, 0xFF, 0xFF, 0xFC, 0xFE,
- 0xDD, 0xDD, 0xDC, 0xCD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xCE, 0xDE, 0xED,
- 0xDD, 0xEE, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFC, 0xFE, 0xFE, 0xDE, 0xEE,
- 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xCC, 0xCD, 0xDD, 0xDE,
- 0xEE, 0xDE, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0xFE,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xFD, 0xDF, 0xED, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDD, 0xED, 0xDC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xED, 0xDD, 0xDC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xCD, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99,
- 0xAB, 0xCD, 0xED, 0xCC, 0xCB, 0x99, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9A, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBC, 0xDE, 0xED,
- 0xCD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xDC, 0xED,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFE, 0xCE, 0xED, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xEC, 0xFE, 0xEE, 0xED, 0xDD,
- 0xDD, 0xDD, 0xEE, 0xEE, 0xFF, 0xFF, 0x8D, 0xDD, 0xDC, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xEE, 0xEE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCD, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xAE, 0xEE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xDE, 0xDC, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xCB, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCC,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED,
- 0xCD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDD,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xCE, 0xDD, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xEE, 0xDD, 0xDC, 0xCC,
- 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFE, 0xAD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xCC, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0x9E, 0xFF,
- 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDE, 0xFD, 0xEE, 0xED, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDD, 0xEE, 0xDD, 0xED, 0xCC, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xED, 0xDD, 0xCC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xCD, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xAB, 0xCD, 0xDD, 0xCD, 0xCB, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBB,
- 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xCC, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDB, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9A, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xBC, 0xCD, 0xED,
- 0xCE, 0xDC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xEC, 0xED,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xCE, 0xED, 0xDD,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFD, 0xEE, 0xEE, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xEF, 0xEF, 0xFF, 0x9C, 0xCD, 0xDC, 0xDC, 0xCC, 0xCD,
- 0xDD, 0xDD, 0xEE, 0xFE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xFE, 0xED, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7E, 0xFF,
- 0xFF, 0xFE, 0xEE, 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFD, 0xDF, 0xFE, 0xFE,
- 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xDE, 0xFE, 0xEE, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xFD, 0xEF, 0xED, 0xCB, 0xBA, 0xA9, 0x9A,
- 0xAB, 0xBC, 0xDD, 0xEE, 0xDE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0xAA,
- 0xCC, 0xDE, 0xED, 0xDE, 0xDB, 0xB9, 0x87, 0x76, 0x77, 0x89, 0xAB, 0xCD,
- 0xEF, 0xDE, 0xDC, 0xBA, 0x97, 0x66, 0x55, 0x67, 0x89, 0xAC, 0xCE, 0xFD,
- 0xDD, 0xCB, 0xA8, 0x75, 0x54, 0x45, 0x67, 0x8A, 0xBD, 0xDF, 0xED, 0xEC,
- 0xB9, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCD, 0xED, 0xDD, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xED, 0xDC, 0xBA, 0x87, 0x65,
- 0x44, 0x46, 0x78, 0xAB, 0xCD, 0xED, 0xDD, 0xDB, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x9A, 0xBC, 0xEF, 0xDD, 0xED, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x89,
- 0xBC, 0xDE, 0xFE, 0xDF, 0xDC, 0xCB, 0xA9, 0x88, 0x88, 0x99, 0xAB, 0xCD,
- 0xFF, 0xED, 0xEE, 0xDD, 0xBB, 0xAA, 0x99, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF,
- 0xDE, 0xED, 0xCC, 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF,
- 0xED, 0xDD, 0xCC, 0xCC, 0xCD, 0xDE, 0xFE, 0xFF, 0xFF, 0xDF, 0xFE, 0xEE,
- 0xDE, 0xDE, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xEF, 0xEE, 0xFE,
- 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDD, 0xDC, 0xDE, 0xDE, 0xED,
- 0xED, 0xFF, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xEE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0x8E, 0xFF,
- 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFE, 0xEF, 0xED, 0xCC,
- 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xEE, 0xDE, 0xED, 0xCB, 0xBA, 0xAA,
- 0xA9, 0xAA, 0xAB, 0xCD, 0xDE, 0xFD, 0xED, 0xDC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDF, 0xDC, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xAB, 0xCD, 0xED, 0xDC, 0xBA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xCE, 0xDC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xCC, 0xBA, 0x98, 0x66, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA8, 0x76, 0x54, 0x34, 0x55, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98,
- 0x65, 0x53, 0x34, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x54, 0x56, 0x67, 0x99, 0xBC, 0xDD, 0xCC, 0xCA, 0x98, 0x77, 0x65, 0x56,
- 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88,
- 0x9A, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xDE, 0xEC, 0xDD, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xEE,
- 0xDE, 0xDC, 0xCB, 0xAA, 0xAA, 0x9A, 0xAA, 0xBB, 0xCE, 0xEF, 0xFD, 0xEE,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xDE, 0xED, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFD, 0xFF, 0xFD, 0xED, 0xDD,
- 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFE, 0x7C, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xDD, 0xDD, 0xEE, 0xFE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0x8B, 0xDC,
- 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xEB, 0xBC, 0xBB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x98,
- 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x98, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAB, 0xAA, 0xA9,
- 0x88, 0x76, 0x55, 0x45, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87,
- 0x66, 0x55, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBC, 0xBA, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xBD, 0xCC, 0xBB,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xCB, 0xDC, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEC, 0x8B, 0xBB, 0xBB, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x8B, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xBB, 0xBA, 0xAA,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78,
- 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99,
- 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA,
- 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9,
- 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77,
- 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x78, 0x89, 0xAB, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB,
- 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xCB,
- 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCB, 0xBC, 0xCB, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xCB, 0xCC, 0xCB, 0xBB, 0xBA,
- 0xAA, 0xAB, 0xBB, 0xBC, 0xCC, 0xDC, 0x8B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xAB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00,
- ],
- [
- 0xAC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8C, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xBA,
- 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCB, 0xAA, 0x99, 0x98,
- 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x88,
- 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBC, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x55, 0x45, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x98, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAA, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xBB, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB,
- 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCB, 0xCC,
- 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xDC, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0x8C, 0xBB, 0xBB, 0xBB, 0xBB, 0xAB,
- 0xBB, 0xBC, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCE, 0xDC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xBC, 0xCC, 0x7D, 0xFE,
- 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xFD, 0xDE, 0xDC, 0xCB,
- 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xDE, 0xDD, 0xDD, 0xCB, 0xAA, 0x99,
- 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xFD, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x99, 0xAB, 0xBC, 0xDD, 0xCC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAB, 0xBD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x89, 0xAB,
- 0xCD, 0xDB, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC,
- 0xCB, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x67, 0x78, 0x9B, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0x98, 0x77, 0x65,
- 0x54, 0x55, 0x67, 0x89, 0xAC, 0xCC, 0xBC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x66, 0x67, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x99, 0xBB,
- 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0x99, 0xAB, 0xCD, 0xDD,
- 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDE, 0xFC, 0xDD,
- 0xDC, 0xBB, 0xBA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDF, 0xEE, 0xDE, 0xDE, 0xDC,
- 0xCC, 0xCB, 0xBC, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xFE, 0xED, 0xDD, 0xCC,
- 0xCD, 0xCC, 0xDE, 0xDE, 0xFF, 0xFF, 0x8C, 0xCC, 0xDC, 0xCC, 0xCC, 0xCC,
- 0xDD, 0xCD, 0xDE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xEE, 0xED, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xED, 0xED, 0xDD, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEE,
- 0xDD, 0xDC, 0xCD, 0xDD, 0xDD, 0xFF, 0xFF, 0xDE, 0xFF, 0xED, 0xDC, 0xCB,
- 0xBB, 0xCC, 0xCC, 0xDD, 0xFF, 0xFD, 0xEF, 0xEE, 0xDC, 0xBB, 0xAA, 0xAA,
- 0xBB, 0xCD, 0xDE, 0xFF, 0xEF, 0xFE, 0xDB, 0xBA, 0x98, 0x88, 0x99, 0xAB,
- 0xCC, 0xDE, 0xFF, 0xEF, 0xDD, 0xB9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCE,
- 0xEF, 0xED, 0xED, 0xCA, 0x97, 0x66, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xFF,
- 0xDD, 0xDB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xED, 0xEC,
- 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDE, 0xFE, 0xDD, 0xCB, 0xA8,
- 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBD, 0xFE, 0xFD, 0xEC, 0xCA, 0x87, 0x65,
- 0x44, 0x45, 0x78, 0xAC, 0xDF, 0xFF, 0xDE, 0xDC, 0xA9, 0x87, 0x65, 0x55,
- 0x67, 0x9A, 0xCD, 0xFF, 0xFD, 0xFD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x8A,
- 0xBD, 0xEF, 0xFF, 0xCF, 0xDD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDE,
- 0xFF, 0xED, 0xFD, 0xED, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDE, 0xEE, 0xFF,
- 0xDE, 0xFD, 0xDD, 0xCB, 0xBB, 0xBB, 0xCC, 0xEE, 0xFF, 0xFF, 0xFD, 0xFE,
- 0xEE, 0xDD, 0xDD, 0xCD, 0xDD, 0xEE, 0xFE, 0xFF, 0xFF, 0xDF, 0xEE, 0xEE,
- 0xDD, 0xED, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0xFD, 0xEE, 0xEE, 0xEF, 0xEF,
- 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xCC, 0xDD, 0xDD, 0xDE,
- 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xEF, 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF,
- 0xEF, 0xDD, 0xDC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xED, 0xEF, 0xED, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDE, 0xFE, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xFD, 0xEE, 0xDC, 0xBA, 0x99, 0x99, 0x99,
- 0x9A, 0xAB, 0xCD, 0xDE, 0xDD, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xAB, 0xCD, 0xED, 0xDD, 0xCA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xDE, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xEE,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCE, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xEE, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAC, 0xDE, 0xEC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78,
- 0x9B, 0xCD, 0xEE, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBD,
- 0xEF, 0xFC, 0xDC, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBC, 0xDF, 0xFF,
- 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFC, 0xED,
- 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xCE, 0xED, 0xDD,
- 0xDC, 0xCC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFC, 0xFE, 0xEE, 0xEE, 0xEE,
- 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE,
- 0xEF, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xEE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCC, 0xAF, 0xFE,
- 0xED, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xEF, 0xDD, 0xCB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDD, 0xED, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xED, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xCD, 0xDC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89,
- 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC,
- 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9A, 0xBD, 0xDB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB,
- 0xCD, 0xEC, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE,
- 0xCD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xEC, 0xDD,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFF, 0xCE, 0xDD, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFC, 0xEE, 0xDD, 0xDD, 0xCC,
- 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFF, 0xAD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD,
- 0xDD, 0xEE, 0xEF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xDF, 0xFE, 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF,
- 0xFE, 0xDD, 0xDC, 0xCC, 0xDD, 0xDD, 0xDD, 0xEE, 0xEC, 0xEF, 0xEE, 0xDC,
- 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xDE, 0xEE, 0xDC, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xED, 0xEE, 0xDC, 0xBA, 0x99, 0x99, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xEC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xAB, 0xCD, 0xDD, 0xDD, 0xCB, 0xA8, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBC,
- 0xCD, 0xDD, 0xDC, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xCC, 0xDD,
- 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xEE, 0xCC, 0xCA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78,
- 0x9B, 0xCD, 0xEE, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC,
- 0xEF, 0xEC, 0xDD, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE,
- 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xEF, 0xFC, 0xED,
- 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xCE, 0xED, 0xDD,
- 0xDC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFD, 0xFE, 0xEE, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0x8C, 0xCC, 0xCC, 0xDC, 0xDD, 0xDD,
- 0xDE, 0xEE, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xFF, 0xFD, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xDE, 0xDF, 0xDE, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xED, 0xDD, 0xCC, 0xCD, 0xEE, 0xEE, 0xFF, 0xDF, 0xFF, 0xFF, 0xED, 0xCC,
- 0xBC, 0xBB, 0xCD, 0xDD, 0xEF, 0xFD, 0xFF, 0xFE, 0xEC, 0xBA, 0xAA, 0xAA,
- 0xBB, 0xCC, 0xDF, 0xEF, 0xDF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x99, 0xAB,
- 0xCC, 0xEF, 0xFF, 0xFF, 0xED, 0xBA, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xDD,
- 0xEF, 0xDF, 0xFF, 0xCA, 0x97, 0x65, 0x55, 0x67, 0x89, 0xBC, 0xDF, 0xFE,
- 0xEF, 0xDC, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x9A, 0xBD, 0xEF, 0xFE, 0xFD,
- 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCF, 0xFF, 0xDF, 0xDC, 0xA8,
- 0x75, 0x43, 0x34, 0x57, 0x8A, 0xCD, 0xEF, 0xED, 0xFD, 0xCA, 0x97, 0x65,
- 0x44, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xEF, 0xDC, 0xB9, 0x87, 0x65, 0x55,
- 0x68, 0x9B, 0xCF, 0xFF, 0xFD, 0xEE, 0xCB, 0xA9, 0x87, 0x76, 0x78, 0x9A,
- 0xCD, 0xFF, 0xFF, 0xDF, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDF,
- 0xFF, 0xFD, 0xFD, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xCD, 0xDF, 0xFF, 0xFF,
- 0xDF, 0xFD, 0xDD, 0xCC, 0xCB, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFD, 0xFE,
- 0xFE, 0xDD, 0xDC, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFE, 0xEE,
- 0xEE, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xEF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xCC, 0xCD, 0xDE, 0xEF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xFF, 0xDF, 0xDE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7F, 0xFF,
- 0xEF, 0xFF, 0xFD, 0xEE, 0xFE, 0xDD, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEE,
- 0xDD, 0xDD, 0xDD, 0xCD, 0xDF, 0xFF, 0xFF, 0xDF, 0xFE, 0xED, 0xDC, 0xCB,
- 0xBB, 0xBC, 0xCC, 0xDD, 0xFF, 0xFD, 0xFF, 0xFD, 0xDB, 0xBA, 0xAA, 0xAA,
- 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFE, 0xDB, 0xAA, 0x98, 0x89, 0x99, 0xAB,
- 0xCC, 0xFF, 0xFF, 0xFE, 0xDC, 0xBA, 0x98, 0x77, 0x78, 0x89, 0xAC, 0xCC,
- 0xFF, 0xFD, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x89, 0xAC, 0xCD, 0xFE,
- 0xDD, 0xCB, 0xA9, 0x76, 0x54, 0x45, 0x67, 0x9A, 0xCC, 0xDF, 0xDD, 0xED,
- 0xBA, 0x97, 0x64, 0x23, 0x46, 0x78, 0xAB, 0xDD, 0xFF, 0xDD, 0xCB, 0xA9,
- 0x76, 0x43, 0x24, 0x57, 0x9A, 0xCD, 0xFF, 0xFE, 0xDC, 0xCA, 0x98, 0x65,
- 0x44, 0x56, 0x78, 0xAC, 0xDE, 0xFD, 0xDD, 0xDC, 0xAA, 0x87, 0x66, 0x56,
- 0x78, 0x9A, 0xBD, 0xFF, 0xFE, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x78, 0x99,
- 0xBC, 0xEF, 0xFF, 0xDF, 0xED, 0xCB, 0xA9, 0x98, 0x89, 0x9A, 0xBC, 0xDD,
- 0xFF, 0xFD, 0xFF, 0xEC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAC, 0xDE, 0xEF, 0xFF,
- 0xDF, 0xFE, 0xCC, 0xDC, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF,
- 0xDE, 0xED, 0xDD, 0xCC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFE, 0xFF,
- 0xFF, 0xEC, 0xED, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xED, 0xFE,
- 0xED, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6C, 0xCB, 0xBC, 0xCD, 0xDC, 0xCF,
- 0xDF, 0xEF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0x8D, 0xDC,
- 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xCD, 0xCB, 0xAA,
- 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCB, 0xBA, 0x99, 0x99,
- 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xDB, 0xBC, 0xAA, 0x99, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xCD, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89,
- 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A,
- 0xBC, 0xBA, 0xBA, 0x98, 0x76, 0x66, 0x56, 0x66, 0x78, 0x89, 0xAB, 0xBB,
- 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBB, 0xBA, 0xA9,
- 0x98, 0x76, 0x55, 0x44, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x99, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x76, 0x65,
- 0x55, 0x56, 0x67, 0x89, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCC, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xCA, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xCC,
- 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x88, 0x99, 0x9A, 0xBB, 0xCD, 0xDB, 0xDC,
- 0xCB, 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xDD, 0xBD, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDB, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0x8C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBC, 0xDD, 0xDE, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0x9B, 0xCB,
- 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xDB, 0xBC, 0xBA, 0xA9,
- 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x99,
- 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x65, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0x9A, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB,
- 0xAB, 0xAA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBB,
- 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCC, 0xBC, 0xBB, 0xAA,
- 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xCB, 0xCC, 0xCB, 0xBB, 0xAA,
- 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDD, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xBC, 0xCD, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBD, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBB, 0x8D, 0xDC,
- 0xCB, 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xCD, 0xDB, 0xCC, 0xCB, 0xAA,
- 0xAA, 0x99, 0x9A, 0xAA, 0xAB, 0xBB, 0xCD, 0xBC, 0xCB, 0xAA, 0x99, 0x98,
- 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDB, 0xBB, 0xBA, 0x98, 0x88, 0x88, 0x88,
- 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x88,
- 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x77, 0x89, 0x9A,
- 0xBB, 0xBA, 0xB9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x78, 0x89, 0xAB, 0xBB,
- 0xAA, 0x99, 0x87, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x55, 0x44, 0x56, 0x67, 0x89, 0x9A, 0xBB, 0xAA, 0x99, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBA, 0xAA, 0x98, 0x77, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x99, 0xBB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCB, 0xAB, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBC, 0xCB, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xCC,
- 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCB, 0xCB,
- 0xBB, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xBD, 0xDC, 0xBB,
- 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDB, 0xDD, 0xCC, 0xCB, 0xBB,
- 0xBB, 0xBC, 0xCC, 0xCD, 0xDD, 0xED, 0x8B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
- 0xBB, 0xBC, 0xCD, 0xDD, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEE, 0xFF, 0xDF, 0xDD, 0xCC, 0xCC, 0xDD, 0xCC, 0xCC, 0xCC, 0x7F, 0xFF,
- 0xFF, 0xFD, 0xDE, 0xDD, 0xDE, 0xDE, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xED,
- 0xCD, 0xCC, 0xCC, 0xDC, 0xDD, 0xEE, 0xFF, 0xDF, 0xFF, 0xDE, 0xCC, 0xBB,
- 0xBB, 0xBB, 0xBC, 0xDD, 0xFE, 0xFE, 0xFF, 0xED, 0xCB, 0xAA, 0x99, 0xAA,
- 0xAA, 0xBC, 0xCE, 0xEF, 0xEE, 0xED, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAB,
- 0xCC, 0xDE, 0xFF, 0xDF, 0xDB, 0xA9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD,
- 0xDE, 0xED, 0xFC, 0xBA, 0x97, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCE, 0xED,
- 0xDE, 0xCB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDE, 0xED, 0xEC,
- 0xB9, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFF, 0xDE, 0xCB, 0x98,
- 0x75, 0x43, 0x34, 0x57, 0x89, 0xBC, 0xDE, 0xFD, 0xDC, 0xBA, 0x97, 0x65,
- 0x44, 0x46, 0x78, 0xAB, 0xCD, 0xFE, 0xDE, 0xCB, 0xA9, 0x87, 0x65, 0x56,
- 0x67, 0x9A, 0xBC, 0xDF, 0xDD, 0xED, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x89,
- 0xAC, 0xDF, 0xFF, 0xEF, 0xDC, 0xBB, 0xA9, 0x88, 0x88, 0x99, 0xAB, 0xCD,
- 0xFF, 0xFF, 0xFD, 0xDC, 0xBB, 0xAA, 0x99, 0x9A, 0xAB, 0xCE, 0xDF, 0xFF,
- 0xDF, 0xFD, 0xDC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFD, 0xFF,
- 0xDE, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xFF, 0xDF, 0xEF, 0xEE,
- 0xED, 0xDD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xEF, 0xFE, 0xEE,
- 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xDD, 0xDD, 0xED, 0xDE,
- 0xEE, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xCB, 0xBB, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xDD, 0xFD, 0xDF, 0xFF, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC,
- 0xCC, 0xCD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFF, 0xFC, 0xDB, 0xBA, 0xBB,
- 0xCB, 0xDD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x99, 0x9A, 0xBC,
- 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x77, 0x78, 0x9A, 0xBC, 0xDD,
- 0xFD, 0xFF, 0xFF, 0xDD, 0xA8, 0x76, 0x55, 0x68, 0x9A, 0xBC, 0xFF, 0xFF,
- 0xFF, 0xFC, 0xC9, 0x76, 0x54, 0x45, 0x68, 0xAB, 0xCC, 0xFF, 0xFF, 0xFD,
- 0xCA, 0x97, 0x54, 0x23, 0x45, 0x79, 0xBC, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9,
- 0x76, 0x43, 0x24, 0x57, 0x9A, 0xCF, 0xFF, 0xFF, 0xFD, 0xDB, 0xA8, 0x65,
- 0x44, 0x56, 0x79, 0xBD, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x87, 0x65, 0x56,
- 0x78, 0xAC, 0xDF, 0xFF, 0xFD, 0xFC, 0xFD, 0xBA, 0x88, 0x77, 0x78, 0x9A,
- 0xCD, 0xFF, 0xFF, 0xDF, 0xFF, 0xDC, 0xBA, 0x99, 0x99, 0xAB, 0xCD, 0xFF,
- 0xFF, 0xFD, 0xFF, 0xFD, 0xDC, 0xBB, 0xBA, 0xBB, 0xDD, 0xFF, 0xFF, 0xFF,
- 0xDF, 0xFD, 0xFF, 0xDD, 0xDC, 0xCB, 0xDC, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF,
- 0xDF, 0xDD, 0xFD, 0xFD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFD,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCB, 0xDD, 0xCF, 0xFF, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEF, 0xEF, 0xFD, 0xDC, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9F, 0xFF,
- 0xFE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDF, 0xFD, 0xFF, 0xFF, 0xCC,
- 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xDC, 0xEF, 0xEF, 0xFD, 0xDC, 0xBA, 0xAA,
- 0x99, 0xAA, 0xAB, 0xCC, 0xDE, 0xFD, 0xFE, 0xDC, 0xBA, 0x99, 0x88, 0x89,
- 0x9A, 0xAA, 0xCC, 0xDD, 0xED, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89,
- 0xAB, 0xCD, 0xEE, 0xDD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAC,
- 0xCD, 0xDD, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xED,
- 0xDC, 0xBA, 0x87, 0x65, 0x54, 0x45, 0x66, 0x79, 0xAB, 0xCD, 0xEC, 0xCB,
- 0xA8, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xBD, 0xEE, 0xCC, 0xBA, 0x87,
- 0x65, 0x54, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xEC, 0xCB, 0x98, 0x76, 0x65,
- 0x54, 0x55, 0x67, 0x8A, 0xBC, 0xFE, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAB, 0xDF, 0xFC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78,
- 0x9A, 0xBE, 0xFF, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x9A, 0xBC,
- 0xFF, 0xFC, 0xDD, 0xBB, 0xAA, 0x99, 0x88, 0x89, 0x9A, 0xBC, 0xDF, 0xFF,
- 0xDD, 0xDC, 0xBB, 0xBA, 0xA9, 0x9A, 0xAA, 0xBC, 0xDE, 0xFF, 0xFC, 0xED,
- 0xCC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xDD, 0xDD, 0xED,
- 0xDC, 0xDC, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFE, 0xDE, 0xDD,
- 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xDD, 0xDD, 0xDF, 0xDE, 0xEE,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFE, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDE, 0xBF, 0xFF,
- 0xFE, 0xDC, 0xCC, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFD, 0xCC,
- 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xEF, 0xFD, 0xCB, 0xAA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xFE, 0xFE, 0xCB, 0xA9, 0x98, 0x88, 0x88,
- 0x89, 0x9A, 0xBC, 0xDF, 0xDD, 0xDC, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89,
- 0x9A, 0xBC, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xDC, 0xCB, 0x98, 0x76, 0x65, 0x55, 0x56, 0x77, 0x89, 0xAC, 0xDD,
- 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xBA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCB, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, 0x98, 0x76, 0x65,
- 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xCC, 0xA9, 0x87, 0x76, 0x65, 0x55,
- 0x66, 0x78, 0x9B, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xEF, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAC,
- 0xDF, 0xFD, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCE, 0xFF,
- 0xDD, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xFF, 0xFD, 0xED,
- 0xCC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xFF, 0xDF, 0xED, 0xDC,
- 0xCC, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFE, 0xFF, 0xEE, 0xDD, 0xDC,
- 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xBE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xEF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xFD, 0xEC, 0xDC, 0xCD, 0xCE, 0x9F, 0xFF,
- 0xFF, 0xFD, 0xDD, 0xCC, 0xDC, 0xDD, 0xDE, 0xEF, 0xFD, 0xFF, 0xFF, 0xED,
- 0xDC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xEF, 0xDF, 0xFE, 0xDD, 0xCB, 0xAA,
- 0xAA, 0xAA, 0xBC, 0xCD, 0xDD, 0xFD, 0xFF, 0xDC, 0xBA, 0x99, 0x98, 0x99,
- 0x9A, 0xAB, 0xCC, 0xDD, 0xDF, 0xED, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A,
- 0xAB, 0xCD, 0xFD, 0xED, 0xCB, 0x98, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xAC,
- 0xDD, 0xDD, 0xEB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD,
- 0xDD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xDE, 0xDD, 0xCB,
- 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xFD, 0xDD, 0xBA, 0x97,
- 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDD, 0xDC, 0xA9, 0x87, 0x65,
- 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xEE, 0xDD, 0xBA, 0x98, 0x76, 0x65, 0x55,
- 0x67, 0x89, 0xAC, 0xDD, 0xED, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78,
- 0x9B, 0xCF, 0xFE, 0xDD, 0xDB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBD,
- 0xDF, 0xFD, 0xDD, 0xBB, 0xA9, 0x99, 0x89, 0x89, 0xAA, 0xBD, 0xEE, 0xFF,
- 0xDE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBD, 0xDF, 0xFF, 0xFD, 0xDD,
- 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDF, 0xFF, 0xFF, 0xDE, 0xDD, 0xDC,
- 0xCC, 0xCC, 0xCC, 0xDD, 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xDF, 0xFE, 0xDE,
- 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xCC, 0xDC, 0xDC, 0xDD, 0xDD,
- 0xDD, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xCB, 0x7F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFD, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFD, 0xFF,
- 0xCD, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xCC,
- 0xCC, 0xCD, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xCB, 0xAA, 0xA9, 0xAB, 0xBD,
- 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFC, 0xB9, 0x76, 0x66, 0x78, 0x9B, 0xCD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xCA, 0x86, 0x54, 0x45, 0x79, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA,
- 0x86, 0x42, 0x24, 0x68, 0xAB, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB8, 0x75,
- 0x44, 0x56, 0x8A, 0xCF, 0xFF, 0xFF, 0xDF, 0xFD, 0xCB, 0x98, 0x76, 0x67,
- 0x89, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0xA9, 0x88, 0x89, 0xBB,
- 0xCF, 0xFF, 0xFF, 0xDF, 0xFF, 0xCC, 0xBB, 0xAA, 0xAA, 0xBC, 0xDF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xCC, 0xBC, 0xCC, 0xCF, 0xFF, 0xFF, 0xFF,
- 0xCF, 0xFD, 0xFF, 0xCC, 0xDD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDD, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7B, 0xCD, 0xDC, 0xCD, 0xDF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xDF, 0xFD, 0xCB, 0xBF, 0xBC, 0xDC, 0xBA, 0xCB, 0xCB, 0x7F, 0xDF,
- 0xDD, 0xDF, 0xCC, 0xBC, 0xFC, 0xFC, 0xFF, 0xFF, 0xFC, 0xDD, 0xFF, 0xDD,
- 0xDC, 0xFB, 0xDB, 0xCB, 0xCF, 0xDC, 0xFF, 0xBC, 0xFF, 0xFA, 0xFB, 0xFB,
- 0xAB, 0xCC, 0xCC, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xBB, 0xAA, 0xA9, 0x9A,
- 0xBB, 0xCC, 0xCC, 0xFF, 0xCC, 0xFD, 0xCB, 0x9B, 0x89, 0x88, 0x99, 0xAB,
- 0xAD, 0xCD, 0xFF, 0xFC, 0xBA, 0xAA, 0x97, 0x77, 0x78, 0x89, 0xAA, 0xBF,
- 0xFF, 0xCB, 0xFC, 0xB9, 0x97, 0x76, 0x66, 0x77, 0x89, 0xAA, 0xFC, 0xFB,
- 0xBC, 0xBB, 0xA9, 0x76, 0x54, 0x55, 0x67, 0x8A, 0xAC, 0xDC, 0xDD, 0xCC,
- 0xB9, 0x97, 0x64, 0x23, 0x46, 0x78, 0x9C, 0xCB, 0xFC, 0xCF, 0xBB, 0xA8,
- 0x76, 0x43, 0x24, 0x67, 0x99, 0xAC, 0xCF, 0xCF, 0xBC, 0xC9, 0x97, 0x65,
- 0x44, 0x56, 0x78, 0x9A, 0xCD, 0xFF, 0xDC, 0xCA, 0xA9, 0x87, 0x66, 0x66,
- 0x78, 0x9A, 0xBB, 0xFF, 0xFF, 0xFF, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x8A,
- 0xBC, 0xBC, 0xFC, 0xFC, 0xCF, 0xCC, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xCF,
- 0xCF, 0xFF, 0xFF, 0xFC, 0xCB, 0xAA, 0x9A, 0xA9, 0xAA, 0xCF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xEC, 0xAA, 0xAB, 0xAC, 0xCC, 0xDF, 0xFF, 0xFC, 0xDF,
- 0xCD, 0xCD, 0xBC, 0xCB, 0xCF, 0xFB, 0xDC, 0xFD, 0xFF, 0xDF, 0xFF, 0xDC,
- 0xFD, 0xDC, 0xFC, 0xDF, 0xDD, 0xCF, 0xFF, 0xFA, 0xDC, 0xDF, 0xFD, 0xFD,
- 0xCD, 0xDF, 0xDF, 0xDD, 0xDF, 0xFF, 0x6C, 0xBB, 0xCC, 0xCC, 0xDB, 0xFD,
- 0xCF, 0xFF, 0xDD, 0xFF, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xCB, 0xAA, 0xAA, 0x99, 0x99, 0xA9, 0xAA, 0xAA, 0xAB, 0x8C, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xCB, 0xCD, 0xDB, 0xBC, 0xCA, 0xBA,
- 0x9A, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCE, 0xCB, 0xBB, 0xAA, 0x99, 0x98,
- 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCB, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x88,
- 0x89, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89,
- 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x87, 0x77, 0x66, 0x67, 0x77, 0x89, 0x9A,
- 0xBC, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xBB,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAB, 0xBA, 0xA9,
- 0x88, 0x76, 0x65, 0x44, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0x9A, 0x98, 0x87,
- 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAA, 0xB9, 0xA9, 0x88, 0x77, 0x65,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0x9A, 0xA9, 0x87, 0x76, 0x66, 0x56,
- 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77,
- 0x89, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x9A,
- 0xBC, 0xDA, 0xBB, 0xA9, 0x98, 0x88, 0x87, 0x88, 0x88, 0x9A, 0xAB, 0xCB,
- 0xAC, 0xBA, 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAB, 0xCD, 0xCA, 0xCB,
- 0xBA, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB,
- 0xBA, 0xAA, 0xBA, 0xAA, 0xBB, 0xBE, 0xED, 0xCB, 0xCC, 0xDD, 0xCB, 0xBB,
- 0xBB, 0xBB, 0xBB, 0xCD, 0xFE, 0xFE, 0x8C, 0xBB, 0xBB, 0xAA, 0xAB, 0xBB,
- 0xBB, 0xCC, 0xCD, 0xDD, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAC, 0xCC,
- 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xDC, 0xBC, 0xBA, 0xA9,
- 0x99, 0x98, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0xA9, 0x98, 0x88,
- 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77,
- 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x78,
- 0x89, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x89,
- 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA,
- 0x99, 0x98, 0x77, 0x66, 0x65, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99,
- 0x87, 0x76, 0x65, 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x88, 0x77,
- 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66,
- 0x65, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66,
- 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77,
- 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99,
- 0xAB, 0xBA, 0xAA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB,
- 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xBB,
- 0xAA, 0x99, 0x99, 0x98, 0x99, 0x99, 0xAA, 0xBC, 0xDC, 0xBC, 0xBB, 0xBA,
- 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCD, 0xDC, 0xDC, 0xCB, 0xBA, 0xAA,
- 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xED, 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA,
- 0xAA, 0xBB, 0xCC, 0xDE, 0xD0, 0x00, 0x00, 0x00,
- ],
- [
- 0xBC, 0xBA, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0x8C, 0xCC,
- 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCD, 0xDC, 0xDB, 0xBC, 0xBC, 0xA9,
- 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xAB, 0xCA, 0xAA, 0x98, 0x88,
- 0x88, 0x89, 0x99, 0xAA, 0xCC, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x78, 0x88,
- 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88,
- 0x99, 0xAA, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x77, 0x88, 0x9A,
- 0xBA, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0xAA, 0xAA,
- 0xAA, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0xA9,
- 0x88, 0x76, 0x65, 0x44, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0x9A, 0x98, 0x87,
- 0x66, 0x54, 0x45, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xB9, 0x98, 0x76, 0x66,
- 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x66,
- 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77,
- 0x89, 0x9A, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A,
- 0xBB, 0xAB, 0xDA, 0xA9, 0x98, 0x88, 0x77, 0x88, 0x88, 0x9A, 0xAC, 0xBB,
- 0xBC, 0xAB, 0xA9, 0x99, 0x98, 0x88, 0x89, 0x9A, 0xAA, 0xBD, 0xCB, 0xBB,
- 0xBB, 0xA9, 0xA9, 0x99, 0x99, 0xAA, 0xAC, 0xBC, 0xCC, 0xBC, 0xCC, 0xBA,
- 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCD, 0xBB, 0xCB, 0xBA,
- 0xBB, 0xBB, 0xAC, 0xBB, 0xDD, 0xDD, 0x7A, 0xAA, 0xAA, 0xBA, 0xAA, 0xAA,
- 0xAB, 0xBB, 0xBB, 0xCD, 0xB0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBF, 0xDF, 0xBB, 0xAB, 0xBF, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xCC, 0xFD, 0xFF, 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC,
- 0xBB, 0xDF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBF,
- 0xCF, 0xBF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xBB, 0xBA, 0xAB, 0xFC,
- 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCA, 0x99, 0x99, 0xAC, 0xDF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xCD, 0xBA, 0x87, 0x77, 0x89, 0x9B, 0xBF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xCB, 0x97, 0x54, 0x46, 0x8A, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xCD, 0xA9, 0x64, 0x12, 0x57, 0x9B, 0xBF, 0xDF, 0xFF, 0xFF, 0xFF, 0xBA,
- 0x97, 0x52, 0x24, 0x79, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, 0x86,
- 0x54, 0x57, 0x9B, 0xFD, 0xFF, 0xFD, 0xFF, 0xFC, 0xCC, 0xA9, 0x87, 0x77,
- 0x8A, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x99, 0x99, 0x9A, 0xAF,
- 0xCF, 0xFF, 0xFF, 0xDF, 0xFF, 0xBF, 0xAC, 0xBA, 0xAA, 0xCC, 0xBF, 0xFF,
- 0xFF, 0xFD, 0xFF, 0xFF, 0xCB, 0xBC, 0xBB, 0xDF, 0xDD, 0xFF, 0xFF, 0xFF,
- 0xDF, 0xFF, 0xDF, 0xFC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xFD, 0xDF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFD,
- 0xDF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6B, 0xCF, 0xDF, 0xDF, 0xFF, 0xCF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xAF, 0xFF, 0xBF, 0xAB, 0xFB, 0x9F, 0xBB, 0xAB, 0x6B, 0xFF,
- 0xFB, 0xFF, 0xAF, 0xAA, 0xFB, 0xFA, 0xBB, 0xFF, 0xFF, 0xFF, 0xFB, 0xBF,
- 0xB9, 0xFB, 0xBA, 0xBB, 0xBF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFA, 0xFB, 0xBB,
- 0xAA, 0xFF, 0xFA, 0xBF, 0xBF, 0xFF, 0xBF, 0xFA, 0xAF, 0xBB, 0x99, 0x9A,
- 0xA9, 0xBF, 0xFB, 0xFB, 0xAB, 0xFB, 0xBA, 0xA9, 0x98, 0x9A, 0x99, 0xAA,
- 0xFB, 0xBB, 0xFF, 0xAF, 0xFA, 0xAA, 0x98, 0x78, 0x78, 0x89, 0xAF, 0xBF,
- 0xAF, 0xFB, 0xBF, 0xBA, 0x99, 0x76, 0x66, 0x88, 0x99, 0xBF, 0xFF, 0xBF,
- 0xFF, 0xFA, 0x98, 0x77, 0x54, 0x56, 0x79, 0x9B, 0xBF, 0xBB, 0xBB, 0xAF,
- 0xAB, 0xA8, 0x64, 0x22, 0x57, 0x88, 0x9A, 0xFF, 0xAB, 0xAF, 0x99, 0xB8,
- 0x77, 0x52, 0x25, 0x79, 0xA9, 0xAA, 0xFF, 0xFA, 0xBB, 0xBA, 0x98, 0x76,
- 0x54, 0x66, 0x78, 0x99, 0xBF, 0xFB, 0x9F, 0xFA, 0x9A, 0x98, 0x76, 0x66,
- 0x78, 0x8A, 0xFA, 0xAB, 0xAF, 0xFB, 0xBA, 0xB8, 0x98, 0x88, 0x78, 0x9A,
- 0xAB, 0xFF, 0xFB, 0xAF, 0xBF, 0xBA, 0xAA, 0x99, 0xA9, 0x9F, 0x8A, 0xFA,
- 0xFF, 0xAA, 0xFF, 0xBB, 0xAF, 0xA9, 0xA8, 0x89, 0xAB, 0xFA, 0xBB, 0xFF,
- 0xFB, 0xFF, 0xFF, 0xFB, 0xA9, 0xAB, 0xAF, 0xBF, 0xBB, 0xBB, 0xBB, 0xFF,
- 0xBF, 0xFB, 0xFF, 0xFA, 0xBF, 0xAF, 0xAF, 0xFB, 0xFF, 0xAF, 0xBF, 0xFF,
- 0xFF, 0xBB, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFB, 0xFF, 0xFB, 0xFF, 0xFF, 0xFB, 0x6F, 0xAA, 0xAB, 0xAB, 0xBA, 0xFA,
- 0xFA, 0xBB, 0xFF, 0xFB, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xCF, 0xCD, 0xCF, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFD, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xDC,
- 0xFC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xDC, 0xDD,
- 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xEB, 0xBA, 0xBB, 0xBC, 0xDD, 0xFD,
- 0xDF, 0xFC, 0xFF, 0xDD, 0xCB, 0x98, 0x78, 0x9A, 0xCC, 0xFF, 0xFF, 0xFF,
- 0xDF, 0xFF, 0xFD, 0xB8, 0x54, 0x46, 0x9B, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xCD, 0xDA, 0x74, 0x22, 0x48, 0xAC, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
- 0xA7, 0x42, 0x14, 0x7A, 0xDF, 0xFF, 0xFF, 0xDD, 0xFF, 0xFD, 0xDA, 0x96,
- 0x44, 0x58, 0xBC, 0xFD, 0xFF, 0xFF, 0xFF, 0xDF, 0xFC, 0xDA, 0x97, 0x78,
- 0xAC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xCA, 0xAA, 0xAB, 0xCF,
- 0xFF, 0xFD, 0xFF, 0xDF, 0xFF, 0xFD, 0xFC, 0xDC, 0xBC, 0xCD, 0xDF, 0xDF,
- 0xFF, 0xFC, 0xFF, 0xFD, 0xFF, 0xDF, 0xCC, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xDD, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6B, 0xDD, 0xCD, 0xDD, 0xFF, 0xDF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xDD, 0xDD, 0xCD, 0xDD, 0xDE, 0xDF, 0xFF, 0xCF, 0xFF,
- 0xFF, 0xDC, 0xCC, 0xCB, 0xCC, 0xBD, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xDC,
- 0xBB, 0xBA, 0xAA, 0xBB, 0xCC, 0xDF, 0xEF, 0xFF, 0xFD, 0xCC, 0xBA, 0x99,
- 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xFE, 0xDC, 0xAA, 0x98, 0x88, 0x88,
- 0x89, 0xAB, 0xBC, 0xDE, 0xFF, 0xDC, 0xB9, 0x98, 0x77, 0x77, 0x77, 0x89,
- 0xAA, 0xCC, 0xFF, 0xFC, 0xCA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB,
- 0xCD, 0xFE, 0xCB, 0xA8, 0x76, 0x65, 0x55, 0x56, 0x77, 0x99, 0xBC, 0xDE,
- 0xDC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xDC, 0xCA,
- 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xA9, 0x87,
- 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xEC, 0xCA, 0x98, 0x76, 0x55,
- 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDF, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55,
- 0x66, 0x78, 0xAB, 0xCF, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78,
- 0x9A, 0xBC, 0xFF, 0xDD, 0xCA, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xBC,
- 0xDF, 0xFD, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x9A, 0xAC, 0xDF, 0xFF,
- 0xFF, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBB, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xDD, 0xCB, 0xBA, 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC,
- 0xDC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDD,
- 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFE, 0xDD, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xCF, 0xFE, 0xFD, 0xDC, 0xCF, 0xFD, 0xED, 0xCC, 0xBC, 0xEC, 0x7F, 0xEF,
- 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, 0xDD, 0xFF,
- 0xDD, 0xFD, 0xEF, 0xEF, 0xEE, 0xEF, 0xFF, 0xCF, 0xEF, 0xFF, 0xDF, 0xEF,
- 0xDF, 0xDE, 0xEF, 0xEF, 0xFF, 0xFD, 0xEE, 0xFD, 0xFD, 0xDD, 0xDD, 0xCC,
- 0xDD, 0xEE, 0xFE, 0xFD, 0xED, 0xFF, 0xEE, 0xDC, 0xCC, 0xBC, 0xBC, 0xCE,
- 0xED, 0xFF, 0xFE, 0xEF, 0xCD, 0xFF, 0xBB, 0xAA, 0xAA, 0xBC, 0xDD, 0xEE,
- 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0x98, 0x77, 0x89, 0xBC, 0xDE, 0xFF, 0xFD,
- 0xDE, 0xDF, 0xDC, 0xA8, 0x54, 0x46, 0x8A, 0xCF, 0xEF, 0xEF, 0xDC, 0xFF,
- 0xDC, 0xCA, 0x74, 0x12, 0x47, 0xAC, 0xED, 0xEE, 0xFE, 0xEE, 0xEF, 0xFB,
- 0xA7, 0x42, 0x24, 0x7A, 0xBD, 0xEE, 0xEF, 0xDE, 0xED, 0xDE, 0xCA, 0x86,
- 0x44, 0x68, 0xAD, 0xDD, 0xEE, 0xFD, 0xDE, 0xEE, 0xFC, 0xB9, 0x87, 0x78,
- 0xAB, 0xCF, 0xDD, 0xFF, 0xFD, 0xFF, 0xFC, 0xCC, 0xBA, 0x9A, 0xAB, 0xBE,
- 0xEF, 0xEF, 0xFD, 0xDF, 0xFF, 0xFD, 0xCC, 0xCC, 0xCC, 0xDC, 0xCD, 0xFF,
- 0xFF, 0xEF, 0xFF, 0xFE, 0xDE, 0xDD, 0xCC, 0xFD, 0xEF, 0xDF, 0xFF, 0xFE,
- 0xFF, 0xFF, 0xED, 0xDD, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDE, 0xFF,
- 0xFE, 0xFF, 0xED, 0xFE, 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xCE, 0xEF, 0xFF,
- 0xFF, 0xFD, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xEF, 0xFE, 0xEE,
- 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0xDD, 0xCC, 0xCC, 0xCE, 0xCE,
- 0xCE, 0xED, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0x8F, 0xF8, 0xF8, 0xF9, 0xF8, 0x5F, 0xFF,
- 0xF9, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF,
- 0xF8, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF,
- 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFE, 0x8F, 0x8F,
- 0x8F, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x78, 0xFF, 0xFF,
- 0xF8, 0x8F, 0xFF, 0xFF, 0xFF, 0xF9, 0x8F, 0xF8, 0xF9, 0xF9, 0x8F, 0xFF,
- 0x8F, 0x8F, 0xF8, 0x89, 0x8F, 0x68, 0x68, 0x88, 0x88, 0xF8, 0xFF, 0xFF,
- 0xFF, 0xF8, 0x88, 0x78, 0x64, 0x56, 0xFF, 0x8F, 0xF8, 0xFF, 0xFF, 0xF8,
- 0xFF, 0x88, 0x64, 0x22, 0x48, 0x88, 0x8F, 0xFF, 0xFF, 0xE9, 0x8F, 0xFF,
- 0xF7, 0x52, 0x25, 0x78, 0x8F, 0xF8, 0xFF, 0xFF, 0x9F, 0xFF, 0xF8, 0x87,
- 0x44, 0x58, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x8F, 0xF7, 0x76,
- 0x88, 0xF9, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0x79, 0x88, 0xF9, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF8, 0xFF, 0xFF, 0x98, 0xFF, 0xFF, 0x8F, 0xF9, 0xFF, 0x8F, 0xFF, 0xFF,
- 0x8F, 0xFF, 0xFF, 0xF8, 0xFF, 0x98, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0x8F, 0xFF, 0xFF,
- 0xFF, 0x8F, 0xFF, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0x99, 0xFF, 0xCF, 0xF8, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x7F, 0x87, 0x87, 0x66, 0x68, 0x87, 0x77, 0x77, 0x68, 0xFF, 0x57, 0xFF,
- 0x88, 0xFF, 0x88, 0x88, 0x8F, 0x88, 0xFF, 0xFF, 0xF8, 0x6F, 0xF7, 0x78,
- 0xF8, 0x8F, 0x87, 0x78, 0x87, 0xFF, 0xF7, 0x87, 0xF7, 0xF8, 0x7F, 0xF8,
- 0x88, 0x88, 0x87, 0x88, 0x8F, 0x87, 0xF8, 0x88, 0xF7, 0xF7, 0xFF, 0x8F,
- 0x88, 0x7F, 0x8F, 0xF8, 0xF7, 0x8F, 0x8F, 0xF7, 0x77, 0xF7, 0x68, 0x8F,
- 0x8F, 0xFF, 0xF7, 0x69, 0x8F, 0x88, 0x76, 0x78, 0x6F, 0x77, 0x6F, 0xFF,
- 0x7F, 0x88, 0xF8, 0x8F, 0xF7, 0x87, 0x88, 0xF7, 0x7F, 0xF8, 0x8F, 0x77,
- 0x68, 0x87, 0xF7, 0x86, 0x87, 0x67, 0x67, 0x7F, 0x78, 0xF8, 0x77, 0x77,
- 0x88, 0x67, 0xF7, 0x76, 0x88, 0x78, 0x77, 0xFF, 0x8F, 0x7F, 0x88, 0x87,
- 0x67, 0x67, 0x77, 0x77, 0x78, 0x8F, 0x7F, 0x77, 0x7F, 0x87, 0x76, 0x68,
- 0x87, 0x77, 0x67, 0x7F, 0x7E, 0xE8, 0xCB, 0x88, 0x7F, 0xF7, 0x77, 0x87,
- 0x6F, 0x8F, 0x87, 0x7F, 0x68, 0x88, 0xF7, 0x88, 0xF7, 0xF6, 0x87, 0xF8,
- 0x87, 0xFF, 0xF7, 0x88, 0xF8, 0x8F, 0x8F, 0xF7, 0x88, 0x7F, 0xFF, 0x8F,
- 0xFF, 0x77, 0xF8, 0x88, 0x78, 0x8F, 0xF7, 0x78, 0x77, 0x88, 0x8F, 0xF7,
- 0x8F, 0xF8, 0xFF, 0xF8, 0x8F, 0x88, 0x78, 0x77, 0x7F, 0xF8, 0x78, 0xF8,
- 0x88, 0x88, 0x7F, 0x8F, 0x7F, 0x8F, 0xA7, 0x78, 0x7F, 0xFF, 0xFF, 0x87,
- 0x8F, 0x78, 0x87, 0x8F, 0x8F, 0x87, 0x8F, 0x77, 0xF8, 0xF7, 0x88, 0x8F,
- 0x8F, 0xFF, 0xF8, 0x87, 0x7F, 0xF8, 0x8F, 0x87, 0x8F, 0x87, 0x78, 0x7F,
- 0xF7, 0x77, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00,
- ],
- [
- 0x57, 0x78, 0x66, 0x77, 0x66, 0x76, 0x77, 0x76, 0x87, 0x79, 0x68, 0xAD,
- 0x98, 0x89, 0x98, 0xDA, 0xB9, 0x99, 0x99, 0x9D, 0x98, 0x79, 0xAA, 0x89,
- 0x98, 0x88, 0x88, 0x98, 0xAA, 0x88, 0x9A, 0x87, 0x89, 0xA9, 0x99, 0x89,
- 0x98, 0x98, 0x99, 0x89, 0xA9, 0x99, 0x7A, 0x88, 0x79, 0x98, 0x88, 0x87,
- 0x87, 0x98, 0x88, 0x9A, 0x76, 0x98, 0x77, 0x88, 0x87, 0x97, 0x88, 0x98,
- 0x98, 0x99, 0x88, 0x79, 0x89, 0x99, 0x78, 0x87, 0x88, 0x88, 0x89, 0xA9,
- 0x98, 0x87, 0x99, 0x87, 0x78, 0x78, 0x87, 0x87, 0x87, 0x97, 0x99, 0x97,
- 0x79, 0x98, 0x98, 0x78, 0x87, 0x98, 0x87, 0x78, 0x88, 0x9A, 0x76, 0x99,
- 0x77, 0x78, 0x78, 0x77, 0x87, 0x78, 0x88, 0x99, 0xA7, 0x79, 0x88, 0x89,
- 0x87, 0x77, 0x87, 0x88, 0x78, 0x88, 0x89, 0x77, 0x88, 0x97, 0x88, 0x87,
- 0x87, 0x67, 0x88, 0x89, 0x89, 0x88, 0x79, 0x89, 0x88, 0x78, 0x87, 0x77,
- 0x77, 0x78, 0x89, 0x8A, 0x76, 0x89, 0x97, 0x77, 0x97, 0x87, 0x77, 0x99,
- 0x89, 0x99, 0x96, 0x6A, 0xA8, 0x88, 0x88, 0x88, 0x89, 0x87, 0x88, 0x88,
- 0x99, 0x87, 0x9A, 0xA8, 0x88, 0x98, 0x78, 0x88, 0x88, 0x88, 0x99, 0x98,
- 0x79, 0x99, 0x88, 0x88, 0x98, 0x88, 0x87, 0x88, 0x88, 0xA9, 0x78, 0xAA,
- 0x98, 0x98, 0xA8, 0x88, 0x88, 0x88, 0x88, 0x88, 0xA7, 0x8A, 0x98, 0x89,
- 0x8A, 0x88, 0x88, 0x9A, 0x89, 0x89, 0x99, 0x78, 0xA9, 0x99, 0xD8, 0x89,
- 0x98, 0x8A, 0x89, 0x98, 0xAA, 0x87, 0x69, 0x88, 0x87, 0x87, 0x78, 0x77,
- 0x67, 0x87, 0x77, 0x79, 0x50, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xF5, 0x12, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x61, 0x15, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
- 0x65, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xAF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBB, 0xFF, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFB,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x99, 0xBF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x66, 0x88, 0xBF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFB, 0xB7, 0x53, 0x45, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF9, 0x63, 0x22, 0x46, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x96, 0x42, 0x24, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x85,
- 0x44, 0x57, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x86, 0x67,
- 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0x99, 0xBF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xBB, 0xBF, 0xFD, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0x5F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xF6, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF3, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
- 0xBC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xE5, 0xEF, 0xFF, 0xFF, 0x3F, 0xFF,
- 0xEE, 0xEE, 0xE5, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x5E,
- 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x5F, 0xFF, 0xF5,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0x55, 0x5F, 0x5F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x5F, 0x4F, 0xFF, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xEE, 0xEE, 0x4E, 0xE5, 0xE6, 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5,
- 0xE5, 0xE5, 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E,
- 0xEE, 0x44, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xEF, 0xFF, 0xF5, 0x45, 0x3F,
- 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0x4F, 0x4F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x5F, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0x5F, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF,
- 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xFF, 0xFE, 0xFF, 0xFE, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAF, 0x5F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFA, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF,
- 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0x99, 0x9B, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x67, 0x7F, 0xAB, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xA7, 0x54, 0x45, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0x64, 0x22, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xA6, 0x42, 0x23, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x75,
- 0x43, 0x57, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x77, 0x67,
- 0x9A, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF9, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBA, 0xAA, 0xAF, 0x5F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x99, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFC, 0x65, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF,
- 0xFF, 0xFF, 0x94, 0x12, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF9, 0x52, 0x14, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97,
- 0x54, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
- 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFA, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x9F, 0xFF, 0xBF, 0xFB, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFE,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAF, 0xFF, 0xA9, 0xAA, 0xFF, 0x5F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xAF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F,
- 0xAF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFA, 0xFF, 0xAF, 0xFF, 0xAF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0xA7, 0x67, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xD7, 0x53, 0x45, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFA, 0x64, 0x22, 0x47, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF9,
- 0x97, 0x42, 0x24, 0x68, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x76,
- 0x44, 0x58, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x67,
- 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA9, 0xAF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xAF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFA, 0xFA, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xA9, 0xAF, 0xFF, 0xFA, 0x9F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x5F, 0xEF, 0x56, 0x6F, 0xF6, 0x66, 0xEE, 0xEF, 0x6F, 0xFF, 0x56, 0xE6,
- 0xE6, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xE6, 0xEE,
- 0xEE, 0xEE, 0xE6, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0x6F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xEE, 0xE6, 0xEE, 0xEE, 0x6E,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x6E, 0x4E, 0x6E, 0xEE, 0xEE, 0xEE,
- 0xE6, 0xEE, 0xEE, 0xEF, 0xF6, 0xF5, 0x6F, 0x56, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xF4, 0x6F, 0x6F, 0xFF, 0xFF, 0xFF, 0xFE,
- 0xEE, 0xE5, 0xE6, 0x66, 0x65, 0x6E, 0xE5, 0xEE, 0xE6, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xE5, 0x56, 0x45, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xE6, 0xE6, 0x65, 0x65, 0xEE, 0xEE, 0xEE, 0xE6, 0xEE, 0xEE, 0xE6, 0x66,
- 0x6E, 0x6E, 0xEE, 0xEE, 0xE6, 0xEE, 0x6E, 0xEF, 0xF6, 0xF6, 0xFF, 0x56,
- 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x6F,
- 0x66, 0xF5, 0xF6, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xF5, 0xF6, 0xFF, 0x6F, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE6, 0xEE, 0xEE, 0xFE, 0x6E, 0xFE,
- 0xFF, 0xFE, 0xFF, 0x6E, 0xF6, 0xFE, 0xFF, 0x66, 0xFF, 0xFE, 0xFF, 0xFE,
- 0xEF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x5F, 0xFF, 0xFE, 0xFF, 0xFF, 0x5F, 0xFF, 0x65, 0x6F, 0xF6, 0xFE,
- 0x66, 0xFE, 0x66, 0x5E, 0x50, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xA8, 0xFF, 0xFF, 0xF7, 0xFF, 0x3F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x76, 0x77, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0x86, 0x54, 0x45, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF9, 0x64, 0x22, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF6, 0x42, 0x24, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF5,
- 0x44, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF6,
- 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x7F, 0x8F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xED, 0xD5, 0xEE, 0xEE, 0x3E, 0xEE,
- 0xEE, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xE4, 0x21, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xDD,
- 0xDD, 0xD1, 0x1D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xED, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFE, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x75, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xF4, 0x12, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x42, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x54, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFC, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x67, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xF6, 0x44, 0x45, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xF6, 0x54, 0x22, 0x46, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xF5, 0x42, 0x34, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x75,
- 0x43, 0x4F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x56,
- 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00,
- ],
- [
- 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xED, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0x53, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xE5, 0x12, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD,
- 0xDD, 0xD2, 0x24, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
- 0xD3, 0x3D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x3E, 0xE5, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xED, 0xE0, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- [
- 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
- 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00,
- ],
- ],
-];
diff --git a/src/codecs/real/rv30.rs b/src/codecs/real/rv30.rs
deleted file mode 100644
index cf7e313..0000000
--- a/src/codecs/real/rv30.rs
+++ /dev/null
@@ -1,307 +0,0 @@
-use crate::formats;
-use crate::io::bitreader::*;
-use crate::io::intcode::*;
-use crate::codecs::*;
-use super::rv3040::*;
-use super::rv30dsp::*;
-
-struct RealVideo30BR {
- rpr_bits: u8,
- width: usize,
- height: usize,
- widths: Vec<usize>,
- heights: Vec<usize>,
-}
-
-impl RealVideo30BR {
- fn new() -> Self {
- RealVideo30BR {
- rpr_bits: 0,
- width: 0,
- height: 0,
- widths: Vec::new(),
- heights: Vec::new(),
- }
- }
-}
-
-impl RV34BitstreamDecoder for RealVideo30BR {
- fn decode_slice_header(&mut self, br: &mut BitReader, _old_w: usize, _old_h: usize) -> DecoderResult<RV34SliceHeader> {
- if br.read(3)? != 0 { return Err(DecoderError::InvalidData); }
- let ft_idx = br.read(2)?;
- let ftype = match ft_idx {
- 0|1 => FrameType::I,
- 2 => FrameType::P,
- _ => FrameType::B,
- };
- if br.read(1)? != 0 { return Err(DecoderError::InvalidData); }
- let q = br.read(5)? as u8;
- let deblock = !br.read_bool()?;
- let pts = br.read(13)? as u16;
- let rpr = br.read(self.rpr_bits)? as usize;
- let (w, h) = if rpr != 0 {
- validate!(rpr < self.widths.len());
- (self.widths[rpr], self.heights[rpr])
- } else {
- (self.width, self.height)
- };
- let start = br.read(get_slice_start_offset_bits(w, h))? as usize;
- br.skip(1)?;
-
- Ok(RV34SliceHeader{ ftype: ftype, quant: q, deblock: deblock, pts: pts, width: w, height: h, start: start, end: 0, set_idx: 0 })
- }
- fn decode_intra_pred(&mut self, br: &mut BitReader, types: &mut [i8], mut pos: usize, tstride: usize, _has_top: bool) -> DecoderResult<()> {
- for _ in 0..4 {
- for x in 0..2 {
- let code = br.read_code(UintCodeType::Gamma)? as usize;
- validate!(code < 81);
- for k in 0..2 {
- let new = RV30_ITYPE_MAP[code * 2 + k] as usize;
- let top = (types[pos + x * 2 + k - tstride] + 1) as usize;
- let left = (types[pos + x * 2 + k - 1] + 1) as usize;
- types[pos + x * 2 + k] = RV30_ITYPE[top * 90 + left * 9 + new];
- validate!(types[pos + x * 2 + k] != 9);
- }
- }
- pos += tstride;
- }
- Ok(())
- }
- fn decode_inter_mb_hdr(&mut self, br: &mut BitReader, ftype: FrameType, _mbtype: MBType) -> DecoderResult<MBInfo> {
- let mut code = br.read_code(UintCodeType::Gamma)? as usize;
- let mut dq = false;
- validate!(code < 11);
- if code > 5 {
- code -= 6;
- dq = true;
- }
- let idx = if ftype == FrameType::P { 0 } else { 1 };
- Ok(MBInfo { mbtype: RV30_MB_TYPES[idx][code], skip_run: 0, dquant: dq })
- }
- fn predict_b_mv(&self, sstate: &SState, mvi: &MVInfo, mbtype: MBType, mvs: &[MV], _mbinfo: &Vec<RV34MBInfo>) -> (MV, MV) {
- let mb_x = sstate.mb_x;
- let mb_y = sstate.mb_y;
- let mv_f;
- let mv_b;
- match mbtype {
- MBType::MBForward | MBType::MBBackward => {
- let mv_pred = mvi.pred_mb_mv(mb_x, mb_y, true, sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl);
- mv_f = mv_pred + mvs[0];
- mv_b = mv_f;
- },
- _ => {
- mv_f = ZERO_MV;
- mv_b = ZERO_MV;
- },
- };
- (mv_f, mv_b)
- }
- fn quant_dc(&self, _is_intra: bool, q: u8) -> u8 { RV30_QUANT_DC[q as usize] }
-}
-
-struct RealVideo30Decoder {
- bd: RealVideo30BR,
- info: Rc<NACodecInfo>,
- dec: RV34Decoder,
-}
-
-impl RealVideo30Decoder {
- fn new() -> Self {
- RealVideo30Decoder{
- bd: RealVideo30BR::new(),
- info: Rc::new(DUMMY_CODEC_INFO),
- dec: RV34Decoder::new(true, Box::new(RV30DSP::new())),
- }
- }
-}
-
-impl NADecoder for RealVideo30Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let fmt = formats::YUV420_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, false, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
-
- let edata = info.get_extradata().unwrap();
- let src: &[u8] = &edata;
-
- if src.len() < 2 { return Err(DecoderError::InvalidData); }
- let num_rpr = (src[1] & 7) as usize;
- if src.len() < num_rpr * 2 + 8 { return Err(DecoderError::ShortData); }
- self.bd.rpr_bits = ((num_rpr >> 1) + 1) as u8;
- if self.bd.rpr_bits > 3 { self.bd.rpr_bits = 3; }
- for i in 0..num_rpr+1 {
- self.bd.widths.push ((src[6 + i * 2] as usize) << 2);
- self.bd.heights.push((src[7 + i * 2] as usize) << 2);
- }
-
- self.bd.width = vinfo.get_width();
- self.bd.height = vinfo.get_height();
- Ok(())
- } else {
-println!("???");
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
-
- let (bufinfo, ftype, pts) = self.dec.parse_frame(src.as_slice(), &mut self.bd)?;
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(ftype == FrameType::I);
- frm.set_pts(Some(pts));
- frm.set_frame_type(ftype);//if ftype == FrameType::B { FrameType::Skip } else { ftype } );
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(RealVideo30Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_rv30() {
-// test_file_decoding("realmedia", "assets/RV/rv30_chroma_drift.rm", Some(1000), true, false, /*None*/Some("rv30"));
- test_file_decoding("realmedia", "assets/RV/rv30_weighted_mc.rm", Some(400), true, false, None/*Some("rv30")*/);
-// test_file_decoding("realmedia", "assets/RV/simpsons-clip.rm", Some(1337)/*Some(6666)*/, true, false, /*None*/Some("rv30"));
-//panic!("end");
- }
-}
-
-const RV30_QUANT_DC: [u8; 32] = [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 22, 22, 23, 23, 23, 24, 24, 25, 25
-];
-
-const RV30_MB_TYPES: [[MBType; 6]; 2] = [
- [ MBType::MBSkip, MBType::MBP16x16, MBType::MBP8x8, MBType::Invalid, MBType::MBIntra, MBType::MBIntra16 ],
- [ MBType::MBSkip, MBType::MBDirect, MBType::MBForward, MBType::MBBackward, MBType::MBIntra, MBType::MBIntra16 ],
-];
-
-const RV30_ITYPE_MAP: [i8; 9*9*2] = [
- 0, 0, 0, 1, 1, 0, 1, 1, 0, 2, 2, 0, 0, 3, 3, 0, 1, 2,
- 2, 1, 0, 4, 4, 0, 3, 1, 1, 3, 0, 5, 5, 0, 2, 2, 1, 4,
- 4, 1, 0, 6, 3, 2, 1, 5, 2, 3, 5, 1, 6, 0, 0, 7, 4, 2,
- 2, 4, 3, 3, 6, 1, 1, 6, 7, 0, 0, 8, 5, 2, 4, 3, 2, 5,
- 3, 4, 1, 7, 4, 4, 7, 1, 8, 0, 6, 2, 3, 5, 5, 3, 2, 6,
- 1, 8, 2, 7, 7, 2, 8, 1, 5, 4, 4, 5, 3, 6, 6, 3, 8, 2,
- 4, 6, 5, 5, 6, 4, 2, 8, 7, 3, 3, 7, 6, 5, 5, 6, 7, 4,
- 4, 7, 8, 3, 3, 8, 7, 5, 8, 4, 5, 7, 4, 8, 6, 6, 7, 6,
- 5, 8, 8, 5, 6, 7, 8, 6, 7, 7, 6, 8, 8, 7, 7, 8, 8, 8,
-];
-
-const RV30_ITYPE: [i8; 10*10*9] = [
- 0, 9, 9, 9, 9, 9, 9, 9, 9,
- 0, 2, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 2, 0, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
-
- 0, 1, 9, 9, 9, 9, 9, 9, 9,
- 0, 2, 1, 6, 4, 8, 5, 7, 3,
- 1, 0, 2, 6, 5, 4, 3, 8, 7,
- 2, 8, 0, 1, 7, 4, 3, 6, 5,
- 2, 0, 1, 3, 8, 5, 4, 7, 6,
- 2, 0, 1, 4, 6, 7, 8, 3, 5,
- 0, 1, 5, 2, 6, 3, 8, 4, 7,
- 0, 1, 6, 2, 4, 7, 5, 8, 3,
- 2, 7, 0, 1, 4, 8, 6, 3, 5,
- 2, 8, 0, 1, 7, 3, 4, 5, 6,
-
- 1, 0, 9, 9, 9, 9, 9, 9, 9,
- 1, 2, 5, 6, 3, 0, 4, 8, 7,
- 1, 6, 2, 5, 3, 0, 4, 8, 7,
- 2, 1, 7, 6, 8, 3, 5, 0, 4,
- 1, 2, 5, 3, 6, 8, 4, 7, 0,
- 1, 6, 2, 0, 4, 5, 8, 7, 3,
- 1, 5, 2, 6, 3, 8, 4, 0, 7,
- 1, 6, 0, 2, 4, 5, 7, 3, 8,
- 2, 1, 7, 6, 0, 8, 5, 4, 3,
- 1, 2, 7, 8, 3, 4, 5, 6, 0,
-
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 0, 2, 1, 8, 7, 6, 5, 4, 3,
- 1, 2, 0, 6, 5, 7, 4, 8, 3,
- 2, 8, 7, 1, 0, 6, 4, 3, 5,
- 2, 0, 8, 1, 3, 7, 5, 4, 6,
- 2, 0, 4, 1, 7, 8, 6, 3, 5,
- 2, 0, 1, 5, 8, 4, 6, 7, 3,
- 2, 0, 6, 1, 4, 7, 8, 5, 3,
- 2, 7, 8, 1, 0, 5, 4, 6, 3,
- 2, 8, 7, 1, 0, 4, 3, 6, 5,
-
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 0, 2, 1, 3, 5, 8, 6, 4, 7,
- 1, 0, 2, 5, 3, 6, 4, 8, 7,
- 2, 8, 1, 0, 3, 5, 7, 6, 4,
- 3, 2, 5, 8, 1, 4, 6, 7, 0,
- 4, 2, 0, 6, 1, 5, 8, 3, 7,
- 5, 3, 1, 2, 8, 6, 4, 0, 7,
- 1, 6, 0, 2, 4, 5, 8, 3, 7,
- 2, 7, 0, 1, 5, 4, 8, 6, 3,
- 2, 8, 3, 5, 1, 0, 7, 6, 4,
-
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 2, 0, 6, 1, 4, 7, 5, 8, 3,
- 1, 6, 2, 0, 4, 5, 3, 7, 8,
- 2, 8, 7, 6, 4, 0, 1, 5, 3,
- 4, 2, 1, 0, 6, 8, 3, 5, 7,
- 4, 2, 6, 0, 1, 5, 7, 8, 3,
- 1, 2, 5, 0, 6, 3, 4, 7, 8,
- 6, 4, 0, 1, 2, 7, 5, 3, 8,
- 2, 7, 4, 6, 0, 1, 8, 5, 3,
- 2, 8, 7, 4, 6, 1, 3, 5, 0,
-
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 5, 1, 2, 3, 6, 8, 0, 4, 7,
- 1, 5, 6, 3, 2, 0, 4, 8, 7,
- 2, 1, 5, 3, 6, 8, 7, 4, 0,
- 5, 3, 1, 2, 6, 8, 4, 7, 0,
- 1, 6, 2, 4, 5, 8, 0, 3, 7,
- 5, 1, 3, 6, 2, 0, 8, 4, 7,
- 1, 6, 5, 2, 0, 4, 3, 7, 8,
- 2, 7, 1, 6, 5, 0, 8, 3, 4,
- 2, 5, 1, 3, 6, 8, 4, 0, 7,
-
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 1, 6, 2, 0, 5, 4, 3, 7, 8,
- 1, 6, 5, 4, 2, 3, 0, 7, 8,
- 2, 1, 6, 7, 4, 8, 5, 3, 0,
- 2, 1, 6, 5, 8, 4, 3, 0, 7,
- 6, 4, 1, 2, 0, 5, 7, 8, 3,
- 1, 6, 5, 2, 3, 0, 4, 8, 7,
- 6, 1, 4, 0, 2, 7, 5, 3, 8,
- 2, 7, 4, 6, 1, 5, 0, 8, 3,
- 2, 1, 6, 8, 4, 7, 3, 5, 0,
-
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 2, 0, 4, 7, 6, 1, 8, 5, 3,
- 6, 1, 2, 0, 4, 7, 5, 8, 3,
- 2, 7, 8, 0, 1, 6, 4, 3, 5,
- 2, 4, 0, 8, 3, 1, 7, 6, 5,
- 4, 2, 7, 0, 6, 1, 8, 5, 3,
- 2, 1, 0, 8, 5, 6, 7, 4, 3,
- 2, 6, 4, 1, 7, 0, 5, 8, 3,
- 2, 7, 4, 0, 8, 6, 1, 5, 3,
- 2, 8, 7, 4, 1, 0, 3, 6, 5,
-
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 2, 0, 8, 1, 3, 4, 6, 5, 7,
- 1, 2, 0, 6, 8, 5, 7, 3, 4,
- 2, 8, 7, 1, 0, 3, 6, 5, 4,
- 8, 3, 2, 5, 1, 0, 4, 7, 6,
- 2, 0, 4, 8, 5, 1, 7, 6, 3,
- 2, 1, 0, 8, 5, 3, 6, 4, 7,
- 2, 1, 6, 0, 8, 4, 5, 7, 3,
- 2, 7, 8, 4, 0, 6, 1, 5, 3,
- 2, 8, 3, 0, 7, 4, 1, 6, 5,
-];
diff --git a/src/codecs/real/rv3040.rs b/src/codecs/real/rv3040.rs
deleted file mode 100644
index d1107ba..0000000
--- a/src/codecs/real/rv3040.rs
+++ /dev/null
@@ -1,1279 +0,0 @@
-use crate::formats::YUV420_FORMAT;
-use crate::frame::{NABufferType, NAVideoInfo, NAVideoBuffer, FrameType, alloc_video_buffer};
-use crate::codecs::{MV, ZERO_MV, DecoderError, DecoderResult, IPBShuffler};
-use crate::io::bitreader::{BitReader,BitReaderMode};
-use crate::io::intcode::*;
-use std::mem;
-
-use super::rv34codes::*;
-use super::rv34dsp::*;
-
-pub struct GenericCache<T: Copy> {
- pub height: usize,
- pub stride: usize,
- pub xpos: usize,
- pub data: Vec<T>,
- pub default: T,
-}
-
-impl<T:Copy> GenericCache<T> {
- pub fn new(height: usize, stride: usize, default: T) -> Self {
- let mut ret = Self {
- stride: stride,
- height: height,
- xpos: 0,
- data: Vec::with_capacity((height + 1) * stride),
- default: default,
- };
- ret.reset();
- ret
- }
- fn full_size(&self) -> usize { self.stride * (self.height + 1) }
- pub fn reset(&mut self) {
- self.data.truncate(0);
- let size = self.full_size();
- self.data.resize(size, self.default);
- self.xpos = self.stride + 1;
- }
- pub fn update_row(&mut self) {
- for i in 0..self.stride {
- self.data[i] = self.data[self.height * self.stride + i];
- }
- self.data.truncate(self.stride);
- let size = self.full_size();
- self.data.resize(size, self.default);
- self.xpos = self.stride + 1;
- }
-}
-
-trait RV34MVScale {
- fn scale(&self, trd: u16, trb: u16) -> (MV, MV);
-}
-
-const TR_SHIFT: u8 = 14;
-const TR_BIAS: i32 = 1 << (TR_SHIFT - 1);
-
-impl RV34MVScale for MV {
- fn scale(&self, trd: u16, trb: u16) -> (MV, MV) {
- let ratio = ((trb as i32) << TR_SHIFT) / (trd as i32);
- let mv_f = MV {
- x: (((self.x as i32) * ratio + TR_BIAS) >> TR_SHIFT) as i16,
- y: (((self.y as i32) * ratio + TR_BIAS) >> TR_SHIFT) as i16
- };
- let mv_b = mv_f - *self;
- (mv_f, mv_b)
- }
-}
-
-#[derive(Clone,Copy)]
-pub struct RV34SliceHeader {
- pub ftype: FrameType,
- pub quant: u8,
- pub pts: u16,
- pub width: usize,
- pub height: usize,
- pub start: usize,
- pub end: usize,
- pub set_idx: usize,
- pub deblock: bool,
-}
-
-impl RV34SliceHeader {
- pub fn fits(&self, cmp: &RV34SliceHeader) -> bool {
- (self.ftype == cmp.ftype) &&
- (self.pts == cmp.pts) &&
- (self.width == cmp.width) &&
- (self.height == cmp.height)
- }
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum MBType {
- MBIntra,
- MBIntra16,
- MBSkip,
- MBP16x16,
- MBP16x16Mix,
- MBP16x8,
- MBP8x16,
- MBP8x8,
- MBDirect,
- MBBidir,
- MBForward,
- MBBackward,
- Invalid,
-}
-
-impl MBType {
- pub fn is_intra(&self) -> bool {
- (*self == MBType::MBIntra) || (*self == MBType::MBIntra16)
- }
- pub fn is_16(&self) -> bool {
- (*self == MBType::MBIntra16) || (*self == MBType::MBP16x16Mix)
- }
- pub fn is_intra_or_16(&self) -> bool {
- self.is_intra() || self.is_16()
- }
- pub fn get_num_mvs(&self) -> usize {
- match *self {
- MBType::MBIntra | MBType::MBIntra16 |
- MBType::MBSkip | MBType::MBDirect => 0,
- MBType::MBP16x16 | MBType::MBP16x16Mix |
- MBType::MBForward | MBType::MBBackward => 1,
- MBType::MBP16x8 | MBType::MBP8x16 | MBType::MBBidir => 2,
- MBType::MBP8x8 => 4,
- MBType::Invalid => unreachable!(),
- }
- }
- pub fn is_fwd(&self) -> bool {
- match *self {
- MBType::MBP16x16 | MBType::MBP16x16Mix |
- MBType::MBP16x8 | MBType::MBP8x16 | MBType::MBP8x8 |
- MBType::MBForward => true,
- _ => false,
- }
- }
- pub fn is_bwd(&self) -> bool {
- match *self {
- MBType::MBBidir | MBType::MBBackward => true,
- _ => false,
- }
- }
- pub fn has_mv_dir(&self, fwd: bool) -> bool {
- match *self {
- MBType::MBBidir => true,
- MBType::MBForward if fwd => true,
- MBType::MBBackward if !fwd => true,
- _ => false,
- }
- }
- pub fn is_nomv(&self) -> bool {
- match *self {
- MBType::MBIntra | MBType::MBIntra16 | MBType::MBSkip | MBType::MBDirect => true,
- _ => false,
- }
- }
- /*pub fn is_16x16(&self) -> bool {
- match *self {
- MBType::MBP16x8 | MBType::MBP8x16 | MBType::MBP8x8 => false,
- _ => true,
- }
- }*/
- fn get_weight(&self) -> usize {
- match *self {
- MBType::MBIntra => 0,
- MBType::MBIntra16 => 1,
- MBType::MBSkip => unreachable!(),
- MBType::MBP16x16 => 2,
- MBType::MBP16x16Mix => 10,
- MBType::MBP16x8 => 7,
- MBType::MBP8x16 => 8,
- MBType::MBP8x8 => 3,
- MBType::MBDirect => 6,
- MBType::MBBidir => 9,
- MBType::MBForward => 4,
- MBType::MBBackward => 5,
- MBType::Invalid => unreachable!(),
- }
- }
-}
-
-const MBTYPE_FROM_WEIGHT: [MBType; 11] = [
- MBType::MBIntra, MBType::MBIntra16, MBType::MBP16x16, MBType::MBP8x8,
- MBType::MBForward, MBType::MBBackward, MBType::MBDirect, MBType::MBP16x8,
- MBType::MBP8x16, MBType::MBBidir, MBType::MBP16x16Mix,
-];
-
-#[derive(Clone,Copy)]
-pub struct MBInfo {
- pub mbtype: MBType,
- pub skip_run: usize,
- pub dquant: bool,
-}
-
-#[derive(Clone,Copy)]
-pub struct RV34MBInfo {
- pub mbtype: MBType,
- pub cbp: u32,
- pub deblock:u16,
- pub cbp_c: u8, // for deblocking purposes
- pub q: u8,
-}
-
-struct IntraModeState {
- cache: GenericCache<i8>,
-}
-
-const RV34_INTRA_PRED4: [PredType4x4; 9] = [
- PredType4x4::DC, PredType4x4::Ver, PredType4x4::Hor,
- PredType4x4::DiagDownRight, PredType4x4::DiagDownLeft,
- PredType4x4::VerRight, PredType4x4::VerLeft,
- PredType4x4::HorUp, PredType4x4::HorDown
-];
-
-const RV34_INTRA_PRED16: [PredType8x8; 4] = [
- PredType8x8::DC, PredType8x8::Ver, PredType8x8::Hor, PredType8x8::Plane
-];
-
-impl IntraModeState {
- fn new(mb_w: usize) -> Self {
- let stride = 1 + mb_w * 4 + 1;
- IntraModeState { cache: GenericCache::new(4, stride, -1) }
- }
- fn reset(&mut self) { self.cache.reset(); }
- fn update(&mut self) { self.cache.update_row(); }
- fn get_pos(&self, xpos: usize) -> usize {
- self.cache.stride + 1 + xpos * 4
- }
- fn set_mb_x(&mut self, mb_x: usize) {
- self.cache.xpos = self.get_pos(mb_x);
- }
- fn fill_block(&mut self, val: i8) {
- let mut pos = self.cache.xpos;
- for _ in 0..4 {
- for j in 0..4 {
- self.cache.data[pos + j] = val;
- }
- pos += self.cache.stride;
- }
- }
- fn get_pred16_type(&self, has_top: bool, has_left: bool) -> PredType8x8 {
- if !has_top && !has_left { return PredType8x8::DC128; }
- let mut im = RV34_INTRA_PRED16[self.cache.data[self.cache.xpos] as usize];
- if !has_top {
- im = match im {
- PredType8x8::Plane | PredType8x8::Ver => PredType8x8::Hor,
- PredType8x8::DC => PredType8x8::LeftDC,
- _ => im,
- };
- } else if !has_left {
- im = match im {
- PredType8x8::Plane | PredType8x8::Hor => PredType8x8::Ver,
- PredType8x8::DC => PredType8x8::TopDC,
- _ => im,
- };
- }
- im
- }
- fn get_pred8_type(&self, has_top: bool, has_left: bool) -> PredType8x8 {
- if !has_top && !has_left { return PredType8x8::DC128; }
- let mut im = RV34_INTRA_PRED16[self.cache.data[self.cache.xpos] as usize];
- im = match im { PredType8x8::Plane => PredType8x8::DC, _ => im };
- if !has_top {
- im = match im {
- PredType8x8::Plane | PredType8x8::Ver => PredType8x8::Hor,
- PredType8x8::DC => PredType8x8::LeftDC,
- _ => im,
- };
- } else if !has_left {
- im = match im {
- PredType8x8::Plane | PredType8x8::Hor => PredType8x8::Ver,
- PredType8x8::DC => PredType8x8::TopDC,
- _ => im,
- };
- }
- im
- }
- fn get_pred4_type(&self, x: usize, y: usize, has_top: bool, has_left: bool) -> PredType4x4 {
- let no_up = !has_top && (y == 0);
- let no_left = !has_left && (x == 0);
- if no_up && no_left { return PredType4x4::DC128; }
- let no_down = !has_left || (x != 0) || (y == 3);
-
- let mut im = RV34_INTRA_PRED4[self.cache.data[self.cache.xpos + x + y * self.cache.stride] as usize];
-
- if no_up {
- im = match im {
- PredType4x4::Ver => PredType4x4::Hor,
- PredType4x4::DC => PredType4x4::LeftDC,
- _ => im,
- };
- } else if no_left {
- im = match im {
- PredType4x4::Hor => PredType4x4::Ver,
- PredType4x4::DC => PredType4x4::TopDC,
- PredType4x4::DiagDownLeft => PredType4x4::DiagDownLeftNoDown,
- _ => im,
- };
- }
- if no_down {
- im = match im {
- PredType4x4::DiagDownLeft => PredType4x4::DiagDownLeftNoDown,
- PredType4x4::HorUp => PredType4x4::HorUpNoDown,
- PredType4x4::VerLeft => PredType4x4::VerLeftNoDown,
- _ => im,
- };
- }
- im
- }
- //todo merge
- fn get_pred4_type_chroma(&self, x: usize, y: usize, has_top: bool, has_left: bool) -> PredType4x4 {
- let no_up = !has_top && (y == 0);
- let no_left = !has_left && (x == 0);
- if no_up && no_left { return PredType4x4::DC128; }
- let no_down = !has_left || (x != 0) || (y == 1);
-
- let mut im = RV34_INTRA_PRED4[self.cache.data[self.cache.xpos + x * 2 + y * 2 * self.cache.stride] as usize];
-
- if no_up {
- im = match im {
- PredType4x4::Ver => PredType4x4::Hor,
- PredType4x4::DC => PredType4x4::LeftDC,
- _ => im,
- };
- } else if no_left {
- im = match im {
- PredType4x4::Hor => PredType4x4::Ver,
- PredType4x4::DC => PredType4x4::TopDC,
- PredType4x4::DiagDownLeft => PredType4x4::DiagDownLeftNoDown,
- _ => im,
- };
- }
- if no_down {
- im = match im {
- PredType4x4::DiagDownLeft => PredType4x4::DiagDownLeftNoDown,
- PredType4x4::HorUp => PredType4x4::HorUpNoDown,
- PredType4x4::VerLeft => PredType4x4::VerLeftNoDown,
- _ => im,
- };
- }
- im
- }
-}
-
-pub struct MVInfo {
- pub mv_b: Vec<MV>,
- pub mv_f: Vec<MV>,
- pub w: usize,
- pub h: usize,
- pub has_b: Vec<bool>,
- pub has_f: Vec<bool>,
-}
-
-impl MVInfo {
- fn new() -> Self {
- Self { mv_b: Vec::new(), mv_f: Vec::new(), w: 0, h: 0, has_b: Vec::new(), has_f: Vec::new() }
- }
- fn resize(&mut self, mb_w: usize, mb_h: usize) {
- self.w = mb_w * 2;
- self.h = mb_h * 2;
- self.reset();
- }
- fn reset(&mut self) {
- let size = self.w * self.h;
- self.mv_f.truncate(0);
- self.mv_f.resize(size, ZERO_MV);
- self.mv_b.truncate(0);
- self.mv_b.resize(size, ZERO_MV);
- self.has_f.truncate(0);
- self.has_f.resize(size >> 2, false);
- self.has_b.truncate(0);
- self.has_b.resize(size >> 2, false);
- }
- fn fill(&mut self, mb_x: usize, mb_y: usize, fwd: bool, mv: MV) {
- let idx = mb_x * 2 + mb_y * 2 * self.w;
- if fwd {
- self.mv_f[idx + 0] = mv;
- self.mv_f[idx + 1] = mv;
- self.mv_f[idx + self.w + 0] = mv;
- self.mv_f[idx + self.w + 1] = mv;
- } else {
- self.mv_b[idx + 0] = mv;
- self.mv_b[idx + 1] = mv;
- self.mv_b[idx + self.w + 0] = mv;
- self.mv_b[idx + self.w + 1] = mv;
- }
- }
- fn get_mv_by_idx(&self, idx: usize, fwd: bool) -> MV {
- if fwd { self.mv_f[idx] } else { self.mv_b[idx] }
- }
- fn pred_mv(&self, idx: usize, fwd: bool, has_top: bool, has_left: bool, has_tr: bool, has_tl: bool, is16: bool) -> MV {
- if !has_top && !has_left { return ZERO_MV; }
- let left_mv = if has_left { self.get_mv_by_idx(idx - 1, fwd) } else { ZERO_MV };
- let top_mv = if has_top { self.get_mv_by_idx(idx - self.w, fwd) } else { left_mv };
- let tr_add = if is16 { 2 } else { 1 };
- let tr_mv;
- if has_tr {
- tr_mv = self.get_mv_by_idx(idx - self.w + tr_add, fwd);
- } else if has_tl {
- tr_mv = self.get_mv_by_idx(idx - self.w - 1, fwd);
- } else {
- tr_mv = left_mv;
- }
- MV::pred(left_mv, top_mv, tr_mv)
- }
- pub fn pred_mb_mv(&self, mb_x: usize, mb_y: usize, fwd: bool, has_top: bool, has_left: bool, has_tr: bool, has_tl: bool) -> MV {
- self.pred_mv(mb_x * 2 + mb_y * 2 * self.w, fwd, has_top, has_left, has_tr, has_tl, true)
- }
- fn set_mb(&mut self, mb_x: usize, mb_y: usize, mbtype: MBType, ref_mvi: &Self, mvs: &[MV], sstate: &SState) {
- let mb_idx = mb_x + mb_y * (self.w >> 1);
- self.has_f[mb_idx] = mbtype.is_fwd();
- self.has_b[mb_idx] = mbtype.is_bwd();
- if mbtype.is_nomv() {
- self.fill(mb_x, mb_y, true, ZERO_MV);
- self.fill(mb_x, mb_y, false, ZERO_MV);
- return;
- }
- if mbtype.is_fwd() {
- self.fill(mb_x, mb_y, false, ZERO_MV);
- } else if mbtype.is_bwd() {
- self.fill(mb_x, mb_y, true, ZERO_MV);
- }
- let idx = mb_x * 2 + mb_y * 2 * self.w;
-
- match mbtype {
- MBType::MBSkip => {
- self.fill(mb_x, mb_y, true, ZERO_MV/*pred_mv*/);
- },
- MBType::MBP16x16 |
- MBType::MBP16x16Mix => {
- let pred_mv = self.pred_mv(idx, mbtype.is_fwd(), sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl, true);
- let new_mv = mvs[0] + pred_mv;
- self.fill(mb_x, mb_y, true, new_mv);
- },
- MBType::MBP16x8 => {
- let pred_mv = self.pred_mv(idx, mbtype.is_fwd(), sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl, true);
- let new_mv = mvs[0] + pred_mv;
- self.mv_f[idx + 0] = new_mv;
- self.mv_f[idx + 1] = new_mv;
-
- let idx2 = idx + self.w;
- let pred_mv = self.pred_mv(idx2, true, true, sstate.has_left, false, sstate.has_left, true);
- let new_mv = mvs[1] + pred_mv;
- self.mv_f[idx2 + 0] = new_mv;
- self.mv_f[idx2 + 1] = new_mv;
- },
- MBType::MBP8x16 => {
- let pred_mv = self.pred_mv(idx, true, sstate.has_top, sstate.has_left, sstate.has_top, sstate.has_tl, false);
- let new_mv = mvs[0] + pred_mv;
- self.mv_f[idx] = new_mv;
- self.mv_f[idx + self.w] = new_mv;
-
- let pred_mv = self.pred_mv(idx + 1, true, sstate.has_top, true, sstate.has_tr, sstate.has_top, false);
- let new_mv = mvs[1] + pred_mv;
- self.mv_f[idx + 1] = new_mv;
- self.mv_f[idx + self.w + 1] = new_mv;
- },
- MBType::MBP8x8 => {
- let mut idx8 = idx;
- let mut has_top = sstate.has_top;
- for y in 0..2 {
- for x in 0..2 {
- let has_left = (x > 0) || sstate.has_left;
- let has_tr = if y > 0 { x == 0 } else if x == 0 { sstate.has_top } else { sstate.has_tr };
- let has_tl;
- if y == 0 {
- has_tl = if x == 0 { sstate.has_tl } else { sstate.has_top };
- } else {
- has_tl = if x == 0 { sstate.has_left } else { true };
- }
- let pred_mv = self.pred_mv(idx8 + x, true, has_top, has_left, has_tr, has_tl, false);
- let new_mv = mvs[x + y * 2] + pred_mv;
- self.mv_f[idx8 + x] = new_mv;
- }
- has_top = true;
- idx8 += self.w;
- }
- },
- MBType::MBDirect => {
- let mut cum_mv_f = ZERO_MV;
- let mut cum_mv_b = ZERO_MV;
- let mut idx8 = idx;
- for _ in 0..2 {
- for x in 0..2 {
- let (mv_f, mv_b) = ref_mvi.mv_f[idx8 + x].scale(sstate.trd, sstate.trb);
- cum_mv_f += mv_f;
- cum_mv_b += mv_b;
- }
- idx8 += self.w;
- }
- cum_mv_f.x >>= 2;
- cum_mv_f.y >>= 2;
- cum_mv_b.x >>= 2;
- cum_mv_b.y >>= 2;
- self.fill(mb_x, mb_y, true, cum_mv_f);
- self.fill(mb_x, mb_y, false, cum_mv_b);
- },
- MBType::MBBidir => {
- let pred_mv_f = ZERO_MV;
- let new_mv = pred_mv_f + mvs[0];
- self.fill(mb_x, mb_y, true, new_mv);
- let pred_mv_b = ZERO_MV;
- let new_mv = pred_mv_b + mvs[1];
- self.fill(mb_x, mb_y, false, new_mv);
- },
- MBType::MBForward => {
- let pred_mv = self.pred_mv(idx, mbtype.is_fwd(), sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl, true);
- let new_mv = mvs[0] + pred_mv;
- self.fill(mb_x, mb_y, true, new_mv);
- },
- MBType::MBBackward => {
- let pred_mv = self.pred_mv(idx, mbtype.is_fwd(), sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl, true);
- let new_mv = mvs[0] + pred_mv;
- self.fill(mb_x, mb_y, false, new_mv);
- },
- _ => {},
- }
- }
- pub fn get_mv(&self, mb_x: usize, mb_y: usize, x: usize, y: usize, fwd: bool) -> MV {
- let idx = mb_x * 2 + x + (mb_y * 2 + y) * self.w;
- if fwd { self.mv_f[idx] }
- else { self.mv_b[idx] }
- }
- fn mv_gt_3(&self, mb_x: usize, mb_y: usize, x: usize, y: usize, vert: bool) -> bool {
- let idx = mb_x * 2 + x + (mb_y * 2 + y) * self.w;
- let off = if vert { self.w } else { 1 };
- let diffx = self.mv_f[idx].x - self.mv_f[idx - off].x;
- let diffy = self.mv_f[idx].y - self.mv_f[idx - off].y;
- (diffx < -3) || (diffx > 3) || (diffy < -3) || (diffy > 3)
- }
-}
-
-pub trait RV34BitstreamDecoder {
- fn decode_slice_header(&mut self, br: &mut BitReader, old_w: usize, old_h: usize) -> DecoderResult<RV34SliceHeader>;
- fn decode_intra_pred(&mut self, br: &mut BitReader, types: &mut [i8], pos: usize, tstride: usize, has_top: bool) -> DecoderResult<()>;
- fn quant_dc(&self, is_intra: bool, q: u8) -> u8;
- fn decode_inter_mb_hdr(&mut self, br: &mut BitReader, ftype: FrameType, mbtype: MBType) -> DecoderResult<MBInfo>;
- fn predict_b_mv(&self, sstate: &SState, mvi: &MVInfo, mbtype: MBType, mvs: &[MV], mbinfo: &Vec<RV34MBInfo>) -> (MV, MV);
-}
-
-pub trait RV34DSP {
- fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, row: usize);
- fn do_luma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, mv: MV, use16: bool, avg: bool);
- fn do_chroma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, comp: usize, mv: MV, use8: bool, avg: bool);
-}
-
-fn parse_slice_offsets(src: &[u8], offsets: &mut Vec<usize>) -> DecoderResult<()> {
- let num_slices = (src[0] as usize) + 1;
- let ini_off = num_slices * 8 + 1;
- offsets.truncate(0);
-
- if ini_off >= src.len() { return Err(DecoderError::ShortData); }
-
- let mut br = BitReader::new(&src[1..], ini_off - 1, BitReaderMode::BE);
-
- for i in 0..num_slices {
- br.skip(32)?;
- let off = br.read(32)? as usize;
- if (i == 0) && (off != 0) {
- return Err(DecoderError::InvalidData);
- }
- if (i > 0) && (off <= offsets[i - 1]) {
- return Err(DecoderError::InvalidData);
- }
- offsets.push(off);
- }
-
- Ok(())
-}
-
-fn decode_slice_header(br: &mut BitReader, bd: &mut RV34BitstreamDecoder, slice_no: usize, slice_offs: &Vec<usize>, old_width: usize, old_height: usize) -> DecoderResult<RV34SliceHeader> {
- validate!(slice_no < slice_offs.len());
- br.seek((slice_offs[slice_no] * 8) as u32)?;
- let mut shdr = bd.decode_slice_header(br, old_width, old_height)?;
- if slice_no < slice_offs.len() - 1 {
- let cur_pos = br.tell() as u32;
- br.seek((slice_offs[slice_no + 1] * 8) as u32)?;
- let nhdr = bd.decode_slice_header(br, shdr.width, shdr.height)?;
- br.seek(cur_pos)?;
- validate!(nhdr.start > shdr.start);
- shdr.end = nhdr.start;
- } else {
- shdr.end = ((shdr.width + 15) >> 4) * ((shdr.height + 15) >> 4);
- }
- Ok(shdr)
-}
-
-const RV34_MB_MAX_SIZES: [usize; 6] = [ 0x2F, 0x62, 0x18B, 0x62F, 0x18BF, 0x23FF ];
-const RV34_SLICE_START_BITS: [u8; 6] = [ 6, 7, 9, 11, 13, 14 ];
-
-pub fn get_slice_start_offset_bits(w: usize, h: usize) -> u8 {
- let mb_size = ((w + 15) >> 4) * ((h + 15) >> 4) - 1;
- let mut idx: usize = 0;
- while (idx < 5) && (RV34_MB_MAX_SIZES[idx] < mb_size) { idx += 1; }
- RV34_SLICE_START_BITS[idx]
-}
-
-const RV34_DQUANT_TAB: [[i8; 2]; 32] = [
- [ 0, 0 ], [ 2, 1 ], [ -1, 1 ], [ -1, 1 ], [ -1, 1 ], [ -1, 1 ], [ -1, 1 ], [ -1, 1 ],
- [ -1, 1 ], [ -1, 1 ], [ -1, 1 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ],
- [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -3, 3 ], [ -3, 3 ], [ -3, 3 ],
- [ -3, 3 ], [ -3, 3 ], [ -3, 3 ], [ -3, 3 ], [ -3, 3 ], [ -3, 2 ], [ -3, 1 ], [ -3,-5 ]
-];
-
-const RV34_QUANT_TAB: [u16; 32] = [
- 60, 67, 76, 85, 96, 108, 121, 136,
- 152, 171, 192, 216, 242, 272, 305, 341,
- 383, 432, 481, 544, 606, 683, 767, 854,
- 963, 1074, 1212, 1392, 1566, 1708, 1978, 2211
-];
-
-const RV34_CHROMA_QUANT_DC: [u8; 32] = [
- 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 15, 15, 16, 17, 18, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23
-];
-const RV34_CHROMA_QUANT_AC: [u8; 32] = [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25
-];
-
-fn decode_dquant(br: &mut BitReader, q: u8) -> DecoderResult<u8> {
- if br.read_bool()? {
- let diff = RV34_DQUANT_TAB[q as usize][br.read(1)? as usize];
- let qp = (q as i8) + diff;
- validate!((qp > 0) && (qp < 32));
- Ok(qp as u8)
- } else {
- let qp = br.read(5)? as u8;
- Ok(qp)
- }
-}
-
-pub struct SState {
- pub mb_x: usize,
- pub mb_y: usize,
- pub mb_w: usize,
- pub mb_h: usize,
- pub cbp: u32,
- pub q: u8,
- pub q_dc: u8,
- pub set_idx: usize,
- pub has_left: bool,
- pub has_top: bool,
- pub has_tl: bool,
- pub has_tr: bool,
- pub trd: u16,
- pub trb: u16,
-}
-
-impl SState {
- fn new() -> Self {
- Self {
- mb_x: 0,
- mb_y: 0,
- mb_w: 0,
- mb_h: 0,
- cbp: 0,
- q: 0,
- q_dc: 0,
- set_idx: 0,
- has_left: false,
- has_top: false,
- has_tl: false,
- has_tr: false,
- trd: 0,
- trb: 0,
- }
- }
-}
-
-struct MBHist {
- is_p: bool,
- hist: [MBType; 4],
- count: usize,
-}
-
-impl MBHist {
- fn new(ftype: FrameType) -> Self { Self { is_p: ftype == FrameType::P, hist: [MBType::Invalid; 4], count: 0 } }
- fn add(&mut self, mbt: MBType) {
- let mbt2 = match mbt {
- MBType::MBSkip if self.is_p => MBType::MBP16x16,
- MBType::MBSkip if !self.is_p => MBType::MBDirect,
- _ => mbt,
- };
- self.hist[self.count] = mbt2;
- self.count += 1;
- }
- fn get_mbtype(&self) -> MBType {
- if self.count == 0 {
- MBType::MBIntra
- } else if self.count == 1 {
- self.hist[0]
- } else if self.count == 2 {
- if self.hist[0].get_weight() <= self.hist[1].get_weight() {
- self.hist[0]
- } else {
- self.hist[1]
- }
- } else {
- let mut w: [usize; 12] = [0; 12];
- for i in 0..self.count { w[self.hist[i].get_weight()] += 1; }
- let mut nz_idx = 0;
- for i in 0..12 {
- if w[i] == self.count { return MBTYPE_FROM_WEIGHT[i]; }
- if (w[i] > w[nz_idx]) || (w[nz_idx] == 0) { nz_idx = i; }
- }
-
- MBTYPE_FROM_WEIGHT[nz_idx]
- }
- }
-}
-
-fn decode_mv(br: &mut BitReader) -> DecoderResult<MV> {
- let x = br.read_code_signed(IntCodeType::Gamma)? as i16;
- let y = br.read_code_signed(IntCodeType::Gamma)? as i16;
- Ok(MV{ x: x, y: y })
-}
-
-fn do_mc_16x16(dsp: &Box<RV34DSP>, buf: &mut NAVideoBuffer<u8>, prevbuf: &NAVideoBuffer<u8>, mb_x: usize, mb_y: usize, mv: MV, avg: bool) {
- dsp.do_luma_mc (buf, prevbuf, mb_x * 16, mb_y * 16, mv, true, avg);
- dsp.do_chroma_mc(buf, prevbuf, mb_x * 8, mb_y * 8, 1, mv, true, avg);
- dsp.do_chroma_mc(buf, prevbuf, mb_x * 8, mb_y * 8, 2, mv, true, avg);
-}
-
-fn do_mc_8x8(dsp: &Box<RV34DSP>, buf: &mut NAVideoBuffer<u8>, prevbuf: &NAVideoBuffer<u8>, mb_x: usize, xoff: usize, mb_y: usize, yoff: usize, mv: MV, avg: bool) {
- dsp.do_luma_mc (buf, prevbuf, mb_x * 16 + xoff * 8, mb_y * 16 + yoff * 8, mv, false, avg);
- dsp.do_chroma_mc(buf, prevbuf, mb_x * 8 + xoff * 4, mb_y * 8 + yoff * 4, 1, mv, false, avg);
- dsp.do_chroma_mc(buf, prevbuf, mb_x * 8 + xoff * 4, mb_y * 8 + yoff * 4, 2, mv, false, avg);
-}
-
-fn do_avg(cdsp: &RV34CommonDSP, buf: &mut NAVideoBuffer<u8>, avg_buf: &NAVideoBuffer<u8>, mb_x: usize, xb: usize, mb_y: usize, yb: usize, size: usize, ratio1: u32, ratio2: u32) {
- for comp in 0..3 {
- let xoff = if comp == 0 { mb_x * 16 + xb * 8 } else { mb_x * 8 + xb * 4 };
- let yoff = if comp == 0 { mb_y * 16 + yb * 8 } else { mb_y * 8 + yb * 4 };
- let csize = if comp == 0 { size } else { size >> 1 };
- let dstride = buf.get_stride(comp);
- let doffset = buf.get_offset(comp) + xoff + yoff * dstride;
- let mut data = buf.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
-
- let sstride = avg_buf.get_stride(comp);
- let soffset = avg_buf.get_offset(comp);
- let data = avg_buf.get_data();
- let src: &[u8] = data.as_slice();
-
- if ratio1 == ratio2 {
- cdsp.avg(dst, doffset, dstride, src, soffset, sstride, csize);
- } else {
- cdsp.weight(dst, doffset, dstride, src, soffset, sstride, ratio2, ratio1, csize);
- }
- }
-}
-
-pub struct RV34Decoder {
- is_rv30: bool,
- coderead: RV34Codes,
- dsp: Box<RV34DSP>,
- cdsp: RV34CommonDSP,
- width: usize,
- height: usize,
- ipbs: IPBShuffler,
- mvi: MVInfo,
- ref_mvi: MVInfo,
- last_ts: u16,
- next_ts: u16,
- ratio1: u32,
- ratio2: u32,
- is_b: bool,
- mbinfo: Vec<RV34MBInfo>,
- avg_buf: NAVideoBuffer<u8>,
- base_ts: u64,
-}
-
-impl RV34Decoder {
- pub fn new(is_rv30: bool, dsp: Box<RV34DSP>) -> Self {
- let tmp_vinfo = NAVideoInfo::new(16, 16, false, YUV420_FORMAT);
- let mut vt = alloc_video_buffer(tmp_vinfo, 4).unwrap();
- let vb = vt.get_vbuf();
- let avg_buf = vb.unwrap();
- RV34Decoder {
- is_rv30: is_rv30,
- coderead: RV34Codes::new(),
- dsp: dsp,
- cdsp: RV34CommonDSP::new(),
- ipbs: IPBShuffler::new(),
- mvi: MVInfo::new(),
- ref_mvi: MVInfo::new(),
- mbinfo: Vec::new(),
- width: 0, height: 0,
- last_ts: 0, next_ts: 0,
- ratio1: 0, ratio2: 0,
- is_b: false,
- avg_buf: avg_buf,
- base_ts: 0,
- }
- }
- fn decode_mb_header_intra(&mut self, bd: &mut RV34BitstreamDecoder, br: &mut BitReader, is_i16: bool, im: &mut IntraModeState, q: u8, has_top: bool, has_dq: bool) -> DecoderResult<MBInfo> {
- if is_i16 {
- let imode = br.read(2)? as i8;
- im.fill_block(imode);
- return Ok(MBInfo { mbtype: MBType::MBIntra16, skip_run: 0, dquant: false });
- } else {
- let dq = if !has_dq {
- if !self.is_rv30 { !br.read_bool()? } else { false }
- } else { false };
- if dq {
- decode_dquant(br, q)?;
- }
- bd.decode_intra_pred(br, im.cache.data.as_mut_slice(), im.cache.xpos, im.cache.stride, has_top)?;
- return Ok(MBInfo { mbtype: MBType::MBIntra, skip_run: 0, dquant: dq });
- }
- }
- fn decode_mb_header_inter(&mut self, bd: &mut RV34BitstreamDecoder, br: &mut BitReader, ftype: FrameType, mbtype: MBType, im: &mut IntraModeState, q: u8, has_top: bool) -> DecoderResult<MBInfo> {
- let hdr = bd.decode_inter_mb_hdr(br, ftype, mbtype)?;
- validate!(hdr.mbtype != MBType::Invalid);
- if hdr.dquant {
- decode_dquant(br, q)?;
- }
- if hdr.mbtype.is_intra() {
- return self.decode_mb_header_intra(bd, br, hdr.mbtype.is_16(), im, q, has_top, true);
- }
- return Ok(hdr);
- }
-
- fn decode_mb_intra(&mut self, sstate: &SState, imode: &IntraModeState, buf: &mut NAVideoBuffer<u8>, br: &mut BitReader, is_16: bool) -> DecoderResult<()> {
- let mut cur_cbp = sstate.cbp;
- {
- let q_dc = RV34_QUANT_TAB[sstate.q_dc as usize];
- let q_ac = RV34_QUANT_TAB[sstate.q as usize];
- let luma_set = if is_16 { 2 } else { 1 };
- let mut coeffs16: [i16; 16] = [0; 16];
- if is_16 {
- let has_ac = self.coderead.decode_block(br, &mut coeffs16, 3, 0, q_dc, q_dc, q_ac)?;
- if has_ac {
- self.cdsp.transform16(&mut coeffs16);
- } else {
- self.cdsp.transform16_dc(&mut coeffs16);
- }
- }
- let stride = buf.get_stride(0);
- let mut offset = buf.get_offset(0) + sstate.mb_x * 16 + sstate.mb_y * 16 * stride;
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- if is_16 {
- let im16 = imode.get_pred16_type(sstate.has_top, sstate.has_left);
- self.cdsp.ipred16x16[im16 as usize](framebuf, offset, stride);
- }
-
- for y in 0..4 {
- for x in 0..4 {
- let mut coeffs: [i16; 16] = [0; 16];
- let has_ac;
- if (cur_cbp & 1) != 0 {
- has_ac = self.coderead.decode_block(br, &mut coeffs, luma_set, 0, q_ac, q_ac, q_ac)?;
- } else {
- has_ac = false;
- }
- if is_16 {
- coeffs[0] = coeffs16[x + y * 4];
- } else {
- let noright = (sstate.mb_x == sstate.mb_w - 1) && (x == 3);
- let has_top = sstate.has_top || (y > 0);
- let im = imode.get_pred4_type(x, y, sstate.has_top, sstate.has_left);
- let topright: [u8; 4] = if (noright && sstate.has_top && y == 0) || (x == 3 && y > 0) {
- let i = offset + x * 4 - stride;
- [framebuf[i + 3], framebuf[i + 3], framebuf[i + 3], framebuf[i + 3]]
- } else if has_top {
- let i = offset + x * 4 - stride;
- [framebuf[i + 4], framebuf[i + 5], framebuf[i + 6], framebuf[i + 7]]
- } else {
- [0; 4]
- };
- self.cdsp.ipred4x4[im as usize](framebuf, offset + x*4, stride, &topright);
- }
- if has_ac {
- self.cdsp.transform(&mut coeffs);
- } else {
- self.cdsp.transform_dc(&mut coeffs);
- }
- self.cdsp.add_coeffs(framebuf, offset + x * 4, stride, &coeffs);
- cur_cbp >>= 1;
- }
- offset += stride * 4;
- }
- }
- let q_dc = RV34_QUANT_TAB[RV34_CHROMA_QUANT_DC[sstate.q as usize] as usize];
- let q_ac = RV34_QUANT_TAB[RV34_CHROMA_QUANT_AC[sstate.q as usize] as usize];
- let chroma_set = 0;
- for comp in 1..3 {
- let stride = buf.get_stride(comp);
- let mut offset = buf.get_offset(comp) + sstate.mb_x * 8 + sstate.mb_y * 8 * stride;
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
- if is_16 {
- let im8 = imode.get_pred8_type(sstate.has_top, sstate.has_left);
- self.cdsp.ipred8x8[im8 as usize](framebuf, offset, stride);
- }
- for y in 0..2 {
- for x in 0..2 {
- let mut coeffs: [i16; 16] = [0; 16];
- let has_ac;
- if (cur_cbp & 1) != 0 {
- has_ac = self.coderead.decode_block(br, &mut coeffs, chroma_set, 1, q_dc, q_ac, q_ac)?;
- } else {
- has_ac = false;
- }
- if !is_16 {
- let noright = (sstate.mb_x == sstate.mb_w - 1) && (x == 1);
- let has_top = sstate.has_top || (y > 0);
- let im = imode.get_pred4_type_chroma(x, y, sstate.has_top, sstate.has_left);
- let topright: [u8; 4] = if (noright && sstate.has_top && y == 0) || (x == 1 && y > 0) {
- let i = offset + x * 4 - stride;
- [framebuf[i + 3], framebuf[i + 3], framebuf[i + 3], framebuf[i + 3]]
- } else if has_top {
- let i = offset + x * 4 - stride;
- [framebuf[i + 4], framebuf[i + 5], framebuf[i + 6], framebuf[i + 7]]
- } else {
- [0; 4]
- };
- self.cdsp.ipred4x4[im as usize](framebuf, offset + x*4, stride, &topright);
- }
- if has_ac {
- self.cdsp.transform(&mut coeffs);
- } else {
- self.cdsp.transform_dc(&mut coeffs);
- }
- self.cdsp.add_coeffs(framebuf, offset + x * 4, stride, &coeffs);
- cur_cbp >>= 1;
- }
- offset += stride * 4;
- }
- }
- Ok(())
- }
-
- fn do_mc(&mut self, buf: &mut NAVideoBuffer<u8>, mbh: &MBInfo, sstate: &SState) {
- let mb_x = sstate.mb_x;
- let mb_y = sstate.mb_y;
- match mbh.mbtype {
- MBType::MBP16x16 | MBType::MBP16x16Mix => {
- if let Some(ref prevbuf) = self.ipbs.get_lastref() {
- let mv = self.mvi.get_mv(mb_x, mb_y, 0, 0, true);
- do_mc_16x16(&self.dsp, buf, prevbuf, mb_x, mb_y, mv, false);
- }
- },
- MBType::MBForward => {
- if let Some(ref fwdbuf) = self.ipbs.get_b_fwdref() {
- let mv = self.mvi.get_mv(mb_x, mb_y, 0, 0, true);
- do_mc_16x16(&self.dsp, buf, fwdbuf, mb_x, mb_y, mv, false);
- }
- },
- MBType::MBBackward => {
- if let Some(ref bwdbuf) = self.ipbs.get_b_bwdref() {
- let mv = self.mvi.get_mv(mb_x, mb_y, 0, 0, false);
- do_mc_16x16(&self.dsp, buf, bwdbuf, mb_x, mb_y, mv, false);
- }
- },
- MBType::MBP8x8 | MBType::MBP8x16 | MBType::MBP16x8 => {
- if let Some(ref prevbuf) = self.ipbs.get_lastref() {
- for y in 0..2 {
- for x in 0..2 {
- let mv = self.mvi.get_mv(mb_x, mb_y, x, y, true);
- do_mc_8x8(&self.dsp, buf, prevbuf, mb_x, x, mb_y, y, mv, false);
- }
- }
- }
- },
- MBType::MBSkip if !self.is_b => {
- if let Some(ref prevbuf) = self.ipbs.get_lastref() {
- do_mc_16x16(&self.dsp, buf, prevbuf, mb_x, mb_y, ZERO_MV, false);
- }
- },
- MBType::MBSkip | MBType::MBDirect => {
- if let (Some(ref fwdbuf), Some(ref bwdbuf)) = (self.ipbs.get_b_fwdref(), self.ipbs.get_b_bwdref()) {
- for y in 0..2 {
- for x in 0..2 {
- let (mv_f, mv_b) = self.ref_mvi.get_mv(mb_x, mb_y, x, y, true).scale(sstate.trd, sstate.trb);
- do_mc_8x8(&self.dsp, buf, fwdbuf, mb_x, x, mb_y, y, mv_f, false);
- do_mc_8x8(&self.dsp, &mut self.avg_buf, bwdbuf, mb_x, x, mb_y, y, mv_b, true);
- do_avg(&self.cdsp, buf, &self.avg_buf, mb_x, x, mb_y, y, 8, self.ratio1, self.ratio2);
- }
- }
- }
- },
- MBType::MBBidir => {
- if let (Some(ref fwdbuf), Some(ref bwdbuf)) = (self.ipbs.get_b_fwdref(), self.ipbs.get_b_bwdref()) {
- let mv_f = self.mvi.get_mv(mb_x, mb_y, 0, 0, true);
- let mv_b = self.mvi.get_mv(mb_x, mb_y, 0, 0, false);
- do_mc_16x16(&self.dsp, buf, fwdbuf, mb_x, mb_y, mv_f, false);
- do_mc_16x16(&self.dsp, &mut self.avg_buf, bwdbuf, mb_x, mb_y, mv_b, true);
- do_avg(&self.cdsp, buf, &self.avg_buf, mb_x, 0, mb_y, 0, 16, self.ratio1, self.ratio2);
- }
- },
- _ => {},
- };
- }
- fn decode_mb_inter(&mut self, sstate: &SState, mbh: &MBInfo, buf: &mut NAVideoBuffer<u8>, br: &mut BitReader, is_16: bool) -> DecoderResult<()> {
- self.do_mc(buf, mbh, sstate);
-
- let mut cur_cbp = sstate.cbp;
-
- {
- let q_dc = RV34_QUANT_TAB[sstate.q_dc as usize];
- let q_ac = RV34_QUANT_TAB[sstate.q as usize];
- let luma_set = if is_16 { 2 } else { 0 };
- let mut coeffs16: [i16; 16] = [0; 16];
- if is_16 {
- let has_ac = self.coderead.decode_block(br, &mut coeffs16, 3, 0, q_dc, q_dc, q_ac)?;
- if has_ac {
- self.cdsp.transform16(&mut coeffs16);
- } else {
- self.cdsp.transform16_dc(&mut coeffs16);
- }
- }
- let stride = buf.get_stride(0);
- let mut offset = buf.get_offset(0) + sstate.mb_x * 16 + sstate.mb_y * 16 * stride;
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
-
- for y in 0..4 {
- for x in 0..4 {
- let mut coeffs: [i16; 16] = [0; 16];
- let has_ac;
- if (cur_cbp & 1) != 0 {
- has_ac = self.coderead.decode_block(br, &mut coeffs, luma_set, 0, q_ac, q_ac, q_ac)?;
- } else {
- has_ac = false;
- }
- if is_16 {
- coeffs[0] = coeffs16[x + y * 4];
- }
- if has_ac {
- self.cdsp.transform(&mut coeffs);
- } else {
- self.cdsp.transform_dc(&mut coeffs);
- }
- self.cdsp.add_coeffs(framebuf, offset + x * 4, stride, &coeffs);
- cur_cbp >>= 1;
- }
- offset += stride * 4;
- }
- }
- if is_16 {
- self.coderead.select_codes(false, sstate.q, sstate.set_idx, false);
- }
- let q_dc = RV34_QUANT_TAB[RV34_CHROMA_QUANT_DC[sstate.q as usize] as usize];
- let q_ac = RV34_QUANT_TAB[RV34_CHROMA_QUANT_AC[sstate.q as usize] as usize];
- let chroma_set = 1;
- for comp in 1..3 {
- let stride = buf.get_stride(comp);
- let mut offset = buf.get_offset(comp) + sstate.mb_x * 8 + sstate.mb_y * 8 * stride;
- let mut data = buf.get_data_mut();
- let framebuf: &mut [u8] = data.as_mut_slice();
- for _ in 0..2 {
- for x in 0..2 {
- let mut coeffs: [i16; 16] = [0; 16];
- let has_ac;
- if (cur_cbp & 1) != 0 {
- has_ac = self.coderead.decode_block(br, &mut coeffs, chroma_set, 1, q_dc, q_ac, q_ac)?;
- } else {
- has_ac = false;
- }
- if has_ac {
- self.cdsp.transform(&mut coeffs);
- } else {
- self.cdsp.transform_dc(&mut coeffs);
- }
- self.cdsp.add_coeffs(framebuf, offset + x * 4, stride, &coeffs);
- cur_cbp >>= 1;
- }
- offset += stride * 4;
- }
- }
- Ok(())
- }
- fn fill_deblock_flags(&self, sstate: &SState, mb_pos: usize, mbinfo: &mut Vec<RV34MBInfo>) {
- let mbt = mbinfo[mb_pos].mbtype;
- let mut hmvmask = 0;
- let mut vmvmask = 0;
-
- for y in 0..2 {
- for x in 0..2 {
- let shift = x * 2 + y * 8;
- if ((x > 0) || (sstate.mb_x > 0)) && self.mvi.mv_gt_3(sstate.mb_x, sstate.mb_y, x, y, false) {
- vmvmask |= 0x11 << shift;
- }
- if ((y > 0) || sstate.has_top) && self.mvi.mv_gt_3(sstate.mb_x, sstate.mb_y, x, y, true) {
- hmvmask |= 0x03 << shift;
- }
- }
- }
- if !sstate.has_top { hmvmask &= !0x000F; }
- if sstate.mb_x == 0 { vmvmask &= !0x1111; }
- if self.is_rv30 {
- vmvmask |= (vmvmask & 0x4444) >> 1;
- hmvmask |= (hmvmask & 0x0F00) >> 4;
- if sstate.mb_x > 0 {
- mbinfo[mb_pos - 1].deblock |= (vmvmask & 0x1111) << 3;
- }
- if sstate.has_top {
-
- mbinfo[mb_pos - sstate.mb_w].deblock |= (hmvmask & 0xF) << 12;
- }
- }
- if mbt.is_intra_or_16() {
- mbinfo[mb_pos].deblock = 0xFFFF;
- mbinfo[mb_pos].cbp_c = 0xFF;
- } else {
- mbinfo[mb_pos].deblock = (mbinfo[mb_pos].cbp as u16) | hmvmask | vmvmask;
- mbinfo[mb_pos].cbp_c = (mbinfo[mb_pos].cbp >> 16) as u8;
- }
- }
-
- pub fn parse_frame(&mut self, src: &[u8], bd: &mut RV34BitstreamDecoder) -> DecoderResult<(NABufferType, FrameType, u64)> {
- let mut slice_offs: Vec<usize> = Vec::new();
- parse_slice_offsets(src, &mut slice_offs)?;
- let ini_off = slice_offs.len() * 8 + 1;
-
- let mut br = BitReader::new(&src[ini_off..], src.len() - ini_off, BitReaderMode::BE);
- let hdr0 = decode_slice_header(&mut br, bd, 0, &slice_offs, self.width, self.height)?;
- validate!((hdr0.width != 0) && (hdr0.height != 0));
- self.width = hdr0.width;
- self.height = hdr0.height;
- let mb_w = (hdr0.width + 15) >> 4;
- let mb_h = (hdr0.height + 15) >> 4;
- let mut mb_pos: usize = 0;
- let mut slice = hdr0;
- let mut slice_no: usize = 1;
- let is_intra = hdr0.ftype == FrameType::I;
- let mut skip_run: usize = 0;
- let mut imode = IntraModeState::new(mb_w);
- let mut q = hdr0.quant;
-
- let mut sstate = SState::new();
- let mut mbinfo: Vec<RV34MBInfo> = Vec::with_capacity(mb_w * mb_h);
-
- self.is_b = hdr0.ftype == FrameType::B;
- if hdr0.ftype != FrameType::B {
- self.last_ts = self.next_ts;
- self.next_ts = hdr0.pts;
- if self.last_ts > self.next_ts {
- self.base_ts += 1 << 13;
- }
- }
- let ts_diff = (self.next_ts << 3).wrapping_sub(hdr0.pts << 3) >> 3;
- let ts = self.base_ts + (self.next_ts as u64) - (ts_diff as u64);
- sstate.trd = (self.next_ts << 3).wrapping_sub(self.last_ts << 3) >> 3;
- sstate.trb = (hdr0.pts << 3).wrapping_sub(self.last_ts << 3) >> 3;
- if sstate.trb != 0 {
- self.ratio1 = ((sstate.trb as u32) << 14) / (sstate.trd as u32);
- self.ratio2 = (((sstate.trd as u32) - (sstate.trb as u32)) << 14) / (sstate.trd as u32);
- } else {
- self.ratio1 = 1 << 14 >> 1;
- self.ratio2 = 1 << 14 >> 1;
- }
- //todo validate against ref frame
-
- let vinfo = NAVideoInfo::new(hdr0.width, hdr0.height, false, YUV420_FORMAT);
- let bufret = alloc_video_buffer(vinfo, 4);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let mut bufinfo = bufret.unwrap();
- let mut buf = bufinfo.get_vbuf().unwrap();
-
- sstate.q = q;
- sstate.has_top = false;
- sstate.mb_w = mb_w;
- sstate.mb_h = mb_h;
- sstate.set_idx = hdr0.set_idx;
-
- self.mvi.resize(mb_w, mb_h);
- for mb_y in 0..mb_h {
- sstate.mb_y = mb_y;
- sstate.has_left = false;
- for mb_x in 0..mb_w {
- sstate.mb_x = mb_x;
- if mb_pos == slice.end {
- slice = decode_slice_header(&mut br, bd, slice_no, &slice_offs, self.width, self.height)?;
- validate!(slice.fits(&hdr0));
- q = slice.quant;
- slice_no += 1;
- imode.reset();
- sstate.q = q;
- sstate.has_top = false;
- sstate.has_left = false;
- sstate.set_idx = slice.set_idx;
- }
- sstate.has_top = (mb_pos - slice.start) >= mb_w;
- sstate.has_tl = sstate.has_top && (mb_x > 0) && (mb_pos > slice.start + mb_w);
- sstate.has_tr = (mb_x < mb_w - 1) && (mb_pos - slice.start >= mb_w - 1);
- imode.set_mb_x(mb_x);
- let mbh = if is_intra {
- let is_i16 = br.read_bool()?;
- self.decode_mb_header_intra(bd, &mut br, is_i16, &mut imode, q, sstate.has_top, false)?
- } else {
- if skip_run == 0 {
- let mbtype;
- if self.is_rv30 {
- mbtype = MBType::Invalid;
- } else {
- let mut hist = MBHist::new(hdr0.ftype);
- if sstate.has_top {
- hist.add(mbinfo[mb_pos - mb_w].mbtype);
- if sstate.has_tr { hist.add(mbinfo[mb_pos - mb_w + 1].mbtype); }
- }
- if sstate.has_left { hist.add(mbinfo[mb_pos - 1].mbtype); }
- if sstate.has_tl { hist.add(mbinfo[mb_pos - mb_w - 1].mbtype); }
- mbtype = hist.get_mbtype();
- }
- self.decode_mb_header_inter(bd, &mut br, hdr0.ftype, mbtype, &mut imode, q, sstate.has_top)?
- } else {
- skip_run -= 1;
- MBInfo { mbtype: MBType::MBSkip, skip_run: 0, dquant: false }
- }
- };
- if !mbh.mbtype.is_intra() {
- let mut mvs: [MV; 4] = [ZERO_MV; 4];
- for i in 0..mbh.mbtype.get_num_mvs() {
- mvs[i] = decode_mv(&mut br)?;
- }
- if !self.is_b {
- self.mvi.set_mb(mb_x, mb_y, mbh.mbtype, &self.ref_mvi, &mvs, &sstate);
- } else {
- let (mv_f, mv_b) = bd.predict_b_mv(&sstate, &self.mvi, mbh.mbtype, &mvs, &mbinfo);
- self.mvi.fill(mb_x, mb_y, true, mv_f);
- self.mvi.fill(mb_x, mb_y, false, mv_b);
- }
- }
- let cbp;
- let is_16 = (mbh.mbtype == MBType::MBIntra16) || (mbh.mbtype == MBType::MBP16x16Mix);
- if mbh.mbtype == MBType::MBSkip {
- cbp = 0;
- if mbh.skip_run > 0 {
- skip_run = mbh.skip_run;
- }
- } else {
- self.coderead.select_codes(mbh.mbtype.is_intra(), q, slice.set_idx, is_16);
- if mbh.mbtype == MBType::MBP16x16Mix {
- self.coderead.select_codes(true, q, slice.set_idx, true);
- }
- cbp = self.coderead.decode_cbp(&mut br)?;
- }
- sstate.cbp = cbp;
- if is_intra || mbh.mbtype.is_intra() {
- sstate.q_dc = bd.quant_dc(true, q);
- self.decode_mb_intra(&sstate, &imode, &mut buf, &mut br, is_16)?;
- } else {
- imode.fill_block(0);
- self.decode_mb_inter(&sstate, &mbh, &mut buf, &mut br, is_16)?;
- }
-
- let mi = RV34MBInfo { cbp: cbp, q: q, mbtype: mbh.mbtype, deblock: 0, cbp_c: 0 };
- mbinfo.push(mi);
- if is_intra {
- mbinfo[mb_pos].deblock = 0xFFFF;
- mbinfo[mb_pos].cbp_c = 0xFF;
- } else {
- self.fill_deblock_flags(&sstate, mb_pos, &mut mbinfo);
- }
- sstate.has_left = true;
- mb_pos += 1;
- }
- if hdr0.deblock && (mb_y >= 1) {
- self.dsp.loop_filter(&mut buf, hdr0.ftype, &mbinfo, mb_w, mb_y - 1);
- }
- imode.update();
- }
- if hdr0.deblock {
- self.dsp.loop_filter(&mut buf, hdr0.ftype, &mbinfo, mb_w, mb_h - 1);
- }
- if !self.is_b {
- self.ipbs.add_frame(buf);
- mem::swap(&mut self.mvi, &mut self.ref_mvi);
- mem::swap(&mut self.mbinfo, &mut mbinfo);
- }
-
- Ok((bufinfo, hdr0.ftype, ts))
- }
-}
diff --git a/src/codecs/real/rv30dsp.rs b/src/codecs/real/rv30dsp.rs
deleted file mode 100644
index b1365db..0000000
--- a/src/codecs/real/rv30dsp.rs
+++ /dev/null
@@ -1,435 +0,0 @@
-use crate::frame::{FrameType, NAVideoBuffer};
-use crate::codecs::MV;
-use crate::codecs::blockdsp::edge_emu;
-use super::rv3040::{RV34DSP, RV34MBInfo};
-
-fn clip8(a: i16) -> u8 {
- if a < 0 { 0 }
- else if a > 255 { 255 }
- else { a as u8 }
-}
-
-fn rv3_filter_h(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, bsize: usize, c1: i16, c2: i16) {
- for _ in 0..bsize {
- for x in 0..bsize {
- dst[didx + x] = clip8((-((src[sidx + x - 1] as i16) + (src[sidx + x + 2] as i16)) + (src[sidx + x + 0] as i16) * c1 + (src[sidx + x + 1] as i16) * c2 + 8) >> 4);
- }
- sidx += sstride;
- didx += dstride;
- }
-}
-
-fn rv3_filter_v(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, bsize: usize, c1: i16, c2: i16) {
- for _ in 0..bsize {
- for x in 0..bsize {
- dst[didx + x] = clip8((-((src[sidx + x - 1 * sstride] as i16) + (src[sidx + x + 2 * sstride] as i16)) + (src[sidx + x + 0 * sstride] as i16) * c1 + (src[sidx + x + 1 * sstride] as i16) * c2 + 8) >> 4);
- }
- sidx += sstride;
- didx += dstride;
- }
-}
-
-macro_rules! mc_matrix {
- ($s: ident, $o: expr, $c1: expr) => (
- ($c1 * 6) * ($s[$o] as i32) + ($c1 * 9) * ($s[$o + 1] as i32) + ($c1) * ($s[$o + 2] as i32)
- );
- ($s: ident, $o: expr, $c1: expr, $d1: expr, $d2: expr) => (
- (-$c1) * ($s[$o - 1] as i32) + ($c1 * $d1) * ($s[$o] as i32) + ($c1 * $d2) * ($s[$o + 1] as i32) + (-$c1) * ($s[$o + 2] as i32)
- );
- ($s: ident, $o: expr, $ss: expr, $c1: expr, $c2: expr, $d1: expr, $d2: expr) => (
- ((mc_matrix!($s, $o - $ss, -1, $d1, $d2) +
- mc_matrix!($s, $o , $c1, $d1, $d2) +
- mc_matrix!($s, $o + $ss, $c2, $d1, $d2) +
- mc_matrix!($s, $o + 2 * $ss, -1, $d1, $d2) + 128) >> 8) as i16
- );
- (m22; $s: ident, $o: expr, $ss: expr) => (
- ((mc_matrix!($s, $o + 0 * $ss, 6) +
- mc_matrix!($s, $o + 1 * $ss, 9) +
- mc_matrix!($s, $o + 2 * $ss, 1) + 128) >> 8) as i16
- );
-}
-
-macro_rules! mc_func {
- (copy; $name: ident, $size: expr) => (
- fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- for _ in 0..$size {
- let d = &mut dst[didx..][..$size];
- let s = &src[sidx..][..$size];
- for x in 0..$size { d[x] = s[x]; }
- didx += dstride;
- sidx += sstride;
- }
- }
- );
- (hor; $name: ident, $c1: expr, $c2: expr, $size: expr) => (
- fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], sidx: usize, sstride: usize) {
- rv3_filter_h(dst, didx, dstride, src, sidx, sstride, $size, $c1, $c2);
- }
- );
- (ver; $name: ident, $c1: expr, $c2: expr, $size: expr) => (
- fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], sidx: usize, sstride: usize) {
- rv3_filter_v(dst, didx, dstride, src, sidx, sstride, $size, $c1, $c2);
- }
- );
- (m11; $name: ident, $size: expr) => (
- fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- for _ in 0..$size {
- for x in 0..$size {
- dst[didx + x] = clip8(mc_matrix!(src, sidx + x, sstride, 12, 6, 12, 6));
- }
- didx += dstride;
- sidx += sstride;
- }
- }
- );
- (m12; $name: ident, $size: expr) => (
- fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- for _ in 0..$size {
- for x in 0..$size {
- dst[didx + x] = clip8(mc_matrix!(src, sidx + x, sstride, 6, 12, 12, 6));
- }
- didx += dstride;
- sidx += sstride;
- }
- }
- );
- (m21; $name: ident, $size: expr) => (
- fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- for _ in 0..$size {
- for x in 0..$size {
- dst[didx + x] = clip8(mc_matrix!(src, sidx + x, sstride, 12, 6, 6, 12));
- }
- didx += dstride;
- sidx += sstride;
- }
- }
- );
- (m22; $name: ident, $size: expr) => (
- fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- for _ in 0..$size {
- for x in 0..$size {
- dst[didx + x] = clip8(mc_matrix!(m22; src, sidx + x, sstride));
- }
- didx += dstride;
- sidx += sstride;
- }
- }
- );
-}
-mc_func!(copy; copy_16, 16);
-mc_func!(copy; copy_8, 8);
-mc_func!(hor; luma_mc_10_16, 12, 6, 16);
-mc_func!(hor; luma_mc_20_16, 6, 12, 16);
-mc_func!(hor; luma_mc_10_8, 12, 6, 8);
-mc_func!(hor; luma_mc_20_8, 6, 12, 8);
-mc_func!(ver; luma_mc_01_16, 12, 6, 16);
-mc_func!(ver; luma_mc_02_16, 6, 12, 16);
-mc_func!(ver; luma_mc_01_8, 12, 6, 8);
-mc_func!(ver; luma_mc_02_8, 6, 12, 8);
-mc_func!(m11; luma_mc_11_16, 16);
-mc_func!(m11; luma_mc_11_8, 8);
-mc_func!(m21; luma_mc_21_16, 16);
-mc_func!(m21; luma_mc_21_8, 8);
-mc_func!(m12; luma_mc_12_16, 16);
-mc_func!(m12; luma_mc_12_8, 8);
-mc_func!(m22; luma_mc_22_16, 16);
-mc_func!(m22; luma_mc_22_8, 8);
-
-const RV30_CHROMA_FRAC1: [u16; 3] = [ 8, 5, 3 ];
-const RV30_CHROMA_FRAC2: [u16; 3] = [ 0, 3, 5 ];
-fn rv30_chroma_mc(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, size: usize, x: usize, y: usize) {
- if (x == 0) && (y == 0) {
- for _ in 0..size {
- for x in 0..size { dst[didx + x] = src[sidx + x]; }
- didx += dstride;
- sidx += sstride;
- }
- return;
- }
- let a = RV30_CHROMA_FRAC1[x] * RV30_CHROMA_FRAC1[y];
- let b = RV30_CHROMA_FRAC2[x] * RV30_CHROMA_FRAC1[y];
- let c = RV30_CHROMA_FRAC1[x] * RV30_CHROMA_FRAC2[y];
- let d = RV30_CHROMA_FRAC2[x] * RV30_CHROMA_FRAC2[y];
- for _ in 0..size {
- for x in 0..size {
- dst[didx + x] = ((a * (src[sidx + x] as u16)
- + b * (src[sidx + x + 1] as u16)
- + c * (src[sidx + x + sstride] as u16)
- + d * (src[sidx + x + 1 + sstride] as u16) + 32) >> 6) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
-}
-
-pub struct RV30DSP {
- luma_mc: [[fn (&mut [u8], usize, usize, &[u8], usize, usize); 9]; 2],
-}
-
-impl RV30DSP {
- pub fn new() -> Self {
- RV30DSP {
- luma_mc: [
- [ copy_16, luma_mc_10_16, luma_mc_20_16,
- luma_mc_01_16, luma_mc_11_16, luma_mc_21_16,
- luma_mc_02_16, luma_mc_12_16, luma_mc_22_16 ],
- [ copy_8, luma_mc_10_8, luma_mc_20_8,
- luma_mc_01_8, luma_mc_11_8, luma_mc_21_8,
- luma_mc_02_8, luma_mc_12_8, luma_mc_22_8 ] ],
- }
- }
-}
-
-macro_rules! el {
- ($src: ident, $o: expr) => ($src[$o] as i16);
-}
-
-fn clip_symm(a: i16, lim: i16) -> i16 {
- if a < -lim {
- -lim
- } else if a > lim {
- lim
- } else {
- a
- }
-}
-
-const RV30_LOOP_FILTER_STRENGTH: [i16; 32] = [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5
-];
-
-macro_rules! test_bit {
- ($pat: expr, $x: expr) => ( (($pat >> $x) & 1) != 0 )
-}
-
-fn rv30_loop_filter4(pix: &mut [u8], mut off: usize, step: usize, stride: usize, lim: i16) {
- for _ in 0..4 {
- let a = el!(pix, off - 2*step);
- let b = el!(pix, off - step);
- let c = el!(pix, off);
- let d = el!(pix, off + step);
- let diff0 = ((a - d) - (b - c) * 4) >> 3;
- let diff = clip_symm(diff0, lim);
- pix[off - step] = clip8(b + diff);
- pix[off ] = clip8(c - diff);
- off += stride;
- }
-}
-
-fn rv30_div_mv(mv: i16) -> (i16, usize) {
- let i = mv / 3;
- let f = mv - i * 3;
- if f < 0 {
- (i - 1, (f + 3) as usize)
- } else {
- (i, f as usize)
- }
-}
-
-fn check_pos(x: usize, y: usize, size: usize, w: usize, h: usize, dx: i16, dy: i16, e0: isize, e1: isize, e2: isize, e3: isize) -> bool {
- let xn = (x as isize) + (dx as isize);
- let yn = (y as isize) + (dy as isize);
-
- (xn - e0 >= 0) && (xn + (size as isize) + e1 <= (w as isize)) && (yn - e2 >= 0) && (yn + (size as isize) + e3 <= (h as isize))
-}
-
-const RV30_EDGE1: [isize; 3] = [ 0, 1, 1 ];
-const RV30_EDGE2: [isize; 3] = [ 0, 2, 2 ];
-
-impl RV34DSP for RV30DSP {
- fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, _ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, row: usize) {
- let mut offs: [usize; 3] = [0; 3];
- let mut stride: [usize; 3] = [0; 3];
-
- for comp in 0..3 {
- stride[comp] = frame.get_stride(comp);
- let start = if comp == 0 { row * 16 } else { row * 8 };
- offs[comp] = frame.get_offset(comp) + start * stride[comp];
- }
-
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
-
- // vertical filter
- let mut left_cbp = 0;
- let mut left_lim = 0;
- let mut left_dbk = 0;
- let mut mb_pos: usize = row * mb_w;
- for mb_x in 0..mb_w {
- let cur_lim = RV30_LOOP_FILTER_STRENGTH[mbinfo[mb_pos].q as usize];
- let cur_dbk = mbinfo[mb_pos].deblock;
- let cur_cbp = mbinfo[mb_pos].cbp_c;
- let xstart = if mb_x == 0 { 1 } else { 0 };
- for y in 0..4 {
- let yoff = offs[0] + mb_x * 16 + y * 4 * stride[0];
- for x in xstart..4 {
- let cs = x + y*4;
- let loc_lim;
-
- if test_bit!(cur_dbk, cs) {
- loc_lim = cur_lim;
- } else if (x == 0) && test_bit!(left_dbk, cs + 3) {
- loc_lim = left_lim;
- } else if (x != 0) && test_bit!(cur_dbk, cs - 1) {
- loc_lim = cur_lim;
- } else {
- loc_lim = 0;
- }
- if loc_lim != 0 {
- rv30_loop_filter4(dst, yoff + x * 4, 1, stride[0], loc_lim);
- }
- }
- }
-
- for comp in 1..3 {
- for y in 0..2 {
- let coff = offs[comp] + mb_x * 8 + y * 4 * stride[comp];
- for x in xstart..2 {
- let cs = x + y * 2 + (comp - 1) * 4;
- let loc_lim;
-
- if test_bit!(cur_cbp, cs) {
- loc_lim = cur_lim;
- } else if (x == 0) && test_bit!(left_cbp, cs + 1) {
- loc_lim = left_lim;
- } else if (x != 0) && test_bit!(cur_cbp, cs - 1) {
- loc_lim = cur_lim;
- } else {
- loc_lim = 0;
- }
- if loc_lim != 0 {
- rv30_loop_filter4(dst, coff + x * 4, 1, stride[comp], loc_lim);
- }
- }
- }
- }
-
- left_lim = cur_lim;
- left_dbk = cur_dbk;
- left_cbp = cur_cbp;
- mb_pos += 1;
- }
-
- // horizontal filter
- let mut mb_pos: usize = row * mb_w;
- for mb_x in 0..mb_w {
- let cur_lim = RV30_LOOP_FILTER_STRENGTH[mbinfo[mb_pos].q as usize];
- let cur_dbk = mbinfo[mb_pos].deblock;
- let cur_cbp = mbinfo[mb_pos].cbp_c;
- let ystart = if row == 0 { 1 } else { 0 };
- let top_lim;
- let top_dbk;
- let top_cbp;
- if row > 0 {
- top_lim = RV30_LOOP_FILTER_STRENGTH[mbinfo[mb_pos - mb_w].q as usize];
- top_dbk = mbinfo[mb_pos - mb_w].deblock;
- top_cbp = mbinfo[mb_pos - mb_w].cbp_c;
- } else {
- top_lim = 0;
- top_dbk = 0;
- top_cbp = 0;
- }
- for y in ystart..4 {
- let yoff = offs[0] + mb_x * 16 + y * 4 * stride[0];
- for x in 0..4 {
- let cs = x + y*4;
- let loc_lim;
-
- if test_bit!(cur_dbk, cs) {
- loc_lim = cur_lim;
- } else if (y == 0) && test_bit!(top_dbk, cs + 12) {
- loc_lim = top_lim;
- } else if (y != 0) && test_bit!(cur_dbk, cs - 4) {
- loc_lim = cur_lim;
- } else {
- loc_lim = 0;
- }
- if loc_lim != 0 {
- rv30_loop_filter4(dst, yoff + x * 4, stride[0], 1, loc_lim);
- }
- }
- }
-
- for comp in 1..3 {
- for y in ystart..2 {
- let coff = offs[comp] + mb_x * 8 + y * 4 * stride[comp];
- for x in 0..2 {
- let cs = x + y * 2 + (comp - 1) * 4;
- let loc_lim;
-
- if test_bit!(cur_cbp, cs) {
- loc_lim = cur_lim;
- } else if (y == 0) && test_bit!(top_cbp, cs + 2) {
- loc_lim = top_lim;
- } else if (y != 0) && test_bit!(cur_cbp, cs - 2) {
- loc_lim = cur_lim;
- } else {
- loc_lim = 0;
- }
- if loc_lim != 0 {
- rv30_loop_filter4(dst, coff + x * 4, stride[comp], 1, loc_lim);
- }
- }
- }
- }
-
- mb_pos += 1;
- }
- }
- fn do_luma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, mv: MV, use16: bool, avg: bool) {
- let size: usize = if use16 { 16 } else { 8 };
- let dstride = frame.get_stride(0);
- let doffset = frame.get_offset(0) + (if !avg { x + y * dstride } else { 0 });
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
-
- let (w_, h_) = prev_frame.get_dimensions(0);
- let w = (w_ + 15) & !15;
- let h = (h_ + 15) & !15;
-
- let (dx, cx) = rv30_div_mv(mv.x);
- let (dy, cy) = rv30_div_mv(mv.y);
- let mode = cx + cy * 3;
-
- if check_pos(x, y, size, w, h, dx, dy, RV30_EDGE1[cx], RV30_EDGE2[cx], RV30_EDGE1[cy], RV30_EDGE2[cy]) {
- let sstride = prev_frame.get_stride(0);
- let mut soffset = prev_frame.get_offset(0) + x + y * sstride;
- let data = prev_frame.get_data();
- let src: &[u8] = data.as_slice();
- soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize;
- self.luma_mc[if use16 { 0 } else { 1 }][mode](dst, doffset, dstride, src, soffset, sstride);
- } else {
- let mut ebuf: [u8; 32*20] = [0; 32*20];
- edge_emu(prev_frame, (x as isize) + (dx as isize) - 1, (y as isize) + (dy as isize) - 1, 16+3, 16+3, &mut ebuf, 32, 0);
- self.luma_mc[if use16 { 0 } else { 1 }][mode](dst, doffset, dstride, &ebuf, 32 + 1, 32);
- }
- }
- fn do_chroma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, comp: usize, mv: MV, use8: bool, avg: bool) {
- let size: usize = if use8 { 8 } else { 4 };
- let dstride = frame.get_stride(comp);
- let doffset = frame.get_offset(comp) + (if !avg { x + y * dstride } else { 0 });
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
-
- let (w_, h_) = prev_frame.get_dimensions(comp);
- let w = (w_ + 7) & !7;
- let h = (h_ + 7) & !7;
-
- let (dx, cx) = rv30_div_mv(mv.x / 2);
- let (dy, cy) = rv30_div_mv(mv.y / 2);
-
- if check_pos(x, y, size, w, h, dx, dy, 0, 1, 0, 1) {
- let sstride = prev_frame.get_stride(comp);
- let mut soffset = prev_frame.get_offset(comp) + x + y * sstride;
- let data = prev_frame.get_data();
- let src: &[u8] = data.as_slice();
- soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize;
- rv30_chroma_mc(dst, doffset, dstride, src, soffset, sstride, size, cx, cy);
- } else {
- let mut ebuf: [u8; 16*10] = [0; 16*10];
- edge_emu(prev_frame, (x as isize) + (dx as isize), (y as isize) + (dy as isize), 8+1, 8+1, &mut ebuf, 16, comp);
- rv30_chroma_mc(dst, doffset, dstride, &ebuf, 0, 16, size, cx, cy);
- }
- }
-}
diff --git a/src/codecs/real/rv34codes.rs b/src/codecs/real/rv34codes.rs
deleted file mode 100644
index 370f288..0000000
--- a/src/codecs/real/rv34codes.rs
+++ /dev/null
@@ -1,4284 +0,0 @@
-use crate::codecs::DecoderResult;
-use crate::io::bitreader::BitReader;
-use crate::io::codebook::*;
-
-struct CBPSet {
- cbp_pattern: Codebook<u16>,
- cbp: [Codebook<u8>; 4],
-}
-
-struct CoefSet {
- blk_pattern0: Vec<Codebook<u16>>,
- blk_pattern1: Vec<Codebook<u16>>,
- blk_pattern2: Vec<Codebook<u16>>,
-}
-
-struct FullSet {
- cbp: Vec<CBPSet>,
- cset: CoefSet,
- coeffs: Codebook<u16>,
-}
-
-struct RV34CodeReader {
- lengths: Vec<u8>,
- codes: Vec<u32>,
- syms: Vec<u16>,
-}
-
-impl RV34CodeReader {
- fn new(data: &'static [u8]) -> Self {
- let len = data.len();
- let mut lengths: Vec<u8> = Vec::with_capacity(len);
- let mut codes: Vec<u32> = Vec::with_capacity(len);
- let mut syms: Vec<u16> = Vec::with_capacity(len);
- let mut counts: [u32; 17] = [0; 17];
- let mut prefix: [u32; 17] = [0; 17];
- for i in 0..len {
- if data[i] > 0 {
- counts[data[i] as usize] += 1;
- }
- }
- for i in 0..16 {
- prefix[i + 1] = (prefix[i] + counts[i]) << 1;
- }
- for i in 0..len {
- if data[i] == 0 { continue; }
- lengths.push(data[i]);
- let bits = data[i] as usize;
- codes.push(prefix[bits]);
- prefix[bits] += 1;
- syms.push(i as u16);
- }
-
- RV34CodeReader { codes: codes, lengths: lengths, syms: syms }
- }
-}
-
-impl CodebookDescReader<u16> for RV34CodeReader {
- fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] }
- fn sym (&mut self, idx: usize) -> u16 { self.syms[idx] }
- fn len (&mut self) -> usize { self.lengths.len() }
-}
-
-struct RV34CBPCodeReader {
- lengths: Vec<u8>,
- codes: Vec<u32>,
- syms: Vec<u8>,
-}
-
-const RV34_CBP_SYMS: [u8; 16] = [
- 0x00, 0x20, 0x10, 0x30, 0x02, 0x22, 0x12, 0x32,
- 0x01, 0x21, 0x11, 0x31, 0x03, 0x23, 0x13, 0x33
-];
-
-impl RV34CBPCodeReader {
- fn new(data: &'static [u8]) -> Self {
- let len = data.len();
- let mut lengths: Vec<u8> = Vec::with_capacity(len);
- let mut codes: Vec<u32> = Vec::with_capacity(len);
- let mut syms: Vec<u8> = Vec::with_capacity(len);
- let mut counts: [u32; 17] = [0; 17];
- let mut prefix: [u32; 17] = [0; 17];
- for i in 0..len {
- if data[i] > 0 {
- counts[data[i] as usize] += 1;
- }
- }
- for i in 0..16 {
- prefix[i + 1] = (prefix[i] + counts[i]) << 1;
- }
- for i in 0..len {
- if data[i] == 0 { continue; }
- lengths.push(data[i]);
- let bits = data[i] as usize;
- codes.push(prefix[bits]);
- prefix[bits] += 1;
- syms.push(RV34_CBP_SYMS[i]);
- }
-
- RV34CBPCodeReader { codes: codes, lengths: lengths, syms: syms }
- }
-}
-
-impl CodebookDescReader<u8> for RV34CBPCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] }
- fn sym (&mut self, idx: usize) -> u8 { self.syms[idx] }
- fn len (&mut self) -> usize { self.lengths.len() }
-}
-
-impl CBPSet {
- fn new(intra: bool, set: usize, subset: usize) -> Self {
- if intra {
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_CBPPAT[set][subset]);
- let cbp_pat = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CBPCodeReader::new(&RV34_INTRA_CBP[set][subset + 0*2]);
- let cbp0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CBPCodeReader::new(&RV34_INTRA_CBP[set][subset + 1*2]);
- let cbp1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CBPCodeReader::new(&RV34_INTRA_CBP[set][subset + 2*2]);
- let cbp2 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CBPCodeReader::new(&RV34_INTRA_CBP[set][subset + 3*2]);
- let cbp3 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- CBPSet { cbp_pattern: cbp_pat, cbp: [cbp0, cbp1, cbp2, cbp3] }
- } else {
- let mut coderead = RV34CodeReader::new(&RV34_INTER_CBPPAT[set]);
- let cbp_pat = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CBPCodeReader::new(&RV34_INTER_CBP[set][0]);
- let cbp0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CBPCodeReader::new(&RV34_INTER_CBP[set][1]);
- let cbp1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CBPCodeReader::new(&RV34_INTER_CBP[set][2]);
- let cbp2 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CBPCodeReader::new(&RV34_INTER_CBP[set][3]);
- let cbp3 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- CBPSet { cbp_pattern: cbp_pat, cbp: [cbp0, cbp1, cbp2, cbp3] }
- }
- }
-}
-
-impl CoefSet {
- fn new(intra: bool, set: usize) -> Self {
- if intra {
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_FIRSTPAT[set][0]);
- let first0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_FIRSTPAT[set][1]);
- let first1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_FIRSTPAT[set][2]);
- let first2 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_FIRSTPAT[set][3]);
- let first3 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let firsts: Vec<Codebook<u16>> = vec![first0, first1, first2, first3];
-
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_SECONDPAT[set][0]);
- let second0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_SECONDPAT[set][1]);
- let second1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let seconds: Vec<Codebook<u16>> = vec![second0, second1];
-
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_THIRDPAT[set][0]);
- let third0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_THIRDPAT[set][1]);
- let third1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let thirds: Vec<Codebook<u16>> = vec![third0, third1];
-
- CoefSet { blk_pattern0: firsts, blk_pattern1: seconds, blk_pattern2: thirds }
- } else {
- let mut coderead = RV34CodeReader::new(&RV34_INTER_FIRSTPAT[set][0]);
- let first0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CodeReader::new(&RV34_INTER_FIRSTPAT[set][1]);
- let first1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let firsts: Vec<Codebook<u16>> = vec![first0, first1];
-
- let mut coderead = RV34CodeReader::new(&RV34_INTER_SECONDPAT[set][0]);
- let second0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CodeReader::new(&RV34_INTER_SECONDPAT[set][1]);
- let second1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let seconds: Vec<Codebook<u16>> = vec![second0, second1];
-
- let mut coderead = RV34CodeReader::new(&RV34_INTER_THIRDPAT[set][0]);
- let third0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let mut coderead = RV34CodeReader::new(&RV34_INTER_THIRDPAT[set][1]);
- let third1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- let thirds: Vec<Codebook<u16>> = vec![third0, third1];
-
- CoefSet { blk_pattern0: firsts, blk_pattern1: seconds, blk_pattern2: thirds }
- }
- }
-}
-
-impl FullSet {
- fn new(intra: bool, set: usize) -> Self {
- if intra {
- let cbp0 = CBPSet::new(intra, set, 0);
- let cbp1 = CBPSet::new(intra, set, 1);
- let cbp: Vec<CBPSet> = vec![cbp0, cbp1];
- let cset = CoefSet::new(intra, set);
- let mut coderead = RV34CodeReader::new(&RV34_INTRA_COEFFS[set]);
- let coeffs = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- FullSet { cbp: cbp, cset: cset, coeffs: coeffs }
- } else {
- let cbp0 = CBPSet::new(intra, set, 0);
- let cbp: Vec<CBPSet> = vec![cbp0];
- let cset = CoefSet::new(intra, set);
- let mut coderead = RV34CodeReader::new(&RV34_INTER_COEFFS[set]);
- let coeffs = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- FullSet { cbp: cbp, cset: cset, coeffs: coeffs }
- }
- }
-}
-
-fn decode_coeff(br: &mut BitReader, ccodes: &Codebook<u16>, val: u8, esc: u8, quant: u16) -> DecoderResult<i16> {
- if val == 0 { return Ok(0); }
- let mut nval = if val == esc {
- let mut c = br.read_cb(ccodes)? as i16;
- if c > 23 {
- c -= 23;
- c = (1 << c) + (br.read(c as u8)? as i16) + 22;
- }
- c += esc as i16;
- c
- } else {
- val as i16
- };
- if br.read_bool()? { nval = -nval; }
- nval = (((nval as i32) * (quant as i32) + 8) >> 4) as i16;
- Ok(nval)
-}
-
-fn decode_subblock3(br: &mut BitReader, ccodes: &Codebook<u16>, idx: usize, q2: u16, q3: u16, q4: u16, coeffs: &mut [i16]) -> DecoderResult<()> {
- let flags = RV34_MODULO_THREE_TABLE[idx];
- coeffs[0*4 + 0] = decode_coeff(br, ccodes, (flags >> 6) & 3, 3, q2)?;
- coeffs[0*4 + 1] = decode_coeff(br, ccodes, (flags >> 4) & 3, 2, q3)?;
- coeffs[1*4 + 0] = decode_coeff(br, ccodes, (flags >> 2) & 3, 2, q3)?;
- coeffs[1*4 + 1] = decode_coeff(br, ccodes, (flags >> 0) & 3, 2, q4)?;
- Ok(())
-}
-fn decode_subblock1(br: &mut BitReader, ccodes: &Codebook<u16>, idx: usize, q2: u16, coeffs: &mut [i16]) -> DecoderResult<()> {
- let val = RV34_MODULO_THREE_TABLE[idx] >> 6;
- coeffs[0] = decode_coeff(br, ccodes, val, 3, q2)?;
- Ok(())
-}
-fn decode_subblock(br: &mut BitReader, ccodes: &Codebook<u16>, idx: usize, invert: bool, q4: u16, coeffs: &mut [i16]) -> DecoderResult<()> {
- let flags = RV34_MODULO_THREE_TABLE[idx];
- coeffs[0*4 + 0] = decode_coeff(br, ccodes, (flags >> 6) & 3, 3, q4)?;
- if !invert {
- coeffs[0*4 + 1] = decode_coeff(br, ccodes, (flags >> 4) & 3, 2, q4)?;
- coeffs[1*4 + 0] = decode_coeff(br, ccodes, (flags >> 2) & 3, 2, q4)?;
- } else {
- coeffs[1*4 + 0] = decode_coeff(br, ccodes, (flags >> 4) & 3, 2, q4)?;
- coeffs[0*4 + 1] = decode_coeff(br, ccodes, (flags >> 2) & 3, 2, q4)?;
- }
- coeffs[1*4 + 1] = decode_coeff(br, ccodes, (flags >> 0) & 3, 2, q4)?;
- Ok(())
-}
-
-#[allow(dead_code)]
-pub struct RV34Codes {
- intra_set: Vec<FullSet>,
- inter_set: Vec<FullSet>,
- is_intra: bool,
- is_16: bool,
- set_idx: usize,
- subset_idx: usize,
-}
-
-impl RV34Codes {
- pub fn new() -> Self {
- let mut iset: Vec<FullSet> = Vec::with_capacity(5);
- for set in 0..5 { iset.push(FullSet::new(true, set)); }
- let mut pset: Vec<FullSet> = Vec::with_capacity(7);
- for set in 0..7 { pset.push(FullSet::new(false, set)); }
- RV34Codes {
- is_intra: false, is_16: false, set_idx: 0, subset_idx: 0,
- intra_set: iset, inter_set: pset,
- }
- }
- pub fn select_codes(&mut self, is_intra: bool, quant: u8, subset: usize, is_16: bool) {
- let mut idx = quant as usize;
- if (subset == 2) && (idx < 19) { idx += 10; }
- else if (subset != 0) && (idx < 26) { idx += 5; }
- if idx > 30 { idx = 30; }
-
- if is_intra {
- self.set_idx = RV34_SET_IDX_INTRA[idx];
- } else {
- self.set_idx = RV34_SET_IDX_INTER[idx];
- }
- self.is_intra = is_intra || is_16;
- self.is_16 = is_16;
- self.subset_idx = subset;
- }
- pub fn decode_cbp(&mut self, br: &mut BitReader) -> DecoderResult<u32> {
- let codeset = if self.is_intra {
- &self.intra_set[self.set_idx].cbp[self.is_16 as usize]
- } else {
- &self.inter_set[self.set_idx].cbp[0]
- };
- let code = br.read_cb(&codeset.cbp_pattern)?;
- let pattern = code & 0xF;
- let mmode = (code >> 4) as usize;
- let mut cbp: u32 = 0;
-
- let ones = RV34_ONES_COUNT[pattern as usize];
-
- for i in 0..4 {
- if ((pattern >> (3 - i)) & 1) != 0 {
- let code = br.read_cb(&codeset.cbp[ones])? as u32;
- cbp |= code << RV34_CBP_SHIFTS[i];
- }
- }
-
- for i in 0..4 {
- let t = (RV34_MODULO_THREE_TABLE[mmode] >> (6 - 2*i)) & 3;
- if t == 1 { cbp |= RV34_CBP_MASKS[br.read(1)? as usize] << i; }
- if t == 2 { cbp |= RV34_CBP_MASKS[2] << i; }
- }
-
- Ok(cbp)
- }
- pub fn decode_block(&mut self, br: &mut BitReader, coeffs: &mut [i16], idx0: usize, idx1: usize, q2: u16, q3: u16, q4: u16) -> DecoderResult<bool> {
- let codeset = if self.is_intra {
- &self.intra_set[self.set_idx].cset
- } else {
- &self.inter_set[self.set_idx].cset
- };
- let ccodes = if self.is_intra {
- &self.intra_set[self.set_idx].coeffs
- } else {
- &self.inter_set[self.set_idx].coeffs
- };
- let blkcp = br.read_cb(&codeset.blk_pattern0[idx0])?;
- let coded = blkcp & 0x7;
- let idx = (blkcp >> 3) as usize;
- let mut has_ac = true;
-
- if (RV34_MODULO_THREE_TABLE[idx] & 0x3F) != 0 {
- decode_subblock3(br, ccodes, idx, q2, q3, q4, coeffs)?;
- } else {
- decode_subblock1(br, ccodes, idx, q2, coeffs)?;
- if coded == 0 {
- return Ok(false);
- }
- has_ac = false;
- }
-
- if (coded & 4) != 0 {
- let idx = br.read_cb(&codeset.blk_pattern1[idx1])? as usize;
- decode_subblock(br, ccodes, idx, false, q4, &mut coeffs[2..])?;
- }
- if (coded & 2) != 0 {
- let idx = br.read_cb(&codeset.blk_pattern1[idx1])? as usize;
- decode_subblock(br, ccodes, idx, true, q4, &mut coeffs[8..])?;
- }
- if (coded & 1) != 0 {
- let idx = br.read_cb(&codeset.blk_pattern2[idx1])? as usize;
- decode_subblock(br, ccodes, idx, false, q4, &mut coeffs[10..])?;
- }
-
- Ok(has_ac || (coded != 0))
- }
-}
-
-const RV34_SET_IDX_INTRA: [usize; 31] = [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0
-];
-const RV34_SET_IDX_INTER: [usize; 31] = [
- 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3,
- 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6
-];
-
-const RV34_ONES_COUNT: [usize; 16] = [ 0, 0, 0, 1, 0, 1, 1, 2, 0, 1, 1, 2, 1, 2, 2, 3 ];
-const RV34_CBP_SHIFTS: [u32; 4] = [ 0, 2, 8, 10 ];
-const RV34_CBP_MASKS: [u32; 3] = [ 0x100000, 0x010000, 0x110000 ];
-
-const RV34_MODULO_THREE_TABLE: [u8; 108] = [
- 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0A,
- 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1A,
- 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2A,
-
- 0x40, 0x41, 0x42, 0x44, 0x45, 0x46, 0x48, 0x49, 0x4A,
- 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x58, 0x59, 0x5A,
- 0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x68, 0x69, 0x6A,
-
- 0x80, 0x81, 0x82, 0x84, 0x85, 0x86, 0x88, 0x89, 0x8A,
- 0x90, 0x91, 0x92, 0x94, 0x95, 0x96, 0x98, 0x99, 0x9A,
- 0xA0, 0xA1, 0xA2, 0xA4, 0xA5, 0xA6, 0xA8, 0xA9, 0xAA,
-
- 0xC0, 0xC1, 0xC2, 0xC4, 0xC5, 0xC6, 0xC8, 0xC9, 0xCA,
- 0xD0, 0xD1, 0xD2, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA,
- 0xE0, 0xE1, 0xE2, 0xE4, 0xE5, 0xE6, 0xE8, 0xE9, 0xEA,
-];
-
-const RV34_INTRA_CBPPAT: &'static [[[u8; 1296]; 2]; 5] = &[
- [
- [
- 8, 10, 10, 10, 10, 10, 11, 10, 10, 11, 10, 10, 10, 10, 10, 6,
- 12, 12, 13, 12, 13, 12, 13, 11, 13, 13, 13, 12, 13, 12, 12, 8,
- 14, 13, 16, 13, 15, 13, 16, 12, 16, 16, 16, 14, 16, 13, 14, 10,
- 12, 13, 12, 12, 13, 13, 13, 12, 13, 13, 12, 12, 13, 12, 12, 8,
- 13, 14, 14, 12, 14, 14, 14, 12, 14, 15, 14, 12, 14, 13, 13, 8,
- 16, 16, 16, 12, 16, 16, 16, 13, 16, 16, 16, 13, 16, 14, 14, 9,
- 14, 16, 13, 13, 16, 16, 16, 14, 15, 16, 14, 13, 15, 15, 14, 10,
- 16, 16, 14, 13, 16, 16, 16, 13, 16, 16, 16, 13, 16, 15, 14, 10,
- 16, 16, 16, 11, 16, 16, 16, 12, 16, 16, 16, 12, 16, 16, 15, 9,
- 12, 13, 13, 13, 12, 12, 14, 12, 12, 14, 13, 12, 12, 12, 12, 8,
- 14, 14, 16, 14, 13, 12, 14, 12, 14, 15, 14, 13, 13, 12, 13, 8,
- 16, 16, 16, 15, 16, 13, 16, 13, 16, 16, 16, 15, 16, 13, 15, 10,
- 14, 16, 14, 14, 14, 14, 15, 13, 14, 16, 14, 13, 13, 13, 13, 9,
- 16, 16, 16, 14, 16, 14, 16, 12, 16, 16, 14, 13, 14, 13, 13, 8,
- 16, 16, 16, 14, 16, 14, 16, 13, 16, 16, 16, 14, 16, 14, 14, 9,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 14, 10,
- 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 16, 14, 16, 15, 14, 9,
- 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 16, 13, 16, 15, 15, 8,
- 14, 16, 16, 16, 14, 14, 16, 14, 16, 16, 16, 15, 13, 13, 14, 10,
- 16, 16, 16, 16, 15, 13, 16, 13, 16, 16, 16, 16, 16, 13, 14, 10,
- 16, 16, 16, 16, 16, 11, 16, 12, 16, 16, 16, 16, 16, 12, 16, 9,
- 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 14, 14, 10,
- 16, 16, 16, 16, 16, 15, 16, 13, 16, 16, 16, 15, 16, 13, 14, 9,
- 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 16, 16, 13, 14, 8,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 11,
- 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14, 9,
- 16, 16, 16, 14, 16, 15, 16, 11, 16, 16, 16, 14, 16, 14, 14, 8,
- 12, 13, 13, 13, 13, 13, 14, 12, 12, 13, 12, 12, 12, 12, 12, 8,
- 14, 14, 16, 14, 15, 14, 16, 13, 14, 15, 14, 13, 14, 13, 13, 9,
- 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 16, 14, 16, 14, 16, 10,
- 14, 15, 14, 14, 15, 14, 15, 13, 14, 14, 13, 12, 13, 13, 13, 9,
- 15, 16, 15, 14, 16, 16, 16, 13, 15, 16, 14, 12, 14, 13, 13, 8,
- 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 16, 13, 16, 14, 14, 9,
- 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 13, 13, 16, 16, 14, 10,
- 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 15, 13, 16, 14, 14, 9,
- 16, 16, 16, 12, 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 15, 8,
- 13, 14, 14, 14, 14, 14, 16, 13, 13, 14, 14, 13, 12, 12, 12, 8,
- 16, 16, 16, 14, 15, 14, 16, 13, 15, 16, 14, 13, 13, 12, 13, 8,
- 16, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 14, 16, 13, 14, 9,
- 15, 16, 16, 15, 16, 15, 16, 13, 14, 16, 14, 13, 13, 13, 12, 8,
- 16, 16, 16, 14, 16, 14, 15, 12, 15, 15, 14, 12, 13, 12, 12, 7,
- 16, 16, 16, 14, 16, 14, 16, 12, 16, 16, 16, 13, 16, 13, 13, 7,
- 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 14, 14, 16, 14, 13, 9,
- 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 14, 12, 16, 13, 12, 7,
- 16, 16, 16, 12, 16, 16, 16, 11, 16, 16, 15, 12, 16, 13, 13, 6,
- 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 15, 13, 13, 14, 10,
- 16, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 14, 13, 14, 9,
- 16, 16, 16, 16, 16, 13, 16, 13, 16, 16, 16, 16, 16, 12, 14, 8,
- 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 14, 13, 13, 9,
- 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 13, 14, 12, 12, 7,
- 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 13, 14, 12, 13, 6,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 14, 9,
- 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 13, 15, 13, 12, 7,
- 16, 16, 16, 13, 16, 14, 16, 11, 16, 16, 16, 12, 16, 12, 12, 5,
- 14, 16, 15, 16, 16, 16, 16, 15, 14, 15, 14, 14, 13, 14, 13, 10,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 14, 16, 10,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11,
- 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 14, 14, 15, 14, 13, 10,
- 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 14, 13, 16, 14, 14, 9,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 15, 9,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, 13, 16, 16, 13, 10,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 16, 16, 13, 9,
- 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 15, 12, 16, 16, 14, 8,
- 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 15, 14, 13, 13, 13, 9,
- 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 14, 13, 13, 9,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 15, 9,
- 16, 16, 16, 16, 16, 16, 16, 15, 15, 16, 14, 14, 14, 13, 13, 9,
- 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 14, 12, 13, 12, 12, 7,
- 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 13, 16, 13, 13, 7,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 16, 14, 13, 9,
- 16, 16, 16, 15, 16, 16, 16, 13, 16, 16, 13, 12, 14, 13, 12, 6,
- 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 14, 10, 15, 12, 12, 5,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, 13, 13, 9,
- 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 15, 13, 12, 13, 8,
- 16, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 15, 12, 14, 8,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 13, 13, 13, 8,
- 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 15, 13, 12, 11, 12, 6,
- 16, 16, 16, 15, 16, 14, 16, 12, 16, 16, 16, 12, 13, 10, 12, 5,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 13, 14, 12, 8,
- 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 13, 12, 13, 12, 10, 5,
- 16, 16, 16, 13, 16, 13, 16, 10, 16, 16, 13, 10, 13, 10, 10, 1,
- ], [
- 2, 7, 7, 8, 7, 8, 9, 8, 7, 9, 8, 8, 8, 8, 9, 7,
- 6, 9, 10, 10, 10, 10, 11, 10, 10, 11, 11, 11, 10, 11, 11, 9,
- 9, 11, 12, 12, 12, 13, 14, 13, 13, 14, 14, 13, 13, 13, 14, 11,
- 6, 10, 9, 10, 10, 11, 11, 11, 10, 11, 10, 11, 11, 11, 11, 9,
- 6, 9, 10, 10, 10, 11, 12, 11, 10, 12, 11, 11, 11, 11, 11, 8,
- 9, 11, 12, 12, 12, 13, 13, 13, 12, 14, 14, 13, 13, 13, 13, 10,
- 9, 13, 11, 13, 13, 14, 14, 13, 13, 14, 13, 13, 14, 14, 14, 12,
- 9, 12, 12, 12, 12, 14, 14, 13, 13, 14, 13, 13, 13, 14, 13, 11,
- 8, 12, 12, 11, 12, 14, 14, 12, 13, 14, 14, 13, 13, 13, 14, 11,
- 6, 10, 10, 11, 9, 10, 12, 11, 10, 12, 11, 11, 10, 11, 11, 9,
- 7, 10, 10, 11, 10, 11, 12, 11, 11, 12, 11, 11, 11, 11, 11, 9,
- 9, 12, 13, 13, 12, 12, 14, 13, 13, 14, 14, 13, 14, 13, 14, 11,
- 8, 11, 11, 12, 11, 12, 12, 12, 11, 13, 12, 12, 12, 12, 12, 10,
- 7, 10, 10, 11, 10, 11, 12, 11, 10, 12, 11, 11, 11, 11, 11, 8,
- 9, 11, 12, 12, 12, 12, 13, 12, 12, 13, 13, 12, 13, 12, 13, 10,
- 10, 13, 13, 14, 14, 14, 15, 14, 14, 15, 14, 15, 14, 14, 14, 12,
- 9, 12, 12, 13, 12, 13, 14, 13, 12, 13, 13, 12, 13, 13, 13, 10,
- 9, 12, 12, 12, 12, 13, 14, 12, 12, 14, 13, 12, 13, 13, 13, 10,
- 9, 12, 13, 13, 11, 13, 14, 13, 13, 14, 14, 14, 12, 13, 13, 11,
- 10, 12, 13, 13, 12, 12, 14, 13, 13, 14, 14, 14, 13, 13, 14, 11,
- 10, 13, 14, 14, 13, 12, 15, 13, 14, 14, 14, 14, 15, 13, 14, 11,
- 11, 14, 14, 14, 13, 14, 15, 14, 14, 15, 15, 14, 13, 14, 14, 12,
- 10, 13, 12, 13, 12, 12, 14, 13, 13, 14, 13, 13, 13, 13, 13, 10,
- 10, 12, 13, 13, 13, 12, 14, 12, 13, 14, 14, 13, 13, 13, 13, 10,
- 13, 15, 16, 16, 15, 15, 16, 16, 15, 16, 15, 16, 16, 16, 16, 14,
- 11, 14, 14, 14, 14, 14, 15, 14, 14, 15, 15, 14, 14, 14, 15, 11,
- 10, 13, 13, 13, 13, 13, 14, 12, 13, 14, 14, 13, 13, 13, 13, 10,
- 6, 10, 10, 11, 10, 11, 12, 11, 10, 12, 10, 11, 10, 11, 11, 9,
- 8, 11, 11, 12, 11, 12, 13, 12, 11, 12, 12, 12, 12, 12, 12, 10,
- 11, 13, 14, 14, 13, 14, 15, 14, 13, 15, 15, 14, 14, 14, 15, 12,
- 7, 11, 10, 12, 11, 12, 12, 12, 11, 12, 11, 12, 11, 12, 12, 10,
- 7, 10, 10, 11, 10, 11, 12, 11, 11, 12, 11, 11, 11, 11, 11, 9,
- 10, 12, 13, 13, 12, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 10,
- 10, 13, 12, 14, 13, 14, 14, 14, 13, 14, 12, 14, 15, 14, 14, 11,
- 10, 12, 12, 12, 12, 13, 14, 13, 13, 14, 13, 12, 13, 13, 13, 10,
- 9, 12, 13, 13, 13, 14, 14, 13, 13, 14, 14, 13, 13, 13, 13, 10,
- 7, 10, 10, 11, 10, 11, 12, 11, 10, 12, 12, 11, 9, 11, 11, 9,
- 7, 10, 11, 11, 10, 11, 12, 11, 10, 12, 12, 11, 11, 11, 11, 9,
- 10, 12, 13, 13, 13, 13, 15, 13, 13, 14, 13, 13, 13, 13, 13, 10,
- 8, 11, 11, 11, 11, 11, 12, 11, 11, 12, 12, 11, 11, 12, 11, 9,
- 6, 9, 9, 10, 9, 10, 10, 10, 9, 11, 10, 10, 9, 10, 10, 7,
- 8, 10, 11, 11, 11, 11, 12, 11, 11, 12, 12, 11, 11, 11, 11, 8,
- 10, 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 13, 13, 13, 13, 11,
- 8, 11, 11, 11, 11, 12, 12, 11, 11, 12, 11, 11, 11, 11, 11, 8,
- 8, 11, 11, 11, 11, 12, 12, 10, 11, 12, 12, 11, 11, 11, 11, 8,
- 10, 13, 13, 13, 12, 13, 14, 13, 12, 14, 14, 14, 10, 13, 13, 11,
- 10, 12, 12, 13, 12, 13, 14, 12, 12, 13, 13, 13, 12, 12, 13, 10,
- 11, 13, 14, 14, 13, 13, 14, 13, 13, 15, 14, 13, 13, 13, 13, 10,
- 10, 12, 13, 13, 12, 13, 14, 13, 13, 14, 14, 13, 12, 13, 13, 11,
- 8, 11, 11, 11, 11, 11, 12, 11, 11, 12, 12, 11, 11, 11, 11, 8,
- 9, 11, 12, 12, 11, 11, 12, 11, 12, 12, 12, 11, 12, 11, 11, 8,
- 12, 15, 14, 14, 14, 15, 15, 14, 14, 15, 15, 14, 14, 14, 15, 12,
- 10, 12, 12, 12, 12, 12, 13, 12, 12, 13, 13, 12, 12, 12, 12, 9,
- 9, 11, 11, 11, 11, 11, 12, 10, 11, 12, 12, 11, 11, 11, 11, 7,
- 10, 13, 13, 13, 13, 14, 15, 14, 13, 14, 14, 14, 12, 14, 15, 12,
- 11, 14, 14, 14, 14, 15, 15, 14, 14, 15, 15, 15, 14, 15, 15, 12,
- 13, 16, 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 14,
- 10, 13, 13, 14, 13, 15, 14, 14, 13, 15, 13, 14, 14, 14, 14, 12,
- 10, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 13, 13, 14, 11,
- 12, 14, 14, 14, 14, 15, 15, 14, 14, 15, 15, 14, 15, 14, 14, 12,
- 11, 14, 14, 15, 14, 15, 15, 14, 14, 15, 12, 14, 15, 16, 15, 12,
- 11, 13, 13, 14, 13, 14, 14, 14, 14, 14, 13, 13, 14, 14, 14, 11,
- 11, 14, 14, 14, 14, 15, 15, 14, 14, 16, 14, 13, 14, 14, 14, 11,
- 10, 13, 13, 13, 12, 14, 14, 14, 12, 15, 14, 14, 11, 13, 13, 12,
- 10, 12, 13, 14, 12, 13, 14, 13, 13, 14, 14, 13, 12, 13, 13, 11,
- 12, 14, 14, 15, 14, 15, 16, 15, 15, 15, 15, 15, 14, 14, 15, 12,
- 10, 13, 13, 13, 12, 13, 14, 13, 13, 14, 13, 13, 12, 13, 13, 11,
- 9, 11, 11, 12, 11, 12, 12, 11, 11, 12, 12, 11, 11, 11, 11, 9,
- 10, 12, 12, 12, 12, 12, 13, 12, 12, 13, 13, 12, 13, 12, 12, 9,
- 11, 13, 13, 15, 14, 14, 15, 14, 14, 15, 14, 14, 14, 14, 14, 11,
- 10, 12, 12, 12, 12, 12, 13, 12, 12, 13, 11, 11, 12, 12, 12, 8,
- 9, 12, 12, 11, 12, 12, 13, 11, 12, 12, 12, 11, 12, 11, 11, 8,
- 10, 13, 13, 14, 12, 14, 15, 14, 13, 15, 15, 14, 10, 13, 13, 11,
- 11, 13, 14, 13, 13, 14, 14, 13, 13, 14, 14, 14, 11, 13, 13, 11,
- 12, 14, 14, 14, 14, 14, 15, 14, 15, 16, 15, 14, 13, 13, 14, 11,
- 11, 14, 13, 14, 13, 14, 15, 14, 13, 15, 14, 14, 11, 13, 13, 11,
- 9, 12, 12, 12, 11, 12, 13, 11, 12, 13, 12, 11, 10, 11, 11, 8,
- 10, 12, 12, 12, 12, 12, 13, 11, 12, 12, 12, 11, 11, 11, 11, 8,
- 12, 15, 14, 15, 14, 15, 16, 15, 15, 15, 15, 14, 14, 14, 14, 12,
- 10, 12, 12, 12, 12, 12, 13, 11, 12, 13, 12, 11, 11, 11, 11, 8,
- 8, 10, 10, 10, 10, 10, 11, 9, 10, 11, 10, 9, 10, 9, 9, 5,
- ],
- ], [
- [
- 12, 12, 11, 9, 11, 10, 11, 9, 11, 11, 10, 9, 9, 8, 9, 5,
- 14, 13, 14, 11, 14, 11, 13, 10, 14, 13, 12, 10, 12, 10, 11, 6,
- 16, 13, 16, 12, 16, 12, 16, 11, 16, 14, 16, 12, 15, 12, 13, 8,
- 14, 14, 12, 11, 14, 12, 13, 10, 13, 13, 11, 10, 12, 11, 10, 6,
- 16, 15, 14, 11, 16, 13, 14, 10, 15, 14, 13, 10, 13, 11, 11, 7,
- 16, 16, 16, 11, 16, 14, 16, 11, 16, 16, 15, 12, 15, 13, 13, 8,
- 16, 16, 13, 12, 16, 16, 15, 12, 16, 16, 12, 11, 15, 13, 12, 8,
- 16, 16, 14, 11, 16, 16, 16, 11, 16, 16, 14, 11, 15, 14, 13, 8,
- 16, 16, 15, 10, 16, 16, 16, 10, 16, 16, 15, 11, 16, 14, 14, 8,
- 14, 14, 14, 12, 13, 11, 13, 10, 13, 13, 12, 11, 11, 10, 10, 6,
- 16, 15, 16, 13, 13, 11, 14, 11, 15, 14, 13, 11, 12, 10, 11, 7,
- 16, 15, 16, 14, 16, 11, 16, 11, 16, 16, 16, 13, 16, 12, 13, 8,
- 16, 16, 14, 13, 15, 13, 14, 11, 14, 15, 13, 11, 13, 11, 11, 7,
- 16, 16, 15, 13, 15, 13, 14, 11, 16, 15, 14, 11, 13, 11, 11, 7,
- 16, 16, 16, 13, 16, 13, 16, 11, 16, 16, 16, 12, 16, 12, 13, 8,
- 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 14, 13, 15, 14, 13, 9,
- 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 14, 12, 15, 13, 13, 8,
- 16, 16, 16, 12, 16, 16, 16, 11, 16, 16, 15, 12, 16, 13, 13, 7,
- 16, 16, 16, 16, 13, 12, 16, 12, 16, 16, 14, 13, 12, 11, 12, 8,
- 16, 16, 16, 15, 14, 11, 16, 11, 16, 16, 16, 13, 14, 11, 13, 8,
- 16, 16, 16, 16, 15, 10, 16, 11, 16, 16, 16, 14, 15, 11, 13, 8,
- 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 14, 14, 14, 12, 13, 9,
- 16, 16, 16, 15, 16, 13, 16, 12, 16, 16, 16, 13, 14, 12, 13, 8,
- 16, 16, 16, 14, 16, 12, 16, 11, 16, 16, 16, 13, 15, 12, 13, 7,
- 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 15, 16, 14, 13, 9,
- 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 14, 16, 13, 13, 8,
- 16, 16, 16, 14, 16, 14, 16, 10, 16, 16, 16, 13, 16, 13, 13, 7,
- 14, 14, 13, 12, 13, 12, 13, 11, 12, 13, 11, 10, 11, 10, 10, 6,
- 16, 16, 15, 13, 16, 13, 15, 11, 14, 14, 13, 11, 13, 11, 11, 7,
- 16, 16, 16, 14, 16, 14, 16, 12, 16, 16, 16, 13, 16, 13, 14, 9,
- 16, 16, 13, 13, 15, 14, 14, 11, 13, 14, 11, 11, 12, 11, 11, 7,
- 16, 16, 15, 12, 16, 14, 15, 11, 14, 14, 12, 11, 13, 11, 11, 7,
- 16, 16, 16, 13, 16, 14, 16, 12, 16, 16, 14, 12, 16, 13, 13, 8,
- 16, 16, 14, 14, 16, 16, 16, 13, 16, 16, 12, 11, 15, 13, 12, 8,
- 16, 16, 15, 13, 16, 16, 16, 12, 16, 16, 13, 11, 16, 13, 12, 8,
- 16, 16, 16, 11, 16, 16, 16, 11, 16, 16, 14, 11, 16, 14, 13, 7,
- 16, 16, 15, 13, 14, 13, 14, 11, 14, 14, 12, 11, 11, 10, 11, 7,
- 16, 16, 16, 13, 14, 12, 15, 11, 15, 14, 13, 11, 12, 11, 11, 7,
- 16, 16, 16, 14, 16, 13, 16, 12, 16, 16, 16, 13, 14, 12, 13, 8,
- 16, 16, 15, 13, 15, 14, 14, 12, 14, 14, 12, 11, 12, 11, 11, 7,
- 16, 16, 14, 12, 15, 13, 14, 11, 15, 14, 13, 11, 12, 11, 11, 6,
- 16, 16, 16, 13, 16, 13, 16, 11, 16, 15, 14, 11, 14, 11, 12, 6,
- 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 13, 12, 14, 13, 12, 8,
- 16, 16, 15, 13, 16, 14, 15, 11, 16, 16, 13, 11, 14, 12, 11, 6,
- 16, 16, 16, 12, 16, 14, 15, 11, 16, 16, 13, 10, 14, 12, 12, 6,
- 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 14, 13, 12, 11, 12, 8,
- 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 15, 13, 13, 11, 12, 8,
- 16, 16, 16, 15, 16, 12, 16, 12, 16, 16, 16, 14, 14, 11, 13, 7,
- 16, 16, 16, 16, 16, 15, 16, 13, 16, 16, 14, 13, 13, 12, 12, 8,
- 16, 16, 16, 14, 15, 13, 15, 11, 16, 15, 14, 12, 13, 11, 11, 6,
- 16, 16, 16, 14, 16, 12, 15, 11, 16, 16, 15, 12, 14, 11, 12, 6,
- 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 15, 13, 14, 13, 12, 8,
- 16, 16, 16, 14, 16, 14, 16, 12, 16, 16, 14, 12, 13, 12, 11, 6,
- 16, 16, 16, 13, 16, 13, 15, 10, 16, 16, 14, 11, 14, 11, 11, 5,
- 16, 16, 15, 14, 16, 16, 16, 13, 14, 14, 12, 12, 12, 12, 12, 8,
- 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 14, 13, 14, 13, 13, 9,
- 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 16, 13, 15, 9,
- 16, 16, 14, 15, 16, 16, 16, 14, 14, 16, 12, 12, 13, 13, 12, 8,
- 16, 16, 16, 14, 16, 16, 16, 13, 16, 15, 13, 12, 14, 12, 12, 8,
- 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 14, 12, 16, 13, 13, 8,
- 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 11, 11, 15, 14, 12, 8,
- 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 12, 11, 15, 13, 12, 8,
- 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 13, 10, 16, 13, 12, 7,
- 16, 16, 16, 16, 16, 15, 16, 13, 14, 16, 13, 13, 12, 12, 12, 8,
- 16, 16, 16, 15, 16, 14, 16, 13, 16, 16, 14, 13, 13, 12, 12, 8,
- 16, 16, 16, 16, 16, 15, 16, 13, 16, 16, 16, 13, 15, 12, 14, 8,
- 16, 16, 16, 15, 16, 16, 16, 13, 14, 16, 13, 12, 12, 12, 11, 8,
- 16, 16, 16, 14, 16, 14, 16, 12, 14, 14, 13, 11, 13, 11, 11, 6,
- 16, 16, 16, 14, 16, 14, 16, 12, 16, 15, 14, 11, 14, 11, 12, 6,
- 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 12, 12, 14, 13, 11, 8,
- 16, 16, 15, 14, 16, 16, 16, 12, 16, 15, 12, 11, 13, 12, 11, 6,
- 16, 16, 16, 13, 16, 14, 16, 11, 16, 14, 13, 10, 14, 11, 11, 5,
- 16, 16, 16, 16, 16, 16, 16, 14, 14, 16, 15, 13, 11, 11, 11, 8,
- 16, 16, 16, 16, 16, 15, 16, 13, 16, 16, 16, 13, 12, 11, 12, 7,
- 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 13, 13, 11, 13, 7,
- 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 14, 13, 12, 12, 11, 7,
- 16, 16, 16, 15, 16, 14, 15, 12, 16, 14, 13, 12, 12, 11, 11, 6,
- 16, 16, 16, 14, 16, 13, 15, 11, 16, 14, 14, 11, 13, 10, 11, 5,
- 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 13, 12, 12, 12, 11, 7,
- 16, 16, 16, 14, 16, 14, 15, 12, 16, 15, 12, 11, 12, 11, 10, 5,
- 16, 16, 16, 13, 16, 13, 14, 10, 16, 14, 12, 9, 12, 10, 9, 3,
- ], [
- 2, 6, 6, 7, 6, 7, 8, 7, 7, 8, 7, 8, 7, 8, 8, 5,
- 5, 8, 9, 9, 9, 9, 12, 10, 10, 11, 10, 10, 10, 11, 11, 8,
- 9, 10, 13, 12, 13, 12, 15, 13, 13, 14, 13, 14, 13, 13, 14, 11,
- 5, 10, 9, 10, 10, 10, 12, 10, 10, 12, 10, 11, 11, 11, 11, 8,
- 6, 9, 10, 9, 10, 11, 12, 10, 10, 12, 11, 11, 10, 11, 11, 8,
- 9, 11, 12, 11, 12, 13, 14, 12, 13, 14, 14, 12, 13, 13, 13, 11,
- 10, 13, 11, 12, 14, 14, 15, 13, 13, 15, 12, 13, 14, 14, 14, 12,
- 9, 12, 12, 12, 13, 13, 15, 13, 13, 14, 13, 13, 14, 13, 15, 11,
- 8, 11, 12, 10, 12, 13, 14, 12, 13, 14, 14, 13, 13, 13, 14, 11,
- 5, 9, 10, 10, 9, 10, 12, 11, 10, 12, 11, 11, 9, 11, 11, 9,
- 6, 10, 10, 11, 10, 10, 12, 11, 11, 12, 11, 11, 11, 11, 11, 9,
- 9, 11, 13, 13, 12, 11, 14, 12, 13, 15, 13, 13, 14, 13, 14, 11,
- 8, 11, 11, 12, 11, 12, 13, 12, 12, 13, 12, 13, 12, 12, 12, 10,
- 7, 10, 10, 11, 10, 11, 12, 11, 11, 12, 11, 11, 11, 11, 12, 9,
- 9, 12, 12, 12, 12, 12, 14, 12, 13, 14, 13, 13, 13, 13, 13, 11,
- 11, 14, 13, 15, 15, 16, 16, 15, 15, 16, 15, 15, 16, 16, 15, 13,
- 10, 12, 13, 13, 13, 14, 15, 13, 13, 14, 13, 13, 14, 14, 14, 11,
- 9, 12, 12, 12, 13, 13, 14, 12, 13, 14, 14, 13, 13, 13, 14, 11,
- 9, 13, 13, 13, 11, 12, 15, 13, 13, 15, 14, 14, 11, 13, 14, 11,
- 10, 13, 13, 13, 12, 12, 15, 13, 13, 15, 14, 14, 13, 13, 14, 11,
- 10, 12, 13, 13, 12, 11, 14, 12, 13, 15, 13, 13, 13, 13, 14, 11,
- 11, 14, 15, 15, 13, 14, 16, 14, 14, 16, 16, 14, 14, 15, 15, 13,
- 10, 13, 13, 13, 12, 13, 14, 13, 13, 14, 14, 14, 13, 13, 14, 11,
- 10, 12, 13, 13, 13, 12, 14, 13, 13, 14, 14, 13, 13, 13, 13, 11,
- 13, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15,
- 12, 15, 15, 15, 14, 15, 16, 14, 15, 16, 16, 15, 16, 15, 15, 13,
- 10, 12, 12, 12, 13, 13, 14, 12, 13, 14, 13, 13, 13, 13, 13, 11,
- 6, 10, 10, 11, 10, 11, 12, 11, 10, 12, 11, 11, 10, 11, 11, 9,
- 8, 11, 12, 12, 12, 12, 13, 12, 12, 13, 12, 13, 12, 13, 13, 10,
- 11, 13, 15, 14, 15, 14, 16, 14, 15, 16, 16, 14, 15, 15, 15, 13,
- 7, 11, 10, 12, 11, 11, 13, 11, 11, 13, 10, 11, 12, 12, 12, 10,
- 7, 11, 11, 11, 11, 11, 13, 11, 11, 13, 11, 12, 12, 12, 12, 9,
- 10, 12, 13, 13, 13, 13, 15, 13, 14, 15, 14, 14, 14, 14, 15, 11,
- 10, 13, 12, 14, 14, 14, 15, 13, 13, 15, 12, 13, 15, 15, 14, 12,
- 10, 13, 12, 12, 13, 13, 15, 14, 13, 15, 13, 13, 14, 14, 14, 11,
- 10, 13, 13, 12, 13, 14, 15, 13, 13, 15, 13, 13, 14, 14, 14, 11,
- 7, 10, 11, 11, 10, 11, 12, 11, 10, 12, 12, 12, 9, 11, 12, 9,
- 7, 11, 11, 11, 11, 11, 13, 11, 11, 13, 12, 12, 11, 12, 12, 9,
- 10, 12, 14, 13, 13, 13, 16, 13, 14, 16, 14, 14, 13, 13, 14, 11,
- 8, 11, 11, 12, 11, 12, 13, 12, 12, 13, 12, 12, 12, 12, 12, 10,
- 6, 9, 9, 10, 9, 10, 11, 10, 10, 11, 10, 10, 10, 10, 10, 8,
- 8, 11, 11, 11, 12, 11, 13, 11, 12, 13, 12, 12, 12, 12, 12, 10,
- 11, 14, 13, 14, 14, 14, 16, 14, 14, 16, 14, 14, 15, 15, 14, 12,
- 9, 12, 11, 12, 12, 12, 13, 12, 12, 13, 12, 12, 12, 12, 12, 10,
- 8, 11, 11, 11, 11, 11, 13, 11, 12, 12, 12, 12, 12, 12, 12, 9,
- 10, 13, 14, 13, 11, 13, 14, 14, 13, 15, 15, 14, 10, 13, 14, 11,
- 10, 13, 13, 13, 12, 13, 14, 13, 13, 14, 14, 14, 13, 13, 13, 11,
- 10, 13, 14, 13, 13, 12, 15, 13, 14, 15, 14, 14, 14, 13, 14, 12,
- 11, 14, 14, 14, 13, 13, 15, 14, 14, 15, 14, 15, 13, 14, 14, 12,
- 9, 11, 12, 12, 11, 11, 13, 12, 12, 13, 12, 12, 12, 12, 12, 10,
- 9, 11, 12, 12, 12, 11, 13, 11, 12, 13, 12, 12, 12, 12, 12, 10,
- 13, 15, 15, 16, 15, 16, 16, 15, 16, 16, 16, 15, 15, 15, 16, 14,
- 10, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 11,
- 8, 11, 11, 11, 11, 11, 12, 11, 11, 12, 12, 11, 12, 11, 12, 9,
- 11, 14, 14, 15, 14, 15, 15, 14, 13, 15, 14, 15, 12, 14, 15, 13,
- 12, 15, 15, 15, 15, 15, 16, 15, 15, 16, 16, 16, 15, 16, 15, 13,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15,
- 11, 14, 13, 15, 14, 14, 16, 14, 14, 16, 13, 14, 15, 14, 15, 12,
- 11, 14, 13, 14, 14, 14, 16, 15, 14, 16, 14, 14, 15, 15, 15, 12,
- 13, 15, 15, 15, 15, 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 13,
- 11, 14, 13, 14, 14, 14, 15, 14, 14, 16, 12, 14, 16, 16, 14, 12,
- 11, 14, 14, 14, 14, 15, 16, 15, 14, 16, 13, 14, 16, 15, 14, 12,
- 12, 14, 14, 14, 14, 14, 16, 14, 15, 16, 14, 14, 14, 15, 15, 12,
- 11, 14, 14, 14, 13, 14, 16, 15, 13, 16, 15, 15, 11, 14, 14, 12,
- 11, 14, 14, 15, 14, 14, 16, 14, 14, 15, 14, 14, 13, 15, 15, 12,
- 13, 15, 16, 15, 15, 15, 16, 15, 16, 16, 16, 16, 15, 15, 16, 13,
- 11, 14, 14, 14, 14, 14, 15, 14, 14, 16, 14, 14, 14, 15, 14, 12,
- 9, 12, 12, 12, 12, 12, 13, 12, 12, 13, 12, 13, 12, 12, 12, 10,
- 11, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 14, 13, 13, 14, 11,
- 12, 15, 14, 15, 15, 15, 16, 15, 14, 16, 14, 14, 16, 16, 14, 13,
- 10, 12, 12, 12, 12, 12, 14, 12, 13, 13, 12, 12, 13, 13, 13, 10,
- 10, 12, 12, 12, 12, 12, 14, 12, 12, 13, 12, 12, 12, 12, 12, 10,
- 10, 14, 14, 14, 12, 14, 16, 14, 13, 16, 16, 16, 10, 13, 14, 12,
- 11, 14, 14, 14, 13, 14, 16, 14, 14, 16, 15, 14, 12, 13, 14, 12,
- 12, 14, 14, 14, 14, 14, 16, 14, 14, 16, 15, 15, 14, 14, 15, 12,
- 12, 14, 15, 15, 14, 15, 16, 14, 15, 15, 15, 15, 13, 15, 14, 12,
- 9, 12, 12, 12, 12, 13, 13, 12, 12, 13, 13, 12, 11, 12, 12, 10,
- 10, 12, 12, 12, 12, 12, 13, 12, 12, 13, 12, 12, 12, 12, 12, 10,
- 13, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 15, 16, 15, 13,
- 10, 12, 12, 13, 12, 13, 13, 12, 13, 14, 13, 13, 12, 13, 13, 10,
- 7, 10, 10, 10, 10, 10, 11, 10, 10, 11, 10, 10, 10, 10, 10, 7,
- ],
- ], [
- [
- 10, 10, 9, 8, 9, 8, 9, 7, 9, 9, 8, 7, 8, 7, 7, 4,
- 13, 11, 12, 9, 12, 9, 12, 9, 12, 11, 11, 9, 10, 9, 9, 6,
- 15, 12, 15, 11, 14, 10, 14, 10, 14, 13, 13, 11, 13, 11, 12, 7,
- 13, 12, 11, 9, 12, 11, 12, 9, 12, 12, 10, 9, 10, 10, 9, 6,
- 14, 13, 12, 10, 13, 12, 13, 9, 13, 12, 11, 10, 12, 11, 10, 6,
- 16, 14, 14, 10, 15, 13, 14, 10, 15, 15, 14, 11, 14, 12, 12, 8,
- 15, 14, 12, 11, 15, 14, 13, 11, 14, 14, 11, 10, 13, 12, 11, 8,
- 15, 16, 13, 11, 16, 14, 14, 11, 15, 15, 12, 10, 14, 13, 12, 8,
- 16, 15, 14, 10, 16, 14, 14, 10, 16, 15, 14, 10, 14, 13, 12, 7,
- 13, 12, 12, 11, 11, 9, 12, 9, 12, 12, 11, 10, 10, 9, 9, 6,
- 13, 13, 14, 12, 12, 10, 12, 10, 14, 13, 12, 11, 11, 10, 10, 7,
- 16, 14, 16, 13, 14, 11, 15, 10, 16, 15, 14, 12, 14, 11, 12, 8,
- 14, 14, 13, 12, 13, 12, 13, 10, 13, 13, 12, 11, 11, 10, 10, 7,
- 15, 14, 14, 12, 14, 12, 13, 10, 14, 13, 12, 11, 12, 11, 11, 7,
- 16, 15, 16, 13, 15, 13, 15, 10, 16, 15, 14, 12, 14, 12, 12, 7,
- 15, 16, 14, 13, 16, 14, 14, 12, 15, 15, 12, 12, 13, 12, 12, 8,
- 16, 16, 14, 13, 16, 14, 14, 11, 15, 15, 14, 11, 14, 12, 12, 8,
- 16, 16, 15, 12, 16, 14, 15, 10, 16, 16, 13, 12, 14, 13, 12, 7,
- 14, 14, 14, 13, 13, 11, 13, 11, 14, 14, 13, 12, 11, 10, 11, 8,
- 16, 15, 16, 13, 13, 11, 14, 11, 15, 14, 14, 13, 12, 11, 12, 8,
- 15, 15, 16, 14, 14, 10, 14, 10, 16, 15, 15, 13, 14, 10, 12, 8,
- 16, 16, 16, 14, 15, 13, 14, 12, 15, 15, 13, 13, 13, 12, 12, 8,
- 16, 16, 16, 14, 15, 13, 14, 11, 16, 16, 14, 13, 13, 12, 12, 8,
- 16, 16, 16, 14, 16, 12, 15, 11, 16, 15, 15, 13, 14, 12, 12, 8,
- 16, 16, 16, 16, 16, 15, 15, 13, 16, 16, 14, 13, 14, 13, 12, 9,
- 16, 16, 16, 14, 16, 15, 15, 11, 16, 16, 14, 13, 15, 13, 12, 8,
- 16, 16, 16, 14, 16, 14, 14, 10, 16, 16, 15, 13, 14, 12, 12, 7,
- 12, 12, 12, 11, 12, 11, 12, 10, 11, 11, 10, 9, 9, 9, 9, 6,
- 14, 13, 14, 12, 13, 12, 13, 10, 13, 13, 12, 10, 12, 10, 11, 7,
- 16, 14, 16, 13, 15, 13, 16, 12, 15, 14, 14, 12, 14, 12, 13, 8,
- 14, 14, 13, 11, 14, 12, 13, 11, 12, 12, 10, 10, 11, 10, 10, 7,
- 14, 14, 13, 12, 14, 12, 13, 11, 13, 13, 12, 10, 12, 11, 10, 7,
- 16, 15, 15, 12, 16, 14, 15, 11, 16, 14, 13, 11, 14, 12, 12, 8,
- 16, 16, 13, 13, 16, 15, 14, 12, 14, 14, 11, 11, 13, 12, 11, 8,
- 16, 16, 14, 12, 16, 14, 14, 12, 15, 14, 12, 11, 14, 12, 12, 8,
- 16, 15, 14, 11, 16, 15, 15, 11, 16, 15, 13, 11, 14, 13, 12, 8,
- 14, 13, 13, 12, 13, 11, 13, 10, 12, 13, 11, 10, 10, 10, 10, 7,
- 15, 14, 14, 13, 13, 12, 13, 11, 14, 13, 12, 11, 12, 10, 11, 7,
- 16, 15, 16, 14, 15, 12, 15, 11, 16, 14, 14, 12, 14, 11, 12, 8,
- 14, 15, 13, 12, 14, 13, 13, 11, 13, 13, 11, 11, 11, 10, 10, 7,
- 14, 14, 14, 12, 14, 13, 13, 10, 14, 13, 12, 10, 12, 10, 10, 6,
- 16, 15, 15, 13, 16, 13, 15, 11, 15, 14, 13, 11, 13, 11, 11, 7,
- 16, 16, 14, 13, 16, 15, 14, 12, 15, 15, 12, 11, 13, 12, 11, 8,
- 16, 16, 14, 13, 16, 14, 14, 11, 15, 14, 12, 11, 13, 12, 11, 7,
- 16, 16, 15, 12, 16, 14, 14, 11, 15, 15, 13, 11, 14, 12, 11, 6,
- 16, 15, 15, 14, 14, 12, 14, 12, 13, 14, 13, 12, 11, 11, 11, 8,
- 16, 16, 16, 14, 14, 12, 15, 12, 15, 14, 14, 12, 12, 11, 12, 8,
- 16, 16, 16, 15, 14, 12, 15, 12, 16, 15, 14, 13, 13, 11, 12, 8,
- 16, 16, 16, 15, 15, 14, 15, 12, 14, 14, 13, 12, 12, 11, 11, 8,
- 16, 16, 15, 14, 14, 12, 14, 11, 14, 14, 13, 12, 12, 11, 11, 7,
- 16, 16, 16, 14, 15, 12, 14, 11, 15, 15, 14, 12, 13, 11, 12, 7,
- 16, 16, 16, 16, 16, 15, 16, 13, 15, 15, 14, 12, 13, 12, 11, 8,
- 16, 16, 16, 14, 15, 14, 14, 12, 16, 15, 13, 12, 13, 12, 11, 7,
- 16, 16, 16, 13, 16, 13, 14, 10, 16, 15, 14, 11, 13, 11, 11, 6,
- 14, 15, 13, 13, 14, 13, 14, 12, 12, 13, 11, 11, 11, 11, 10, 8,
- 16, 16, 15, 13, 16, 14, 16, 13, 14, 14, 13, 12, 13, 12, 12, 8,
- 16, 16, 16, 14, 16, 14, 16, 13, 16, 14, 15, 13, 15, 13, 13, 9,
- 15, 15, 14, 14, 15, 14, 14, 12, 13, 14, 11, 11, 12, 12, 11, 8,
- 15, 16, 15, 13, 15, 14, 14, 12, 14, 14, 12, 11, 13, 12, 12, 8,
- 16, 16, 16, 13, 16, 15, 15, 13, 16, 15, 14, 11, 15, 12, 13, 8,
- 16, 16, 14, 13, 16, 15, 15, 13, 14, 14, 10, 11, 14, 12, 11, 8,
- 16, 16, 15, 13, 16, 16, 15, 13, 15, 14, 12, 11, 14, 13, 12, 8,
- 16, 16, 15, 13, 16, 15, 16, 12, 16, 14, 13, 10, 15, 13, 12, 7,
- 15, 15, 15, 14, 14, 14, 15, 12, 13, 14, 12, 12, 11, 11, 11, 8,
- 16, 15, 16, 14, 15, 13, 15, 12, 14, 14, 13, 12, 12, 11, 12, 8,
- 16, 16, 16, 15, 16, 14, 16, 13, 16, 15, 14, 12, 14, 11, 13, 8,
- 16, 16, 15, 14, 16, 14, 15, 13, 14, 14, 12, 11, 12, 11, 11, 8,
- 15, 16, 15, 14, 15, 14, 14, 12, 14, 13, 12, 11, 12, 11, 11, 7,
- 16, 16, 16, 14, 16, 13, 16, 12, 15, 14, 13, 11, 13, 11, 12, 7,
- 16, 16, 15, 14, 16, 15, 15, 13, 14, 15, 11, 11, 13, 12, 11, 8,
- 16, 16, 15, 13, 16, 14, 15, 12, 15, 14, 12, 11, 13, 11, 11, 7,
- 16, 16, 15, 13, 16, 14, 16, 12, 15, 14, 13, 10, 13, 11, 11, 6,
- 16, 16, 16, 14, 14, 14, 15, 13, 14, 14, 14, 12, 11, 11, 11, 8,
- 16, 16, 16, 14, 15, 14, 16, 13, 15, 14, 14, 13, 12, 11, 11, 7,
- 16, 16, 16, 16, 15, 13, 16, 12, 15, 15, 14, 12, 13, 10, 12, 7,
- 16, 16, 16, 14, 15, 15, 14, 13, 14, 14, 13, 12, 12, 11, 11, 8,
- 16, 15, 16, 14, 16, 13, 15, 12, 14, 14, 13, 12, 12, 10, 10, 6,
- 16, 15, 16, 14, 16, 13, 16, 11, 16, 14, 13, 11, 13, 10, 11, 6,
- 16, 16, 16, 15, 16, 16, 15, 13, 14, 16, 12, 12, 12, 12, 10, 7,
- 16, 16, 16, 14, 16, 14, 14, 12, 15, 15, 12, 11, 12, 11, 10, 6,
- 16, 16, 16, 13, 16, 13, 15, 10, 15, 14, 13, 10, 13, 10, 10, 4,
- ], [
- 1, 6, 6, 7, 6, 7, 9, 8, 7, 9, 7, 8, 7, 8, 8, 6,
- 6, 9, 10, 10, 10, 10, 12, 11, 10, 12, 11, 11, 11, 11, 12, 9,
- 9, 10, 13, 11, 13, 12, 14, 13, 14, 14, 14, 14, 14, 14, 14, 12,
- 6, 10, 9, 10, 10, 11, 13, 11, 11, 13, 10, 12, 11, 12, 12, 9,
- 6, 10, 10, 10, 10, 11, 13, 11, 11, 13, 12, 12, 11, 12, 12, 9,
- 9, 11, 13, 12, 13, 14, 15, 13, 14, 16, 14, 14, 14, 14, 15, 12,
- 10, 13, 11, 13, 14, 14, 16, 14, 14, 15, 13, 14, 15, 15, 16, 12,
- 9, 13, 12, 12, 14, 14, 16, 14, 14, 15, 14, 14, 15, 15, 15, 12,
- 8, 11, 12, 11, 13, 14, 15, 13, 13, 15, 14, 14, 13, 15, 15, 11,
- 6, 10, 10, 11, 9, 10, 13, 11, 10, 13, 11, 12, 10, 12, 12, 9,
- 6, 10, 10, 11, 11, 10, 13, 11, 11, 13, 11, 12, 12, 12, 13, 10,
- 9, 12, 13, 13, 13, 12, 16, 13, 14, 15, 14, 14, 15, 14, 15, 12,
- 8, 12, 12, 13, 12, 13, 15, 14, 13, 15, 13, 14, 13, 13, 14, 11,
- 7, 11, 11, 12, 11, 12, 13, 12, 12, 13, 12, 13, 12, 13, 13, 10,
- 9, 12, 13, 13, 13, 13, 16, 13, 13, 15, 14, 14, 14, 15, 15, 12,
- 11, 15, 14, 15, 15, 16, 16, 16, 15, 16, 15, 16, 16, 16, 16, 14,
- 10, 13, 13, 14, 14, 14, 16, 15, 14, 16, 15, 15, 15, 15, 16, 13,
- 9, 12, 13, 13, 13, 14, 16, 14, 13, 15, 14, 14, 14, 16, 15, 12,
- 10, 13, 14, 14, 11, 13, 16, 14, 14, 16, 15, 15, 12, 14, 15, 12,
- 10, 13, 14, 14, 12, 12, 16, 15, 14, 16, 15, 15, 14, 14, 16, 12,
- 9, 12, 13, 14, 13, 11, 16, 13, 14, 15, 13, 14, 14, 14, 15, 12,
- 11, 15, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 13, 14, 14, 13, 14, 16, 15, 14, 16, 16, 16, 14, 15, 16, 13,
- 10, 13, 13, 14, 13, 13, 16, 13, 13, 14, 14, 15, 15, 14, 15, 13,
- 13, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15,
- 12, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 12, 13, 14, 13, 13, 14, 13, 13, 14, 13, 14, 14, 14, 15, 12,
- 6, 10, 11, 11, 10, 11, 13, 12, 11, 13, 11, 12, 11, 12, 12, 10,
- 8, 12, 13, 13, 12, 13, 14, 14, 13, 15, 14, 14, 14, 14, 15, 12,
- 12, 14, 16, 15, 15, 15, 16, 15, 16, 16, 16, 16, 16, 16, 16, 14,
- 7, 11, 11, 12, 12, 12, 14, 13, 12, 14, 11, 12, 13, 13, 13, 11,
- 8, 11, 12, 12, 12, 12, 14, 13, 12, 14, 12, 13, 13, 14, 14, 11,
- 11, 13, 14, 14, 14, 14, 16, 15, 15, 16, 15, 15, 16, 16, 16, 13,
- 10, 14, 12, 14, 14, 15, 16, 15, 13, 16, 12, 14, 16, 16, 15, 13,
- 10, 13, 13, 14, 14, 15, 16, 15, 14, 16, 14, 15, 15, 16, 16, 12,
- 10, 13, 14, 13, 14, 14, 16, 15, 14, 16, 15, 15, 14, 16, 16, 13,
- 7, 11, 11, 11, 10, 12, 14, 13, 11, 14, 13, 13, 10, 12, 13, 10,
- 8, 11, 12, 12, 11, 12, 14, 13, 12, 15, 13, 13, 12, 13, 14, 11,
- 11, 13, 14, 14, 14, 14, 16, 15, 14, 16, 15, 16, 16, 16, 16, 14,
- 8, 12, 12, 13, 12, 13, 15, 14, 12, 15, 13, 13, 13, 14, 14, 11,
- 6, 10, 10, 11, 10, 11, 13, 12, 11, 13, 11, 12, 11, 12, 12, 9,
- 9, 12, 13, 13, 13, 13, 14, 13, 13, 15, 14, 14, 14, 14, 14, 12,
- 11, 15, 14, 15, 14, 15, 16, 16, 16, 16, 15, 16, 16, 16, 16, 14,
- 9, 13, 12, 13, 13, 13, 15, 14, 13, 14, 13, 14, 14, 15, 14, 12,
- 9, 12, 12, 12, 12, 13, 14, 13, 13, 14, 13, 13, 13, 13, 14, 11,
- 10, 13, 15, 14, 12, 14, 16, 14, 14, 16, 15, 15, 12, 14, 16, 12,
- 10, 14, 14, 14, 13, 14, 16, 15, 14, 16, 16, 16, 13, 14, 16, 13,
- 11, 13, 14, 14, 14, 13, 16, 14, 14, 16, 15, 15, 15, 15, 16, 13,
- 11, 15, 15, 15, 14, 15, 16, 16, 15, 16, 16, 16, 14, 16, 16, 13,
- 9, 13, 13, 13, 12, 13, 15, 14, 13, 15, 14, 14, 13, 14, 15, 11,
- 9, 12, 12, 13, 12, 12, 14, 13, 13, 14, 13, 14, 14, 14, 14, 11,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15,
- 11, 14, 14, 15, 15, 14, 16, 16, 14, 16, 14, 15, 15, 16, 16, 12,
- 9, 12, 12, 13, 12, 12, 14, 12, 12, 14, 13, 13, 13, 13, 14, 11,
- 11, 14, 14, 16, 14, 16, 16, 16, 13, 16, 14, 16, 14, 16, 16, 13,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 15, 14, 16, 14, 15, 16, 16, 15, 16, 14, 15, 16, 16, 16, 13,
- 11, 15, 14, 16, 15, 16, 16, 16, 15, 16, 15, 16, 16, 16, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 11, 14, 13, 14, 15, 14, 16, 15, 14, 16, 12, 14, 16, 16, 15, 13,
- 11, 14, 14, 16, 14, 15, 16, 16, 15, 16, 14, 15, 16, 16, 16, 14,
- 12, 14, 14, 15, 14, 16, 16, 15, 14, 16, 15, 15, 15, 16, 16, 13,
- 11, 14, 15, 15, 13, 15, 16, 16, 14, 16, 16, 16, 12, 15, 15, 13,
- 11, 15, 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15,
- 11, 15, 14, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13,
- 10, 13, 13, 14, 14, 14, 16, 15, 14, 16, 14, 15, 14, 14, 15, 12,
- 12, 15, 14, 16, 14, 15, 16, 15, 15, 16, 15, 15, 16, 15, 16, 13,
- 12, 16, 14, 16, 15, 16, 16, 16, 16, 16, 14, 15, 16, 16, 16, 14,
- 10, 13, 13, 14, 14, 13, 16, 14, 13, 16, 13, 14, 15, 15, 15, 12,
- 10, 13, 13, 14, 13, 13, 16, 14, 14, 15, 14, 14, 14, 14, 15, 12,
- 10, 14, 15, 14, 13, 15, 16, 15, 14, 16, 16, 16, 11, 14, 16, 12,
- 11, 14, 14, 16, 14, 15, 16, 15, 15, 16, 16, 16, 13, 15, 16, 13,
- 12, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 15, 16, 13,
- 12, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 13,
- 10, 13, 14, 14, 13, 14, 16, 14, 13, 16, 15, 14, 12, 14, 16, 11,
- 10, 13, 13, 14, 13, 14, 16, 14, 14, 15, 14, 14, 13, 14, 14, 11,
- 13, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 11, 13, 14, 15, 14, 14, 16, 15, 14, 16, 14, 15, 14, 15, 16, 12,
- 8, 11, 11, 11, 11, 12, 13, 12, 11, 13, 11, 12, 11, 12, 12, 9,
- ],
- ], [
- [
- 8, 8, 8, 7, 8, 7, 8, 6, 8, 8, 7, 6, 7, 6, 6, 4,
- 11, 10, 11, 9, 11, 9, 11, 8, 11, 10, 10, 9, 10, 8, 9, 6,
- 13, 11, 13, 10, 12, 10, 13, 9, 13, 12, 13, 10, 12, 10, 11, 7,
- 11, 11, 10, 9, 11, 10, 11, 9, 10, 11, 9, 8, 10, 9, 9, 6,
- 12, 12, 11, 9, 12, 11, 12, 9, 12, 12, 11, 9, 11, 10, 10, 7,
- 14, 13, 13, 10, 15, 12, 13, 10, 15, 13, 13, 10, 13, 12, 12, 8,
- 13, 13, 11, 10, 14, 13, 12, 10, 13, 13, 10, 10, 12, 11, 10, 8,
- 15, 14, 13, 10, 14, 13, 13, 10, 14, 13, 12, 10, 13, 12, 11, 8,
- 14, 14, 13, 10, 16, 13, 13, 10, 15, 14, 13, 10, 13, 12, 12, 8,
- 11, 11, 11, 10, 10, 9, 10, 9, 10, 10, 10, 9, 9, 8, 9, 6,
- 12, 12, 12, 11, 11, 9, 12, 9, 12, 12, 11, 10, 11, 9, 10, 7,
- 14, 13, 14, 12, 13, 10, 13, 10, 15, 13, 14, 12, 12, 10, 12, 8,
- 13, 13, 12, 11, 12, 11, 12, 10, 12, 12, 11, 10, 11, 10, 10, 7,
- 14, 13, 13, 11, 13, 12, 12, 10, 13, 13, 12, 11, 12, 10, 10, 7,
- 16, 15, 15, 12, 14, 12, 13, 10, 15, 14, 13, 12, 13, 12, 12, 8,
- 15, 15, 13, 13, 14, 14, 14, 12, 14, 14, 12, 11, 13, 12, 11, 8,
- 15, 16, 14, 12, 15, 14, 13, 11, 15, 15, 13, 12, 13, 12, 11, 8,
- 16, 15, 15, 12, 16, 14, 14, 10, 15, 15, 14, 12, 14, 12, 12, 8,
- 13, 13, 13, 13, 11, 10, 12, 10, 12, 13, 12, 11, 10, 10, 10, 8,
- 14, 13, 14, 13, 12, 10, 13, 10, 14, 14, 13, 12, 12, 10, 11, 8,
- 15, 14, 16, 14, 13, 10, 14, 10, 16, 14, 14, 13, 13, 10, 12, 8,
- 15, 15, 14, 14, 14, 13, 13, 12, 14, 14, 13, 12, 12, 11, 11, 9,
- 15, 15, 15, 14, 14, 12, 14, 11, 15, 14, 13, 13, 13, 11, 11, 8,
- 16, 15, 16, 14, 15, 12, 14, 11, 16, 16, 15, 13, 14, 12, 12, 8,
- 16, 16, 16, 14, 15, 14, 14, 12, 15, 15, 14, 13, 13, 12, 11, 9,
- 16, 16, 15, 15, 16, 14, 14, 11, 16, 16, 14, 13, 14, 12, 12, 8,
- 16, 16, 16, 13, 15, 13, 14, 10, 16, 16, 15, 13, 14, 12, 12, 8,
- 11, 11, 11, 10, 11, 10, 11, 9, 10, 10, 9, 8, 9, 9, 9, 6,
- 12, 12, 13, 11, 12, 11, 12, 10, 12, 12, 11, 10, 11, 10, 10, 7,
- 15, 13, 15, 12, 14, 13, 14, 11, 14, 13, 13, 11, 13, 11, 12, 8,
- 12, 13, 12, 11, 13, 11, 12, 10, 11, 12, 10, 9, 11, 10, 10, 7,
- 14, 13, 13, 11, 14, 12, 13, 11, 12, 12, 11, 10, 12, 11, 10, 7,
- 15, 14, 15, 12, 15, 13, 15, 11, 15, 14, 13, 11, 13, 12, 12, 8,
- 14, 14, 13, 12, 15, 14, 13, 12, 13, 13, 11, 10, 13, 12, 11, 8,
- 16, 15, 13, 12, 15, 14, 14, 12, 14, 14, 12, 11, 14, 12, 11, 8,
- 16, 15, 14, 12, 16, 15, 15, 11, 15, 14, 13, 11, 14, 13, 12, 8,
- 12, 12, 12, 11, 12, 11, 12, 10, 11, 11, 11, 10, 10, 9, 9, 7,
- 13, 13, 14, 12, 13, 11, 13, 11, 13, 12, 12, 11, 11, 10, 10, 7,
- 15, 14, 16, 13, 14, 12, 14, 11, 14, 14, 14, 12, 13, 11, 12, 8,
- 13, 13, 13, 12, 13, 12, 13, 11, 12, 12, 11, 10, 11, 10, 10, 7,
- 14, 14, 13, 12, 13, 12, 13, 10, 13, 13, 11, 10, 12, 10, 10, 7,
- 16, 15, 15, 13, 15, 12, 14, 11, 15, 14, 13, 11, 13, 11, 11, 7,
- 15, 16, 14, 13, 15, 14, 14, 12, 14, 14, 12, 11, 13, 12, 11, 8,
- 16, 15, 14, 13, 15, 14, 14, 11, 14, 14, 12, 11, 13, 12, 11, 7,
- 16, 15, 15, 12, 16, 14, 14, 11, 15, 14, 13, 11, 14, 12, 11, 7,
- 14, 15, 14, 14, 13, 12, 13, 12, 13, 13, 12, 12, 11, 10, 11, 8,
- 15, 15, 15, 14, 13, 12, 14, 12, 14, 14, 13, 12, 12, 11, 11, 8,
- 16, 15, 16, 14, 14, 12, 15, 12, 16, 14, 14, 13, 13, 11, 12, 8,
- 15, 15, 15, 14, 14, 13, 14, 12, 14, 14, 13, 12, 12, 11, 11, 8,
- 15, 15, 15, 14, 14, 13, 14, 12, 14, 14, 13, 12, 12, 11, 11, 7,
- 16, 15, 16, 14, 15, 12, 15, 11, 15, 14, 14, 12, 13, 11, 12, 7,
- 16, 16, 16, 15, 16, 15, 14, 13, 15, 15, 13, 12, 13, 12, 11, 9,
- 16, 16, 16, 14, 15, 14, 14, 12, 15, 15, 13, 12, 14, 12, 11, 8,
- 16, 16, 16, 14, 16, 14, 14, 11, 15, 15, 14, 12, 14, 12, 11, 7,
- 13, 13, 13, 12, 13, 12, 13, 11, 11, 12, 11, 10, 10, 10, 10, 8,
- 15, 14, 14, 13, 14, 13, 14, 12, 13, 13, 12, 11, 13, 11, 11, 8,
- 16, 15, 16, 14, 16, 14, 16, 13, 15, 14, 14, 12, 14, 12, 13, 9,
- 14, 15, 13, 13, 14, 13, 14, 12, 12, 13, 11, 11, 12, 11, 11, 8,
- 15, 15, 14, 13, 15, 14, 14, 12, 13, 13, 12, 11, 13, 12, 11, 8,
- 16, 16, 16, 13, 16, 15, 16, 13, 15, 14, 14, 12, 14, 13, 13, 9,
- 14, 15, 13, 13, 16, 15, 15, 13, 13, 14, 11, 11, 13, 12, 11, 9,
- 16, 16, 14, 13, 16, 15, 16, 13, 14, 14, 12, 11, 14, 13, 12, 8,
- 16, 16, 15, 12, 16, 15, 15, 12, 15, 14, 13, 11, 14, 13, 12, 8,
- 14, 14, 14, 13, 14, 13, 14, 12, 12, 13, 12, 11, 11, 11, 11, 8,
- 15, 15, 15, 14, 14, 13, 15, 12, 14, 13, 13, 12, 12, 11, 11, 8,
- 16, 16, 16, 15, 15, 14, 16, 13, 15, 14, 14, 12, 14, 12, 12, 9,
- 15, 15, 14, 14, 14, 14, 14, 13, 13, 14, 12, 11, 12, 11, 11, 8,
- 15, 15, 15, 13, 15, 14, 14, 12, 13, 13, 12, 11, 12, 11, 11, 7,
- 16, 15, 16, 14, 16, 14, 15, 12, 15, 14, 14, 12, 13, 12, 12, 8,
- 16, 16, 15, 14, 16, 15, 15, 13, 14, 14, 12, 11, 13, 12, 11, 8,
- 16, 16, 15, 13, 16, 14, 14, 12, 14, 15, 12, 11, 13, 12, 11, 7,
- 16, 16, 16, 13, 16, 15, 15, 12, 15, 14, 13, 11, 14, 12, 11, 7,
- 15, 15, 15, 14, 13, 13, 14, 13, 13, 14, 13, 12, 11, 11, 11, 8,
- 16, 16, 16, 14, 15, 13, 15, 12, 14, 14, 14, 13, 12, 11, 12, 8,
- 16, 16, 16, 14, 15, 13, 15, 12, 15, 14, 14, 12, 13, 11, 12, 8,
- 15, 16, 16, 14, 15, 14, 15, 13, 14, 14, 12, 12, 11, 11, 11, 8,
- 16, 15, 15, 14, 15, 14, 14, 12, 14, 14, 13, 12, 12, 11, 11, 7,
- 16, 16, 16, 13, 15, 13, 15, 12, 15, 14, 14, 12, 13, 11, 11, 7,
- 16, 16, 16, 15, 15, 16, 15, 13, 14, 14, 12, 12, 12, 12, 11, 8,
- 16, 16, 16, 14, 16, 14, 14, 12, 15, 15, 13, 11, 12, 11, 10, 7,
- 16, 16, 15, 13, 16, 14, 14, 11, 15, 14, 13, 10, 13, 11, 10, 5,
- ], [
- 1, 6, 6, 7, 6, 7, 9, 7, 6, 9, 7, 8, 7, 8, 8, 5,
- 5, 8, 10, 10, 10, 10, 12, 11, 11, 12, 11, 11, 11, 12, 12, 9,
- 9, 10, 12, 11, 13, 12, 15, 13, 14, 15, 15, 14, 14, 15, 15, 12,
- 6, 10, 9, 10, 10, 11, 13, 12, 11, 13, 11, 12, 12, 12, 12, 10,
- 6, 10, 10, 10, 11, 11, 13, 11, 11, 13, 12, 12, 11, 12, 12, 10,
- 9, 12, 13, 12, 13, 13, 16, 13, 14, 16, 15, 14, 14, 15, 16, 12,
- 9, 13, 11, 13, 14, 14, 16, 15, 14, 16, 13, 15, 15, 15, 15, 12,
- 9, 13, 12, 13, 14, 15, 16, 15, 14, 16, 15, 15, 15, 15, 16, 12,
- 8, 12, 12, 11, 13, 14, 15, 13, 13, 15, 14, 14, 14, 14, 14, 12,
- 6, 10, 10, 11, 9, 10, 13, 11, 11, 13, 12, 12, 10, 12, 12, 9,
- 6, 10, 11, 11, 11, 10, 13, 12, 11, 13, 12, 12, 12, 12, 13, 10,
- 9, 12, 13, 13, 13, 12, 16, 13, 14, 16, 14, 15, 16, 14, 15, 12,
- 8, 12, 13, 13, 13, 13, 16, 14, 13, 16, 13, 14, 14, 14, 14, 12,
- 7, 11, 11, 12, 11, 12, 14, 13, 12, 14, 13, 13, 12, 13, 13, 11,
- 9, 12, 13, 13, 13, 13, 15, 14, 14, 16, 16, 15, 15, 15, 16, 12,
- 11, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 14, 14, 15, 15, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 13,
- 9, 13, 13, 13, 14, 14, 16, 14, 14, 16, 15, 14, 14, 16, 16, 13,
- 9, 13, 14, 14, 11, 13, 16, 14, 13, 16, 15, 16, 13, 14, 15, 12,
- 10, 13, 14, 15, 13, 12, 16, 14, 14, 16, 15, 15, 14, 14, 16, 13,
- 9, 12, 13, 14, 12, 11, 15, 13, 13, 15, 13, 14, 15, 14, 16, 12,
- 11, 15, 16, 16, 14, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 13,
- 11, 14, 14, 15, 13, 14, 16, 15, 15, 16, 16, 16, 16, 16, 16, 13,
- 10, 12, 13, 14, 13, 13, 16, 14, 14, 14, 14, 16, 15, 14, 16, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 9, 12, 13, 14, 13, 13, 16, 13, 13, 15, 15, 16, 15, 15, 16, 12,
- 6, 11, 11, 12, 10, 12, 13, 12, 11, 13, 11, 12, 11, 12, 13, 10,
- 9, 12, 13, 13, 13, 13, 16, 14, 14, 15, 14, 14, 14, 14, 14, 12,
- 12, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 7, 11, 11, 12, 12, 12, 14, 13, 12, 14, 11, 13, 13, 13, 13, 11,
- 8, 12, 12, 13, 12, 13, 14, 13, 13, 14, 13, 13, 13, 14, 14, 11,
- 11, 14, 14, 15, 16, 15, 16, 16, 15, 16, 16, 16, 16, 16, 16, 13,
- 10, 14, 12, 14, 15, 15, 16, 16, 14, 16, 12, 15, 16, 16, 16, 13,
- 11, 14, 13, 15, 15, 15, 16, 16, 14, 16, 14, 14, 16, 16, 16, 13,
- 11, 14, 14, 14, 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 13,
- 7, 11, 12, 11, 10, 12, 14, 13, 12, 14, 13, 13, 10, 12, 13, 10,
- 8, 12, 12, 13, 12, 12, 15, 13, 13, 14, 13, 13, 13, 13, 14, 11,
- 11, 13, 15, 16, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13,
- 9, 12, 13, 13, 13, 13, 15, 14, 13, 15, 13, 14, 13, 14, 14, 12,
- 7, 11, 11, 11, 11, 11, 13, 12, 11, 13, 11, 12, 11, 12, 12, 10,
- 9, 12, 13, 13, 13, 13, 16, 13, 14, 16, 15, 14, 14, 14, 16, 12,
- 12, 14, 14, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 14,
- 10, 13, 13, 14, 14, 14, 16, 15, 14, 16, 14, 14, 16, 15, 15, 12,
- 9, 12, 13, 13, 13, 15, 16, 14, 13, 16, 14, 13, 13, 14, 14, 11,
- 10, 14, 15, 14, 12, 14, 16, 15, 13, 16, 16, 16, 12, 14, 16, 12,
- 11, 14, 14, 14, 14, 14, 16, 15, 15, 16, 16, 16, 14, 15, 16, 13,
- 11, 14, 14, 16, 14, 13, 16, 15, 14, 16, 15, 16, 15, 15, 16, 13,
- 12, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 14,
- 10, 13, 14, 14, 13, 14, 16, 14, 13, 16, 15, 15, 13, 14, 14, 12,
- 9, 12, 13, 14, 13, 12, 16, 14, 13, 16, 14, 14, 14, 14, 15, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13,
- 9, 12, 13, 13, 13, 13, 14, 13, 12, 15, 14, 14, 14, 14, 14, 11,
- 11, 14, 14, 16, 14, 16, 16, 16, 13, 16, 14, 16, 14, 16, 16, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 14, 14, 16, 16, 15, 16, 16, 15, 16, 14, 16, 16, 16, 16, 14,
- 12, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 14, 12, 15, 15, 15, 16, 16, 14, 16, 12, 14, 16, 16, 15, 14,
- 12, 15, 14, 16, 16, 16, 16, 16, 15, 16, 14, 16, 16, 16, 16, 14,
- 12, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14,
- 11, 15, 15, 16, 14, 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 13,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 11, 15, 14, 16, 14, 14, 16, 15, 14, 16, 15, 16, 15, 16, 16, 12,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13,
- 12, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 14,
- 10, 14, 13, 14, 15, 14, 16, 15, 14, 16, 13, 16, 16, 16, 15, 13,
- 10, 14, 14, 14, 13, 14, 16, 15, 15, 16, 14, 14, 14, 16, 16, 12,
- 10, 14, 15, 14, 13, 16, 16, 15, 13, 16, 16, 16, 12, 14, 16, 12,
- 11, 16, 16, 16, 14, 15, 16, 16, 16, 16, 16, 16, 14, 16, 16, 13,
- 12, 15, 14, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 14,
- 11, 14, 14, 14, 14, 15, 16, 14, 14, 16, 16, 16, 13, 15, 15, 12,
- 10, 14, 13, 14, 14, 14, 16, 15, 14, 16, 15, 15, 14, 14, 16, 12,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 12, 14, 14, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 13,
- 8, 11, 11, 12, 12, 12, 13, 12, 11, 13, 12, 12, 12, 13, 12, 10,
- ],
- ], [
- [
- 5, 6, 6, 6, 6, 6, 7, 6, 6, 7, 6, 6, 6, 6, 6, 4,
- 9, 9, 9, 8, 9, 8, 10, 8, 10, 10, 9, 9, 9, 8, 9, 6,
- 11, 10, 12, 10, 11, 10, 12, 9, 12, 11, 11, 10, 11, 10, 11, 8,
- 9, 10, 9, 8, 10, 10, 10, 9, 9, 10, 8, 8, 9, 9, 8, 7,
- 10, 11, 10, 9, 11, 11, 11, 9, 11, 11, 10, 9, 10, 10, 10, 7,
- 13, 12, 12, 10, 13, 12, 13, 10, 13, 12, 12, 11, 13, 12, 11, 9,
- 11, 12, 10, 10, 12, 12, 11, 10, 11, 12, 10, 10, 11, 11, 10, 8,
- 12, 12, 11, 10, 13, 13, 13, 10, 13, 13, 12, 11, 13, 12, 11, 9,
- 12, 12, 12, 10, 13, 13, 13, 10, 13, 13, 12, 10, 13, 12, 12, 9,
- 9, 9, 10, 10, 9, 8, 10, 9, 9, 10, 9, 9, 8, 8, 9, 6,
- 10, 11, 11, 11, 10, 9, 11, 9, 11, 11, 11, 10, 10, 9, 10, 7,
- 12, 12, 13, 12, 12, 10, 13, 10, 13, 13, 13, 12, 12, 11, 11, 9,
- 11, 12, 11, 11, 11, 11, 11, 10, 11, 12, 10, 10, 10, 10, 10, 8,
- 12, 12, 12, 11, 12, 11, 11, 10, 12, 12, 11, 11, 11, 11, 10, 8,
- 14, 13, 13, 12, 13, 12, 13, 10, 14, 14, 13, 12, 13, 12, 12, 9,
- 13, 14, 13, 12, 13, 13, 13, 12, 13, 13, 12, 12, 12, 12, 11, 9,
- 14, 14, 13, 12, 13, 13, 13, 11, 14, 14, 13, 12, 13, 12, 12, 9,
- 14, 15, 14, 12, 15, 13, 13, 11, 15, 14, 14, 12, 14, 13, 12, 9,
- 11, 11, 12, 12, 10, 10, 12, 11, 11, 12, 11, 11, 10, 10, 10, 8,
- 12, 12, 14, 13, 11, 10, 12, 11, 13, 13, 13, 12, 12, 10, 11, 9,
- 13, 13, 14, 14, 12, 10, 13, 11, 14, 14, 14, 13, 12, 11, 12, 9,
- 13, 13, 13, 13, 12, 13, 13, 12, 13, 14, 12, 12, 12, 12, 11, 9,
- 13, 14, 14, 13, 13, 12, 13, 11, 14, 14, 13, 12, 13, 12, 12, 9,
- 14, 14, 14, 14, 14, 12, 13, 11, 15, 15, 15, 13, 14, 12, 12, 9,
- 14, 15, 15, 13, 14, 14, 13, 12, 13, 14, 13, 13, 12, 12, 11, 10,
- 16, 16, 15, 14, 15, 14, 13, 11, 15, 15, 14, 13, 13, 13, 12, 9,
- 15, 15, 15, 13, 14, 13, 13, 11, 15, 15, 15, 13, 14, 13, 12, 9,
- 8, 9, 9, 9, 9, 9, 10, 9, 8, 10, 9, 9, 8, 8, 9, 7,
- 11, 11, 11, 11, 11, 11, 12, 10, 11, 11, 11, 10, 10, 10, 10, 8,
- 13, 13, 14, 12, 13, 12, 14, 11, 13, 13, 13, 12, 13, 11, 12, 9,
- 10, 11, 10, 11, 11, 11, 12, 10, 10, 11, 10, 10, 10, 10, 10, 8,
- 12, 12, 12, 11, 12, 12, 12, 11, 11, 12, 11, 10, 11, 11, 10, 8,
- 14, 13, 14, 12, 14, 13, 14, 12, 14, 13, 13, 11, 13, 12, 12, 9,
- 12, 13, 12, 12, 13, 13, 13, 12, 12, 13, 11, 11, 12, 12, 11, 9,
- 13, 14, 13, 12, 14, 14, 14, 12, 14, 13, 12, 11, 13, 12, 12, 9,
- 14, 14, 13, 12, 15, 14, 15, 12, 14, 14, 13, 11, 13, 13, 12, 9,
- 10, 11, 11, 11, 10, 10, 12, 10, 10, 11, 10, 10, 9, 9, 10, 7,
- 12, 12, 13, 12, 12, 11, 12, 11, 12, 12, 12, 11, 11, 10, 10, 8,
- 14, 13, 14, 13, 14, 12, 13, 12, 14, 13, 14, 12, 13, 11, 12, 9,
- 12, 13, 12, 12, 12, 12, 12, 11, 11, 12, 11, 10, 10, 10, 10, 8,
- 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 11, 10, 11, 10, 10, 7,
- 14, 14, 14, 12, 14, 12, 14, 11, 14, 13, 13, 11, 13, 11, 11, 8,
- 13, 15, 13, 13, 14, 14, 14, 12, 13, 14, 12, 12, 12, 12, 11, 9,
- 14, 15, 13, 12, 14, 13, 13, 11, 13, 13, 12, 11, 13, 12, 11, 8,
- 15, 15, 15, 12, 15, 14, 14, 11, 14, 14, 13, 11, 13, 12, 12, 8,
- 12, 13, 13, 13, 12, 12, 13, 12, 12, 13, 12, 12, 11, 11, 11, 9,
- 13, 14, 15, 14, 13, 12, 14, 12, 13, 13, 14, 12, 12, 11, 12, 9,
- 14, 14, 15, 14, 14, 12, 14, 12, 14, 14, 14, 13, 13, 11, 12, 9,
- 13, 14, 14, 14, 13, 13, 14, 13, 13, 13, 12, 12, 12, 12, 11, 9,
- 14, 14, 14, 13, 13, 13, 13, 12, 13, 14, 13, 12, 12, 11, 11, 8,
- 15, 14, 15, 14, 14, 13, 14, 11, 15, 14, 14, 12, 13, 11, 12, 8,
- 14, 15, 14, 14, 15, 14, 14, 13, 14, 15, 13, 13, 12, 12, 11, 10,
- 16, 15, 14, 14, 14, 14, 13, 12, 14, 14, 13, 12, 13, 12, 11, 9,
- 15, 15, 15, 14, 16, 14, 14, 11, 15, 15, 14, 12, 13, 12, 11, 8,
- 11, 12, 11, 12, 12, 12, 12, 11, 10, 11, 10, 10, 10, 10, 10, 8,
- 13, 13, 13, 13, 13, 13, 14, 12, 12, 12, 12, 12, 12, 11, 12, 9,
- 14, 14, 14, 13, 15, 13, 15, 13, 14, 14, 14, 12, 14, 12, 13, 10,
- 12, 13, 12, 13, 13, 13, 13, 12, 11, 12, 11, 11, 12, 11, 11, 9,
- 14, 14, 13, 13, 14, 14, 14, 12, 12, 13, 12, 11, 13, 12, 12, 9,
- 14, 14, 15, 13, 15, 15, 15, 13, 15, 13, 13, 12, 14, 12, 13, 10,
- 13, 15, 12, 13, 14, 14, 14, 13, 12, 13, 11, 11, 13, 12, 11, 10,
- 14, 15, 14, 13, 15, 14, 15, 13, 14, 14, 12, 11, 13, 13, 12, 9,
- 14, 15, 14, 13, 15, 14, 15, 13, 14, 14, 13, 11, 14, 13, 12, 9,
- 12, 13, 13, 13, 12, 13, 13, 12, 11, 12, 12, 11, 11, 11, 11, 9,
- 13, 14, 14, 13, 14, 13, 14, 12, 13, 13, 13, 12, 12, 11, 11, 9,
- 15, 15, 16, 14, 15, 14, 14, 13, 15, 14, 14, 13, 13, 12, 13, 10,
- 13, 14, 14, 13, 13, 14, 14, 13, 12, 13, 12, 12, 11, 11, 11, 9,
- 14, 14, 14, 13, 14, 13, 14, 12, 13, 13, 12, 11, 12, 11, 11, 8,
- 15, 15, 15, 13, 15, 14, 14, 12, 14, 13, 13, 12, 13, 12, 12, 9,
- 14, 15, 14, 14, 15, 15, 14, 13, 13, 14, 12, 12, 13, 12, 12, 9,
- 15, 15, 14, 13, 15, 14, 14, 13, 14, 14, 12, 11, 13, 12, 11, 8,
- 15, 16, 14, 13, 15, 15, 15, 12, 14, 14, 13, 11, 14, 12, 12, 8,
- 12, 14, 13, 13, 13, 13, 14, 12, 12, 13, 12, 12, 10, 11, 11, 9,
- 14, 15, 15, 14, 13, 13, 15, 13, 13, 14, 14, 12, 12, 11, 12, 9,
- 15, 15, 16, 14, 14, 13, 15, 13, 14, 14, 14, 13, 13, 11, 12, 9,
- 14, 15, 14, 14, 14, 14, 14, 13, 13, 14, 13, 12, 12, 12, 11, 9,
- 14, 15, 15, 14, 14, 14, 14, 12, 13, 14, 13, 12, 12, 11, 11, 8,
- 15, 15, 15, 14, 14, 13, 15, 12, 15, 14, 14, 12, 13, 11, 11, 8,
- 14, 16, 14, 14, 14, 15, 14, 13, 13, 14, 12, 12, 12, 12, 11, 9,
- 15, 15, 15, 14, 15, 14, 14, 12, 14, 14, 13, 12, 12, 11, 11, 8,
- 15, 15, 14, 13, 15, 13, 14, 12, 14, 14, 13, 11, 13, 11, 11, 7,
- ], [
- 1, 5, 6, 7, 6, 7, 9, 8, 6, 9, 8, 8, 7, 8, 8, 6,
- 5, 8, 10, 10, 10, 11, 13, 12, 11, 13, 12, 12, 12, 12, 13, 10,
- 8, 10, 13, 12, 13, 13, 16, 14, 14, 16, 16, 14, 16, 16, 16, 12,
- 5, 10, 9, 11, 11, 12, 13, 12, 11, 13, 11, 12, 12, 12, 13, 10,
- 6, 10, 11, 11, 11, 12, 14, 12, 11, 13, 13, 13, 12, 13, 13, 11,
- 8, 12, 13, 12, 14, 14, 16, 14, 14, 16, 16, 16, 16, 16, 16, 13,
- 9, 13, 11, 14, 14, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 13,
- 9, 13, 13, 13, 14, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 14,
- 8, 12, 13, 12, 13, 14, 16, 14, 14, 16, 16, 16, 14, 16, 16, 13,
- 5, 10, 11, 12, 9, 11, 13, 12, 11, 13, 13, 13, 11, 12, 13, 10,
- 6, 10, 11, 12, 11, 11, 14, 13, 12, 14, 12, 13, 13, 13, 13, 11,
- 9, 12, 14, 15, 13, 13, 16, 16, 14, 16, 16, 16, 16, 16, 16, 13,
- 8, 13, 13, 14, 13, 14, 16, 16, 14, 16, 14, 16, 14, 16, 14, 13,
- 7, 11, 12, 13, 12, 12, 14, 13, 12, 14, 13, 14, 13, 14, 14, 12,
- 9, 13, 14, 14, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13,
- 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 15, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 9, 13, 14, 14, 14, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14,
- 9, 13, 14, 15, 11, 13, 16, 14, 14, 16, 16, 16, 13, 14, 16, 13,
- 9, 13, 14, 16, 13, 13, 16, 16, 14, 16, 16, 16, 16, 15, 16, 14,
- 8, 12, 13, 16, 13, 12, 16, 14, 13, 16, 14, 16, 16, 16, 16, 13,
- 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 14, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 9, 13, 16, 16, 14, 14, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 13, 14, 15, 14, 14, 16, 14, 13, 16, 16, 16, 14, 16, 16, 14,
- 6, 11, 11, 12, 11, 12, 14, 13, 11, 14, 12, 13, 12, 13, 13, 11,
- 9, 13, 13, 14, 13, 14, 16, 16, 14, 16, 16, 16, 15, 16, 16, 13,
- 11, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 7, 11, 11, 13, 12, 13, 16, 14, 12, 16, 12, 14, 14, 14, 14, 12,
- 8, 12, 12, 13, 12, 14, 16, 14, 13, 16, 14, 14, 14, 14, 14, 12,
- 11, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 14, 13, 16, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 16,
- 10, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 7, 11, 12, 12, 11, 13, 16, 14, 12, 15, 14, 14, 11, 13, 13, 12,
- 8, 12, 12, 13, 13, 13, 16, 14, 13, 16, 13, 15, 13, 14, 14, 12,
- 11, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 8, 12, 13, 14, 13, 14, 16, 16, 14, 16, 14, 16, 14, 16, 15, 13,
- 6, 11, 11, 12, 11, 12, 13, 13, 11, 13, 12, 13, 12, 13, 13, 11,
- 9, 13, 14, 14, 14, 14, 16, 14, 14, 16, 16, 16, 16, 16, 14, 13,
- 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 14, 13, 14, 14, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 13,
- 9, 13, 14, 13, 13, 16, 16, 14, 13, 16, 16, 16, 13, 16, 14, 13,
- 10, 14, 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 13, 14, 16, 14,
- 11, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 14, 16, 16, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 14, 14, 14, 14, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 13,
- 9, 13, 13, 16, 14, 14, 16, 16, 14, 16, 14, 16, 16, 16, 16, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 13, 14, 14, 13, 16, 16, 14, 13, 16, 14, 16, 14, 14, 16, 12,
- 10, 14, 14, 16, 16, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 14,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 14, 13, 16, 16, 16, 16, 16, 14, 16, 12, 16, 16, 16, 16, 14,
- 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 14,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15,
- 11, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 15, 14, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 14,
- 10, 14, 14, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13,
- 10, 14, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16, 12, 16, 16, 14,
- 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16,
- 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 15, 14, 16, 14, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 13,
- 10, 15, 14, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 8, 12, 12, 13, 12, 14, 14, 14, 12, 16, 13, 14, 12, 14, 14, 11,
- ],
- ],
-];
-
-const RV34_INTRA_CBP: &'static [[[u8; 16]; 8]; 5] = &[
- [
- [ 0, 3, 3, 4, 3, 5, 5, 5, 2, 5, 4, 6, 4, 6, 6, 6, ],
- [ 0, 2, 3, 4, 2, 5, 6, 7, 3, 6, 5, 7, 4, 7, 8, 8, ],
- [ 0, 3, 4, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 3, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 6, 3, 5, 6, 5, ],
- [ 0, 4, 4, 4, 4, 5, 5, 4, 4, 5, 4, 5, 4, 4, 4, 2, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ],
- [ 0, 6, 6, 5, 6, 5, 6, 4, 6, 6, 5, 4, 4, 4, 4, 1, ],
- [ 0, 4, 4, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 4, 4, 2, ],
- ], [
- [ 0, 4, 3, 4, 3, 4, 5, 4, 3, 5, 4, 5, 3, 5, 5, 5, ],
- [ 0, 2, 3, 4, 2, 5, 6, 7, 3, 6, 5, 7, 4, 7, 8, 8, ],
- [ 0, 4, 4, 4, 4, 4, 5, 4, 4, 5, 4, 4, 3, 4, 4, 3, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 6, 3, 5, 6, 5, ],
- [ 0, 4, 4, 4, 4, 4, 5, 4, 4, 5, 5, 5, 4, 4, 4, 2, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ],
- [ 0, 5, 6, 5, 5, 5, 6, 4, 6, 6, 5, 4, 5, 4, 4, 1, ],
- [ 0, 4, 4, 4, 4, 4, 5, 4, 4, 5, 5, 4, 4, 4, 5, 2, ],
- ], [
- [ 0, 3, 3, 4, 3, 4, 4, 5, 3, 5, 4, 5, 4, 5, 5, 5, ],
- [ 0, 2, 3, 4, 2, 4, 6, 7, 3, 6, 5, 7, 5, 7, 8, 8, ],
- [ 0, 4, 4, 4, 4, 4, 5, 4, 3, 5, 4, 4, 4, 4, 4, 3, ],
- [ 0, 3, 3, 4, 3, 3, 6, 6, 3, 6, 4, 6, 3, 6, 6, 5, ],
- [ 0, 4, 4, 4, 3, 4, 5, 4, 4, 5, 4, 4, 4, 4, 4, 3, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ],
- [ 0, 5, 5, 5, 5, 5, 6, 4, 5, 6, 5, 5, 5, 4, 4, 1, ],
- [ 0, 4, 4, 4, 4, 4, 6, 4, 4, 6, 5, 4, 4, 4, 4, 2, ],
- ], [
- [ 0, 3, 3, 4, 3, 4, 4, 5, 3, 5, 4, 5, 4, 5, 5, 5, ],
- [ 0, 2, 3, 4, 2, 4, 7, 6, 3, 7, 5, 7, 5, 7, 7, 7, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ],
- [ 0, 3, 3, 3, 3, 4, 6, 6, 3, 6, 4, 6, 3, 6, 6, 5, ],
- [ 0, 3, 4, 4, 3, 4, 5, 4, 4, 5, 4, 5, 4, 5, 4, 3, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ],
- [ 0, 4, 5, 4, 4, 4, 5, 4, 4, 5, 5, 4, 4, 4, 4, 2, ],
- [ 0, 4, 4, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 4, 4, 2, ],
- ], [
- [ 0, 3, 3, 4, 3, 4, 5, 6, 2, 5, 4, 7, 4, 6, 6, 7, ],
- [ 0, 2, 3, 4, 2, 4, 6, 7, 3, 7, 5, 7, 5, 7, 7, 7, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ],
- [ 0, 2, 3, 4, 3, 4, 6, 5, 3, 6, 4, 6, 4, 6, 6, 6, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ],
- [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ],
- [ 0, 4, 4, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 4, 4, 2, ],
- [ 0, 3, 4, 4, 4, 4, 5, 4, 4, 5, 4, 4, 4, 4, 4, 3, ],
- ],
-];
-
-const RV34_INTRA_FIRSTPAT: &'static [[[u8; 864]; 4]; 5] = &[
- [
- [
- 0, 10, 5, 10, 7, 12, 9, 11, 8, 13, 9, 12, 10, 13, 11, 12,
- 16, 16, 14, 15, 15, 16, 13, 14, 5, 12, 6, 11, 9, 13, 10, 11,
- 9, 14, 9, 12, 11, 14, 11, 12, 16, 16, 14, 15, 15, 16, 13, 13,
- 10, 15, 9, 12, 12, 16, 11, 12, 12, 16, 10, 13, 13, 16, 11, 12,
- 16, 16, 13, 14, 15, 16, 13, 12, 6, 12, 8, 11, 8, 12, 10, 11,
- 9, 14, 10, 12, 10, 13, 11, 12, 15, 16, 14, 15, 14, 16, 13, 13,
- 8, 13, 9, 12, 10, 13, 10, 12, 10, 14, 9, 12, 11, 14, 10, 12,
- 15, 16, 13, 15, 14, 16, 13, 13, 11, 16, 10, 13, 13, 16, 11, 12,
- 12, 16, 11, 13, 13, 16, 11, 12, 16, 16, 13, 14, 15, 16, 12, 12,
- 10, 16, 12, 14, 10, 14, 11, 12, 12, 16, 13, 14, 11, 14, 12, 12,
- 16, 16, 15, 16, 14, 15, 13, 13, 11, 16, 12, 14, 11, 14, 11, 12,
- 12, 16, 12, 14, 11, 14, 11, 12, 16, 16, 14, 15, 13, 15, 13, 12,
- 14, 16, 13, 14, 13, 16, 12, 12, 14, 16, 13, 14, 13, 16, 12, 12,
- 16, 16, 14, 14, 14, 15, 12, 11, 2, 10, 6, 10, 7, 12, 9, 11,
- 8, 12, 9, 11, 10, 13, 10, 11, 15, 16, 14, 15, 14, 16, 13, 13,
- 5, 12, 6, 11, 9, 13, 10, 11, 9, 13, 9, 11, 10, 13, 10, 11,
- 15, 16, 13, 14, 14, 16, 13, 13, 9, 15, 8, 12, 12, 15, 11, 11,
- 11, 16, 10, 12, 13, 15, 11, 11, 15, 16, 13, 14, 15, 16, 12, 12,
- 6, 12, 8, 11, 8, 12, 9, 11, 9, 14, 9, 12, 10, 13, 10, 11,
- 15, 16, 14, 15, 14, 16, 13, 13, 7, 13, 8, 11, 9, 13, 10, 11,
- 9, 14, 9, 12, 10, 13, 10, 11, 14, 16, 13, 14, 13, 16, 12, 12,
- 11, 16, 10, 12, 12, 15, 11, 11, 11, 16, 10, 12, 12, 15, 11, 11,
- 15, 16, 12, 13, 14, 16, 12, 11, 9, 15, 11, 13, 9, 13, 11, 12,
- 11, 16, 12, 14, 10, 14, 11, 12, 16, 16, 14, 15, 13, 15, 12, 12,
- 11, 16, 11, 14, 10, 14, 11, 12, 11, 16, 12, 13, 11, 14, 11, 11,
- 15, 16, 14, 15, 13, 14, 12, 12, 13, 16, 12, 14, 13, 15, 11, 11,
- 13, 16, 12, 14, 13, 15, 11, 11, 16, 16, 13, 14, 13, 15, 11, 10,
- 5, 12, 7, 11, 8, 13, 10, 11, 9, 13, 9, 12, 10, 14, 11, 12,
- 16, 16, 14, 15, 14, 16, 13, 13, 7, 13, 7, 11, 9, 13, 10, 11,
- 9, 14, 9, 12, 11, 14, 11, 12, 16, 16, 14, 14, 14, 16, 13, 13,
- 9, 15, 8, 12, 12, 15, 11, 12, 11, 16, 10, 12, 13, 16, 11, 12,
- 16, 16, 13, 14, 15, 16, 12, 12, 7, 13, 8, 12, 9, 13, 10, 11,
- 10, 14, 10, 12, 10, 14, 11, 12, 16, 16, 14, 15, 14, 16, 13, 13,
- 8, 14, 9, 12, 10, 13, 10, 11, 9, 14, 9, 12, 10, 14, 10, 11,
- 15, 16, 13, 14, 14, 16, 12, 12, 11, 16, 10, 12, 12, 15, 11, 12,
- 11, 16, 10, 12, 12, 15, 11, 11, 15, 16, 12, 14, 14, 16, 12, 11,
- 10, 16, 11, 13, 9, 14, 11, 12, 12, 16, 12, 14, 11, 14, 11, 12,
- 16, 16, 14, 16, 14, 15, 13, 12, 11, 16, 11, 14, 10, 14, 11, 12,
- 11, 16, 12, 14, 11, 14, 11, 11, 15, 16, 14, 15, 13, 15, 12, 12,
- 13, 16, 12, 14, 13, 15, 11, 11, 13, 16, 12, 14, 12, 14, 11, 11,
- 15, 16, 12, 13, 13, 14, 11, 10, 6, 13, 8, 11, 9, 13, 10, 11,
- 10, 14, 10, 12, 10, 13, 10, 11, 15, 16, 13, 13, 13, 14, 12, 11,
- 7, 13, 8, 11, 9, 13, 9, 11, 10, 14, 9, 11, 10, 13, 10, 11,
- 15, 16, 13, 13, 13, 14, 11, 11, 9, 14, 8, 11, 10, 13, 9, 10,
- 11, 15, 9, 11, 11, 13, 9, 10, 15, 16, 12, 13, 13, 14, 10, 9,
- 7, 13, 8, 11, 9, 13, 9, 11, 10, 14, 10, 12, 10, 13, 10, 11,
- 15, 16, 13, 13, 13, 14, 11, 11, 8, 13, 8, 11, 9, 13, 9, 10,
- 9, 14, 9, 11, 10, 13, 9, 10, 14, 16, 12, 13, 13, 14, 11, 10,
- 9, 14, 8, 11, 10, 13, 9, 9, 10, 14, 8, 11, 10, 13, 9, 9,
- 14, 16, 11, 12, 12, 14, 10, 9, 9, 14, 9, 12, 8, 12, 9, 10,
- 11, 15, 10, 12, 10, 13, 9, 10, 15, 16, 13, 13, 12, 13, 11, 10,
- 9, 14, 9, 12, 9, 12, 9, 10, 10, 14, 10, 12, 9, 12, 9, 9,
- 14, 16, 12, 13, 11, 13, 10, 9, 10, 14, 9, 11, 10, 12, 8, 8,
- 10, 14, 9, 11, 10, 12, 8, 8, 12, 14, 9, 10, 10, 11, 8, 7,
- ], [
- 0, 9, 6, 9, 6, 10, 8, 9, 7, 11, 8, 11, 9, 11, 9, 10,
- 14, 16, 13, 14, 13, 14, 12, 11, 5, 11, 7, 10, 8, 10, 8, 9,
- 8, 12, 8, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11,
- 10, 14, 9, 11, 11, 13, 10, 10, 11, 15, 9, 11, 12, 13, 10, 10,
- 15, 16, 12, 12, 13, 14, 11, 9, 6, 11, 7, 10, 7, 10, 8, 9,
- 8, 12, 9, 11, 9, 11, 9, 10, 14, 16, 13, 13, 13, 14, 11, 11,
- 7, 12, 8, 11, 8, 11, 9, 9, 9, 13, 9, 11, 9, 12, 9, 10,
- 14, 16, 12, 13, 12, 14, 11, 10, 11, 14, 10, 12, 11, 13, 10, 10,
- 12, 15, 10, 12, 12, 13, 10, 10, 15, 16, 12, 12, 13, 14, 10, 9,
- 10, 14, 11, 13, 9, 12, 10, 10, 11, 15, 12, 13, 10, 12, 10, 10,
- 14, 16, 13, 14, 12, 13, 11, 10, 11, 14, 11, 13, 10, 12, 10, 10,
- 12, 15, 11, 13, 10, 12, 10, 10, 15, 16, 13, 13, 12, 13, 11, 9,
- 13, 16, 12, 13, 12, 13, 10, 9, 14, 16, 12, 13, 12, 13, 10, 9,
- 16, 16, 12, 12, 13, 13, 10, 7, 4, 10, 6, 9, 7, 10, 8, 9,
- 8, 12, 9, 11, 9, 11, 9, 9, 14, 16, 13, 13, 13, 14, 11, 11,
- 6, 11, 7, 10, 8, 11, 8, 9, 9, 12, 9, 11, 9, 12, 9, 9,
- 14, 16, 12, 13, 13, 14, 11, 10, 10, 14, 9, 11, 11, 13, 9, 9,
- 11, 14, 9, 11, 11, 13, 10, 9, 14, 16, 11, 12, 13, 14, 10, 9,
- 6, 11, 8, 10, 7, 10, 8, 9, 9, 12, 9, 11, 9, 11, 9, 9,
- 14, 16, 13, 13, 12, 13, 11, 10, 8, 12, 8, 10, 8, 11, 9, 9,
- 9, 12, 9, 11, 9, 11, 9, 9, 14, 16, 12, 13, 12, 13, 11, 10,
- 11, 14, 10, 11, 11, 13, 9, 9, 11, 14, 10, 11, 11, 13, 9, 9,
- 14, 16, 11, 12, 13, 14, 10, 8, 10, 14, 11, 12, 9, 12, 10, 10,
- 11, 14, 11, 13, 10, 12, 10, 10, 14, 16, 13, 14, 12, 13, 11, 9,
- 11, 14, 11, 12, 10, 12, 10, 10, 11, 14, 11, 12, 10, 12, 10, 9,
- 14, 16, 13, 13, 11, 12, 10, 9, 13, 16, 12, 13, 12, 13, 10, 9,
- 13, 16, 11, 12, 11, 13, 10, 8, 15, 16, 12, 12, 12, 12, 9, 7,
- 8, 12, 8, 11, 9, 12, 9, 10, 10, 14, 10, 12, 11, 13, 10, 10,
- 16, 16, 14, 14, 14, 14, 12, 11, 8, 13, 8, 11, 9, 12, 10, 10,
- 11, 14, 10, 12, 11, 13, 10, 10, 16, 16, 13, 14, 14, 14, 12, 11,
- 11, 14, 9, 12, 11, 13, 10, 10, 12, 15, 10, 12, 12, 14, 10, 10,
- 15, 16, 12, 12, 14, 14, 11, 9, 9, 13, 9, 11, 9, 12, 10, 10,
- 11, 14, 10, 12, 10, 12, 10, 10, 15, 16, 14, 14, 13, 14, 12, 11,
- 9, 13, 9, 11, 10, 12, 10, 10, 10, 14, 10, 12, 10, 12, 10, 10,
- 15, 16, 13, 13, 13, 14, 11, 10, 11, 15, 10, 12, 11, 13, 10, 10,
- 11, 15, 10, 12, 12, 13, 10, 9, 15, 16, 11, 12, 13, 14, 10, 9,
- 11, 15, 11, 13, 10, 12, 10, 10, 12, 16, 12, 13, 11, 13, 10, 10,
- 16, 16, 14, 14, 12, 13, 11, 9, 11, 15, 11, 13, 10, 13, 10, 10,
- 12, 15, 12, 13, 10, 12, 10, 10, 14, 16, 13, 13, 12, 13, 10, 9,
- 13, 16, 12, 13, 12, 13, 10, 9, 13, 16, 11, 12, 11, 13, 10, 9,
- 14, 16, 11, 12, 12, 12, 9, 7, 10, 15, 10, 12, 11, 13, 10, 10,
- 12, 16, 12, 13, 12, 13, 11, 10, 16, 16, 14, 14, 14, 15, 12, 10,
- 10, 14, 10, 12, 10, 13, 10, 10, 12, 15, 11, 12, 11, 13, 10, 10,
- 16, 16, 14, 13, 14, 14, 11, 9, 11, 14, 10, 11, 11, 12, 9, 9,
- 12, 15, 10, 11, 11, 13, 9, 8, 16, 16, 12, 12, 13, 13, 10, 7,
- 10, 15, 10, 12, 10, 13, 10, 10, 12, 15, 11, 12, 11, 13, 10, 10,
- 16, 16, 14, 13, 14, 14, 11, 9, 10, 14, 10, 12, 10, 12, 10, 10,
- 12, 15, 11, 12, 11, 13, 10, 10, 16, 16, 13, 13, 13, 14, 11, 9,
- 11, 14, 10, 11, 10, 12, 9, 8, 11, 14, 9, 11, 11, 12, 9, 8,
- 14, 16, 10, 11, 12, 13, 9, 7, 11, 15, 11, 12, 10, 12, 10, 9,
- 13, 16, 11, 12, 11, 12, 10, 9, 16, 16, 13, 13, 12, 13, 10, 7,
- 11, 15, 10, 12, 10, 12, 9, 8, 12, 15, 11, 12, 10, 12, 9, 8,
- 14, 16, 12, 12, 11, 12, 9, 7, 11, 14, 10, 11, 10, 12, 8, 7,
- 11, 14, 9, 10, 10, 11, 8, 6, 12, 15, 9, 9, 9, 10, 7, 4,
- ], [
- 0, 6, 3, 7, 3, 7, 6, 7, 5, 9, 6, 9, 7, 9, 8, 8,
- 16, 16, 16, 16, 16, 16, 16, 11, 3, 8, 5, 8, 6, 8, 7, 7,
- 7, 11, 7, 10, 8, 10, 8, 9, 16, 16, 16, 16, 16, 16, 14, 10,
- 8, 16, 7, 11, 10, 16, 9, 9, 11, 16, 9, 14, 16, 16, 10, 9,
- 16, 16, 16, 16, 16, 16, 16, 10, 3, 8, 5, 8, 5, 8, 7, 7,
- 7, 11, 8, 10, 8, 10, 8, 9, 16, 16, 16, 16, 16, 16, 16, 11,
- 6, 10, 7, 9, 7, 10, 8, 8, 8, 11, 8, 10, 8, 11, 8, 8,
- 16, 16, 16, 16, 16, 16, 11, 10, 10, 16, 9, 13, 11, 16, 10, 9,
- 11, 16, 9, 11, 16, 16, 10, 9, 16, 16, 11, 16, 16, 16, 11, 9,
- 9, 16, 10, 11, 8, 11, 9, 9, 11, 16, 12, 16, 10, 16, 10, 10,
- 16, 16, 16, 16, 16, 16, 16, 10, 10, 16, 11, 16, 10, 16, 10, 10,
- 11, 16, 11, 16, 10, 16, 10, 9, 16, 16, 16, 16, 16, 16, 11, 9,
- 16, 16, 16, 16, 16, 16, 11, 9, 16, 16, 16, 16, 16, 16, 11, 9,
- 16, 16, 11, 16, 16, 16, 9, 7, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 2, 8, 5, 9, 6, 9, 8, 8, 8, 12, 9, 11, 9, 11, 10, 10,
- 16, 16, 14, 16, 14, 16, 14, 12, 5, 10, 6, 9, 8, 10, 8, 9,
- 9, 12, 9, 11, 10, 12, 10, 10, 16, 16, 14, 15, 15, 16, 13, 12,
- 10, 13, 9, 12, 11, 12, 10, 10, 12, 15, 11, 12, 12, 13, 11, 10,
- 16, 16, 15, 14, 15, 16, 13, 12, 6, 10, 8, 10, 7, 10, 8, 9,
- 9, 13, 10, 11, 10, 12, 10, 10, 16, 16, 14, 16, 14, 16, 13, 12,
- 7, 11, 8, 11, 9, 11, 9, 9, 10, 13, 10, 11, 10, 12, 10, 9,
- 16, 16, 14, 14, 14, 15, 12, 11, 11, 14, 11, 12, 11, 13, 10, 10,
- 12, 15, 11, 13, 12, 13, 11, 10, 16, 16, 14, 16, 15, 15, 13, 11,
- 10, 13, 11, 12, 10, 12, 10, 10, 12, 15, 12, 13, 11, 13, 11, 11,
- 16, 16, 15, 16, 14, 15, 13, 11, 11, 14, 11, 13, 11, 12, 11, 10,
- 12, 16, 12, 13, 12, 13, 11, 10, 16, 16, 15, 16, 13, 15, 12, 11,
- 13, 15, 12, 13, 13, 14, 11, 11, 14, 16, 13, 13, 13, 14, 11, 11,
- 16, 16, 15, 14, 15, 15, 12, 10, 3, 8, 6, 9, 7, 9, 8, 8,
- 8, 12, 9, 11, 9, 11, 9, 9, 16, 16, 15, 15, 15, 16, 13, 12,
- 6, 10, 7, 9, 8, 10, 8, 8, 9, 12, 9, 11, 10, 12, 10, 9,
- 16, 16, 14, 14, 14, 15, 13, 11, 10, 13, 9, 11, 11, 12, 10, 10,
- 12, 14, 11, 12, 12, 13, 11, 10, 16, 16, 14, 14, 15, 15, 13, 11,
- 6, 10, 8, 10, 7, 10, 8, 9, 10, 12, 10, 11, 10, 11, 10, 9,
- 16, 16, 14, 15, 14, 15, 13, 11, 8, 11, 8, 10, 9, 11, 9, 9,
- 9, 13, 9, 11, 10, 11, 9, 9, 16, 16, 13, 14, 14, 14, 12, 10,
- 11, 14, 10, 12, 11, 12, 10, 10, 12, 14, 11, 12, 12, 13, 10, 10,
- 16, 16, 13, 14, 15, 15, 12, 10, 10, 13, 11, 12, 10, 12, 10, 10,
- 12, 14, 12, 13, 11, 13, 11, 10, 16, 16, 15, 14, 14, 14, 12, 11,
- 11, 14, 11, 12, 10, 12, 10, 10, 12, 15, 12, 12, 11, 13, 10, 10,
- 16, 16, 14, 15, 13, 14, 12, 10, 13, 15, 12, 13, 12, 13, 11, 10,
- 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 13, 14, 13, 15, 11, 9,
- 6, 10, 8, 10, 8, 11, 9, 10, 11, 13, 11, 12, 11, 13, 11, 10,
- 16, 16, 16, 16, 16, 16, 13, 12, 8, 11, 9, 11, 9, 11, 10, 10,
- 11, 14, 11, 12, 11, 12, 11, 10, 16, 16, 15, 15, 16, 16, 13, 12,
- 11, 14, 10, 12, 12, 13, 11, 10, 13, 16, 12, 13, 13, 14, 11, 11,
- 16, 16, 15, 16, 16, 16, 13, 12, 8, 12, 9, 11, 9, 11, 10, 10,
- 11, 14, 11, 12, 11, 12, 11, 10, 16, 16, 16, 16, 16, 16, 13, 12,
- 9, 12, 10, 11, 10, 12, 10, 10, 11, 14, 11, 12, 11, 13, 10, 10,
- 16, 16, 15, 14, 15, 15, 13, 11, 12, 14, 11, 13, 12, 13, 11, 10,
- 12, 15, 11, 12, 13, 13, 11, 10, 16, 16, 14, 15, 16, 15, 13, 11,
- 11, 15, 12, 13, 11, 13, 11, 10, 13, 16, 13, 14, 12, 14, 11, 11,
- 16, 16, 16, 16, 15, 15, 13, 12, 12, 14, 12, 13, 11, 13, 11, 10,
- 13, 15, 12, 13, 11, 13, 11, 10, 16, 16, 15, 15, 13, 15, 13, 11,
- 13, 16, 13, 13, 13, 13, 12, 11, 13, 16, 13, 13, 13, 13, 11, 10,
- 16, 16, 13, 15, 14, 14, 12, 9, 9, 13, 10, 12, 11, 13, 11, 11,
- 13, 16, 13, 14, 13, 14, 12, 11, 16, 16, 16, 16, 16, 16, 14, 12,
- 10, 14, 11, 13, 11, 13, 11, 10, 13, 16, 13, 13, 13, 14, 12, 11,
- 16, 16, 16, 16, 16, 16, 14, 12, 11, 15, 11, 13, 12, 13, 11, 10,
- 14, 16, 12, 13, 13, 14, 12, 10, 16, 16, 15, 16, 16, 16, 13, 11,
- 10, 14, 11, 12, 11, 13, 11, 10, 13, 16, 12, 13, 12, 14, 12, 11,
- 16, 16, 16, 16, 16, 16, 14, 12, 11, 14, 11, 12, 11, 13, 11, 10,
- 13, 15, 12, 13, 12, 13, 11, 10, 16, 16, 15, 15, 16, 16, 13, 11,
- 12, 15, 12, 13, 12, 13, 11, 10, 13, 16, 12, 13, 13, 13, 11, 10,
- 16, 16, 14, 14, 16, 15, 13, 10, 12, 15, 12, 13, 12, 13, 11, 10,
- 14, 16, 13, 14, 13, 14, 12, 11, 16, 16, 16, 16, 15, 16, 13, 11,
- 12, 16, 12, 13, 12, 13, 11, 10, 13, 16, 13, 13, 12, 14, 11, 10,
- 16, 16, 15, 16, 14, 15, 13, 10, 12, 15, 12, 14, 12, 13, 11, 10,
- 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 13, 14, 13, 14, 11, 8,
- ],
- ], [
- [
- 0, 11, 5, 11, 7, 13, 10, 12, 7, 13, 9, 13, 10, 14, 12, 13,
- 16, 16, 15, 16, 16, 16, 15, 15, 4, 13, 6, 12, 10, 14, 11, 12,
- 8, 14, 9, 13, 11, 15, 12, 13, 16, 16, 15, 16, 15, 16, 15, 14,
- 9, 16, 9, 13, 13, 16, 12, 13, 12, 16, 10, 14, 14, 16, 13, 13,
- 16, 16, 14, 16, 16, 16, 14, 14, 5, 13, 8, 13, 8, 13, 11, 12,
- 9, 14, 10, 13, 10, 14, 12, 13, 16, 16, 15, 16, 15, 16, 14, 15,
- 7, 14, 9, 13, 10, 14, 11, 13, 9, 15, 10, 13, 11, 14, 12, 13,
- 16, 16, 14, 16, 15, 16, 14, 14, 11, 16, 11, 14, 13, 16, 12, 13,
- 12, 16, 11, 14, 14, 16, 12, 13, 16, 16, 14, 15, 16, 16, 14, 13,
- 10, 16, 12, 15, 10, 15, 12, 14, 12, 16, 13, 16, 11, 15, 13, 14,
- 16, 16, 16, 16, 14, 16, 14, 14, 11, 16, 12, 15, 11, 16, 12, 13,
- 12, 16, 13, 15, 12, 16, 12, 13, 16, 16, 16, 16, 14, 16, 14, 14,
- 14, 16, 13, 15, 14, 16, 13, 13, 14, 16, 14, 15, 14, 16, 13, 13,
- 16, 16, 15, 16, 15, 16, 13, 13, 2, 12, 6, 11, 7, 13, 10, 12,
- 7, 13, 9, 12, 10, 14, 11, 12, 16, 16, 15, 16, 15, 16, 14, 15,
- 5, 13, 6, 12, 9, 13, 10, 12, 8, 14, 9, 13, 11, 14, 11, 13,
- 16, 16, 14, 16, 15, 16, 14, 14, 9, 16, 8, 13, 12, 16, 11, 13,
- 11, 16, 10, 13, 13, 16, 12, 13, 16, 16, 13, 15, 16, 16, 13, 13,
- 5, 13, 8, 12, 7, 13, 10, 12, 8, 14, 10, 13, 10, 14, 11, 13,
- 16, 16, 14, 16, 15, 16, 14, 14, 7, 14, 8, 12, 9, 14, 11, 12,
- 8, 14, 9, 13, 10, 14, 11, 12, 15, 16, 14, 15, 14, 16, 13, 14,
- 11, 16, 10, 13, 13, 16, 12, 13, 11, 16, 10, 13, 13, 16, 12, 13,
- 16, 16, 13, 15, 15, 16, 13, 13, 9, 16, 12, 15, 9, 14, 11, 13,
- 11, 16, 13, 15, 11, 14, 12, 13, 16, 16, 15, 16, 14, 16, 14, 14,
- 11, 16, 12, 14, 11, 15, 12, 13, 11, 16, 12, 14, 11, 15, 12, 13,
- 16, 16, 15, 16, 14, 16, 13, 13, 13, 16, 13, 15, 13, 16, 12, 13,
- 14, 16, 13, 15, 13, 16, 12, 12, 16, 16, 14, 15, 14, 16, 12, 12,
- 4, 13, 7, 12, 8, 14, 11, 12, 9, 14, 10, 13, 11, 14, 12, 13,
- 16, 16, 15, 16, 16, 16, 15, 15, 6, 14, 7, 12, 10, 14, 11, 12,
- 9, 15, 10, 13, 11, 15, 12, 13, 16, 16, 15, 16, 16, 16, 14, 14,
- 9, 16, 8, 13, 12, 16, 11, 13, 12, 16, 10, 14, 13, 16, 12, 13,
- 16, 16, 14, 16, 16, 16, 14, 14, 6, 14, 8, 13, 8, 14, 11, 13,
- 9, 15, 10, 13, 11, 14, 12, 13, 16, 16, 15, 16, 16, 16, 14, 14,
- 7, 15, 9, 13, 10, 14, 11, 13, 9, 15, 10, 13, 11, 14, 11, 13,
- 16, 16, 14, 16, 15, 16, 14, 14, 10, 16, 10, 13, 12, 16, 12, 13,
- 11, 16, 10, 13, 13, 16, 12, 13, 16, 16, 13, 14, 15, 16, 13, 13,
- 9, 16, 12, 14, 9, 14, 11, 13, 12, 16, 12, 15, 11, 15, 12, 13,
- 16, 16, 16, 16, 15, 16, 14, 14, 10, 16, 12, 15, 11, 15, 12, 13,
- 11, 16, 12, 14, 11, 15, 12, 13, 16, 16, 14, 16, 13, 16, 13, 13,
- 13, 16, 13, 15, 13, 16, 12, 13, 13, 16, 12, 14, 13, 16, 12, 12,
- 15, 16, 13, 14, 13, 16, 12, 12, 6, 14, 8, 13, 9, 14, 10, 12,
- 10, 15, 10, 12, 11, 14, 11, 12, 16, 16, 14, 14, 14, 16, 13, 13,
- 7, 15, 8, 13, 9, 14, 10, 12, 10, 15, 10, 13, 11, 14, 11, 12,
- 16, 16, 14, 14, 14, 16, 13, 12, 9, 16, 8, 12, 11, 14, 10, 11,
- 11, 16, 10, 13, 11, 14, 10, 11, 16, 16, 13, 14, 14, 16, 12, 11,
- 7, 14, 9, 13, 9, 14, 10, 12, 10, 16, 10, 13, 11, 14, 11, 12,
- 16, 16, 14, 14, 14, 15, 13, 12, 7, 14, 9, 13, 9, 14, 10, 12,
- 9, 14, 10, 12, 10, 14, 11, 12, 15, 16, 13, 14, 14, 15, 12, 12,
- 9, 15, 9, 12, 11, 14, 10, 11, 10, 15, 9, 12, 11, 14, 10, 11,
- 14, 16, 11, 13, 13, 15, 11, 11, 9, 16, 10, 13, 9, 14, 10, 11,
- 11, 16, 11, 13, 10, 14, 10, 11, 16, 16, 14, 15, 13, 15, 12, 12,
- 9, 16, 10, 13, 9, 13, 10, 11, 10, 15, 10, 13, 10, 13, 10, 11,
- 14, 16, 13, 14, 12, 14, 11, 11, 11, 16, 10, 13, 11, 13, 9, 10,
- 11, 14, 10, 12, 10, 13, 9, 9, 13, 15, 10, 11, 11, 12, 9, 8,
- ], [
- 0, 10, 5, 10, 6, 11, 8, 10, 7, 12, 8, 11, 9, 12, 9, 10,
- 14, 16, 13, 13, 13, 14, 12, 11, 5, 12, 6, 10, 8, 12, 9, 10,
- 8, 13, 8, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11,
- 9, 15, 8, 12, 11, 14, 10, 10, 11, 16, 9, 12, 12, 14, 10, 10,
- 14, 16, 11, 12, 13, 14, 11, 10, 5, 12, 8, 11, 7, 11, 9, 10,
- 8, 13, 9, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11,
- 7, 13, 8, 11, 9, 12, 9, 10, 9, 13, 9, 11, 9, 12, 9, 10,
- 14, 16, 12, 13, 12, 13, 11, 10, 11, 15, 10, 12, 12, 14, 10, 10,
- 12, 16, 10, 12, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 10, 9,
- 10, 15, 11, 13, 9, 13, 10, 10, 11, 15, 12, 13, 10, 12, 10, 10,
- 14, 16, 13, 14, 12, 13, 11, 10, 11, 16, 11, 13, 10, 13, 10, 10,
- 11, 16, 11, 13, 10, 13, 10, 10, 14, 16, 13, 14, 12, 13, 11, 9,
- 13, 16, 12, 13, 12, 14, 11, 10, 14, 16, 12, 13, 12, 14, 10, 9,
- 16, 16, 12, 13, 13, 13, 10, 8, 3, 11, 6, 10, 7, 11, 9, 10,
- 8, 12, 8, 11, 9, 12, 9, 10, 14, 16, 13, 13, 13, 14, 11, 11,
- 5, 12, 6, 10, 8, 12, 9, 10, 8, 13, 8, 11, 9, 12, 9, 10,
- 14, 16, 12, 13, 13, 14, 11, 10, 9, 14, 8, 11, 11, 14, 10, 10,
- 11, 15, 9, 11, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 11, 9,
- 6, 12, 8, 11, 7, 11, 9, 10, 8, 13, 9, 11, 9, 12, 9, 10,
- 14, 16, 12, 13, 13, 13, 11, 10, 7, 13, 8, 11, 8, 12, 9, 10,
- 9, 13, 9, 11, 9, 12, 9, 9, 14, 16, 12, 13, 12, 13, 11, 10,
- 10, 15, 9, 12, 11, 14, 10, 10, 11, 15, 9, 11, 11, 13, 10, 9,
- 14, 16, 11, 12, 13, 14, 10, 9, 9, 15, 11, 13, 9, 12, 10, 10,
- 11, 15, 11, 13, 9, 12, 10, 10, 14, 16, 13, 14, 12, 13, 11, 10,
- 10, 15, 11, 13, 10, 13, 10, 10, 11, 15, 11, 13, 10, 12, 10, 10,
- 14, 16, 12, 13, 11, 12, 10, 9, 13, 16, 12, 13, 12, 14, 10, 9,
- 13, 16, 11, 12, 12, 13, 10, 9, 14, 16, 11, 12, 12, 13, 9, 8,
- 7, 13, 8, 12, 9, 13, 10, 11, 10, 14, 10, 12, 11, 13, 11, 11,
- 16, 16, 13, 14, 14, 14, 12, 11, 8, 14, 8, 12, 9, 13, 10, 10,
- 10, 14, 10, 12, 11, 13, 10, 10, 16, 16, 13, 13, 14, 14, 12, 11,
- 10, 15, 9, 12, 11, 14, 10, 10, 12, 16, 10, 12, 12, 14, 10, 10,
- 16, 16, 12, 13, 14, 15, 11, 10, 8, 14, 9, 12, 9, 13, 10, 11,
- 10, 15, 10, 12, 10, 13, 10, 11, 16, 16, 13, 14, 14, 14, 12, 11,
- 8, 14, 9, 12, 9, 13, 10, 10, 10, 14, 10, 12, 10, 13, 10, 10,
- 15, 16, 13, 13, 13, 14, 11, 10, 10, 15, 10, 12, 12, 14, 10, 10,
- 11, 16, 9, 12, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 10, 9,
- 11, 16, 11, 13, 10, 13, 10, 10, 12, 16, 12, 13, 10, 13, 11, 10,
- 15, 16, 14, 14, 12, 13, 11, 10, 11, 16, 11, 13, 10, 13, 10, 10,
- 11, 16, 12, 13, 10, 12, 10, 10, 14, 16, 13, 14, 11, 13, 11, 9,
- 13, 16, 12, 13, 12, 14, 10, 10, 12, 16, 11, 12, 12, 13, 10, 9,
- 14, 16, 11, 12, 11, 12, 9, 8, 10, 16, 10, 13, 11, 14, 11, 11,
- 12, 16, 11, 13, 12, 14, 11, 11, 16, 16, 14, 13, 14, 14, 12, 10,
- 10, 15, 10, 13, 10, 13, 10, 11, 12, 16, 11, 13, 11, 13, 11, 10,
- 16, 16, 14, 13, 14, 14, 12, 10, 11, 15, 9, 12, 11, 13, 10, 9,
- 12, 16, 10, 12, 12, 13, 10, 9, 16, 16, 12, 12, 13, 14, 10, 8,
- 10, 16, 10, 13, 10, 14, 11, 11, 12, 16, 11, 13, 12, 14, 11, 10,
- 16, 16, 14, 13, 14, 14, 12, 10, 9, 15, 9, 12, 10, 13, 10, 10,
- 11, 16, 10, 12, 11, 13, 10, 10, 16, 16, 13, 13, 13, 14, 11, 9,
- 10, 15, 9, 11, 11, 13, 9, 9, 11, 15, 9, 11, 11, 13, 9, 8,
- 14, 16, 10, 11, 13, 13, 10, 8, 11, 16, 11, 13, 10, 13, 10, 9,
- 13, 16, 11, 13, 11, 13, 10, 9, 16, 16, 13, 13, 13, 13, 10, 8,
- 11, 16, 10, 12, 10, 13, 10, 9, 11, 16, 11, 12, 10, 12, 9, 9,
- 15, 16, 12, 13, 11, 12, 10, 8, 11, 16, 10, 12, 11, 12, 9, 8,
- 11, 15, 9, 11, 10, 12, 9, 7, 13, 15, 9, 9, 10, 10, 7, 5,
- ], [
- 0, 7, 3, 8, 4, 9, 7, 8, 5, 10, 7, 10, 8, 11, 8, 9,
- 16, 16, 16, 16, 16, 16, 11, 10, 2, 10, 4, 9, 7, 10, 7, 8,
- 7, 16, 7, 10, 9, 16, 8, 9, 16, 16, 16, 16, 16, 16, 11, 10,
- 8, 16, 7, 10, 10, 16, 9, 8, 10, 16, 9, 11, 16, 16, 9, 9,
- 16, 16, 16, 16, 16, 16, 11, 9, 3, 10, 6, 9, 6, 11, 8, 8,
- 7, 16, 8, 10, 9, 16, 9, 9, 16, 16, 16, 16, 16, 16, 11, 10,
- 5, 16, 7, 10, 8, 11, 8, 8, 8, 16, 8, 10, 9, 16, 8, 8,
- 16, 16, 11, 16, 16, 16, 10, 9, 9, 16, 9, 11, 11, 16, 9, 9,
- 11, 16, 9, 11, 11, 16, 9, 8, 16, 16, 10, 16, 16, 16, 10, 9,
- 8, 16, 10, 16, 8, 16, 10, 9, 12, 16, 11, 16, 10, 16, 10, 9,
- 16, 16, 16, 16, 16, 16, 12, 10, 10, 16, 11, 16, 10, 16, 10, 9,
- 11, 16, 11, 16, 10, 16, 10, 9, 16, 16, 16, 16, 16, 16, 11, 9,
- 16, 16, 16, 16, 16, 16, 10, 9, 16, 16, 11, 16, 16, 16, 10, 9,
- 16, 16, 10, 11, 11, 16, 9, 7, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 2, 9, 6, 9, 6, 10, 8, 9, 8, 12, 9, 11, 9, 12, 10, 10,
- 16, 16, 14, 14, 15, 15, 13, 12, 5, 11, 7, 10, 8, 11, 9, 9,
- 9, 13, 9, 11, 10, 12, 10, 10, 15, 16, 14, 14, 14, 16, 12, 11,
- 10, 14, 9, 11, 11, 13, 10, 10, 12, 15, 10, 12, 12, 13, 11, 10,
- 16, 16, 14, 15, 14, 15, 12, 11, 5, 11, 8, 10, 7, 11, 9, 9,
- 9, 13, 9, 12, 9, 12, 10, 10, 15, 16, 13, 14, 13, 16, 12, 11,
- 7, 12, 8, 11, 9, 11, 9, 10, 9, 13, 9, 11, 10, 12, 9, 9,
- 16, 16, 13, 14, 13, 14, 11, 11, 10, 14, 10, 12, 11, 13, 10, 10,
- 11, 16, 11, 12, 12, 13, 10, 10, 16, 16, 13, 14, 13, 14, 12, 11,
- 10, 14, 11, 13, 10, 13, 10, 11, 12, 16, 12, 13, 10, 12, 11, 11,
- 16, 16, 14, 15, 13, 14, 12, 11, 11, 15, 11, 13, 11, 13, 10, 10,
- 12, 15, 12, 13, 11, 13, 11, 10, 15, 16, 14, 15, 13, 15, 12, 11,
- 12, 16, 12, 13, 12, 14, 11, 11, 13, 16, 12, 13, 12, 14, 11, 10,
- 16, 16, 13, 14, 13, 14, 11, 10, 3, 10, 6, 9, 7, 10, 8, 9,
- 9, 12, 9, 11, 10, 12, 9, 10, 15, 16, 14, 14, 14, 14, 12, 11,
- 6, 11, 7, 10, 8, 10, 9, 9, 9, 13, 9, 11, 10, 12, 9, 9,
- 15, 16, 13, 14, 14, 15, 12, 11, 10, 14, 9, 11, 11, 12, 10, 10,
- 12, 14, 10, 12, 11, 13, 10, 10, 15, 16, 13, 14, 14, 16, 12, 11,
- 6, 11, 8, 10, 7, 11, 9, 9, 9, 13, 9, 11, 9, 12, 9, 9,
- 15, 16, 14, 14, 13, 14, 12, 11, 7, 11, 8, 11, 8, 11, 9, 9,
- 9, 12, 9, 11, 9, 12, 9, 9, 15, 16, 13, 13, 13, 14, 11, 10,
- 10, 13, 10, 12, 11, 13, 10, 10, 11, 15, 10, 12, 11, 13, 10, 10,
- 14, 16, 12, 13, 13, 14, 11, 10, 10, 14, 11, 12, 9, 12, 10, 10,
- 11, 15, 11, 13, 10, 13, 10, 10, 15, 16, 14, 14, 13, 14, 12, 11,
- 10, 14, 10, 12, 10, 12, 10, 10, 11, 15, 11, 12, 10, 12, 10, 10,
- 15, 16, 13, 14, 12, 14, 11, 10, 12, 16, 11, 13, 12, 14, 11, 10,
- 12, 16, 12, 13, 11, 13, 10, 10, 15, 16, 12, 14, 12, 14, 11, 9,
- 7, 12, 9, 11, 9, 12, 10, 10, 11, 14, 11, 12, 11, 13, 11, 11,
- 16, 16, 15, 16, 15, 16, 13, 12, 8, 12, 9, 11, 9, 12, 10, 10,
- 11, 14, 11, 12, 11, 13, 10, 10, 16, 16, 14, 15, 15, 16, 13, 12,
- 11, 14, 10, 12, 11, 13, 10, 10, 12, 16, 11, 13, 12, 14, 11, 10,
- 16, 16, 14, 15, 14, 16, 12, 11, 8, 13, 9, 11, 9, 12, 10, 10,
- 11, 14, 11, 12, 11, 13, 10, 10, 16, 16, 15, 15, 14, 15, 13, 12,
- 9, 13, 9, 12, 9, 12, 10, 10, 11, 14, 10, 12, 10, 12, 10, 10,
- 16, 16, 14, 15, 14, 14, 12, 11, 11, 15, 11, 12, 11, 13, 11, 10,
- 12, 16, 11, 12, 12, 13, 11, 10, 16, 16, 13, 15, 14, 15, 11, 11,
- 11, 16, 11, 13, 10, 13, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11,
- 16, 16, 14, 15, 14, 15, 13, 11, 11, 16, 11, 13, 11, 13, 11, 10,
- 12, 16, 12, 13, 10, 13, 11, 10, 16, 16, 14, 14, 12, 14, 12, 10,
- 12, 16, 12, 14, 12, 14, 11, 11, 13, 16, 12, 14, 12, 14, 11, 10,
- 15, 16, 12, 14, 12, 14, 11, 9, 9, 14, 11, 13, 11, 13, 11, 11,
- 13, 16, 12, 14, 13, 14, 12, 11, 16, 16, 16, 16, 16, 16, 14, 12,
- 9, 14, 10, 12, 10, 13, 11, 11, 12, 16, 12, 13, 13, 14, 11, 11,
- 16, 16, 16, 16, 16, 14, 13, 12, 10, 15, 11, 13, 11, 14, 11, 10,
- 13, 16, 12, 13, 12, 15, 11, 10, 16, 16, 14, 16, 15, 16, 13, 11,
- 10, 14, 10, 13, 11, 14, 11, 11, 13, 16, 12, 13, 12, 14, 11, 11,
- 16, 16, 16, 16, 15, 16, 13, 12, 10, 14, 10, 12, 10, 13, 10, 11,
- 12, 15, 12, 13, 12, 13, 11, 10, 16, 16, 14, 14, 15, 15, 13, 11,
- 11, 16, 11, 13, 11, 14, 11, 10, 12, 16, 11, 13, 12, 14, 11, 10,
- 16, 16, 13, 14, 14, 15, 12, 10, 11, 16, 12, 13, 11, 14, 11, 10,
- 13, 16, 13, 14, 12, 14, 11, 11, 16, 16, 15, 16, 15, 15, 12, 11,
- 11, 16, 12, 13, 11, 14, 11, 10, 13, 16, 12, 13, 11, 14, 11, 10,
- 16, 16, 14, 15, 13, 14, 12, 10, 12, 16, 12, 14, 12, 14, 10, 10,
- 12, 16, 11, 13, 11, 14, 10, 10, 14, 16, 11, 13, 12, 13, 10, 8,
- ],
- ], [
- [
- 0, 12, 6, 13, 7, 14, 11, 14, 8, 14, 10, 14, 11, 15, 13, 15,
- 16, 16, 16, 16, 16, 16, 16, 16, 5, 14, 7, 13, 10, 16, 12, 14,
- 9, 16, 10, 14, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 9, 14, 14, 16, 13, 16, 12, 16, 11, 16, 16, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 5, 14, 9, 14, 8, 14, 12, 14,
- 9, 16, 11, 14, 11, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 10, 14, 11, 16, 12, 14, 10, 16, 11, 15, 12, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 12, 16, 14, 16, 14, 16,
- 13, 16, 12, 16, 15, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 13, 16, 11, 16, 14, 16, 13, 16, 14, 16, 13, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 14, 16, 13, 16, 14, 16,
- 13, 16, 14, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 15, 16, 16, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 1, 12, 6, 12, 8, 14, 11, 13,
- 8, 14, 10, 13, 11, 14, 13, 14, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 14, 7, 13, 10, 14, 11, 14, 9, 16, 10, 14, 12, 16, 13, 15,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 9, 14, 13, 16, 13, 14,
- 12, 16, 11, 15, 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 14, 9, 13, 8, 14, 12, 14, 9, 16, 11, 14, 11, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 7, 15, 9, 14, 10, 16, 12, 14,
- 9, 16, 10, 14, 11, 16, 12, 14, 16, 16, 16, 16, 16, 16, 15, 16,
- 11, 16, 11, 15, 14, 16, 13, 15, 12, 16, 11, 15, 14, 16, 13, 14,
- 16, 16, 14, 16, 16, 16, 14, 16, 10, 16, 13, 16, 10, 16, 13, 16,
- 12, 16, 14, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 13, 16, 12, 16, 13, 16, 12, 16, 13, 16, 12, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 15, 16, 14, 16, 14, 16, 16, 16, 14, 16,
- 15, 16, 14, 16, 14, 16, 14, 16, 16, 16, 16, 16, 16, 16, 14, 14,
- 4, 14, 8, 13, 9, 16, 12, 14, 9, 16, 11, 14, 11, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 15, 8, 13, 10, 16, 12, 14,
- 10, 16, 11, 14, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 16, 9, 14, 13, 16, 13, 15, 12, 16, 11, 16, 14, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 9, 14, 9, 16, 12, 14,
- 10, 16, 11, 15, 12, 16, 13, 15, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 10, 14, 11, 16, 12, 14, 10, 16, 11, 14, 12, 16, 13, 15,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 15, 14, 16, 13, 15,
- 12, 16, 11, 15, 14, 16, 13, 14, 16, 16, 14, 16, 16, 16, 14, 16,
- 10, 16, 13, 16, 10, 16, 13, 15, 13, 16, 14, 16, 12, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 12, 16, 13, 16,
- 12, 16, 13, 16, 11, 16, 13, 16, 16, 16, 16, 16, 15, 16, 15, 16,
- 14, 16, 14, 16, 15, 16, 14, 16, 14, 16, 14, 16, 14, 16, 14, 14,
- 16, 16, 14, 16, 15, 16, 14, 14, 6, 16, 9, 14, 10, 16, 12, 14,
- 10, 16, 11, 13, 12, 16, 13, 14, 16, 16, 16, 16, 16, 16, 14, 14,
- 7, 16, 9, 14, 10, 16, 12, 13, 11, 16, 11, 14, 12, 16, 12, 14,
- 16, 16, 16, 16, 16, 16, 14, 14, 9, 16, 9, 14, 12, 16, 11, 13,
- 12, 16, 11, 14, 12, 16, 12, 13, 16, 16, 14, 16, 16, 16, 13, 14,
- 7, 16, 10, 14, 10, 16, 12, 14, 11, 16, 11, 14, 11, 16, 12, 14,
- 16, 16, 16, 16, 16, 16, 14, 14, 8, 16, 10, 14, 10, 16, 11, 13,
- 10, 16, 11, 13, 11, 16, 12, 13, 16, 16, 14, 16, 16, 16, 14, 14,
- 10, 16, 9, 13, 12, 16, 11, 13, 11, 16, 10, 13, 12, 16, 11, 12,
- 16, 16, 13, 15, 15, 16, 13, 13, 9, 16, 11, 14, 9, 16, 11, 13,
- 12, 16, 12, 16, 12, 16, 12, 13, 16, 16, 16, 16, 15, 16, 14, 14,
- 10, 16, 11, 14, 10, 16, 11, 13, 11, 16, 12, 14, 10, 15, 11, 13,
- 16, 16, 15, 16, 13, 16, 13, 13, 12, 16, 11, 13, 12, 16, 11, 12,
- 12, 16, 11, 13, 11, 14, 11, 11, 13, 16, 12, 13, 12, 14, 11, 11,
- ], [
- 0, 10, 5, 10, 6, 11, 8, 10, 7, 12, 8, 11, 8, 12, 9, 10,
- 14, 16, 13, 13, 13, 14, 12, 11, 4, 12, 6, 10, 8, 12, 9, 10,
- 8, 13, 8, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11,
- 9, 15, 8, 12, 12, 14, 10, 11, 11, 16, 9, 12, 12, 14, 10, 10,
- 14, 16, 11, 13, 13, 15, 11, 11, 4, 12, 8, 11, 6, 11, 9, 10,
- 8, 13, 9, 11, 8, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11,
- 7, 13, 8, 11, 9, 12, 9, 10, 8, 13, 9, 11, 9, 12, 9, 10,
- 14, 16, 12, 13, 12, 13, 11, 10, 11, 16, 10, 12, 12, 14, 10, 11,
- 11, 16, 10, 12, 12, 14, 10, 10, 15, 16, 11, 13, 13, 14, 11, 10,
- 10, 16, 11, 13, 9, 13, 10, 11, 11, 15, 12, 13, 10, 12, 10, 11,
- 15, 16, 13, 14, 12, 13, 11, 11, 11, 16, 11, 13, 10, 13, 10, 11,
- 12, 16, 11, 13, 10, 13, 10, 10, 15, 16, 13, 14, 12, 13, 11, 10,
- 13, 16, 12, 13, 13, 14, 11, 11, 14, 16, 12, 13, 12, 14, 11, 10,
- 16, 16, 13, 13, 13, 14, 11, 9, 3, 11, 6, 10, 6, 11, 9, 10,
- 8, 12, 8, 11, 9, 12, 9, 10, 14, 16, 13, 13, 13, 13, 12, 11,
- 5, 12, 6, 10, 8, 12, 9, 10, 8, 13, 8, 11, 9, 12, 9, 10,
- 14, 16, 12, 13, 13, 14, 11, 11, 9, 15, 8, 11, 11, 14, 10, 10,
- 11, 15, 9, 11, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 11, 10,
- 5, 12, 8, 11, 7, 11, 9, 10, 8, 13, 9, 11, 9, 12, 9, 10,
- 14, 16, 12, 13, 13, 13, 11, 11, 7, 13, 8, 11, 8, 12, 9, 10,
- 8, 13, 8, 11, 9, 12, 9, 9, 13, 16, 11, 13, 12, 13, 11, 10,
- 10, 15, 9, 12, 11, 14, 10, 10, 11, 15, 9, 11, 11, 13, 10, 10,
- 14, 16, 11, 12, 13, 14, 10, 10, 9, 16, 11, 13, 9, 12, 10, 10,
- 11, 16, 11, 13, 9, 12, 10, 10, 15, 16, 13, 14, 12, 13, 11, 10,
- 11, 16, 11, 13, 10, 13, 10, 10, 11, 15, 11, 13, 9, 12, 10, 10,
- 14, 16, 12, 13, 11, 13, 10, 10, 13, 16, 12, 13, 12, 14, 11, 10,
- 13, 16, 11, 13, 12, 13, 10, 10, 14, 16, 11, 12, 12, 13, 10, 9,
- 7, 14, 8, 12, 9, 13, 10, 11, 10, 14, 10, 12, 11, 13, 11, 11,
- 16, 16, 14, 14, 14, 14, 12, 12, 7, 14, 8, 12, 9, 13, 10, 11,
- 10, 14, 10, 12, 11, 13, 10, 11, 16, 16, 13, 13, 14, 14, 12, 11,
- 10, 15, 9, 12, 12, 14, 10, 10, 12, 16, 9, 12, 12, 14, 10, 10,
- 16, 16, 12, 13, 14, 15, 12, 11, 8, 14, 9, 12, 9, 13, 10, 11,
- 10, 15, 10, 12, 10, 13, 10, 11, 16, 16, 14, 14, 14, 14, 12, 11,
- 8, 14, 9, 12, 9, 13, 10, 11, 10, 14, 10, 12, 10, 13, 10, 10,
- 15, 16, 13, 13, 13, 14, 12, 11, 10, 15, 10, 12, 12, 14, 10, 10,
- 11, 16, 9, 12, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 11, 10,
- 11, 16, 11, 14, 9, 13, 10, 11, 12, 16, 12, 14, 10, 13, 11, 11,
- 16, 16, 14, 15, 13, 14, 12, 11, 11, 16, 12, 14, 10, 13, 11, 11,
- 11, 16, 11, 13, 10, 13, 10, 10, 15, 16, 13, 14, 12, 13, 11, 10,
- 13, 16, 12, 14, 13, 14, 11, 10, 12, 16, 11, 13, 12, 13, 10, 10,
- 14, 16, 11, 12, 11, 13, 10, 9, 10, 16, 10, 13, 11, 14, 11, 11,
- 12, 16, 11, 13, 12, 14, 11, 11, 16, 16, 14, 13, 14, 15, 12, 11,
- 10, 16, 10, 13, 10, 14, 11, 11, 12, 16, 11, 13, 11, 14, 11, 11,
- 16, 16, 14, 13, 14, 14, 12, 11, 11, 15, 9, 12, 11, 14, 10, 10,
- 13, 16, 10, 12, 12, 14, 10, 10, 16, 16, 13, 13, 14, 14, 11, 10,
- 10, 16, 10, 13, 11, 14, 11, 11, 12, 16, 11, 13, 12, 14, 11, 11,
- 16, 16, 14, 14, 14, 14, 12, 11, 9, 16, 10, 13, 10, 14, 11, 11,
- 11, 15, 11, 12, 11, 13, 11, 11, 16, 16, 13, 13, 14, 14, 12, 10,
- 10, 15, 9, 12, 11, 14, 10, 10, 11, 16, 9, 11, 11, 13, 10, 9,
- 15, 16, 11, 12, 13, 14, 10, 9, 11, 16, 11, 13, 10, 13, 10, 10,
- 13, 16, 12, 13, 11, 13, 10, 10, 16, 16, 14, 14, 13, 13, 11, 10,
- 11, 16, 11, 13, 10, 13, 10, 10, 12, 16, 11, 13, 10, 13, 10, 10,
- 15, 16, 13, 13, 12, 13, 11, 9, 11, 16, 11, 12, 11, 13, 10, 9,
- 11, 15, 10, 11, 11, 12, 9, 8, 13, 15, 10, 10, 10, 11, 8, 7,
- ], [
- 0, 9, 3, 8, 5, 9, 7, 8, 5, 11, 6, 9, 8, 11, 8, 9,
- 16, 16, 16, 16, 16, 16, 11, 10, 2, 10, 4, 9, 7, 10, 7, 8,
- 7, 16, 7, 10, 9, 11, 8, 9, 16, 16, 11, 16, 16, 16, 11, 10,
- 7, 16, 7, 10, 10, 16, 8, 9, 10, 16, 8, 10, 11, 16, 9, 9,
- 16, 16, 16, 16, 16, 16, 11, 10, 3, 11, 6, 9, 6, 11, 8, 8,
- 7, 16, 8, 10, 8, 11, 8, 9, 16, 16, 15, 16, 16, 16, 11, 10,
- 5, 11, 7, 9, 8, 11, 8, 8, 7, 16, 7, 10, 8, 11, 8, 8,
- 16, 16, 11, 16, 16, 16, 10, 9, 9, 16, 8, 11, 11, 16, 9, 9,
- 10, 16, 8, 11, 11, 16, 9, 9, 16, 16, 10, 16, 16, 16, 10, 9,
- 8, 16, 10, 11, 8, 16, 9, 9, 11, 16, 11, 16, 10, 16, 10, 9,
- 16, 16, 16, 16, 16, 16, 11, 10, 9, 16, 10, 16, 10, 16, 9, 9,
- 10, 16, 10, 16, 9, 16, 9, 9, 16, 16, 16, 16, 15, 16, 10, 9,
- 16, 16, 11, 16, 16, 16, 10, 10, 13, 16, 11, 16, 11, 16, 10, 9,
- 16, 16, 10, 11, 11, 16, 9, 8, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 1, 10, 6, 10, 7, 11, 9, 10, 8, 12, 9, 12, 9, 12, 10, 10,
- 16, 16, 14, 16, 14, 15, 13, 12, 5, 12, 7, 10, 9, 11, 9, 10,
- 9, 13, 9, 12, 10, 13, 10, 10, 16, 16, 14, 15, 14, 14, 13, 12,
- 10, 15, 10, 12, 12, 14, 11, 11, 12, 16, 11, 13, 12, 14, 11, 11,
- 16, 16, 14, 16, 15, 16, 13, 12, 6, 12, 8, 11, 8, 11, 10, 10,
- 9, 13, 10, 12, 10, 12, 10, 10, 15, 16, 13, 15, 13, 14, 12, 12,
- 7, 13, 9, 11, 9, 12, 10, 10, 9, 14, 10, 12, 10, 13, 10, 10,
- 15, 16, 13, 15, 13, 14, 12, 11, 11, 15, 11, 13, 12, 14, 11, 11,
- 12, 16, 11, 13, 12, 14, 11, 11, 16, 16, 13, 15, 14, 16, 12, 11,
- 10, 16, 12, 14, 10, 13, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11,
- 16, 16, 15, 16, 14, 16, 13, 12, 11, 16, 12, 14, 11, 14, 11, 11,
- 12, 16, 12, 14, 11, 14, 11, 11, 16, 16, 14, 15, 13, 15, 12, 12,
- 13, 16, 13, 15, 13, 15, 12, 12, 13, 16, 12, 15, 12, 15, 11, 11,
- 16, 16, 13, 16, 13, 15, 12, 11, 4, 11, 7, 10, 7, 11, 9, 10,
- 9, 13, 9, 12, 10, 12, 10, 10, 15, 16, 14, 15, 14, 15, 13, 12,
- 6, 12, 7, 11, 9, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 10,
- 15, 16, 14, 15, 14, 15, 12, 12, 10, 15, 9, 12, 12, 13, 11, 11,
- 12, 15, 11, 13, 12, 14, 11, 11, 16, 16, 13, 15, 14, 16, 12, 12,
- 6, 12, 8, 11, 8, 11, 9, 10, 9, 14, 10, 12, 10, 12, 10, 10,
- 14, 16, 13, 14, 13, 14, 12, 12, 8, 13, 9, 11, 9, 12, 10, 10,
- 9, 13, 9, 12, 9, 12, 9, 10, 14, 16, 13, 14, 13, 14, 12, 11,
- 11, 15, 11, 13, 11, 14, 11, 11, 12, 16, 10, 13, 12, 13, 11, 10,
- 15, 16, 12, 15, 13, 16, 12, 11, 10, 15, 11, 13, 10, 13, 11, 11,
- 12, 16, 12, 14, 11, 13, 11, 11, 16, 16, 14, 15, 13, 16, 13, 12,
- 11, 16, 11, 14, 11, 13, 11, 11, 12, 16, 12, 14, 10, 13, 11, 11,
- 15, 16, 13, 16, 12, 14, 12, 11, 12, 16, 12, 14, 12, 15, 11, 11,
- 13, 16, 12, 14, 12, 14, 11, 11, 15, 16, 13, 15, 13, 15, 11, 10,
- 7, 13, 9, 12, 10, 13, 11, 11, 11, 15, 12, 13, 12, 13, 11, 11,
- 16, 16, 15, 16, 16, 16, 14, 13, 8, 13, 9, 12, 10, 13, 11, 11,
- 12, 15, 11, 13, 12, 13, 11, 11, 16, 16, 14, 15, 15, 16, 13, 12,
- 11, 16, 11, 13, 12, 14, 11, 11, 13, 16, 12, 14, 13, 15, 12, 11,
- 16, 16, 14, 16, 15, 16, 13, 12, 9, 15, 10, 13, 10, 13, 11, 11,
- 12, 15, 11, 13, 11, 13, 11, 11, 16, 16, 14, 16, 16, 16, 13, 12,
- 9, 14, 10, 13, 10, 13, 11, 11, 11, 14, 11, 13, 11, 13, 11, 11,
- 16, 16, 14, 16, 14, 16, 12, 12, 11, 16, 11, 14, 12, 14, 12, 11,
- 12, 16, 11, 13, 13, 14, 11, 11, 16, 16, 13, 15, 14, 16, 12, 11,
- 12, 16, 12, 14, 11, 14, 11, 11, 13, 16, 13, 14, 12, 15, 12, 11,
- 16, 16, 16, 16, 14, 16, 13, 12, 12, 16, 12, 14, 11, 14, 12, 11,
- 12, 16, 12, 15, 11, 14, 11, 11, 16, 16, 14, 16, 13, 15, 12, 12,
- 13, 16, 13, 16, 13, 16, 12, 12, 13, 16, 12, 15, 12, 16, 11, 11,
- 14, 16, 12, 15, 12, 15, 11, 10, 9, 16, 11, 14, 12, 14, 12, 12,
- 13, 16, 13, 15, 14, 16, 12, 12, 16, 16, 16, 16, 16, 16, 14, 13,
- 10, 16, 11, 14, 12, 14, 12, 12, 13, 16, 13, 14, 13, 16, 12, 12,
- 16, 16, 15, 16, 16, 16, 13, 12, 11, 16, 11, 14, 12, 15, 12, 11,
- 13, 16, 12, 14, 13, 16, 12, 11, 16, 16, 14, 16, 16, 16, 13, 12,
- 11, 16, 11, 14, 12, 14, 12, 12, 13, 16, 12, 15, 13, 16, 12, 12,
- 16, 16, 16, 16, 16, 16, 14, 13, 10, 16, 11, 14, 11, 15, 11, 11,
- 13, 16, 12, 14, 12, 14, 12, 11, 16, 16, 14, 16, 16, 16, 13, 12,
- 11, 16, 11, 15, 12, 15, 12, 11, 13, 16, 11, 14, 13, 15, 12, 11,
- 16, 16, 13, 16, 14, 16, 12, 11, 12, 16, 12, 15, 11, 15, 12, 11,
- 14, 16, 13, 15, 12, 16, 12, 11, 16, 16, 15, 16, 14, 16, 13, 12,
- 11, 16, 12, 15, 11, 15, 11, 11, 13, 16, 13, 16, 11, 15, 11, 11,
- 16, 16, 14, 16, 13, 15, 12, 11, 12, 16, 12, 15, 12, 16, 11, 11,
- 12, 16, 11, 15, 12, 14, 11, 11, 13, 16, 12, 13, 11, 13, 10, 9,
- ],
- ], [
- [
- 0, 13, 6, 13, 8, 14, 12, 16, 8, 16, 11, 16, 12, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 16, 7, 14, 11, 16, 13, 16,
- 9, 16, 11, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 10, 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 5, 16, 10, 16, 8, 16, 13, 16,
- 10, 16, 12, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 10, 16, 11, 16, 13, 16, 10, 16, 12, 16, 12, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 12, 16, 16, 16, 16, 16,
- 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 11, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16,
- 14, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 1, 13, 7, 13, 8, 16, 12, 16,
- 8, 16, 10, 16, 11, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 4, 16, 7, 14, 10, 16, 12, 16, 9, 16, 10, 16, 12, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 9, 16, 14, 16, 14, 16,
- 13, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 16, 9, 16, 8, 16, 12, 16, 9, 16, 11, 16, 11, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 10, 16, 11, 16, 13, 16,
- 9, 16, 11, 16, 11, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 12, 16, 16, 16, 14, 16, 13, 16, 12, 16, 16, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 13, 16, 11, 16, 14, 16,
- 13, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 14, 16, 13, 16, 14, 16, 13, 16, 14, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 4, 16, 8, 16, 9, 16, 13, 16, 10, 16, 11, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 8, 16, 11, 16, 13, 16,
- 10, 16, 11, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 16, 9, 16, 13, 16, 13, 16, 13, 16, 12, 16, 16, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 10, 16, 13, 16,
- 10, 16, 12, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 10, 16, 11, 16, 13, 16, 10, 16, 11, 16, 12, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 16, 16, 16, 14, 16,
- 12, 16, 11, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 13, 16, 10, 16, 13, 16, 13, 16, 16, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 13, 16, 12, 16, 14, 16,
- 12, 16, 15, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 10, 16, 13, 16,
- 11, 16, 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 9, 16, 11, 16, 12, 16, 11, 16, 11, 16, 12, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 9, 16, 12, 16, 12, 16,
- 13, 16, 11, 16, 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 10, 16, 10, 16, 12, 16, 11, 16, 12, 16, 12, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 10, 16, 11, 16, 12, 16,
- 10, 16, 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 10, 14, 12, 16, 12, 16, 11, 16, 10, 14, 13, 16, 12, 14,
- 16, 16, 14, 16, 16, 16, 14, 16, 9, 16, 12, 16, 10, 16, 12, 16,
- 13, 16, 13, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 12, 16, 11, 16, 12, 16, 11, 16, 12, 16, 11, 16, 12, 15,
- 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 12, 16, 13, 16, 12, 13,
- 12, 16, 12, 16, 12, 16, 12, 13, 16, 16, 13, 14, 13, 16, 13, 13,
- ], [
- 0, 10, 5, 10, 5, 10, 8, 10, 6, 11, 8, 11, 8, 11, 9, 10,
- 14, 16, 13, 14, 13, 14, 12, 12, 4, 12, 5, 10, 8, 12, 9, 10,
- 7, 12, 8, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 12, 12,
- 9, 16, 8, 12, 12, 14, 10, 11, 11, 16, 9, 12, 12, 14, 11, 11,
- 14, 16, 12, 13, 14, 15, 12, 12, 4, 12, 7, 11, 6, 11, 9, 10,
- 8, 12, 9, 11, 8, 11, 9, 10, 14, 16, 12, 14, 13, 14, 12, 12,
- 7, 13, 8, 11, 8, 12, 9, 10, 8, 13, 8, 11, 9, 12, 9, 10,
- 14, 16, 12, 13, 12, 13, 11, 11, 11, 16, 10, 12, 12, 14, 11, 11,
- 12, 16, 10, 12, 12, 14, 11, 11, 16, 16, 12, 13, 14, 15, 12, 11,
- 10, 16, 11, 14, 9, 13, 10, 11, 11, 16, 12, 14, 10, 13, 11, 11,
- 15, 16, 13, 14, 13, 14, 12, 12, 11, 16, 12, 14, 10, 13, 11, 11,
- 12, 16, 12, 14, 11, 13, 11, 11, 15, 16, 13, 14, 13, 14, 12, 11,
- 14, 16, 13, 14, 13, 15, 12, 12, 14, 16, 12, 14, 13, 15, 11, 11,
- 16, 16, 13, 14, 14, 15, 12, 11, 3, 11, 5, 10, 6, 11, 9, 10,
- 7, 12, 8, 11, 9, 11, 9, 10, 14, 16, 13, 13, 13, 14, 12, 12,
- 5, 12, 6, 10, 8, 12, 9, 10, 8, 13, 8, 11, 9, 12, 9, 10,
- 14, 16, 12, 13, 13, 14, 12, 12, 9, 16, 8, 11, 11, 14, 10, 11,
- 11, 16, 9, 12, 12, 14, 10, 11, 15, 16, 12, 13, 14, 15, 12, 11,
- 5, 12, 7, 11, 6, 11, 9, 10, 8, 13, 9, 11, 8, 11, 9, 10,
- 14, 16, 12, 14, 13, 13, 12, 12, 7, 13, 8, 11, 8, 12, 9, 10,
- 8, 12, 8, 11, 9, 12, 9, 10, 13, 16, 12, 13, 12, 13, 11, 11,
- 10, 16, 9, 12, 12, 14, 10, 11, 11, 15, 9, 12, 12, 14, 10, 11,
- 14, 16, 11, 13, 13, 14, 11, 11, 9, 16, 11, 14, 8, 13, 10, 11,
- 11, 16, 12, 13, 10, 13, 10, 11, 16, 16, 13, 15, 13, 14, 12, 12,
- 11, 16, 11, 14, 10, 13, 10, 11, 11, 16, 11, 13, 10, 13, 10, 11,
- 14, 16, 13, 14, 12, 13, 11, 11, 14, 16, 12, 14, 13, 15, 11, 11,
- 13, 16, 12, 13, 12, 14, 11, 11, 14, 16, 12, 13, 12, 13, 11, 10,
- 6, 14, 8, 12, 9, 13, 10, 11, 10, 14, 10, 12, 11, 13, 11, 12,
- 16, 16, 14, 14, 14, 14, 13, 12, 7, 14, 8, 12, 9, 13, 10, 11,
- 10, 14, 10, 12, 11, 13, 11, 11, 16, 16, 13, 14, 14, 15, 13, 12,
- 10, 16, 8, 12, 12, 14, 10, 11, 12, 16, 10, 12, 13, 15, 11, 11,
- 16, 16, 13, 14, 15, 16, 12, 12, 8, 15, 9, 13, 9, 13, 10, 11,
- 10, 15, 10, 13, 10, 13, 11, 11, 16, 16, 14, 14, 14, 14, 13, 12,
- 8, 15, 9, 12, 10, 13, 10, 11, 10, 14, 10, 12, 10, 13, 10, 11,
- 16, 16, 13, 14, 13, 14, 12, 12, 10, 16, 10, 13, 12, 15, 11, 11,
- 11, 16, 9, 12, 12, 14, 11, 11, 14, 16, 11, 13, 14, 16, 12, 11,
- 10, 16, 12, 14, 9, 13, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11,
- 16, 16, 15, 16, 14, 14, 13, 12, 11, 16, 12, 14, 11, 14, 11, 11,
- 11, 16, 12, 14, 10, 13, 11, 11, 15, 16, 13, 15, 12, 14, 12, 11,
- 14, 16, 13, 14, 13, 16, 12, 12, 12, 16, 12, 13, 12, 14, 11, 11,
- 14, 16, 11, 12, 12, 13, 10, 10, 9, 16, 10, 14, 11, 15, 12, 12,
- 12, 16, 11, 13, 12, 15, 12, 12, 16, 16, 14, 13, 15, 15, 13, 12,
- 10, 16, 10, 14, 11, 15, 11, 12, 12, 16, 11, 13, 12, 14, 12, 12,
- 16, 16, 14, 13, 15, 14, 13, 12, 11, 16, 9, 12, 12, 14, 11, 11,
- 13, 16, 11, 13, 13, 15, 11, 11, 16, 16, 14, 14, 16, 16, 12, 12,
- 10, 16, 10, 14, 11, 14, 11, 12, 12, 16, 11, 13, 12, 14, 12, 12,
- 16, 16, 14, 14, 15, 15, 13, 12, 10, 16, 10, 13, 11, 14, 11, 12,
- 11, 16, 11, 13, 11, 14, 11, 12, 16, 16, 14, 14, 14, 14, 13, 12,
- 11, 16, 10, 12, 12, 15, 11, 11, 12, 16, 9, 12, 12, 14, 10, 11,
- 16, 16, 12, 13, 14, 15, 11, 11, 11, 16, 12, 14, 10, 14, 11, 11,
- 13, 16, 12, 14, 12, 14, 11, 11, 16, 16, 15, 15, 14, 15, 12, 12,
- 11, 16, 12, 14, 11, 14, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11,
- 16, 16, 14, 14, 13, 14, 12, 11, 12, 16, 11, 13, 12, 14, 10, 10,
- 12, 15, 11, 12, 12, 13, 10, 10, 14, 15, 11, 11, 12, 12, 10, 9,
- ], [
- 0, 8, 3, 8, 5, 9, 7, 8, 5, 10, 6, 10, 8, 11, 8, 9,
- 16, 16, 15, 16, 16, 16, 11, 11, 2, 10, 4, 9, 7, 10, 7, 8,
- 7, 16, 7, 10, 9, 11, 8, 9, 16, 16, 15, 16, 16, 16, 11, 11,
- 7, 16, 6, 11, 10, 16, 9, 10, 10, 16, 9, 11, 11, 16, 9, 10,
- 16, 16, 16, 16, 16, 16, 16, 11, 3, 10, 6, 9, 5, 10, 7, 9,
- 7, 16, 8, 10, 8, 11, 8, 9, 16, 16, 16, 16, 16, 16, 11, 11,
- 5, 11, 7, 10, 8, 11, 8, 9, 7, 14, 7, 10, 8, 11, 8, 9,
- 16, 16, 11, 16, 16, 16, 10, 11, 9, 16, 9, 11, 11, 16, 9, 10,
- 10, 16, 8, 11, 11, 16, 9, 10, 16, 16, 11, 16, 16, 16, 11, 10,
- 8, 16, 9, 16, 7, 16, 9, 10, 11, 16, 11, 16, 10, 16, 10, 10,
- 16, 16, 16, 16, 16, 16, 16, 11, 9, 16, 10, 16, 9, 16, 9, 10,
- 10, 16, 10, 16, 9, 16, 9, 10, 16, 16, 16, 16, 11, 16, 11, 11,
- 16, 16, 16, 16, 16, 16, 10, 10, 11, 16, 11, 16, 11, 16, 10, 10,
- 16, 16, 11, 16, 11, 16, 10, 9, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 1, 10, 6, 10, 7, 11, 9, 10, 8, 12, 9, 12, 9, 12, 10, 10,
- 15, 16, 14, 15, 14, 16, 13, 12, 5, 12, 7, 11, 8, 11, 9, 10,
- 9, 13, 9, 12, 10, 12, 10, 10, 16, 16, 14, 15, 13, 16, 13, 12,
- 10, 15, 10, 13, 12, 14, 11, 11, 12, 16, 11, 13, 12, 14, 11, 11,
- 16, 16, 14, 16, 14, 16, 13, 12, 5, 12, 8, 11, 7, 11, 9, 10,
- 9, 13, 10, 12, 9, 12, 10, 10, 14, 16, 14, 15, 13, 14, 13, 12,
- 7, 13, 9, 12, 9, 12, 10, 10, 9, 13, 9, 12, 9, 12, 10, 10,
- 14, 16, 13, 14, 13, 15, 12, 12, 11, 16, 11, 13, 12, 14, 11, 11,
- 12, 16, 11, 14, 12, 14, 11, 11, 16, 16, 14, 16, 14, 16, 13, 12,
- 10, 16, 11, 14, 10, 13, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11,
- 15, 16, 15, 16, 14, 16, 13, 12, 11, 16, 12, 14, 11, 14, 11, 12,
- 12, 16, 12, 14, 11, 14, 11, 11, 15, 16, 14, 16, 13, 16, 13, 12,
- 13, 16, 13, 16, 13, 16, 12, 12, 13, 16, 13, 16, 13, 16, 12, 12,
- 16, 16, 14, 15, 14, 16, 13, 12, 4, 11, 7, 10, 7, 11, 9, 10,
- 9, 13, 9, 11, 9, 12, 10, 10, 15, 16, 14, 15, 14, 15, 13, 12,
- 6, 12, 7, 11, 8, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 10,
- 15, 16, 13, 14, 14, 15, 12, 12, 10, 14, 10, 12, 12, 13, 11, 11,
- 12, 16, 11, 13, 12, 14, 11, 11, 16, 16, 14, 15, 15, 16, 13, 12,
- 6, 12, 8, 11, 8, 11, 9, 10, 9, 13, 10, 12, 9, 12, 10, 10,
- 16, 16, 14, 15, 13, 14, 12, 12, 8, 13, 9, 11, 9, 12, 9, 10,
- 9, 13, 9, 12, 9, 12, 9, 10, 14, 16, 13, 14, 13, 14, 12, 11,
- 11, 15, 11, 13, 12, 14, 11, 11, 11, 16, 10, 13, 12, 14, 11, 11,
- 15, 16, 13, 15, 14, 16, 12, 11, 10, 16, 12, 13, 10, 13, 11, 11,
- 11, 16, 12, 14, 10, 13, 11, 11, 16, 16, 14, 16, 13, 16, 13, 12,
- 11, 16, 12, 14, 10, 14, 11, 11, 11, 16, 12, 14, 10, 13, 11, 11,
- 16, 16, 14, 16, 12, 15, 12, 11, 13, 16, 13, 15, 13, 15, 12, 12,
- 13, 16, 12, 15, 12, 15, 12, 11, 15, 16, 13, 16, 13, 16, 12, 11,
- 8, 14, 9, 12, 10, 13, 11, 11, 11, 16, 11, 13, 11, 13, 11, 11,
- 16, 16, 16, 16, 16, 16, 14, 13, 9, 14, 10, 12, 10, 13, 11, 11,
- 11, 16, 11, 13, 12, 13, 11, 11, 16, 16, 15, 16, 15, 16, 14, 12,
- 11, 16, 11, 13, 12, 14, 12, 11, 13, 16, 12, 14, 13, 14, 12, 11,
- 16, 16, 15, 16, 16, 16, 14, 13, 9, 14, 10, 13, 10, 13, 11, 11,
- 11, 16, 11, 13, 11, 13, 11, 11, 16, 16, 15, 16, 14, 15, 14, 13,
- 9, 14, 10, 13, 10, 13, 11, 11, 11, 15, 11, 13, 11, 13, 11, 11,
- 16, 16, 14, 16, 14, 16, 13, 12, 12, 16, 12, 14, 13, 14, 12, 11,
- 12, 16, 11, 14, 12, 15, 12, 11, 16, 16, 13, 16, 15, 16, 13, 11,
- 11, 16, 12, 14, 11, 14, 12, 11, 13, 16, 13, 15, 12, 14, 12, 12,
- 16, 16, 16, 16, 14, 16, 14, 13, 12, 16, 13, 15, 11, 14, 12, 12,
- 12, 16, 13, 14, 11, 15, 12, 11, 16, 16, 15, 16, 13, 15, 13, 12,
- 13, 16, 13, 15, 13, 16, 12, 12, 13, 16, 13, 15, 13, 15, 12, 12,
- 15, 16, 13, 16, 13, 15, 11, 10, 10, 16, 12, 14, 12, 15, 12, 12,
- 14, 16, 13, 15, 13, 16, 13, 12, 16, 16, 16, 16, 16, 16, 15, 13,
- 10, 16, 12, 14, 12, 15, 12, 12, 13, 16, 13, 15, 13, 15, 13, 12,
- 16, 16, 16, 16, 16, 16, 14, 13, 11, 16, 12, 15, 13, 16, 12, 12,
- 14, 16, 13, 16, 13, 16, 12, 12, 16, 16, 15, 16, 15, 16, 14, 12,
- 11, 16, 12, 14, 12, 16, 12, 12, 14, 16, 13, 15, 13, 15, 13, 12,
- 16, 16, 16, 16, 16, 16, 15, 13, 11, 16, 12, 14, 12, 15, 12, 12,
- 13, 16, 12, 14, 12, 15, 12, 12, 16, 16, 16, 16, 16, 16, 14, 12,
- 12, 16, 12, 15, 13, 16, 12, 12, 13, 16, 12, 15, 13, 15, 12, 11,
- 16, 16, 14, 16, 15, 16, 13, 12, 12, 16, 13, 16, 12, 16, 12, 12,
- 15, 16, 14, 16, 13, 16, 12, 12, 16, 16, 16, 16, 16, 16, 14, 13,
- 12, 16, 13, 15, 12, 16, 12, 12, 13, 16, 13, 15, 12, 15, 12, 12,
- 16, 16, 15, 16, 14, 16, 13, 12, 13, 16, 13, 16, 12, 16, 12, 12,
- 13, 16, 12, 16, 12, 15, 12, 12, 14, 16, 12, 14, 12, 14, 11, 10,
- ],
- ], [
- [
- 0, 16, 6, 16, 8, 16, 16, 16, 9, 16, 11, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 16, 7, 16, 11, 16, 16, 16,
- 10, 16, 11, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 10, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 5, 16, 10, 16, 9, 16, 16, 16,
- 10, 16, 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 11, 16, 12, 16, 16, 16, 10, 16, 12, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 7, 16, 8, 16, 13, 16,
- 9, 16, 11, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 4, 16, 7, 16, 11, 16, 13, 16, 9, 16, 11, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 9, 16, 16, 16, 16, 16,
- 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 4, 16, 10, 16, 8, 16, 16, 16, 10, 16, 12, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 10, 16, 11, 16, 16, 16,
- 9, 16, 11, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 12, 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 16, 16, 11, 16, 16, 16,
- 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 4, 16, 8, 16, 10, 16, 16, 16, 10, 16, 11, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 8, 16, 11, 16, 16, 16,
- 10, 16, 12, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 16, 9, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 10, 16, 16, 16,
- 11, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 11, 16, 11, 16, 16, 16, 10, 16, 12, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 12, 16, 16, 16, 16, 16,
- 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 16, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 12, 16, 16, 16,
- 12, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 11, 16, 16, 16,
- 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 9, 16, 11, 16, 13, 16, 11, 16, 12, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 9, 16, 13, 16, 12, 16,
- 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 10, 16, 10, 16, 14, 16, 12, 16, 12, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 11, 16, 11, 16, 13, 16,
- 10, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 10, 16, 13, 16, 12, 16, 12, 16, 11, 16, 16, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 12, 16, 10, 16, 13, 16,
- 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 13, 16, 11, 16, 13, 16, 12, 16, 13, 16, 12, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 13, 16, 16, 16, 12, 16,
- 13, 16, 12, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 0, 10, 4, 10, 5, 11, 9, 11, 6, 11, 8, 11, 8, 12, 10, 12,
- 15, 16, 13, 15, 14, 15, 13, 14, 4, 12, 5, 11, 8, 12, 9, 11,
- 7, 13, 8, 12, 9, 13, 10, 12, 15, 16, 13, 15, 14, 16, 13, 14,
- 10, 16, 9, 13, 12, 16, 11, 13, 11, 16, 10, 14, 13, 16, 12, 13,
- 16, 16, 14, 16, 15, 16, 14, 15, 4, 12, 7, 12, 6, 12, 9, 11,
- 8, 13, 9, 12, 9, 12, 10, 12, 15, 16, 13, 15, 14, 15, 13, 14,
- 7, 13, 8, 12, 9, 13, 10, 12, 8, 13, 9, 12, 9, 13, 10, 12,
- 14, 16, 13, 15, 13, 15, 13, 14, 12, 16, 11, 14, 13, 16, 12, 13,
- 12, 16, 11, 14, 13, 16, 12, 13, 16, 16, 14, 16, 15, 16, 14, 15,
- 10, 16, 12, 16, 10, 14, 12, 13, 12, 16, 13, 16, 11, 14, 12, 13,
- 16, 16, 16, 16, 15, 16, 14, 15, 12, 16, 13, 16, 11, 15, 12, 13,
- 13, 16, 13, 16, 12, 15, 12, 14, 16, 16, 16, 16, 14, 16, 13, 14,
- 16, 16, 14, 16, 14, 16, 13, 15, 16, 16, 14, 16, 14, 16, 13, 15,
- 16, 16, 16, 16, 16, 16, 14, 16, 2, 11, 5, 11, 6, 11, 9, 11,
- 7, 12, 8, 11, 9, 12, 10, 12, 15, 16, 14, 14, 14, 14, 13, 14,
- 4, 13, 6, 11, 8, 12, 9, 11, 8, 13, 8, 12, 10, 13, 10, 12,
- 15, 16, 13, 15, 14, 15, 13, 14, 9, 16, 8, 13, 12, 15, 11, 12,
- 11, 16, 10, 14, 13, 16, 12, 13, 16, 16, 14, 16, 16, 16, 14, 15,
- 5, 13, 8, 12, 7, 12, 9, 11, 8, 13, 9, 12, 9, 12, 10, 12,
- 16, 16, 14, 15, 14, 15, 13, 13, 7, 13, 8, 12, 9, 13, 10, 12,
- 8, 13, 8, 12, 9, 13, 10, 12, 14, 16, 13, 14, 13, 15, 12, 13,
- 11, 16, 10, 14, 13, 16, 12, 13, 11, 16, 10, 13, 12, 15, 11, 13,
- 14, 16, 12, 14, 14, 16, 13, 14, 10, 16, 12, 15, 9, 14, 11, 13,
- 12, 16, 12, 16, 11, 14, 12, 13, 16, 16, 15, 16, 16, 16, 14, 15,
- 11, 16, 12, 15, 11, 15, 12, 13, 12, 16, 12, 15, 11, 14, 12, 13,
- 16, 16, 14, 16, 13, 15, 13, 14, 15, 16, 14, 16, 14, 16, 13, 14,
- 14, 16, 13, 16, 14, 16, 13, 14, 16, 16, 14, 16, 14, 16, 13, 14,
- 7, 15, 8, 13, 9, 14, 11, 13, 10, 14, 10, 13, 11, 14, 12, 13,
- 16, 16, 15, 16, 15, 16, 15, 14, 7, 16, 8, 13, 10, 14, 11, 13,
- 11, 15, 10, 13, 12, 14, 12, 13, 16, 16, 16, 16, 16, 16, 15, 15,
- 10, 16, 9, 13, 13, 16, 12, 13, 13, 16, 11, 14, 14, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 15, 16, 8, 16, 10, 14, 9, 14, 11, 13,
- 11, 16, 11, 14, 11, 14, 12, 13, 16, 16, 16, 16, 16, 16, 14, 15,
- 8, 16, 10, 14, 10, 14, 11, 13, 10, 15, 10, 14, 11, 14, 12, 13,
- 16, 16, 14, 16, 15, 16, 14, 14, 11, 16, 10, 14, 13, 16, 12, 13,
- 11, 16, 10, 13, 13, 16, 12, 13, 16, 16, 13, 16, 16, 16, 14, 14,
- 11, 16, 12, 16, 10, 15, 12, 13, 14, 16, 14, 16, 12, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 13, 16, 11, 16, 12, 14,
- 12, 16, 13, 16, 11, 14, 12, 13, 16, 16, 16, 16, 14, 16, 14, 14,
- 15, 16, 14, 16, 16, 16, 13, 14, 13, 16, 13, 15, 14, 16, 13, 14,
- 14, 16, 13, 14, 14, 15, 13, 14, 9, 16, 11, 16, 12, 16, 13, 14,
- 12, 16, 12, 15, 13, 16, 13, 14, 16, 16, 16, 15, 16, 16, 15, 15,
- 10, 16, 10, 16, 12, 16, 12, 14, 12, 16, 12, 14, 13, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 15, 15, 11, 16, 10, 14, 14, 16, 12, 13,
- 14, 16, 12, 16, 14, 16, 13, 14, 16, 16, 16, 16, 16, 16, 16, 15,
- 10, 16, 12, 16, 11, 16, 12, 14, 13, 16, 12, 15, 13, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 16, 15, 10, 16, 11, 16, 12, 16, 12, 14,
- 12, 16, 12, 15, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 14, 14,
- 11, 16, 10, 14, 14, 16, 12, 13, 13, 16, 11, 14, 14, 16, 12, 13,
- 16, 16, 15, 16, 16, 16, 14, 14, 12, 16, 13, 16, 11, 16, 12, 14,
- 15, 16, 14, 16, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 14, 16,
- 12, 16, 13, 16, 12, 16, 12, 14, 13, 16, 13, 16, 12, 16, 12, 13,
- 16, 16, 16, 16, 16, 16, 14, 15, 13, 16, 13, 16, 14, 16, 12, 13,
- 13, 16, 13, 14, 14, 16, 12, 13, 16, 16, 14, 14, 14, 15, 13, 13,
- ], [
- 0, 9, 3, 9, 5, 9, 7, 9, 5, 10, 7, 11, 8, 11, 9, 10,
- 16, 16, 16, 16, 16, 16, 16, 16, 2, 11, 4, 10, 7, 11, 8, 10,
- 7, 16, 7, 11, 9, 16, 9, 11, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 7, 16, 11, 16, 10, 11, 11, 16, 10, 16, 16, 16, 11, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 2, 11, 6, 10, 6, 10, 8, 10,
- 7, 16, 8, 16, 8, 11, 9, 11, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 13, 7, 11, 8, 11, 9, 11, 6, 12, 8, 12, 8, 12, 9, 11,
- 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 10, 16, 12, 16, 10, 13,
- 10, 16, 9, 16, 11, 16, 11, 12, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 10, 16, 8, 16, 10, 12, 11, 16, 12, 16, 10, 16, 11, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 11, 16, 10, 16, 11, 16,
- 11, 16, 12, 16, 10, 16, 11, 12, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 1, 10, 5, 10, 6, 10, 9, 10, 7, 12, 9, 12, 9, 12, 10, 10,
- 16, 16, 15, 16, 14, 16, 13, 13, 5, 12, 7, 11, 8, 11, 9, 10,
- 8, 13, 9, 12, 10, 12, 10, 11, 16, 16, 16, 16, 14, 16, 13, 12,
- 10, 16, 10, 13, 12, 14, 12, 12, 12, 16, 11, 14, 13, 15, 12, 12,
- 16, 16, 16, 15, 16, 16, 14, 13, 5, 12, 8, 11, 7, 11, 9, 10,
- 8, 13, 10, 12, 9, 12, 10, 10, 15, 16, 14, 15, 14, 14, 13, 13,
- 7, 13, 9, 12, 9, 12, 10, 10, 9, 13, 10, 13, 10, 13, 10, 10,
- 14, 16, 14, 15, 14, 16, 13, 12, 11, 16, 12, 14, 12, 15, 12, 12,
- 12, 16, 12, 15, 13, 16, 12, 12, 16, 16, 15, 16, 16, 16, 14, 13,
- 10, 16, 12, 14, 10, 14, 12, 12, 12, 16, 13, 14, 11, 14, 12, 12,
- 16, 16, 16, 16, 14, 16, 14, 13, 11, 16, 12, 14, 11, 14, 12, 12,
- 12, 16, 13, 16, 11, 15, 12, 12, 16, 16, 16, 16, 14, 16, 14, 13,
- 13, 16, 14, 16, 14, 16, 13, 13, 13, 16, 13, 16, 13, 16, 13, 12,
- 16, 16, 16, 16, 16, 16, 13, 13, 4, 11, 7, 10, 7, 11, 9, 10,
- 8, 12, 9, 12, 9, 12, 10, 11, 15, 16, 14, 15, 14, 16, 13, 13,
- 6, 12, 7, 11, 8, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 10,
- 16, 16, 15, 16, 15, 16, 13, 12, 10, 16, 10, 13, 12, 14, 12, 11,
- 12, 16, 11, 14, 13, 14, 12, 12, 16, 16, 16, 14, 16, 16, 14, 13,
- 6, 12, 8, 11, 7, 11, 9, 10, 9, 14, 10, 12, 9, 12, 10, 10,
- 15, 16, 14, 16, 14, 16, 14, 13, 7, 13, 9, 12, 9, 12, 10, 10,
- 9, 13, 9, 12, 9, 12, 10, 10, 14, 16, 13, 14, 14, 16, 12, 11,
- 11, 16, 11, 14, 12, 14, 12, 12, 12, 16, 11, 14, 12, 14, 12, 11,
- 16, 16, 13, 16, 14, 16, 13, 12, 10, 16, 12, 14, 10, 14, 11, 11,
- 12, 16, 13, 14, 11, 14, 12, 12, 16, 16, 16, 16, 14, 16, 13, 13,
- 11, 16, 12, 16, 11, 14, 12, 12, 12, 16, 12, 14, 11, 14, 12, 11,
- 16, 16, 15, 16, 13, 15, 13, 12, 13, 16, 14, 16, 13, 16, 13, 12,
- 13, 16, 13, 16, 13, 16, 13, 12, 16, 16, 14, 16, 14, 16, 12, 11,
- 8, 13, 10, 12, 10, 13, 11, 11, 11, 14, 12, 14, 12, 14, 12, 12,
- 16, 16, 16, 16, 16, 16, 14, 13, 9, 14, 10, 13, 10, 13, 11, 11,
- 12, 16, 12, 13, 12, 13, 12, 11, 16, 16, 16, 16, 16, 16, 15, 14,
- 12, 16, 11, 14, 13, 15, 12, 12, 13, 16, 12, 15, 14, 15, 13, 12,
- 16, 16, 16, 16, 16, 16, 15, 13, 9, 14, 11, 13, 10, 13, 11, 11,
- 11, 16, 12, 14, 12, 14, 12, 12, 16, 16, 16, 16, 16, 16, 16, 13,
- 10, 15, 11, 13, 11, 14, 12, 11, 11, 16, 12, 14, 11, 14, 12, 11,
- 16, 16, 16, 16, 16, 16, 14, 12, 12, 16, 12, 14, 13, 15, 13, 12,
- 12, 16, 12, 14, 13, 15, 12, 12, 16, 16, 14, 16, 16, 16, 14, 12,
- 12, 16, 13, 16, 11, 14, 12, 12, 14, 16, 14, 16, 12, 16, 13, 12,
- 16, 16, 16, 16, 16, 16, 16, 13, 12, 16, 13, 16, 12, 16, 13, 12,
- 12, 16, 13, 16, 12, 16, 12, 12, 16, 16, 16, 16, 14, 16, 14, 12,
- 14, 16, 14, 16, 14, 16, 14, 13, 13, 16, 13, 16, 13, 16, 13, 12,
- 16, 16, 13, 16, 13, 16, 12, 11, 9, 16, 12, 15, 13, 16, 13, 12,
- 13, 16, 14, 16, 14, 16, 14, 13, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 16, 12, 15, 12, 15, 13, 12, 13, 16, 14, 16, 13, 16, 13, 12,
- 16, 16, 16, 16, 16, 16, 16, 13, 12, 16, 12, 16, 13, 16, 13, 12,
- 14, 16, 13, 16, 14, 16, 13, 12, 16, 16, 16, 16, 16, 16, 16, 13,
- 11, 16, 12, 15, 12, 16, 13, 12, 14, 16, 14, 16, 13, 16, 13, 13,
- 16, 16, 16, 16, 16, 16, 15, 13, 11, 16, 12, 16, 12, 16, 13, 12,
- 13, 16, 13, 15, 13, 16, 13, 12, 16, 16, 16, 16, 16, 16, 15, 13,
- 12, 16, 12, 16, 13, 16, 13, 12, 13, 16, 12, 16, 13, 16, 13, 12,
- 16, 16, 14, 16, 16, 16, 14, 12, 12, 16, 14, 16, 11, 16, 13, 12,
- 14, 16, 14, 16, 13, 16, 13, 12, 16, 16, 16, 16, 16, 16, 16, 13,
- 12, 16, 13, 16, 12, 16, 13, 12, 13, 16, 13, 16, 12, 16, 13, 12,
- 16, 16, 16, 16, 14, 16, 14, 12, 13, 16, 13, 16, 13, 16, 13, 13,
- 13, 16, 12, 16, 12, 16, 12, 12, 14, 16, 13, 15, 13, 16, 12, 11,
- ],
- ],
-];
-
-const RV34_INTRA_SECONDPAT: &'static [[[u8; 108]; 2]; 5] = &[
- [
- [
- 0, 5, 10, 3, 6, 10, 7, 8, 9, 4, 6, 10, 6, 7, 9, 8,
- 8, 9, 8, 8, 9, 8, 9, 9, 9, 9, 8, 3, 6, 10, 4, 6,
- 10, 7, 7, 9, 5, 7, 10, 6, 7, 9, 7, 7, 8, 7, 8, 9,
- 8, 8, 9, 8, 8, 7, 6, 8, 10, 6, 8, 10, 7, 8, 9, 7,
- 8, 10, 7, 8, 10, 8, 8, 8, 8, 9, 9, 8, 8, 9, 9, 8,
- 7, 7, 8, 9, 7, 8, 9, 7, 7, 7, 8, 8, 9, 7, 8, 9,
- 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 6, 5,
- ], [
- 0, 5, 11, 3, 6, 11, 8, 9, 11, 3, 6, 10, 6, 7, 11, 9,
- 9, 11, 7, 9, 11, 9, 9, 11, 10, 10, 11, 2, 6, 10, 4, 7,
- 10, 7, 9, 11, 4, 7, 11, 6, 7, 10, 9, 9, 11, 7, 9, 11,
- 8, 9, 10, 10, 10, 10, 5, 8, 11, 6, 8, 11, 8, 9, 11, 6,
- 8, 11, 7, 8, 11, 9, 9, 11, 8, 10, 11, 9, 9, 11, 10, 10,
- 10, 8, 9, 11, 8, 9, 11, 9, 9, 10, 8, 9, 11, 8, 9, 11,
- 9, 9, 10, 8, 9, 10, 9, 9, 10, 9, 9, 8,
- ],
- ], [
- [
- 0, 5, 10, 4, 6, 10, 7, 8, 10, 4, 6, 10, 6, 7, 9, 8,
- 8, 9, 8, 8, 9, 8, 9, 9, 9, 9, 9, 2, 6, 10, 4, 6,
- 10, 7, 7, 9, 5, 7, 10, 6, 7, 9, 7, 7, 9, 7, 8, 9,
- 8, 8, 9, 9, 8, 8, 6, 8, 10, 6, 8, 10, 7, 8, 9, 6,
- 8, 10, 7, 8, 10, 8, 8, 9, 8, 9, 10, 8, 8, 9, 9, 9,
- 8, 8, 8, 10, 7, 8, 9, 7, 8, 8, 7, 8, 10, 7, 8, 9,
- 7, 7, 8, 8, 8, 9, 8, 8, 8, 7, 7, 6,
- ], [
- 0, 5, 12, 4, 7, 12, 8, 10, 13, 4, 7, 12, 6, 8, 12, 10,
- 10, 12, 8, 9, 12, 10, 10, 12, 12, 12, 12, 1, 6, 12, 4, 7,
- 12, 8, 9, 12, 4, 7, 12, 6, 8, 11, 9, 10, 12, 8, 9, 12,
- 9, 10, 11, 11, 11, 12, 6, 8, 12, 7, 9, 12, 9, 10, 13, 6,
- 9, 12, 8, 9, 12, 10, 10, 12, 9, 10, 12, 10, 10, 12, 12, 12,
- 12, 8, 10, 12, 9, 10, 12, 10, 10, 12, 8, 10, 12, 9, 10, 12,
- 10, 10, 11, 9, 10, 12, 10, 10, 11, 11, 10, 10,
- ],
- ], [
- [
- 0, 5, 10, 3, 6, 10, 7, 8, 11, 4, 6, 10, 6, 7, 10, 8,
- 9, 10, 8, 8, 10, 9, 9, 10, 10, 10, 10, 2, 6, 10, 4, 6,
- 10, 7, 8, 10, 4, 7, 10, 6, 7, 10, 8, 8, 10, 7, 8, 10,
- 8, 8, 9, 10, 9, 9, 5, 8, 11, 6, 8, 10, 7, 9, 10, 6,
- 8, 11, 7, 8, 10, 8, 8, 10, 8, 9, 11, 9, 9, 10, 10, 9,
- 9, 8, 9, 10, 8, 9, 10, 8, 9, 10, 8, 9, 10, 8, 8, 10,
- 8, 8, 9, 8, 9, 10, 8, 8, 9, 9, 8, 8,
- ], [
- 0, 6, 13, 4, 7, 14, 9, 11, 14, 3, 7, 13, 7, 8, 13, 11,
- 11, 14, 8, 10, 13, 10, 11, 13, 13, 13, 14, 1, 6, 12, 4, 8,
- 13, 9, 10, 15, 4, 8, 13, 7, 8, 12, 11, 11, 14, 8, 10, 13,
- 10, 10, 13, 13, 13, 14, 5, 9, 13, 7, 9, 13, 10, 11, 14, 6,
- 10, 14, 8, 10, 14, 11, 11, 14, 9, 11, 14, 11, 11, 13, 13, 13,
- 14, 9, 10, 14, 9, 11, 13, 11, 12, 14, 9, 11, 13, 9, 11, 14,
- 11, 12, 13, 10, 12, 15, 11, 11, 13, 13, 12, 13,
- ],
- ], [
- [
- 0, 5, 11, 3, 6, 11, 7, 9, 12, 3, 6, 11, 6, 7, 11, 9,
- 9, 11, 8, 9, 11, 9, 9, 11, 11, 11, 12, 2, 6, 11, 4, 6,
- 11, 7, 9, 11, 4, 7, 11, 5, 7, 10, 9, 9, 11, 7, 8, 11,
- 9, 9, 10, 11, 11, 11, 5, 8, 11, 6, 8, 11, 8, 9, 12, 6,
- 8, 11, 7, 8, 11, 9, 9, 11, 8, 9, 12, 9, 9, 11, 11, 11,
- 11, 8, 10, 12, 8, 10, 11, 9, 10, 12, 8, 10, 12, 8, 9, 12,
- 10, 10, 12, 9, 10, 12, 9, 9, 11, 11, 10, 11,
- ], [
- 0, 6, 13, 3, 8, 14, 10, 12, 16, 3, 8, 15, 7, 9, 15, 12,
- 13, 15, 9, 11, 15, 11, 12, 16, 14, 16, 16, 1, 7, 13, 4, 8,
- 14, 9, 11, 15, 4, 8, 14, 7, 9, 14, 12, 13, 15, 8, 10, 14,
- 11, 11, 14, 16, 14, 16, 6, 9, 14, 7, 10, 14, 11, 13, 15, 7,
- 10, 14, 9, 10, 13, 12, 12, 15, 10, 11, 14, 11, 11, 14, 14, 14,
- 16, 9, 11, 14, 10, 11, 14, 13, 14, 15, 9, 12, 14, 10, 12, 16,
- 13, 14, 16, 10, 13, 16, 12, 12, 14, 15, 14, 15,
- ],
- ], [
- [
- 0, 6, 12, 3, 7, 12, 9, 11, 13, 4, 7, 12, 6, 8, 12, 10,
- 11, 13, 8, 10, 13, 10, 11, 13, 13, 13, 14, 1, 6, 12, 4, 7,
- 12, 9, 10, 14, 4, 7, 12, 6, 7, 12, 10, 11, 13, 8, 9, 13,
- 10, 10, 12, 13, 13, 14, 6, 9, 13, 7, 9, 13, 10, 12, 14, 7,
- 9, 13, 8, 10, 13, 11, 11, 14, 9, 11, 13, 11, 11, 14, 13, 13,
- 14, 10, 12, 14, 10, 12, 14, 12, 13, 15, 10, 12, 14, 10, 12, 14,
- 12, 13, 15, 11, 13, 15, 12, 12, 15, 14, 14, 14,
- ], [
- 0, 6, 16, 3, 8, 16, 10, 13, 16, 3, 8, 16, 7, 9, 16, 13,
- 16, 16, 8, 10, 16, 11, 13, 16, 16, 16, 16, 1, 7, 14, 4, 8,
- 16, 10, 12, 16, 4, 8, 13, 7, 9, 16, 13, 14, 16, 8, 10, 16,
- 11, 11, 14, 16, 16, 16, 6, 9, 14, 8, 10, 14, 12, 16, 16, 6,
- 10, 13, 9, 11, 16, 13, 14, 16, 9, 12, 16, 12, 11, 16, 16, 16,
- 16, 10, 12, 16, 11, 12, 16, 16, 14, 16, 9, 12, 16, 11, 12, 16,
- 16, 15, 16, 10, 13, 16, 12, 13, 16, 16, 16, 16,
- ],
- ],
-];
-
-const RV34_INTRA_THIRDPAT: &'static [[[u8; 108]; 2]; 5] = &[
- [
- [
- 0, 5, 10, 3, 6, 10, 7, 8, 10, 4, 7, 10, 6, 7, 10, 8,
- 8, 10, 8, 9, 10, 9, 9, 10, 9, 9, 9, 2, 6, 10, 4, 7,
- 10, 7, 8, 9, 5, 7, 10, 6, 7, 10, 8, 8, 9, 8, 9, 10,
- 8, 8, 9, 9, 9, 8, 6, 8, 11, 6, 8, 10, 7, 8, 10, 6,
- 8, 11, 7, 8, 10, 8, 8, 9, 8, 9, 10, 9, 9, 10, 9, 9,
- 9, 7, 8, 10, 7, 8, 10, 7, 8, 8, 7, 8, 10, 7, 8, 9,
- 7, 8, 8, 8, 8, 9, 8, 8, 8, 7, 7, 7,
- ], [
- 0, 4, 10, 3, 6, 10, 7, 8, 11, 3, 6, 10, 5, 7, 10, 9,
- 9, 11, 9, 10, 11, 9, 10, 11, 11, 11, 11, 2, 6, 10, 4, 6,
- 10, 7, 8, 10, 4, 7, 10, 6, 7, 10, 8, 9, 10, 8, 9, 11,
- 9, 9, 11, 10, 10, 11, 6, 8, 11, 6, 8, 11, 8, 9, 11, 7,
- 9, 11, 7, 8, 11, 9, 9, 11, 9, 10, 12, 10, 10, 12, 11, 11,
- 11, 8, 9, 11, 8, 9, 11, 9, 9, 11, 9, 10, 11, 9, 10, 11,
- 9, 10, 11, 10, 11, 12, 10, 10, 12, 10, 10, 10,
- ],
- ], [
- [
- 0, 5, 10, 3, 6, 10, 7, 8, 10, 4, 7, 10, 6, 7, 10, 8,
- 9, 10, 8, 9, 11, 8, 9, 10, 10, 10, 10, 2, 6, 10, 4, 6,
- 10, 7, 8, 10, 4, 7, 10, 5, 7, 10, 8, 8, 10, 8, 9, 10,
- 8, 9, 10, 9, 9, 9, 5, 7, 11, 6, 8, 11, 7, 8, 11, 6,
- 8, 11, 7, 8, 10, 8, 9, 10, 8, 9, 11, 9, 9, 10, 10, 9,
- 10, 7, 8, 10, 7, 8, 10, 8, 9, 10, 8, 9, 10, 8, 9, 10,
- 8, 8, 10, 9, 9, 10, 9, 9, 10, 9, 9, 9,
- ], [
- 0, 5, 11, 3, 6, 11, 8, 9, 12, 4, 7, 12, 6, 7, 12, 9,
- 10, 13, 10, 11, 13, 10, 11, 14, 12, 13, 14, 1, 6, 11, 4, 7,
- 11, 8, 9, 12, 5, 7, 11, 6, 8, 12, 9, 10, 13, 10, 11, 14,
- 10, 11, 13, 12, 12, 14, 6, 8, 12, 7, 9, 13, 9, 10, 14, 7,
- 10, 13, 8, 10, 12, 11, 11, 13, 11, 13, 14, 11, 12, 14, 13, 13,
- 15, 9, 10, 12, 9, 11, 14, 10, 11, 14, 11, 11, 13, 10, 11, 13,
- 11, 12, 14, 12, 14, 15, 13, 13, 14, 13, 13, 14,
- ],
- ], [
- [
- 0, 5, 11, 3, 6, 11, 7, 9, 11, 4, 6, 11, 5, 7, 10, 9,
- 9, 11, 8, 9, 11, 9, 10, 11, 11, 11, 11, 2, 6, 10, 3, 6,
- 10, 7, 9, 11, 4, 7, 10, 5, 7, 10, 8, 9, 11, 8, 9, 11,
- 9, 9, 11, 11, 11, 11, 5, 8, 11, 6, 8, 11, 8, 10, 12, 6,
- 8, 11, 7, 8, 11, 9, 10, 11, 9, 10, 12, 9, 10, 11, 11, 11,
- 11, 8, 9, 11, 8, 10, 12, 9, 11, 12, 8, 10, 12, 9, 10, 12,
- 10, 11, 12, 10, 11, 12, 10, 10, 11, 11, 11, 11,
- ], [
- 0, 5, 13, 2, 7, 16, 9, 11, 16, 4, 8, 16, 7, 9, 16, 12,
- 12, 16, 12, 16, 16, 12, 16, 16, 16, 16, 16, 1, 6, 13, 4, 8,
- 16, 9, 11, 16, 6, 9, 16, 7, 10, 16, 13, 13, 16, 13, 15, 16,
- 12, 16, 16, 16, 16, 16, 7, 9, 16, 8, 11, 15, 11, 13, 16, 10,
- 12, 16, 10, 12, 16, 16, 13, 16, 16, 16, 16, 14, 16, 16, 16, 16,
- 16, 12, 12, 16, 12, 16, 16, 16, 16, 16, 13, 14, 16, 12, 13, 16,
- 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16,
- ],
- ], [
- [
- 0, 6, 11, 3, 7, 11, 8, 10, 12, 4, 7, 11, 6, 8, 11, 10,
- 11, 12, 9, 10, 12, 10, 10, 12, 12, 12, 13, 1, 6, 11, 4, 7,
- 11, 8, 10, 12, 4, 7, 11, 6, 8, 11, 10, 10, 12, 9, 10, 12,
- 10, 10, 12, 13, 13, 13, 6, 8, 12, 7, 10, 12, 10, 12, 13, 7,
- 9, 12, 8, 10, 12, 11, 11, 13, 11, 12, 14, 11, 11, 13, 13, 13,
- 13, 9, 11, 13, 10, 12, 14, 12, 13, 15, 10, 12, 14, 11, 12, 14,
- 13, 13, 14, 12, 13, 15, 13, 13, 14, 14, 14, 14,
- ], [
- 0, 5, 16, 2, 6, 16, 10, 14, 16, 4, 8, 16, 7, 9, 16, 11,
- 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 1, 6, 12, 4, 8,
- 12, 12, 12, 16, 6, 8, 16, 8, 10, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 12, 16, 16, 7, 10, 16, 8, 11, 14, 16, 16, 16, 10,
- 12, 16, 10, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ],
- ], [
- [
- 0, 5, 11, 3, 6, 11, 10, 10, 12, 3, 7, 11, 6, 8, 11, 11,
- 11, 12, 10, 10, 12, 11, 11, 13, 14, 13, 14, 1, 6, 11, 4, 7,
- 11, 10, 11, 13, 5, 7, 11, 7, 8, 11, 11, 11, 13, 10, 11, 13,
- 11, 11, 12, 13, 13, 14, 7, 10, 12, 9, 11, 13, 12, 13, 14, 9,
- 10, 13, 9, 10, 13, 12, 11, 13, 12, 13, 16, 12, 13, 13, 14, 14,
- 14, 11, 14, 16, 12, 14, 15, 14, 13, 16, 13, 13, 15, 13, 14, 16,
- 14, 13, 16, 13, 13, 16, 13, 14, 15, 15, 14, 15,
- ], [
- 0, 4, 16, 2, 7, 16, 10, 16, 16, 4, 10, 16, 7, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 6, 13, 4, 11,
- 16, 16, 16, 16, 6, 10, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 8, 16, 16, 10, 16, 16, 16, 16, 16, 10,
- 16, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ],
- ],
-];
-
-const RV34_INTRA_COEFFS: &'static [[u8; 32]; 5] = &[
- [
- 1, 3, 3, 4, 4, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9,
- 9, 9, 10, 10, 10, 11, 11, 11, 10, 10, 10, 12, 13, 14, 15, 15,
- ], [
- 1, 2, 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 10, 11,
- 11, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 16, 16, 16, 16,
- ], [
- 1, 2, 3, 4, 5, 6, 8, 8, 9, 9, 10, 10, 11, 12, 12, 12,
- 13, 13, 14, 14, 14, 14, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16,
- ], [
- 1, 2, 3, 4, 5, 6, 8, 8, 9, 9, 10, 10, 11, 12, 12, 12,
- 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 14, 12, 16, 16, 16, 16,
- ], [
- 1, 2, 3, 4, 5, 7, 7, 8, 8, 9, 10, 10, 12, 11, 13, 12,
- 15, 13, 14, 13, 12, 15, 14, 13, 12, 12, 10, 11, 16, 16, 16, 16,
- ]
-];
-
-const RV34_INTER_CBPPAT: &'static [[u8; 1296]; 7] = &[
-[
- 7, 9, 9, 8, 9, 8, 9, 8, 9, 9, 8, 8, 8, 8, 8, 4,
- 7, 10, 11, 10, 11, 10, 12, 10, 12, 11, 11, 10, 11, 10, 10, 7,
- 10, 11, 15, 12, 15, 12, 15, 12, 15, 14, 14, 12, 14, 12, 14, 9,
- 7, 11, 10, 10, 12, 11, 11, 10, 11, 12, 10, 10, 11, 10, 10, 7,
- 8, 12, 12, 11, 13, 12, 12, 10, 13, 13, 12, 10, 12, 11, 11, 7,
- 11, 13, 15, 11, 15, 13, 15, 12, 16, 14, 14, 12, 15, 13, 13, 9,
- 10, 15, 11, 12, 15, 14, 14, 12, 15, 15, 12, 12, 14, 14, 12, 9,
- 11, 15, 13, 12, 16, 15, 14, 12, 15, 15, 13, 12, 15, 14, 13, 9,
- 13, 15, 14, 10, 16, 15, 16, 11, 16, 16, 15, 12, 16, 15, 15, 9,
- 7, 11, 11, 11, 11, 10, 11, 10, 11, 12, 11, 10, 10, 10, 10, 7,
- 9, 12, 13, 12, 12, 11, 13, 10, 13, 13, 12, 11, 12, 10, 11, 7,
- 12, 13, 16, 14, 15, 12, 16, 12, 16, 15, 15, 13, 15, 12, 14, 9,
- 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 7,
- 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 13, 11, 12, 11, 11, 7,
- 12, 14, 15, 13, 16, 13, 15, 11, 16, 14, 15, 12, 15, 12, 13, 8,
- 12, 16, 14, 14, 16, 15, 15, 13, 16, 15, 14, 13, 15, 14, 13, 9,
- 12, 15, 14, 13, 15, 14, 15, 12, 16, 15, 14, 12, 14, 13, 13, 8,
- 13, 16, 16, 12, 16, 14, 16, 11, 16, 16, 15, 12, 16, 14, 14, 8,
- 10, 15, 15, 15, 12, 12, 14, 12, 14, 15, 15, 14, 12, 12, 13, 9,
- 11, 15, 16, 14, 13, 12, 15, 12, 16, 15, 15, 14, 14, 12, 13, 9,
- 14, 15, 16, 16, 15, 11, 16, 12, 16, 16, 16, 15, 16, 12, 15, 9,
- 12, 16, 16, 15, 14, 14, 14, 13, 16, 16, 15, 14, 14, 13, 13, 9,
- 12, 15, 15, 14, 14, 13, 15, 12, 16, 15, 14, 13, 14, 13, 13, 8,
- 13, 16, 16, 15, 16, 12, 16, 11, 16, 16, 16, 14, 16, 13, 14, 8,
- 14, 16, 16, 16, 16, 16, 15, 14, 16, 16, 16, 15, 16, 15, 14, 11,
- 13, 16, 16, 15, 16, 15, 15, 12, 16, 16, 16, 14, 15, 14, 14, 9,
- 14, 16, 16, 13, 16, 14, 16, 10, 16, 16, 16, 13, 16, 14, 14, 8,
- 7, 12, 11, 11, 11, 11, 12, 10, 11, 11, 10, 10, 10, 10, 10, 7,
- 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 8,
- 12, 14, 16, 14, 16, 14, 16, 13, 16, 14, 15, 13, 15, 13, 14, 9,
- 9, 13, 12, 12, 13, 12, 13, 11, 12, 13, 11, 10, 12, 11, 11, 7,
- 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 7,
- 12, 14, 16, 13, 16, 14, 15, 12, 15, 15, 14, 12, 15, 13, 13, 8,
- 11, 15, 13, 14, 15, 15, 14, 13, 15, 15, 12, 12, 14, 14, 12, 9,
- 11, 15, 14, 13, 15, 14, 14, 12, 15, 14, 13, 11, 14, 13, 12, 8,
- 13, 16, 15, 12, 16, 15, 16, 12, 16, 16, 14, 11, 15, 14, 14, 8,
- 8, 13, 13, 12, 12, 12, 13, 11, 12, 13, 12, 11, 11, 10, 10, 7,
- 9, 13, 14, 12, 13, 12, 13, 11, 13, 13, 13, 11, 12, 11, 11, 7,
- 12, 14, 16, 14, 15, 13, 15, 12, 15, 15, 15, 13, 14, 12, 13, 8,
- 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 7,
- 9, 13, 12, 12, 13, 12, 12, 10, 13, 13, 12, 10, 12, 10, 10, 6,
- 11, 14, 14, 12, 14, 12, 14, 11, 14, 14, 13, 11, 13, 11, 12, 7,
- 12, 16, 14, 14, 15, 15, 14, 13, 15, 15, 13, 12, 14, 13, 12, 8,
- 11, 14, 13, 12, 14, 13, 13, 11, 14, 14, 13, 11, 13, 12, 11, 7,
- 11, 14, 14, 12, 15, 13, 14, 11, 15, 14, 13, 11, 14, 12, 12, 6,
- 11, 16, 15, 15, 13, 14, 15, 13, 14, 15, 15, 13, 12, 12, 12, 9,
- 12, 15, 15, 14, 14, 13, 15, 12, 15, 15, 14, 13, 13, 11, 12, 8,
- 13, 16, 16, 15, 16, 13, 16, 13, 16, 16, 15, 14, 14, 12, 14, 8,
- 11, 16, 15, 14, 14, 14, 14, 13, 15, 15, 14, 13, 13, 12, 12, 8,
- 11, 14, 14, 13, 13, 12, 14, 11, 14, 14, 13, 12, 12, 11, 11, 7,
- 12, 14, 15, 13, 14, 12, 14, 11, 15, 14, 14, 12, 13, 11, 12, 7,
- 13, 16, 16, 16, 16, 15, 16, 14, 16, 16, 15, 14, 15, 14, 13, 9,
- 12, 15, 14, 13, 15, 13, 14, 12, 15, 15, 13, 12, 13, 12, 12, 7,
- 11, 15, 14, 12, 14, 13, 14, 10, 15, 14, 13, 11, 13, 11, 11, 5,
- 10, 15, 15, 15, 15, 14, 15, 13, 12, 14, 12, 12, 12, 13, 12, 9,
- 12, 16, 16, 15, 16, 15, 16, 14, 14, 15, 14, 13, 14, 13, 13, 9,
- 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 16, 14, 15, 11,
- 11, 15, 15, 14, 15, 15, 15, 14, 14, 15, 12, 12, 13, 13, 12, 9,
- 12, 15, 15, 14, 16, 14, 15, 13, 14, 14, 13, 12, 14, 13, 12, 8,
- 13, 16, 16, 15, 16, 16, 16, 14, 16, 16, 15, 12, 16, 14, 14, 9,
- 13, 16, 14, 16, 16, 16, 16, 15, 15, 16, 11, 12, 16, 15, 12, 9,
- 13, 16, 15, 14, 16, 15, 16, 14, 15, 16, 12, 11, 15, 14, 13, 8,
- 13, 16, 16, 13, 16, 16, 16, 13, 16, 16, 13, 11, 16, 14, 14, 8,
- 11, 15, 15, 15, 14, 14, 15, 13, 13, 15, 14, 13, 12, 12, 12, 9,
- 11, 15, 16, 14, 15, 14, 15, 13, 14, 14, 14, 13, 13, 12, 13, 8,
- 13, 16, 16, 16, 16, 15, 16, 14, 16, 16, 16, 13, 15, 12, 14, 9,
- 11, 16, 15, 14, 14, 14, 15, 13, 14, 14, 13, 12, 13, 12, 11, 8,
- 11, 14, 14, 13, 14, 13, 14, 12, 13, 13, 12, 11, 12, 11, 11, 7,
- 12, 15, 15, 13, 15, 14, 15, 12, 15, 14, 14, 11, 13, 12, 12, 7,
- 13, 16, 15, 15, 16, 16, 16, 14, 15, 16, 12, 12, 14, 14, 12, 8,
- 11, 15, 14, 13, 15, 13, 14, 12, 14, 14, 12, 11, 13, 12, 11, 6,
- 11, 14, 14, 12, 15, 13, 14, 11, 15, 14, 12, 10, 13, 11, 11, 5,
- 12, 16, 16, 16, 15, 15, 16, 15, 14, 16, 15, 15, 10, 12, 12, 9,
- 13, 16, 16, 16, 15, 14, 16, 13, 15, 15, 15, 14, 12, 11, 13, 8,
- 14, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 14, 14, 11, 14, 8,
- 13, 16, 16, 15, 15, 15, 15, 14, 15, 16, 14, 13, 12, 12, 11, 8,
- 11, 15, 15, 13, 14, 13, 14, 12, 14, 14, 13, 12, 12, 11, 11, 6,
- 11, 15, 15, 13, 15, 12, 14, 11, 14, 14, 13, 11, 12, 10, 11, 5,
- 13, 16, 16, 15, 16, 16, 16, 14, 16, 16, 14, 14, 14, 13, 11, 8,
- 11, 14, 14, 13, 14, 13, 14, 11, 14, 14, 12, 11, 12, 11, 10, 5,
- 10, 13, 13, 11, 13, 12, 13, 9, 13, 13, 12, 9, 12, 10, 10, 3,
-], [
- 5, 7, 7, 7, 7, 7, 8, 7, 7, 8, 7, 7, 7, 7, 7, 4,
- 7, 9, 11, 9, 11, 9, 11, 9, 11, 10, 10, 9, 10, 9, 10, 6,
- 11, 11, 14, 11, 14, 11, 14, 11, 15, 13, 14, 12, 14, 12, 13, 9,
- 6, 11, 10, 9, 11, 10, 11, 9, 11, 11, 9, 9, 10, 10, 9, 6,
- 8, 11, 11, 10, 12, 11, 12, 10, 12, 12, 11, 10, 12, 11, 11, 7,
- 11, 13, 14, 11, 15, 13, 15, 11, 15, 14, 14, 12, 14, 13, 13, 9,
- 10, 14, 11, 11, 15, 14, 13, 12, 14, 14, 11, 11, 14, 13, 12, 9,
- 11, 14, 13, 11, 15, 14, 14, 11, 15, 15, 13, 11, 14, 14, 13, 9,
- 12, 14, 14, 10, 16, 15, 16, 11, 16, 16, 15, 11, 16, 15, 14, 9,
- 6, 10, 11, 10, 10, 9, 11, 9, 10, 11, 10, 10, 9, 9, 9, 6,
- 9, 12, 12, 11, 12, 10, 12, 10, 12, 12, 12, 11, 11, 10, 11, 7,
- 12, 13, 15, 13, 14, 11, 15, 11, 15, 15, 14, 13, 14, 12, 14, 9,
- 9, 12, 12, 11, 12, 11, 12, 11, 12, 13, 11, 11, 12, 11, 11, 7,
- 9, 12, 12, 11, 13, 11, 12, 10, 13, 13, 12, 11, 12, 11, 11, 7,
- 12, 14, 15, 12, 15, 12, 14, 11, 15, 15, 14, 12, 14, 13, 13, 8,
- 12, 15, 14, 13, 15, 14, 14, 13, 16, 16, 14, 13, 15, 14, 13, 9,
- 12, 15, 14, 13, 15, 14, 14, 12, 15, 15, 13, 12, 14, 13, 13, 9,
- 13, 15, 15, 12, 16, 14, 15, 11, 16, 16, 15, 12, 15, 14, 14, 9,
- 10, 14, 14, 14, 12, 11, 13, 12, 14, 15, 14, 13, 12, 11, 12, 9,
- 12, 14, 15, 14, 13, 11, 14, 12, 15, 15, 15, 14, 13, 11, 13, 9,
- 13, 15, 16, 15, 14, 11, 16, 11, 16, 16, 16, 14, 15, 12, 15, 9,
- 12, 15, 15, 14, 14, 14, 14, 13, 15, 15, 14, 14, 14, 13, 13, 9,
- 12, 15, 15, 14, 14, 13, 14, 12, 15, 15, 14, 13, 14, 13, 13, 9,
- 13, 15, 16, 14, 15, 13, 16, 11, 16, 16, 15, 14, 15, 13, 14, 9,
- 14, 16, 16, 16, 16, 16, 15, 14, 16, 16, 16, 16, 16, 16, 14, 11,
- 14, 16, 16, 14, 16, 15, 15, 12, 16, 16, 16, 14, 15, 14, 14, 9,
- 14, 16, 16, 14, 16, 14, 16, 11, 16, 16, 16, 14, 16, 14, 14, 9,
- 6, 11, 10, 10, 10, 10, 11, 10, 10, 11, 9, 9, 9, 9, 9, 6,
- 9, 12, 12, 11, 13, 11, 13, 11, 12, 12, 11, 11, 12, 11, 11, 7,
- 12, 14, 16, 13, 16, 14, 16, 13, 15, 14, 15, 12, 15, 13, 14, 9,
- 8, 12, 11, 11, 12, 12, 12, 11, 11, 12, 10, 10, 11, 11, 10, 7,
- 9, 12, 12, 11, 13, 12, 13, 11, 13, 12, 11, 10, 12, 11, 11, 7,
- 12, 14, 15, 12, 15, 14, 15, 12, 15, 14, 14, 12, 14, 13, 13, 9,
- 11, 15, 13, 13, 15, 14, 14, 13, 14, 15, 11, 11, 14, 14, 12, 9,
- 11, 14, 13, 12, 15, 14, 14, 12, 14, 14, 12, 11, 14, 13, 12, 8,
- 13, 15, 15, 12, 16, 15, 15, 12, 15, 15, 14, 11, 15, 14, 14, 8,
- 8, 12, 12, 11, 11, 11, 12, 11, 11, 12, 11, 11, 10, 10, 10, 7,
- 9, 13, 13, 12, 13, 11, 13, 11, 12, 13, 12, 11, 11, 10, 11, 7,
- 12, 14, 15, 14, 15, 13, 15, 12, 15, 14, 14, 13, 14, 12, 13, 9,
- 9, 13, 12, 12, 12, 12, 12, 11, 12, 13, 11, 11, 11, 11, 10, 7,
- 9, 12, 12, 11, 12, 11, 12, 10, 12, 12, 11, 10, 11, 10, 10, 7,
- 11, 13, 14, 12, 14, 12, 14, 11, 14, 13, 13, 11, 13, 11, 12, 7,
- 12, 15, 14, 13, 15, 14, 14, 13, 15, 15, 13, 12, 13, 13, 12, 9,
- 11, 14, 13, 12, 14, 13, 13, 11, 14, 14, 12, 11, 13, 12, 11, 7,
- 11, 14, 14, 12, 14, 13, 14, 11, 14, 14, 13, 11, 13, 12, 12, 7,
- 11, 15, 15, 14, 13, 13, 14, 13, 14, 15, 14, 13, 11, 11, 12, 9,
- 12, 15, 15, 14, 14, 12, 14, 12, 14, 14, 14, 13, 12, 11, 12, 8,
- 13, 16, 16, 15, 15, 12, 16, 13, 16, 15, 15, 14, 14, 12, 14, 9,
- 12, 15, 15, 14, 14, 14, 14, 13, 15, 15, 14, 13, 12, 12, 12, 9,
- 11, 14, 14, 13, 13, 12, 13, 11, 14, 13, 13, 12, 12, 11, 11, 7,
- 12, 14, 15, 13, 14, 12, 14, 11, 15, 14, 13, 12, 13, 11, 12, 7,
- 13, 16, 16, 15, 16, 15, 15, 14, 16, 16, 15, 14, 14, 14, 12, 9,
- 12, 15, 14, 13, 14, 13, 14, 12, 15, 14, 13, 12, 13, 12, 12, 8,
- 12, 14, 14, 13, 15, 13, 14, 11, 14, 14, 13, 12, 13, 12, 12, 6,
- 10, 14, 14, 13, 14, 14, 14, 13, 12, 13, 12, 12, 12, 12, 11, 9,
- 12, 15, 15, 14, 15, 14, 16, 14, 14, 14, 13, 12, 14, 13, 13, 9,
- 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 16, 14, 16, 11,
- 11, 15, 14, 14, 15, 14, 14, 14, 13, 14, 11, 12, 13, 13, 12, 9,
- 12, 15, 14, 14, 15, 14, 15, 13, 14, 14, 13, 12, 14, 13, 13, 9,
- 13, 16, 16, 14, 16, 15, 16, 14, 16, 15, 15, 12, 16, 14, 14, 9,
- 13, 16, 14, 15, 16, 16, 16, 14, 14, 16, 11, 12, 15, 14, 12, 9,
- 13, 16, 15, 14, 16, 15, 16, 14, 15, 15, 12, 11, 15, 14, 13, 9,
- 14, 16, 16, 13, 16, 16, 16, 14, 16, 15, 13, 11, 16, 14, 14, 9,
- 11, 15, 15, 14, 14, 14, 14, 13, 13, 14, 13, 13, 11, 11, 11, 9,
- 12, 15, 15, 14, 15, 14, 15, 13, 14, 14, 13, 13, 13, 12, 12, 9,
- 13, 16, 16, 16, 16, 14, 16, 14, 16, 15, 16, 14, 15, 12, 14, 9,
- 11, 15, 14, 14, 15, 14, 14, 13, 14, 14, 12, 12, 12, 12, 11, 8,
- 11, 14, 14, 13, 14, 13, 13, 12, 13, 13, 12, 11, 12, 11, 11, 7,
- 12, 14, 15, 13, 15, 13, 14, 13, 14, 14, 13, 12, 13, 12, 12, 8,
- 13, 16, 15, 15, 16, 15, 15, 14, 15, 16, 12, 12, 14, 14, 11, 9,
- 12, 15, 14, 13, 15, 13, 14, 12, 14, 14, 12, 11, 13, 12, 11, 7,
- 12, 14, 14, 13, 15, 13, 14, 12, 15, 14, 13, 10, 13, 12, 12, 6,
- 12, 16, 16, 15, 14, 14, 15, 14, 13, 15, 14, 14, 10, 11, 11, 9,
- 13, 16, 16, 15, 15, 14, 15, 14, 15, 15, 15, 14, 12, 11, 12, 8,
- 14, 16, 16, 16, 16, 14, 16, 14, 16, 15, 15, 14, 14, 11, 14, 8,
- 12, 16, 16, 15, 15, 14, 15, 14, 14, 16, 14, 14, 12, 12, 11, 8,
- 11, 14, 14, 13, 14, 13, 14, 12, 14, 14, 13, 12, 12, 11, 11, 7,
- 12, 14, 15, 13, 14, 13, 14, 12, 14, 14, 13, 12, 13, 11, 12, 6,
- 14, 16, 16, 16, 16, 16, 15, 14, 16, 16, 14, 13, 13, 13, 11, 8,
- 12, 15, 15, 13, 15, 13, 14, 12, 14, 14, 13, 12, 13, 12, 10, 6,
- 11, 14, 13, 12, 14, 12, 13, 10, 14, 13, 12, 10, 12, 10, 10, 4,
-], [
- 4, 6, 6, 6, 6, 6, 7, 6, 6, 7, 6, 6, 6, 6, 6, 3,
- 6, 9, 10, 9, 10, 9, 11, 9, 10, 10, 10, 9, 10, 9, 10, 6,
- 10, 11, 14, 11, 14, 11, 14, 11, 14, 13, 14, 11, 14, 11, 13, 9,
- 6, 10, 9, 9, 10, 10, 10, 9, 10, 11, 9, 9, 10, 10, 9, 6,
- 8, 11, 11, 9, 12, 11, 12, 10, 12, 12, 11, 10, 12, 11, 11, 7,
- 11, 13, 14, 11, 15, 13, 15, 11, 15, 14, 14, 11, 15, 13, 14, 9,
- 10, 13, 11, 11, 14, 14, 13, 11, 14, 14, 11, 11, 13, 13, 11, 9,
- 11, 14, 12, 11, 15, 14, 14, 11, 15, 15, 13, 11, 14, 14, 13, 9,
- 12, 14, 13, 10, 16, 15, 16, 11, 16, 16, 14, 11, 16, 14, 14, 9,
- 6, 10, 10, 10, 9, 9, 10, 9, 10, 11, 10, 10, 9, 9, 9, 6,
- 8, 11, 12, 11, 11, 10, 12, 10, 12, 12, 12, 11, 11, 10, 11, 7,
- 11, 13, 15, 13, 14, 11, 15, 11, 15, 14, 14, 13, 14, 12, 14, 9,
- 8, 12, 12, 12, 12, 12, 12, 11, 12, 13, 11, 11, 11, 11, 11, 8,
- 9, 12, 12, 11, 12, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 8,
- 11, 14, 15, 13, 14, 13, 15, 11, 15, 15, 14, 13, 15, 13, 14, 9,
- 12, 16, 14, 14, 15, 15, 14, 12, 15, 16, 14, 13, 14, 14, 13, 10,
- 11, 15, 14, 13, 15, 14, 15, 12, 15, 16, 14, 13, 15, 14, 13, 9,
- 13, 15, 15, 12, 16, 15, 16, 12, 16, 16, 15, 13, 15, 14, 14, 9,
- 10, 14, 14, 14, 11, 11, 13, 11, 14, 14, 14, 13, 11, 11, 11, 9,
- 11, 14, 15, 14, 13, 11, 14, 12, 15, 15, 15, 14, 13, 11, 13, 9,
- 13, 14, 16, 15, 14, 11, 16, 12, 16, 16, 16, 14, 15, 12, 15, 10,
- 12, 16, 15, 15, 14, 14, 14, 12, 16, 16, 14, 14, 14, 13, 13, 10,
- 12, 15, 15, 14, 14, 13, 14, 12, 15, 16, 14, 14, 14, 13, 13, 9,
- 13, 16, 16, 14, 16, 13, 16, 12, 16, 16, 16, 14, 16, 13, 15, 10,
- 14, 16, 16, 16, 16, 16, 15, 14, 16, 16, 16, 16, 16, 16, 14, 11,
- 13, 16, 16, 15, 16, 16, 16, 13, 16, 16, 16, 15, 16, 15, 14, 10,
- 14, 16, 16, 14, 16, 14, 16, 12, 16, 16, 16, 15, 16, 15, 15, 10,
- 6, 10, 10, 10, 10, 10, 11, 10, 9, 10, 9, 9, 9, 9, 9, 6,
- 9, 12, 12, 11, 12, 11, 13, 11, 12, 12, 11, 10, 12, 11, 11, 8,
- 12, 14, 15, 14, 15, 14, 16, 13, 15, 14, 14, 12, 15, 13, 14, 10,
- 8, 12, 11, 11, 12, 12, 12, 11, 11, 12, 10, 10, 11, 11, 10, 7,
- 9, 12, 12, 11, 13, 12, 13, 11, 12, 13, 11, 10, 12, 12, 11, 8,
- 11, 14, 14, 13, 15, 14, 15, 13, 15, 14, 14, 12, 15, 13, 14, 9,
- 11, 15, 12, 13, 15, 15, 14, 13, 14, 15, 11, 11, 14, 14, 12, 9,
- 11, 14, 13, 13, 15, 14, 15, 13, 15, 15, 13, 11, 15, 14, 13, 9,
- 13, 15, 15, 12, 16, 15, 16, 13, 16, 15, 14, 11, 16, 15, 14, 9,
- 8, 12, 12, 11, 11, 11, 12, 11, 11, 12, 11, 11, 9, 10, 10, 7,
- 9, 12, 13, 12, 12, 11, 13, 11, 12, 13, 12, 12, 11, 11, 11, 8,
- 12, 14, 15, 14, 15, 13, 16, 13, 15, 14, 15, 13, 14, 12, 14, 9,
- 9, 13, 12, 12, 12, 12, 13, 12, 12, 13, 11, 11, 11, 11, 10, 8,
- 9, 12, 12, 12, 12, 12, 13, 11, 12, 13, 11, 11, 12, 11, 11, 7,
- 11, 13, 14, 13, 14, 13, 15, 12, 14, 14, 14, 12, 14, 12, 13, 8,
- 12, 15, 14, 14, 15, 15, 14, 13, 15, 16, 13, 13, 14, 14, 12, 9,
- 11, 14, 13, 13, 14, 14, 14, 12, 14, 15, 13, 12, 14, 13, 12, 8,
- 11, 14, 14, 13, 15, 14, 15, 12, 15, 15, 14, 12, 14, 13, 13, 8,
- 11, 14, 14, 14, 13, 13, 14, 13, 13, 14, 14, 13, 11, 11, 11, 9,
- 11, 15, 15, 14, 14, 13, 15, 13, 14, 15, 14, 14, 13, 11, 13, 9,
- 13, 16, 16, 16, 15, 13, 16, 13, 16, 16, 16, 15, 15, 12, 15, 10,
- 11, 15, 15, 15, 14, 14, 14, 13, 15, 15, 14, 14, 13, 13, 12, 9,
- 11, 14, 14, 13, 13, 13, 14, 12, 14, 14, 13, 13, 13, 12, 12, 8,
- 12, 15, 15, 14, 15, 13, 15, 12, 15, 15, 14, 13, 14, 12, 13, 8,
- 13, 16, 16, 16, 16, 16, 16, 14, 16, 16, 15, 15, 15, 15, 13, 10,
- 12, 15, 15, 14, 15, 14, 15, 13, 15, 16, 14, 13, 14, 14, 13, 9,
- 12, 15, 15, 14, 15, 14, 15, 12, 15, 15, 14, 13, 14, 13, 13, 8,
- 10, 14, 13, 13, 14, 13, 14, 13, 11, 13, 11, 11, 11, 11, 11, 9,
- 12, 15, 16, 14, 15, 14, 16, 14, 14, 14, 14, 13, 14, 13, 13, 10,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 13, 16, 14, 16, 11,
- 11, 15, 14, 14, 15, 14, 15, 14, 13, 14, 11, 12, 13, 13, 11, 9,
- 12, 15, 15, 14, 15, 15, 16, 14, 14, 14, 13, 12, 14, 13, 13, 9,
- 13, 16, 16, 15, 16, 16, 16, 15, 16, 15, 15, 12, 16, 14, 15, 10,
- 12, 16, 14, 15, 16, 16, 16, 14, 14, 16, 11, 12, 14, 15, 12, 9,
- 13, 16, 15, 14, 16, 16, 16, 14, 15, 16, 13, 12, 15, 15, 13, 9,
- 14, 16, 16, 14, 16, 16, 16, 15, 16, 16, 14, 12, 16, 15, 15, 10,
- 11, 14, 14, 14, 14, 14, 14, 13, 12, 14, 13, 13, 11, 11, 11, 9,
- 11, 15, 15, 14, 14, 14, 16, 14, 14, 14, 14, 13, 13, 12, 13, 9,
- 13, 16, 16, 16, 16, 15, 16, 15, 16, 15, 16, 14, 15, 13, 15, 10,
- 11, 15, 15, 14, 14, 14, 15, 14, 14, 15, 13, 13, 12, 13, 11, 9,
- 11, 14, 14, 13, 14, 14, 14, 13, 13, 14, 13, 12, 13, 12, 12, 8,
- 12, 15, 15, 14, 16, 14, 16, 14, 15, 15, 15, 13, 14, 13, 14, 9,
- 13, 16, 15, 16, 16, 16, 16, 15, 15, 16, 13, 13, 14, 14, 12, 9,
- 12, 15, 14, 14, 15, 15, 15, 13, 14, 15, 13, 12, 14, 13, 12, 8,
- 12, 15, 14, 14, 15, 15, 15, 13, 15, 15, 14, 12, 14, 13, 13, 8,
- 12, 16, 15, 15, 13, 14, 15, 14, 13, 15, 14, 14, 10, 11, 11, 9,
- 12, 16, 16, 15, 15, 14, 16, 14, 15, 15, 15, 14, 13, 12, 13, 9,
- 14, 16, 16, 16, 16, 14, 16, 15, 16, 15, 16, 15, 14, 12, 15, 10,
- 12, 16, 15, 15, 15, 15, 15, 14, 15, 16, 14, 14, 12, 13, 11, 9,
- 11, 15, 15, 14, 14, 14, 15, 13, 14, 15, 14, 13, 13, 12, 12, 8,
- 12, 15, 15, 14, 15, 14, 15, 13, 15, 15, 14, 13, 14, 12, 13, 8,
- 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 14, 14, 14, 14, 11, 9,
- 12, 15, 15, 14, 15, 15, 15, 13, 15, 15, 14, 13, 14, 13, 12, 8,
- 11, 14, 14, 13, 14, 13, 14, 12, 13, 14, 13, 12, 13, 12, 12, 7,
-], [
- 2, 6, 6, 5, 6, 6, 7, 6, 6, 7, 6, 6, 6, 6, 6, 3,
- 6, 9, 10, 9, 10, 9, 11, 9, 10, 10, 10, 9, 10, 9, 10, 7,
- 10, 11, 14, 11, 14, 11, 14, 11, 14, 13, 14, 12, 14, 12, 13, 9,
- 6, 10, 9, 9, 10, 10, 10, 9, 10, 11, 9, 9, 10, 10, 9, 7,
- 8, 11, 11, 9, 12, 11, 12, 10, 12, 12, 11, 10, 12, 11, 11, 8,
- 11, 13, 14, 11, 16, 13, 15, 12, 16, 14, 14, 12, 15, 13, 14, 10,
- 10, 13, 11, 11, 14, 14, 13, 11, 13, 14, 11, 11, 13, 13, 11, 9,
- 11, 13, 13, 11, 15, 14, 14, 12, 15, 15, 13, 12, 15, 14, 13, 10,
- 12, 14, 14, 11, 16, 15, 16, 12, 16, 16, 15, 12, 16, 15, 15, 10,
- 6, 10, 10, 10, 9, 9, 10, 9, 10, 11, 10, 10, 9, 9, 9, 7,
- 8, 11, 12, 11, 11, 10, 12, 10, 12, 12, 12, 11, 11, 10, 11, 8,
- 12, 13, 16, 13, 14, 11, 16, 12, 16, 15, 15, 13, 14, 12, 14, 10,
- 9, 13, 12, 12, 12, 12, 12, 11, 13, 13, 12, 12, 12, 12, 11, 8,
- 10, 13, 13, 12, 13, 12, 13, 11, 14, 14, 13, 12, 13, 12, 12, 9,
- 12, 14, 16, 13, 15, 13, 15, 12, 16, 16, 16, 13, 16, 14, 14, 10,
- 12, 16, 14, 14, 16, 15, 14, 13, 16, 16, 14, 14, 15, 15, 13, 11,
- 12, 16, 15, 14, 16, 15, 15, 12, 16, 16, 15, 14, 16, 15, 14, 10,
- 14, 16, 16, 14, 16, 15, 16, 13, 16, 16, 16, 14, 16, 16, 15, 11,
- 10, 14, 14, 13, 11, 11, 13, 12, 14, 14, 13, 13, 11, 11, 12, 9,
- 12, 14, 16, 14, 13, 11, 14, 12, 16, 15, 15, 14, 14, 12, 13, 10,
- 13, 14, 16, 15, 14, 11, 16, 12, 16, 16, 16, 15, 16, 13, 15, 11,
- 12, 16, 15, 15, 14, 14, 14, 13, 16, 16, 15, 15, 14, 14, 13, 11,
- 13, 16, 16, 15, 14, 14, 15, 13, 16, 16, 16, 15, 15, 14, 14, 11,
- 14, 16, 16, 15, 16, 14, 16, 13, 16, 16, 16, 15, 16, 14, 15, 11,
- 15, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14, 12,
- 15, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 15, 12,
- 15, 16, 16, 15, 16, 15, 16, 13, 16, 16, 16, 16, 16, 16, 16, 11,
- 6, 10, 10, 10, 10, 10, 11, 10, 9, 10, 9, 9, 9, 9, 9, 7,
- 9, 12, 13, 12, 13, 12, 14, 12, 12, 12, 12, 11, 12, 11, 11, 8,
- 12, 14, 16, 14, 16, 14, 16, 14, 15, 14, 15, 13, 16, 13, 14, 11,
- 8, 12, 11, 11, 12, 12, 12, 11, 11, 12, 10, 10, 11, 11, 10, 8,
- 10, 13, 13, 12, 14, 13, 14, 12, 13, 13, 12, 11, 13, 12, 12, 9,
- 12, 15, 15, 13, 16, 15, 16, 14, 16, 15, 15, 12, 16, 14, 15, 10,
- 11, 15, 13, 13, 16, 15, 14, 13, 14, 15, 11, 12, 14, 14, 12, 10,
- 12, 16, 14, 13, 16, 16, 16, 14, 16, 15, 13, 12, 15, 15, 14, 10,
- 14, 16, 16, 14, 16, 16, 16, 14, 16, 16, 15, 13, 16, 16, 15, 11,
- 8, 12, 12, 12, 11, 11, 12, 11, 11, 12, 11, 11, 9, 10, 10, 8,
- 10, 13, 14, 13, 13, 12, 14, 12, 13, 13, 13, 12, 12, 11, 12, 9,
- 13, 15, 16, 15, 16, 14, 16, 14, 16, 15, 16, 14, 15, 13, 15, 11,
- 10, 13, 13, 13, 13, 13, 13, 12, 13, 14, 12, 12, 12, 12, 11, 9,
- 10, 13, 13, 13, 13, 13, 14, 12, 13, 14, 13, 12, 12, 12, 12, 9,
- 12, 15, 15, 14, 16, 14, 16, 13, 16, 15, 15, 13, 15, 13, 14, 10,
- 13, 16, 15, 15, 16, 16, 15, 14, 16, 16, 13, 14, 15, 15, 12, 10,
- 12, 16, 14, 14, 16, 16, 15, 13, 16, 16, 14, 13, 15, 14, 13, 10,
- 13, 16, 16, 14, 16, 15, 16, 13, 16, 16, 16, 13, 16, 15, 15, 10,
- 11, 15, 15, 14, 13, 13, 14, 13, 13, 15, 14, 14, 11, 12, 12, 10,
- 12, 15, 16, 15, 14, 13, 16, 14, 16, 15, 16, 14, 13, 12, 13, 10,
- 14, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 16, 13, 16, 11,
- 12, 16, 16, 16, 15, 15, 15, 14, 15, 16, 14, 14, 13, 14, 12, 10,
- 12, 16, 16, 15, 15, 14, 16, 13, 16, 16, 15, 14, 14, 13, 13, 10,
- 13, 16, 16, 15, 16, 14, 16, 13, 16, 16, 16, 15, 16, 14, 15, 10,
- 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 13, 12,
- 14, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 15, 16, 15, 14, 11,
- 14, 16, 16, 15, 16, 16, 16, 13, 16, 16, 16, 15, 16, 15, 14, 10,
- 10, 14, 13, 13, 13, 13, 14, 13, 11, 13, 11, 11, 11, 11, 11, 9,
- 12, 15, 16, 15, 16, 15, 16, 14, 14, 14, 14, 13, 14, 13, 14, 11,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 14, 16, 12,
- 11, 15, 14, 14, 15, 15, 15, 14, 13, 14, 11, 12, 13, 13, 12, 10,
- 13, 16, 15, 15, 16, 16, 16, 15, 15, 15, 13, 12, 15, 14, 13, 10,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 12,
- 13, 16, 14, 15, 16, 16, 16, 15, 14, 16, 11, 12, 15, 15, 12, 10,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 16, 16, 14, 11,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 11,
- 11, 15, 15, 14, 13, 14, 14, 14, 13, 14, 13, 13, 11, 12, 11, 10,
- 12, 16, 16, 16, 16, 15, 16, 15, 15, 15, 15, 14, 13, 12, 14, 10,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 14, 16, 12,
- 12, 16, 15, 15, 16, 16, 16, 14, 14, 15, 13, 13, 13, 13, 12, 10,
- 12, 16, 16, 15, 15, 15, 16, 14, 14, 15, 14, 13, 14, 13, 13, 10,
- 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 16, 14, 15, 11,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 15, 15, 12, 11,
- 13, 16, 16, 15, 16, 16, 16, 14, 16, 16, 14, 13, 16, 14, 13, 10,
- 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 16, 14, 15, 10,
- 12, 16, 16, 15, 14, 15, 16, 14, 13, 15, 14, 14, 11, 12, 12, 10,
- 13, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 15, 13, 12, 14, 11,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 11,
- 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 15, 15, 13, 14, 12, 11,
- 13, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 14, 13, 13, 10,
- 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 15, 15, 14, 14, 10,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 15, 16, 13, 11,
- 14, 16, 16, 16, 16, 16, 16, 14, 16, 16, 15, 14, 15, 14, 13, 10,
- 12, 15, 15, 14, 15, 14, 16, 14, 14, 16, 15, 13, 14, 13, 13, 9,
-], [
- 2, 5, 5, 5, 5, 5, 6, 6, 5, 6, 5, 6, 5, 6, 6, 4,
- 6, 8, 10, 8, 10, 9, 11, 9, 10, 10, 10, 9, 10, 9, 10, 8,
- 10, 11, 13, 11, 13, 11, 14, 11, 14, 13, 13, 12, 13, 12, 13, 10,
- 6, 10, 8, 9, 10, 10, 10, 9, 10, 11, 9, 9, 10, 10, 9, 7,
- 8, 11, 11, 10, 12, 11, 12, 10, 12, 12, 11, 10, 12, 12, 11, 9,
- 11, 13, 14, 11, 15, 14, 15, 12, 16, 14, 14, 12, 15, 14, 14, 11,
- 10, 13, 11, 11, 14, 13, 13, 12, 13, 14, 11, 11, 13, 13, 12, 10,
- 11, 14, 13, 11, 16, 14, 14, 12, 15, 15, 14, 12, 15, 14, 14, 11,
- 12, 14, 14, 11, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 15, 12,
- 6, 10, 10, 10, 8, 9, 10, 9, 10, 11, 10, 10, 9, 9, 9, 8,
- 8, 11, 12, 12, 11, 10, 12, 11, 12, 12, 12, 12, 12, 11, 12, 9,
- 11, 13, 16, 14, 14, 12, 15, 12, 16, 15, 16, 14, 14, 13, 14, 11,
- 9, 13, 12, 12, 12, 12, 12, 11, 13, 13, 12, 12, 12, 12, 11, 10,
- 10, 13, 13, 12, 13, 12, 13, 11, 14, 14, 13, 13, 13, 13, 12, 10,
- 13, 14, 16, 14, 15, 14, 16, 13, 16, 16, 16, 14, 16, 14, 15, 12,
- 12, 16, 14, 14, 16, 15, 14, 13, 16, 16, 14, 14, 15, 15, 13, 12,
- 13, 16, 15, 14, 16, 16, 15, 13, 16, 16, 15, 14, 16, 16, 14, 12,
- 14, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 12,
- 10, 13, 14, 13, 11, 11, 13, 12, 13, 14, 13, 13, 11, 12, 12, 10,
- 11, 14, 15, 15, 13, 12, 14, 13, 16, 16, 16, 15, 14, 13, 14, 11,
- 12, 14, 16, 16, 14, 12, 16, 13, 16, 16, 16, 16, 15, 13, 16, 12,
- 12, 16, 15, 16, 14, 15, 14, 14, 16, 16, 15, 16, 14, 14, 13, 12,
- 13, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 16, 16, 14, 15, 12,
- 14, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 16, 15, 16, 13,
- 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 15, 13,
- 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 13,
- 15, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 13,
- 6, 10, 10, 10, 10, 10, 10, 10, 8, 10, 9, 9, 8, 9, 9, 7,
- 9, 12, 13, 12, 13, 12, 13, 12, 12, 12, 12, 11, 12, 11, 12, 10,
- 12, 14, 16, 14, 16, 14, 16, 14, 16, 15, 15, 14, 16, 14, 15, 12,
- 8, 12, 11, 11, 12, 12, 12, 11, 11, 12, 10, 10, 11, 12, 10, 9,
- 10, 13, 13, 12, 14, 13, 14, 12, 13, 13, 12, 11, 13, 13, 12, 10,
- 13, 15, 16, 14, 16, 16, 16, 14, 16, 15, 15, 13, 16, 15, 15, 12,
- 11, 15, 13, 13, 15, 15, 15, 14, 14, 14, 11, 12, 14, 14, 12, 11,
- 13, 16, 14, 14, 16, 16, 16, 14, 16, 15, 13, 13, 16, 14, 14, 11,
- 14, 16, 16, 14, 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 16, 12,
- 8, 12, 12, 12, 11, 11, 12, 12, 11, 12, 11, 11, 9, 10, 10, 9,
- 10, 13, 14, 13, 13, 12, 14, 13, 13, 13, 13, 13, 12, 11, 12, 10,
- 13, 15, 16, 15, 16, 14, 16, 14, 16, 16, 16, 15, 16, 13, 15, 12,
- 10, 14, 13, 13, 13, 13, 13, 13, 13, 14, 12, 12, 12, 12, 11, 10,
- 10, 13, 13, 13, 13, 13, 14, 12, 13, 14, 13, 12, 13, 12, 12, 10,
- 13, 16, 16, 14, 16, 15, 16, 14, 16, 16, 15, 14, 16, 14, 15, 11,
- 13, 16, 15, 16, 16, 16, 15, 14, 16, 16, 14, 14, 15, 15, 13, 12,
- 13, 16, 15, 14, 16, 16, 16, 14, 16, 16, 14, 14, 15, 15, 14, 11,
- 14, 16, 16, 15, 16, 16, 16, 14, 16, 16, 16, 15, 16, 16, 15, 12,
- 11, 14, 15, 14, 13, 13, 14, 14, 13, 15, 14, 14, 11, 12, 12, 11,
- 13, 16, 16, 16, 14, 14, 16, 14, 16, 16, 16, 15, 14, 13, 14, 12,
- 14, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 14, 16, 13,
- 13, 16, 16, 16, 15, 16, 15, 15, 16, 16, 15, 16, 14, 14, 13, 12,
- 13, 16, 16, 15, 15, 14, 16, 14, 16, 16, 16, 15, 14, 14, 14, 11,
- 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 15, 16, 12,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 13,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12,
- 9, 13, 13, 13, 13, 13, 14, 13, 10, 12, 11, 12, 11, 12, 11, 10,
- 12, 15, 16, 15, 16, 16, 16, 16, 14, 14, 14, 13, 14, 13, 14, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14,
- 11, 15, 14, 14, 15, 14, 15, 14, 13, 14, 11, 12, 13, 13, 12, 11,
- 13, 16, 16, 15, 16, 16, 16, 15, 15, 15, 14, 13, 16, 15, 14, 12,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 13,
- 12, 16, 14, 15, 16, 16, 16, 16, 14, 16, 11, 13, 15, 16, 13, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 16, 16, 15, 12,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 13,
- 11, 15, 14, 14, 13, 14, 15, 14, 12, 14, 13, 13, 11, 12, 12, 11,
- 13, 16, 16, 16, 16, 15, 16, 16, 15, 15, 15, 15, 14, 13, 14, 12,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 13,
- 13, 16, 16, 16, 16, 16, 16, 15, 14, 16, 13, 14, 13, 14, 13, 11,
- 13, 16, 16, 16, 16, 16, 16, 15, 15, 16, 15, 14, 14, 14, 14, 11,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 15, 16, 16, 13, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 16, 16, 15, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12,
- 11, 16, 16, 15, 13, 15, 16, 15, 13, 15, 15, 15, 11, 12, 12, 11,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 15, 12,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 13,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 14, 14, 13, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 12,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 14, 13,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 12,
- 12, 14, 14, 14, 14, 15, 16, 14, 14, 16, 15, 14, 14, 15, 14, 11,
-], [
- 1, 5, 5, 6, 5, 6, 7, 7, 5, 7, 6, 7, 5, 6, 6, 6,
- 6, 9, 10, 9, 10, 9, 11, 10, 11, 11, 11, 10, 11, 10, 11, 9,
- 10, 11, 14, 12, 14, 12, 16, 12, 16, 13, 16, 13, 14, 13, 16, 12,
- 6, 10, 9, 9, 10, 11, 11, 10, 10, 11, 9, 10, 10, 11, 10, 9,
- 8, 11, 11, 10, 13, 12, 13, 12, 13, 13, 12, 12, 13, 13, 13, 11,
- 11, 13, 16, 12, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16, 13,
- 10, 14, 11, 12, 14, 14, 13, 13, 13, 16, 12, 13, 14, 16, 13, 12,
- 11, 14, 13, 12, 16, 16, 16, 14, 16, 16, 14, 14, 16, 16, 16, 13,
- 12, 14, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 6, 10, 10, 11, 9, 9, 11, 10, 10, 11, 11, 11, 9, 10, 10, 9,
- 9, 12, 13, 12, 12, 11, 13, 12, 13, 13, 13, 13, 12, 12, 13, 11,
- 12, 13, 16, 16, 16, 13, 16, 14, 16, 16, 16, 16, 16, 14, 16, 13,
- 9, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 12, 11,
- 10, 14, 14, 13, 14, 13, 14, 13, 16, 16, 14, 15, 14, 14, 14, 12,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 14, 14, 16, 11, 12, 14, 13, 14, 16, 16, 16, 12, 13, 13, 12,
- 12, 16, 16, 16, 13, 13, 16, 14, 16, 16, 16, 16, 16, 14, 16, 13,
- 13, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 6, 10, 10, 10, 10, 11, 11, 11, 9, 11, 9, 10, 9, 10, 10, 9,
- 9, 13, 13, 13, 13, 13, 14, 13, 12, 13, 13, 12, 13, 12, 13, 11,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 8, 13, 12, 12, 13, 13, 13, 13, 11, 13, 10, 12, 12, 13, 12, 11,
- 10, 14, 13, 13, 16, 16, 16, 14, 14, 14, 13, 13, 14, 14, 14, 12,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 11, 16, 13, 16, 16, 16, 16, 16, 14, 16, 12, 13, 16, 16, 14, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 13, 13, 13, 11, 12, 13, 13, 11, 13, 12, 13, 10, 12, 12, 11,
- 10, 14, 16, 16, 14, 13, 16, 14, 14, 16, 16, 14, 13, 13, 14, 12,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 16, 14, 16, 14, 14, 14, 14, 13, 16, 13, 14, 13, 14, 12, 12,
- 10, 14, 14, 14, 14, 16, 16, 14, 14, 16, 14, 14, 14, 14, 14, 12,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16, 12, 14, 14, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 14, 13, 14, 13, 14, 16, 16, 11, 13, 12, 13, 11, 13, 12, 12,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 14, 16, 16, 16, 16, 16, 13, 16, 12, 13, 14, 16, 13, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 14, 16, 12, 16, 16, 16, 14, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 14, 16, 16, 16, 13, 16, 14, 16, 12, 13, 13, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16, 12, 16, 14, 14,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13,
-], [
- 1, 5, 5, 6, 5, 6, 7, 8, 5, 7, 6, 8, 6, 7, 7, 7,
- 5, 9, 10, 10, 10, 10, 12, 11, 10, 11, 11, 11, 10, 11, 12, 10,
- 9, 11, 13, 12, 13, 12, 16, 14, 16, 14, 16, 16, 16, 13, 16, 13,
- 5, 10, 9, 10, 10, 11, 11, 11, 10, 11, 9, 11, 10, 11, 11, 10,
- 8, 11, 11, 11, 12, 13, 13, 13, 12, 13, 12, 12, 13, 13, 13, 12,
- 11, 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 14, 11, 12, 14, 16, 13, 14, 13, 16, 12, 14, 16, 16, 13, 13,
- 11, 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 14, 14, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 10, 11, 11, 9, 10, 11, 11, 10, 12, 11, 12, 9, 11, 11, 11,
- 8, 12, 13, 13, 11, 11, 14, 13, 13, 14, 13, 16, 12, 12, 13, 12,
- 11, 13, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 13, 12, 13, 12, 13, 13, 14, 13, 16, 13, 16, 13, 16, 13, 13,
- 10, 14, 13, 14, 13, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 14, 16, 16, 11, 12, 14, 16, 13, 16, 16, 16, 12, 14, 13, 13,
- 11, 16, 16, 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 14, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 10, 10, 11, 10, 11, 12, 12, 8, 11, 10, 11, 9, 11, 11, 11,
- 9, 12, 13, 13, 13, 13, 16, 16, 12, 13, 13, 13, 13, 13, 16, 13,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 13, 11, 13, 12, 13, 13, 14, 11, 13, 10, 13, 12, 14, 12, 12,
- 10, 14, 13, 14, 16, 16, 16, 16, 13, 16, 13, 14, 16, 16, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 13, 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 13, 13, 13, 11, 13, 14, 16, 11, 13, 13, 14, 10, 12, 12, 12,
- 10, 14, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, 13, 13, 16, 14,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 14, 16, 13, 16, 16, 16, 13, 16, 13, 16, 13, 16, 13, 14,
- 10, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 13,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16, 12, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 14, 13, 16, 13, 16, 16, 16, 10, 14, 12, 14, 11, 13, 13, 13,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 16, 16, 16, 16, 12, 16, 12, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 16, 16, 16, 16, 13, 16, 13, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 16, 16, 14, 16, 16, 16, 12, 16, 16, 16, 12, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16, 12, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14,
-]];
-
-const RV34_INTER_CBP: &[[[u8; 16]; 4]; 7] = &[
-[
- [ 0, 6, 6, 3, 6, 4, 5, 3, 6, 5, 4, 3, 3, 4, 4, 3 ],
- [ 0, 6, 6, 4, 6, 4, 5, 3, 6, 5, 4, 3, 4, 4, 4, 2 ],
- [ 0, 7, 7, 4, 7, 5, 5, 4, 7, 5, 5, 4, 5, 4, 4, 1 ],
- [ 0, 7, 7, 5, 7, 5, 6, 4, 7, 6, 5, 3, 5, 4, 4, 1 ]
-], [
- [ 0, 6, 6, 3, 6, 3, 5, 4, 6, 5, 3, 4, 3, 4, 4, 3 ],
- [ 0, 6, 6, 4, 6, 4, 4, 4, 6, 4, 4, 3, 4, 4, 4, 2 ],
- [ 0, 6, 6, 4, 6, 4, 5, 4, 6, 5, 4, 3, 4, 4, 3, 2 ],
- [ 0, 7, 7, 5, 7, 5, 6, 4, 7, 6, 5, 3, 5, 4, 4, 1 ]
-], [
- [ 0, 6, 6, 3, 6, 3, 5, 4, 6, 5, 3, 4, 3, 4, 4, 3 ],
- [ 0, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, 4, 4, 4, 4, 2 ],
- [ 0, 6, 6, 4, 6, 4, 5, 3, 6, 5, 4, 3, 4, 4, 4, 2 ],
- [ 0, 7, 7, 5, 7, 5, 6, 4, 7, 6, 5, 3, 5, 4, 4, 1 ]
-], [
- [ 0, 6, 6, 3, 6, 3, 5, 4, 6, 5, 3, 4, 3, 4, 4, 3 ],
- [ 0, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, 4, 4, 4, 4, 2 ],
- [ 0, 6, 6, 4, 6, 4, 5, 3, 6, 5, 4, 3, 4, 4, 4, 2 ],
- [ 0, 7, 7, 4, 7, 5, 6, 4, 7, 6, 5, 4, 4, 4, 4, 1 ]
-], [
- [ 0, 5, 5, 3, 5, 3, 5, 4, 5, 5, 3, 4, 3, 4, 4, 4 ],
- [ 0, 5, 5, 3, 5, 4, 5, 4, 5, 5, 3, 4, 3, 4, 4, 3 ],
- [ 0, 6, 6, 4, 6, 4, 5, 4, 6, 5, 4, 3, 4, 4, 3, 2 ],
- [ 0, 7, 7, 4, 7, 5, 6, 4, 7, 6, 5, 4, 4, 4, 4, 1 ]
-], [
- [ 0, 5, 5, 3, 5, 3, 5, 4, 5, 5, 3, 4, 3, 4, 4, 4 ],
- [ 0, 5, 5, 3, 5, 4, 5, 4, 5, 5, 3, 4, 3, 4, 4, 3 ],
- [ 0, 5, 5, 3, 5, 4, 4, 4, 5, 4, 4, 4, 3, 4, 4, 3 ],
- [ 0, 6, 6, 4, 6, 4, 5, 4, 6, 5, 4, 3, 4, 4, 3, 2 ]
-], [
- [ 0, 4, 4, 3, 4, 3, 5, 5, 4, 5, 3, 5, 3, 5, 4, 5 ],
- [ 0, 4, 4, 3, 4, 4, 5, 4, 4, 5, 3, 5, 3, 5, 4, 4 ],
- [ 0, 4, 4, 3, 4, 4, 5, 4, 4, 5, 4, 4, 3, 4, 4, 4 ],
- [ 0, 4, 4, 3, 5, 4, 5, 4, 5, 5, 4, 4, 3, 4, 4, 3 ]
-]];
-
-const RV34_INTER_FIRSTPAT: &'static [[[u8; 864]; 2]; 7] = &[
- [
- [
- 0, 7, 5, 7, 5, 7, 6, 6, 7, 10, 7, 9, 8, 9, 8, 7,
- 12, 14, 11, 12, 12, 12, 11, 9, 6, 9, 6, 8, 7, 9, 7, 7,
- 8, 11, 8, 9, 9, 10, 9, 8, 13, 15, 12, 12, 12, 13, 11, 9,
- 10, 13, 9, 10, 11, 12, 9, 8, 12, 14, 10, 11, 12, 13, 10, 9,
- 16, 16, 12, 12, 14, 13, 11, 9, 6, 9, 7, 9, 7, 9, 8, 7,
- 9, 11, 9, 10, 9, 10, 9, 8, 14, 16, 12, 12, 13, 13, 11, 9,
- 8, 11, 8, 10, 9, 10, 9, 8, 10, 13, 10, 11, 10, 11, 9, 8,
- 14, 16, 12, 12, 13, 13, 11, 9, 12, 14, 10, 11, 12, 13, 10, 9,
- 13, 16, 11, 12, 13, 13, 10, 9, 16, 16, 13, 12, 14, 14, 11, 9,
- 11, 13, 11, 12, 10, 11, 10, 9, 13, 14, 12, 12, 11, 12, 10, 9,
- 16, 16, 13, 13, 13, 13, 11, 9, 12, 15, 12, 12, 11, 12, 10, 9,
- 13, 16, 13, 13, 12, 12, 11, 9, 16, 16, 14, 13, 13, 13, 11, 9,
- 14, 16, 13, 13, 13, 14, 11, 9, 16, 16, 13, 13, 14, 14, 11, 9,
- 16, 16, 13, 13, 14, 13, 11, 8, 4, 9, 6, 8, 6, 9, 7, 7,
- 8, 11, 8, 9, 9, 10, 8, 8, 13, 15, 12, 12, 13, 13, 11, 9,
- 7, 10, 7, 9, 8, 10, 8, 8, 9, 12, 9, 10, 10, 11, 9, 8,
- 14, 16, 12, 12, 13, 13, 11, 9, 11, 13, 9, 10, 11, 12, 9, 8,
- 12, 14, 10, 11, 12, 13, 10, 9, 16, 16, 13, 12, 14, 14, 11, 9,
- 7, 10, 8, 9, 8, 10, 8, 8, 10, 12, 10, 11, 10, 11, 9, 8,
- 14, 16, 13, 13, 13, 13, 11, 9, 9, 12, 9, 10, 9, 11, 9, 8,
- 11, 13, 10, 11, 10, 11, 10, 9, 15, 16, 13, 13, 13, 13, 11, 9,
- 12, 14, 11, 11, 12, 13, 10, 9, 13, 16, 11, 12, 13, 13, 10, 9,
- 16, 16, 12, 12, 14, 13, 11, 8, 11, 14, 11, 12, 10, 11, 10, 9,
- 13, 15, 12, 13, 11, 12, 10, 9, 16, 16, 14, 13, 13, 13, 11, 9,
- 12, 15, 12, 13, 11, 12, 10, 9, 13, 16, 13, 13, 12, 12, 11, 9,
- 16, 16, 14, 13, 13, 13, 11, 9, 15, 16, 13, 13, 13, 13, 11, 9,
- 16, 16, 13, 13, 13, 13, 11, 9, 16, 16, 13, 12, 13, 13, 10, 7,
- 8, 11, 8, 10, 9, 11, 9, 9, 10, 13, 10, 11, 11, 12, 10, 9,
- 15, 16, 13, 13, 14, 14, 12, 10, 9, 12, 9, 11, 10, 11, 9, 9,
- 12, 14, 11, 11, 11, 12, 10, 9, 16, 16, 13, 13, 14, 14, 12, 10,
- 12, 14, 10, 11, 12, 13, 10, 9, 14, 16, 11, 12, 13, 14, 10, 9,
- 16, 16, 13, 13, 15, 14, 11, 9, 9, 12, 10, 11, 9, 11, 10, 9,
- 12, 14, 11, 12, 11, 12, 10, 9, 16, 16, 14, 13, 14, 14, 12, 10,
- 11, 14, 10, 12, 11, 12, 10, 9, 12, 15, 11, 12, 12, 13, 11, 10,
- 16, 16, 14, 13, 14, 14, 12, 10, 13, 16, 11, 12, 13, 14, 11, 9,
- 14, 16, 12, 12, 13, 14, 11, 9, 16, 16, 13, 13, 14, 14, 11, 9,
- 12, 15, 12, 13, 10, 12, 10, 9, 14, 16, 13, 13, 11, 12, 11, 10,
- 16, 16, 14, 14, 14, 13, 12, 9, 13, 16, 13, 13, 12, 13, 11, 10,
- 14, 16, 13, 13, 12, 13, 11, 10, 16, 16, 14, 14, 13, 13, 12, 9,
- 15, 16, 13, 13, 13, 14, 11, 9, 16, 16, 13, 13, 13, 14, 11, 9,
- 16, 16, 13, 12, 13, 13, 10, 8, 10, 13, 10, 11, 10, 12, 10, 9,
- 12, 14, 11, 12, 12, 13, 11, 10, 16, 16, 13, 13, 14, 14, 12, 9,
- 11, 14, 10, 11, 11, 12, 10, 9, 13, 16, 11, 12, 12, 13, 11, 10,
- 16, 16, 14, 13, 14, 14, 12, 9, 12, 15, 10, 11, 12, 13, 9, 8,
- 14, 16, 11, 11, 13, 14, 10, 8, 16, 16, 12, 12, 14, 14, 10, 8,
- 11, 14, 11, 12, 11, 12, 10, 9, 13, 16, 12, 13, 12, 13, 11, 10,
- 16, 16, 14, 13, 14, 14, 12, 9, 12, 15, 11, 12, 11, 13, 10, 10,
- 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 14, 13, 14, 14, 12, 9,
- 13, 16, 11, 11, 13, 13, 10, 8, 14, 16, 11, 12, 13, 14, 10, 8,
- 16, 16, 12, 12, 14, 14, 10, 8, 12, 15, 12, 13, 10, 11, 10, 9,
- 14, 16, 13, 13, 11, 12, 10, 9, 16, 16, 14, 13, 13, 13, 11, 8,
- 13, 16, 12, 13, 11, 12, 10, 9, 14, 16, 13, 13, 12, 12, 10, 9,
- 16, 16, 14, 13, 13, 12, 10, 8, 14, 16, 12, 12, 12, 13, 10, 8,
- 14, 16, 12, 12, 12, 13, 10, 7, 16, 16, 11, 11, 12, 11, 8, 5,
- ], [
- 0, 7, 4, 8, 5, 8, 7, 8, 6, 10, 7, 10, 8, 10, 9, 9,
- 13, 16, 12, 13, 13, 14, 12, 12, 4, 10, 6, 9, 8, 11, 8, 9,
- 8, 12, 8, 11, 10, 12, 10, 10, 14, 16, 12, 13, 14, 15, 12, 12,
- 9, 14, 9, 11, 12, 14, 11, 11, 11, 15, 10, 12, 13, 14, 11, 11,
- 15, 16, 13, 14, 15, 16, 13, 12, 5, 10, 7, 10, 7, 10, 9, 9,
- 8, 12, 9, 11, 10, 11, 10, 10, 14, 16, 13, 14, 14, 14, 12, 12,
- 8, 12, 8, 11, 10, 12, 10, 10, 10, 14, 10, 12, 11, 13, 10, 11,
- 15, 16, 13, 14, 14, 15, 13, 12, 11, 16, 10, 12, 13, 15, 11, 11,
- 13, 16, 11, 13, 14, 15, 12, 12, 16, 16, 14, 14, 16, 16, 13, 12,
- 11, 15, 11, 13, 11, 13, 11, 11, 13, 16, 12, 14, 12, 13, 12, 12,
- 16, 16, 14, 15, 15, 15, 13, 12, 12, 16, 12, 14, 12, 14, 12, 12,
- 14, 16, 13, 14, 13, 14, 12, 12, 16, 16, 14, 16, 16, 16, 13, 12,
- 14, 16, 13, 14, 15, 16, 13, 12, 16, 16, 14, 15, 16, 16, 13, 12,
- 16, 16, 15, 16, 16, 16, 13, 12, 2, 9, 5, 8, 6, 9, 8, 9,
- 7, 11, 8, 10, 9, 11, 9, 10, 13, 16, 12, 13, 14, 14, 12, 12,
- 5, 11, 6, 10, 9, 11, 9, 9, 9, 13, 9, 11, 10, 12, 10, 10,
- 14, 16, 12, 14, 14, 15, 12, 12, 9, 14, 9, 11, 12, 14, 10, 11,
- 11, 16, 10, 12, 13, 14, 11, 11, 16, 16, 13, 14, 15, 16, 13, 12,
- 6, 11, 7, 10, 8, 11, 9, 9, 9, 13, 9, 11, 10, 12, 10, 10,
- 14, 16, 13, 14, 14, 14, 12, 12, 8, 13, 8, 11, 10, 12, 10, 10,
- 10, 13, 10, 12, 11, 13, 10, 11, 14, 16, 13, 14, 14, 15, 12, 12,
- 11, 15, 10, 12, 13, 15, 11, 11, 12, 16, 11, 13, 13, 15, 12, 11,
- 16, 16, 13, 14, 15, 16, 13, 12, 11, 15, 11, 13, 10, 13, 11, 11,
- 13, 16, 12, 14, 12, 13, 12, 11, 16, 16, 14, 15, 15, 15, 13, 12,
- 12, 16, 12, 13, 12, 14, 12, 12, 13, 16, 12, 14, 13, 14, 12, 12,
- 16, 16, 14, 15, 15, 15, 13, 12, 14, 16, 13, 14, 15, 16, 12, 12,
- 16, 16, 13, 14, 15, 16, 12, 12, 16, 16, 14, 15, 16, 16, 13, 12,
- 6, 12, 7, 10, 9, 12, 9, 10, 9, 13, 9, 12, 11, 13, 11, 11,
- 14, 16, 13, 14, 15, 15, 13, 12, 8, 13, 8, 11, 10, 13, 10, 10,
- 10, 14, 10, 12, 12, 14, 11, 11, 15, 16, 13, 14, 16, 16, 13, 12,
- 10, 15, 9, 12, 12, 15, 11, 11, 12, 16, 11, 13, 14, 16, 12, 12,
- 16, 16, 14, 14, 16, 16, 13, 12, 8, 13, 9, 11, 10, 12, 10, 11,
- 11, 14, 11, 12, 11, 13, 11, 11, 16, 16, 14, 15, 15, 16, 13, 12,
- 10, 14, 10, 12, 11, 13, 11, 11, 11, 15, 11, 13, 12, 14, 11, 11,
- 15, 16, 13, 14, 15, 16, 13, 12, 12, 16, 11, 13, 13, 16, 12, 12,
- 13, 16, 11, 13, 14, 16, 12, 12, 16, 16, 13, 14, 16, 16, 13, 12,
- 12, 16, 12, 14, 11, 13, 11, 11, 13, 16, 13, 14, 12, 14, 12, 12,
- 16, 16, 15, 16, 16, 16, 14, 13, 13, 16, 12, 14, 12, 14, 12, 12,
- 14, 16, 13, 14, 13, 14, 12, 12, 16, 16, 14, 16, 14, 16, 13, 12,
- 15, 16, 13, 15, 15, 16, 13, 12, 15, 16, 13, 15, 14, 16, 13, 12,
- 16, 16, 14, 15, 15, 16, 13, 11, 8, 13, 8, 11, 10, 13, 10, 11,
- 11, 15, 10, 12, 12, 14, 11, 11, 15, 16, 13, 14, 15, 15, 13, 12,
- 9, 14, 9, 12, 11, 14, 10, 11, 11, 16, 10, 12, 13, 14, 11, 11,
- 16, 16, 13, 14, 15, 16, 13, 12, 11, 15, 9, 12, 12, 14, 10, 10,
- 12, 16, 11, 12, 14, 15, 11, 11, 16, 16, 13, 14, 16, 16, 12, 11,
- 9, 14, 10, 12, 11, 13, 11, 11, 12, 16, 11, 13, 12, 14, 11, 11,
- 16, 16, 14, 14, 15, 15, 13, 12, 10, 15, 10, 12, 12, 14, 11, 11,
- 12, 16, 11, 13, 13, 14, 11, 11, 16, 16, 14, 14, 15, 16, 13, 12,
- 12, 16, 10, 12, 13, 15, 11, 11, 13, 16, 11, 13, 14, 15, 11, 11,
- 16, 16, 13, 13, 15, 16, 12, 11, 12, 16, 11, 13, 10, 13, 11, 11,
- 14, 16, 13, 14, 12, 14, 11, 11, 16, 16, 15, 16, 14, 15, 13, 11,
- 13, 16, 12, 14, 12, 14, 11, 11, 13, 16, 12, 14, 12, 14, 11, 11,
- 16, 16, 14, 15, 14, 14, 12, 11, 14, 16, 12, 13, 13, 15, 11, 11,
- 14, 16, 12, 13, 13, 14, 11, 11, 15, 16, 12, 13, 13, 13, 10, 9,
- ],
- ], [
- [
- 0, 7, 4, 7, 5, 7, 6, 6, 6, 10, 7, 8, 8, 9, 8, 7,
- 13, 14, 11, 12, 12, 12, 11, 9, 5, 9, 6, 8, 7, 9, 7, 7,
- 8, 11, 8, 9, 9, 10, 9, 8, 13, 16, 12, 12, 12, 13, 11, 9,
- 10, 13, 8, 10, 11, 12, 9, 9, 12, 14, 10, 11, 12, 13, 10, 9,
- 15, 16, 12, 12, 14, 14, 11, 9, 6, 10, 7, 9, 7, 9, 8, 7,
- 8, 11, 9, 10, 9, 10, 9, 8, 14, 16, 12, 12, 13, 12, 11, 9,
- 8, 11, 8, 10, 9, 10, 9, 8, 10, 13, 10, 11, 10, 11, 9, 9,
- 14, 16, 12, 12, 13, 13, 11, 9, 12, 15, 10, 11, 12, 13, 10, 9,
- 13, 16, 11, 12, 13, 13, 10, 9, 16, 16, 12, 13, 14, 14, 11, 9,
- 10, 14, 11, 12, 9, 11, 10, 9, 12, 15, 12, 13, 11, 12, 11, 9,
- 16, 16, 13, 13, 13, 13, 11, 9, 12, 15, 12, 13, 11, 12, 11, 9,
- 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 13, 13, 13, 13, 11, 9,
- 14, 16, 13, 13, 13, 14, 11, 10, 16, 16, 13, 13, 13, 14, 11, 10,
- 16, 16, 13, 13, 14, 14, 11, 9, 4, 9, 6, 8, 6, 9, 7, 7,
- 8, 11, 8, 9, 9, 10, 9, 8, 13, 15, 12, 12, 13, 13, 11, 9,
- 6, 10, 7, 9, 8, 10, 8, 8, 9, 12, 9, 10, 10, 11, 9, 8,
- 14, 16, 12, 12, 13, 13, 11, 10, 10, 13, 8, 10, 11, 12, 9, 9,
- 12, 15, 10, 11, 12, 13, 10, 9, 16, 16, 12, 12, 14, 14, 11, 9,
- 7, 11, 8, 9, 7, 10, 8, 8, 9, 12, 10, 11, 9, 11, 9, 9,
- 14, 16, 12, 13, 13, 13, 11, 10, 9, 12, 9, 10, 9, 11, 9, 9,
- 10, 13, 10, 11, 10, 11, 10, 9, 14, 16, 12, 13, 13, 13, 11, 9,
- 12, 15, 10, 11, 12, 13, 10, 9, 13, 16, 11, 12, 13, 13, 10, 9,
- 16, 16, 12, 12, 14, 14, 11, 9, 10, 14, 11, 12, 9, 11, 10, 9,
- 12, 16, 12, 13, 11, 12, 11, 9, 16, 16, 14, 14, 13, 13, 11, 9,
- 12, 16, 12, 13, 11, 12, 10, 10, 13, 16, 12, 13, 11, 12, 11, 10,
- 16, 16, 13, 13, 13, 13, 11, 9, 14, 16, 13, 13, 13, 14, 11, 9,
- 15, 16, 13, 13, 13, 14, 11, 9, 16, 16, 13, 13, 13, 13, 10, 8,
- 7, 11, 8, 10, 9, 11, 9, 9, 10, 13, 10, 11, 11, 12, 10, 10,
- 15, 16, 13, 13, 14, 14, 12, 10, 9, 13, 9, 11, 10, 12, 10, 9,
- 11, 14, 10, 12, 12, 13, 10, 10, 16, 16, 13, 13, 14, 14, 12, 10,
- 11, 15, 9, 11, 12, 13, 10, 9, 13, 16, 11, 12, 13, 14, 11, 10,
- 16, 16, 13, 13, 15, 15, 11, 10, 9, 13, 10, 11, 9, 11, 10, 9,
- 11, 14, 11, 12, 11, 12, 11, 10, 16, 16, 14, 14, 14, 14, 12, 10,
- 10, 14, 10, 12, 11, 12, 10, 10, 12, 15, 11, 12, 12, 13, 11, 10,
- 16, 16, 13, 13, 14, 14, 12, 10, 13, 16, 11, 12, 13, 14, 11, 10,
- 13, 16, 11, 12, 13, 14, 11, 10, 16, 16, 12, 13, 14, 14, 11, 9,
- 11, 15, 12, 13, 10, 12, 10, 10, 13, 16, 13, 14, 11, 13, 11, 10,
- 16, 16, 14, 14, 14, 14, 12, 10, 13, 16, 13, 13, 11, 13, 11, 10,
- 14, 16, 13, 14, 12, 13, 11, 10, 16, 16, 14, 14, 13, 13, 12, 10,
- 15, 16, 13, 14, 14, 14, 11, 10, 15, 16, 13, 13, 13, 14, 11, 10,
- 16, 16, 12, 13, 13, 13, 10, 8, 9, 13, 10, 11, 10, 12, 10, 10,
- 12, 15, 11, 12, 12, 13, 11, 10, 16, 16, 14, 13, 14, 14, 12, 10,
- 10, 14, 10, 12, 11, 13, 10, 10, 13, 16, 11, 12, 12, 14, 11, 10,
- 16, 16, 13, 13, 14, 14, 12, 10, 12, 16, 9, 11, 12, 14, 10, 9,
- 13, 16, 10, 12, 13, 14, 10, 9, 16, 16, 12, 12, 14, 14, 11, 9,
- 10, 14, 11, 12, 10, 12, 10, 10, 13, 16, 12, 13, 12, 13, 11, 10,
- 16, 16, 14, 14, 14, 14, 12, 10, 11, 16, 11, 12, 11, 13, 11, 10,
- 13, 16, 12, 13, 12, 14, 11, 10, 16, 16, 14, 14, 14, 14, 12, 10,
- 13, 16, 11, 12, 13, 14, 10, 9, 14, 16, 11, 12, 13, 14, 10, 9,
- 16, 16, 12, 12, 14, 14, 10, 8, 12, 16, 12, 13, 10, 12, 10, 9,
- 14, 16, 13, 13, 11, 12, 11, 9, 16, 16, 14, 14, 13, 13, 11, 9,
- 13, 16, 12, 13, 11, 12, 10, 9, 14, 16, 13, 13, 11, 13, 11, 9,
- 16, 16, 14, 14, 13, 13, 11, 9, 14, 16, 12, 13, 12, 13, 10, 8,
- 14, 16, 12, 12, 12, 13, 10, 8, 15, 16, 11, 11, 11, 12, 9, 6,
- ], [
- 0, 7, 4, 7, 5, 8, 7, 8, 5, 10, 7, 10, 8, 10, 9, 10,
- 13, 16, 12, 14, 14, 14, 13, 12, 4, 10, 6, 9, 8, 11, 9, 9,
- 8, 12, 8, 11, 10, 12, 10, 10, 14, 16, 13, 14, 14, 15, 13, 12,
- 9, 14, 9, 12, 12, 14, 11, 11, 12, 16, 11, 13, 13, 15, 12, 12,
- 15, 16, 14, 15, 15, 16, 13, 13, 5, 10, 7, 10, 7, 10, 9, 9,
- 8, 12, 9, 11, 9, 11, 10, 10, 14, 16, 13, 14, 14, 15, 13, 12,
- 7, 12, 8, 11, 10, 12, 10, 10, 10, 13, 10, 12, 11, 13, 11, 11,
- 15, 16, 13, 15, 14, 16, 13, 13, 11, 16, 11, 13, 13, 16, 12, 12,
- 13, 16, 12, 14, 14, 16, 12, 12, 16, 16, 14, 16, 16, 16, 14, 13,
- 11, 15, 12, 14, 11, 13, 11, 12, 13, 16, 12, 14, 12, 14, 12, 12,
- 16, 16, 14, 16, 14, 16, 13, 13, 13, 16, 12, 14, 12, 14, 12, 12,
- 14, 16, 13, 15, 13, 15, 13, 13, 16, 16, 15, 16, 16, 16, 14, 13,
- 15, 16, 13, 16, 15, 16, 13, 13, 16, 16, 14, 16, 16, 16, 14, 13,
- 16, 16, 16, 16, 16, 16, 14, 13, 2, 9, 5, 8, 6, 9, 8, 9,
- 7, 11, 8, 10, 9, 11, 9, 10, 14, 16, 13, 14, 14, 15, 13, 12,
- 5, 11, 6, 10, 9, 11, 9, 10, 8, 13, 9, 11, 11, 12, 10, 11,
- 14, 16, 13, 14, 14, 16, 13, 13, 9, 15, 9, 12, 12, 14, 11, 11,
- 12, 16, 11, 13, 13, 15, 12, 12, 16, 16, 14, 15, 16, 16, 14, 13,
- 6, 11, 7, 10, 8, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 11,
- 14, 16, 13, 14, 14, 15, 13, 13, 8, 12, 8, 11, 10, 12, 10, 11,
- 9, 13, 10, 12, 11, 13, 11, 11, 14, 16, 13, 14, 14, 16, 13, 13,
- 12, 16, 11, 13, 13, 15, 12, 12, 13, 16, 11, 13, 14, 16, 12, 12,
- 16, 16, 14, 15, 16, 16, 13, 13, 11, 15, 11, 14, 10, 13, 11, 12,
- 13, 16, 13, 15, 12, 14, 12, 12, 16, 16, 15, 16, 15, 16, 14, 13,
- 12, 16, 12, 14, 12, 14, 12, 12, 13, 16, 13, 15, 13, 14, 12, 13,
- 16, 16, 15, 16, 15, 16, 13, 13, 15, 16, 13, 16, 15, 16, 13, 13,
- 16, 16, 14, 16, 16, 16, 13, 13, 16, 16, 15, 16, 16, 16, 14, 13,
- 5, 12, 7, 10, 9, 12, 10, 10, 9, 13, 9, 12, 11, 13, 11, 11,
- 15, 16, 13, 14, 15, 15, 13, 13, 7, 13, 8, 11, 10, 13, 10, 11,
- 10, 14, 10, 12, 12, 14, 11, 12, 16, 16, 14, 15, 16, 16, 14, 13,
- 10, 16, 9, 12, 13, 15, 11, 12, 13, 16, 11, 13, 14, 16, 12, 12,
- 16, 16, 14, 16, 16, 16, 14, 13, 8, 13, 9, 12, 9, 12, 10, 11,
- 11, 15, 11, 13, 11, 13, 11, 12, 16, 16, 14, 16, 16, 16, 14, 13,
- 9, 14, 10, 12, 11, 13, 11, 12, 11, 15, 11, 13, 12, 14, 12, 12,
- 16, 16, 14, 16, 15, 16, 14, 13, 12, 16, 11, 14, 14, 16, 12, 12,
- 13, 16, 12, 14, 14, 16, 13, 13, 16, 16, 13, 15, 16, 16, 14, 13,
- 11, 16, 12, 14, 10, 13, 12, 12, 13, 16, 13, 15, 12, 14, 12, 13,
- 16, 16, 16, 16, 16, 16, 14, 14, 13, 16, 13, 15, 12, 15, 12, 13,
- 13, 16, 13, 15, 12, 15, 13, 13, 16, 16, 15, 16, 14, 16, 14, 13,
- 16, 16, 14, 16, 16, 16, 14, 13, 15, 16, 14, 16, 15, 16, 14, 13,
- 16, 16, 14, 16, 15, 16, 13, 12, 8, 14, 9, 12, 10, 14, 11, 12,
- 11, 16, 10, 13, 12, 14, 12, 12, 16, 16, 14, 15, 15, 16, 14, 13,
- 9, 15, 9, 12, 12, 14, 11, 12, 12, 16, 11, 13, 13, 15, 12, 12,
- 16, 16, 14, 15, 16, 16, 14, 13, 11, 16, 9, 12, 13, 15, 11, 11,
- 13, 16, 11, 13, 14, 16, 12, 12, 16, 16, 14, 14, 16, 16, 13, 12,
- 9, 15, 10, 13, 11, 14, 11, 12, 12, 16, 11, 14, 12, 14, 12, 12,
- 16, 16, 14, 16, 16, 16, 14, 13, 10, 16, 10, 13, 12, 15, 12, 12,
- 12, 16, 12, 14, 13, 15, 12, 12, 16, 16, 14, 16, 16, 16, 14, 13,
- 12, 16, 11, 13, 13, 16, 12, 12, 13, 16, 11, 13, 14, 16, 12, 12,
- 16, 16, 13, 14, 16, 16, 13, 12, 11, 16, 12, 14, 10, 13, 11, 12,
- 13, 16, 13, 15, 12, 14, 12, 12, 16, 16, 16, 16, 15, 16, 13, 12,
- 12, 16, 12, 15, 12, 14, 12, 12, 13, 16, 13, 15, 12, 14, 12, 12,
- 16, 16, 15, 16, 14, 15, 13, 12, 14, 16, 13, 14, 13, 16, 12, 12,
- 13, 16, 12, 14, 13, 15, 12, 12, 14, 16, 12, 13, 13, 14, 11, 10,
- ],
- ], [
- [
- 0, 7, 4, 7, 5, 7, 6, 6, 6, 10, 7, 8, 8, 9, 8, 8,
- 13, 14, 11, 12, 12, 12, 11, 10, 5, 9, 6, 8, 7, 9, 7, 7,
- 8, 11, 8, 9, 9, 10, 9, 8, 13, 16, 12, 12, 13, 13, 11, 10,
- 10, 14, 8, 10, 11, 13, 9, 9, 12, 15, 10, 11, 12, 13, 10, 10,
- 16, 16, 12, 13, 14, 14, 11, 10, 5, 10, 7, 9, 6, 9, 8, 8,
- 8, 11, 9, 10, 9, 10, 9, 8, 14, 16, 12, 12, 13, 13, 11, 10,
- 8, 12, 8, 10, 9, 10, 9, 9, 10, 13, 9, 11, 10, 11, 9, 9,
- 14, 16, 12, 13, 13, 13, 11, 10, 12, 16, 10, 12, 12, 13, 10, 10,
- 13, 16, 11, 12, 13, 14, 11, 10, 16, 16, 12, 13, 14, 14, 11, 10,
- 10, 14, 11, 13, 9, 11, 10, 10, 12, 16, 12, 13, 11, 12, 11, 10,
- 16, 16, 13, 14, 13, 13, 12, 10, 12, 16, 12, 13, 11, 13, 11, 10,
- 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 13, 14, 13, 14, 12, 10,
- 14, 16, 13, 14, 13, 14, 12, 11, 16, 16, 13, 14, 14, 15, 12, 11,
- 16, 16, 13, 14, 14, 14, 11, 10, 3, 9, 5, 8, 6, 9, 7, 7,
- 8, 11, 8, 10, 9, 10, 9, 8, 14, 15, 12, 12, 13, 13, 11, 10,
- 6, 11, 6, 9, 8, 10, 8, 8, 9, 12, 9, 10, 10, 11, 9, 9,
- 14, 16, 12, 13, 13, 13, 11, 10, 10, 14, 8, 11, 12, 13, 9, 9,
- 12, 16, 10, 11, 12, 13, 10, 10, 16, 16, 12, 13, 14, 14, 11, 10,
- 6, 11, 8, 10, 7, 10, 8, 8, 9, 12, 10, 11, 9, 11, 9, 9,
- 14, 16, 12, 13, 13, 13, 12, 10, 9, 12, 9, 11, 9, 11, 9, 9,
- 10, 13, 10, 11, 10, 12, 10, 9, 14, 16, 12, 13, 13, 13, 11, 10,
- 12, 16, 10, 12, 12, 14, 10, 10, 13, 16, 10, 12, 13, 14, 11, 10,
- 16, 16, 12, 13, 14, 14, 11, 10, 10, 15, 11, 13, 9, 11, 10, 10,
- 12, 16, 12, 13, 11, 12, 11, 10, 16, 16, 14, 14, 13, 14, 12, 10,
- 12, 16, 12, 13, 11, 13, 11, 10, 13, 16, 12, 13, 11, 13, 11, 10,
- 16, 16, 13, 14, 13, 13, 12, 10, 14, 16, 13, 14, 14, 14, 11, 11,
- 15, 16, 13, 14, 13, 14, 11, 10, 16, 16, 13, 13, 13, 14, 11, 9,
- 7, 12, 8, 11, 9, 11, 9, 10, 10, 14, 10, 12, 11, 12, 11, 10,
- 16, 16, 13, 13, 14, 14, 12, 11, 9, 13, 9, 11, 10, 12, 10, 10,
- 11, 15, 10, 12, 12, 13, 11, 10, 16, 16, 13, 14, 14, 14, 12, 11,
- 11, 16, 9, 11, 12, 14, 10, 10, 13, 16, 10, 12, 13, 14, 11, 10,
- 16, 16, 13, 14, 16, 16, 12, 11, 9, 13, 10, 12, 9, 12, 10, 10,
- 11, 15, 11, 13, 11, 13, 11, 11, 16, 16, 14, 14, 14, 14, 13, 11,
- 10, 14, 10, 12, 11, 13, 11, 10, 12, 16, 11, 13, 12, 13, 11, 11,
- 16, 16, 13, 14, 14, 14, 12, 11, 13, 16, 11, 13, 13, 14, 11, 11,
- 13, 16, 11, 13, 13, 14, 11, 11, 16, 16, 12, 13, 14, 15, 12, 10,
- 11, 16, 12, 14, 10, 12, 11, 10, 13, 16, 13, 14, 11, 13, 11, 11,
- 16, 16, 15, 16, 14, 14, 13, 11, 13, 16, 13, 14, 12, 13, 11, 11,
- 13, 16, 13, 14, 12, 13, 11, 11, 16, 16, 14, 14, 13, 14, 12, 11,
- 15, 16, 13, 14, 14, 16, 12, 11, 14, 16, 13, 14, 13, 14, 12, 11,
- 16, 16, 12, 13, 13, 14, 11, 9, 9, 14, 10, 12, 10, 13, 11, 11,
- 12, 16, 12, 13, 12, 14, 12, 11, 16, 16, 14, 14, 14, 14, 13, 11,
- 10, 16, 10, 13, 12, 14, 11, 11, 13, 16, 12, 13, 13, 14, 12, 11,
- 16, 16, 14, 14, 15, 15, 13, 11, 12, 16, 9, 12, 13, 14, 10, 10,
- 14, 16, 11, 12, 13, 15, 11, 10, 16, 16, 13, 13, 15, 16, 11, 10,
- 10, 16, 11, 13, 11, 13, 11, 11, 13, 16, 12, 14, 12, 14, 12, 11,
- 16, 16, 14, 14, 14, 14, 13, 11, 11, 16, 11, 13, 12, 14, 11, 11,
- 13, 16, 12, 14, 13, 14, 12, 11, 16, 16, 14, 14, 14, 15, 13, 11,
- 13, 16, 11, 13, 13, 14, 11, 10, 14, 16, 11, 13, 13, 14, 11, 10,
- 16, 16, 12, 13, 14, 15, 11, 9, 12, 16, 12, 14, 10, 13, 11, 10,
- 14, 16, 13, 14, 11, 13, 11, 10, 16, 16, 14, 15, 13, 14, 12, 10,
- 13, 16, 13, 14, 11, 13, 11, 10, 14, 16, 13, 14, 12, 13, 11, 10,
- 16, 16, 14, 14, 13, 13, 11, 10, 14, 16, 12, 13, 13, 14, 11, 9,
- 14, 16, 12, 13, 12, 13, 10, 9, 14, 16, 11, 11, 12, 12, 9, 7,
- ], [
- 0, 7, 3, 8, 5, 8, 7, 9, 5, 10, 7, 10, 8, 11, 10, 10,
- 14, 16, 14, 15, 14, 16, 14, 14, 4, 10, 6, 10, 8, 11, 9, 10,
- 8, 12, 9, 11, 10, 12, 11, 11, 15, 16, 14, 16, 15, 16, 14, 14,
- 10, 16, 10, 13, 13, 16, 12, 13, 13, 16, 12, 14, 14, 16, 13, 13,
- 16, 16, 16, 16, 16, 16, 14, 15, 4, 10, 7, 10, 7, 10, 9, 10,
- 8, 12, 9, 12, 10, 12, 11, 12, 14, 16, 14, 16, 15, 16, 14, 14,
- 8, 12, 9, 12, 10, 13, 11, 12, 10, 14, 11, 13, 11, 14, 12, 13,
- 16, 16, 14, 16, 16, 16, 14, 15, 12, 16, 12, 14, 14, 16, 13, 14,
- 14, 16, 13, 16, 16, 16, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 12, 16, 11, 14, 13, 13, 13, 16, 13, 16, 13, 15, 13, 14,
- 16, 16, 16, 16, 16, 16, 15, 16, 13, 16, 13, 16, 13, 16, 13, 14,
- 14, 16, 14, 16, 14, 16, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 2, 9, 5, 9, 6, 10, 8, 10,
- 7, 11, 8, 11, 9, 12, 10, 11, 14, 16, 14, 16, 15, 16, 14, 14,
- 5, 11, 6, 10, 9, 12, 10, 11, 9, 13, 9, 12, 11, 13, 11, 12,
- 16, 16, 14, 16, 16, 16, 14, 14, 10, 16, 9, 13, 13, 16, 12, 13,
- 13, 16, 12, 14, 14, 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 14,
- 5, 11, 8, 11, 7, 11, 10, 11, 9, 13, 10, 13, 10, 13, 11, 12,
- 16, 16, 14, 16, 16, 16, 14, 14, 8, 13, 9, 12, 10, 13, 11, 12,
- 10, 14, 10, 13, 11, 14, 12, 12, 16, 16, 14, 16, 15, 16, 14, 14,
- 12, 16, 12, 14, 14, 16, 13, 14, 14, 16, 12, 16, 15, 16, 13, 14,
- 16, 16, 15, 16, 16, 16, 15, 15, 11, 16, 12, 16, 10, 14, 12, 13,
- 13, 16, 14, 16, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 15, 16,
- 13, 16, 13, 16, 13, 16, 13, 14, 14, 16, 14, 16, 13, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 15, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16,
- 5, 13, 7, 12, 9, 13, 11, 12, 10, 14, 10, 13, 11, 13, 12, 13,
- 16, 16, 16, 16, 16, 16, 16, 15, 7, 14, 8, 12, 11, 14, 11, 12,
- 11, 16, 11, 13, 13, 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 10, 14, 14, 16, 12, 13, 13, 16, 12, 15, 16, 16, 14, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 14, 10, 13, 9, 13, 11, 12,
- 11, 16, 12, 14, 12, 14, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 11, 14, 12, 14, 12, 13, 11, 16, 12, 14, 12, 15, 13, 13,
- 16, 16, 15, 16, 16, 16, 15, 16, 13, 16, 12, 16, 15, 16, 14, 14,
- 13, 16, 12, 16, 16, 16, 14, 14, 16, 16, 14, 16, 16, 16, 14, 16,
- 11, 16, 13, 16, 10, 14, 12, 13, 14, 16, 14, 16, 13, 16, 14, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 14, 16, 13, 16, 14, 15,
- 13, 16, 14, 16, 13, 16, 14, 15, 16, 16, 16, 16, 15, 16, 15, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 15, 16,
- 16, 16, 15, 16, 16, 16, 14, 14, 8, 16, 10, 14, 11, 16, 12, 13,
- 12, 16, 12, 14, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 16, 14,
- 10, 16, 10, 14, 12, 16, 12, 13, 13, 16, 12, 15, 14, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 16, 15, 11, 16, 10, 13, 13, 16, 12, 13,
- 14, 16, 12, 14, 15, 16, 13, 13, 16, 16, 16, 16, 16, 16, 15, 14,
- 10, 16, 11, 14, 11, 16, 12, 13, 13, 16, 13, 16, 13, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 16, 15, 11, 16, 12, 14, 13, 16, 13, 14,
- 13, 16, 13, 16, 14, 16, 13, 14, 16, 16, 16, 16, 16, 16, 16, 15,
- 13, 16, 12, 14, 14, 16, 13, 13, 13, 16, 12, 15, 14, 16, 13, 13,
- 16, 16, 14, 16, 16, 16, 14, 13, 11, 16, 12, 16, 11, 15, 12, 13,
- 14, 16, 14, 16, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 14, 14,
- 12, 16, 13, 16, 12, 16, 13, 14, 13, 16, 14, 16, 13, 16, 13, 14,
- 16, 16, 16, 16, 14, 16, 14, 14, 14, 16, 13, 16, 14, 16, 13, 13,
- 13, 16, 13, 16, 14, 16, 13, 13, 15, 16, 13, 14, 13, 15, 12, 12,
- ],
- ], [
- [
- 0, 7, 4, 6, 4, 7, 6, 7, 6, 9, 7, 8, 7, 9, 8, 8,
- 13, 14, 12, 12, 12, 13, 11, 11, 5, 9, 5, 8, 7, 9, 7, 8,
- 8, 11, 8, 10, 9, 10, 9, 9, 13, 15, 12, 13, 12, 13, 11, 11,
- 9, 14, 8, 11, 11, 13, 10, 10, 11, 15, 10, 12, 12, 13, 10, 11,
- 14, 16, 12, 13, 14, 14, 12, 11, 5, 9, 7, 9, 6, 9, 8, 8,
- 8, 11, 8, 10, 8, 10, 9, 9, 13, 16, 12, 13, 13, 13, 11, 11,
- 7, 11, 8, 10, 9, 11, 9, 9, 9, 13, 9, 11, 10, 11, 10, 10,
- 14, 16, 12, 13, 13, 13, 12, 11, 11, 16, 10, 12, 12, 14, 11, 11,
- 13, 16, 11, 13, 13, 14, 11, 11, 16, 16, 13, 14, 14, 15, 12, 11,
- 10, 15, 11, 13, 9, 12, 10, 10, 12, 16, 12, 13, 11, 12, 11, 11,
- 15, 16, 13, 14, 13, 14, 12, 11, 12, 16, 12, 14, 11, 13, 11, 11,
- 13, 16, 12, 14, 12, 13, 12, 11, 16, 16, 13, 14, 14, 14, 12, 11,
- 14, 16, 13, 14, 14, 15, 12, 12, 16, 16, 13, 14, 14, 16, 12, 12,
- 16, 16, 14, 14, 14, 15, 12, 11, 3, 9, 5, 8, 6, 9, 7, 8,
- 7, 11, 8, 10, 9, 10, 9, 9, 13, 14, 12, 13, 13, 13, 12, 11,
- 6, 11, 6, 9, 8, 10, 8, 9, 9, 12, 8, 10, 10, 11, 9, 10,
- 14, 16, 12, 13, 13, 14, 12, 11, 9, 14, 8, 11, 11, 13, 10, 10,
- 12, 16, 10, 12, 12, 14, 11, 11, 16, 16, 12, 13, 14, 15, 12, 11,
- 6, 11, 8, 10, 7, 10, 8, 9, 9, 12, 9, 11, 9, 11, 10, 10,
- 14, 16, 13, 13, 13, 14, 12, 11, 8, 12, 9, 11, 9, 11, 9, 10,
- 10, 13, 9, 11, 10, 12, 10, 10, 14, 16, 12, 13, 13, 14, 12, 11,
- 12, 16, 10, 12, 12, 14, 11, 11, 12, 16, 10, 12, 13, 14, 11, 11,
- 15, 16, 12, 13, 14, 14, 11, 11, 10, 15, 11, 13, 9, 12, 10, 10,
- 12, 16, 12, 14, 11, 13, 11, 11, 16, 16, 14, 14, 14, 14, 12, 11,
- 12, 16, 12, 14, 11, 13, 11, 11, 13, 16, 12, 14, 11, 13, 11, 11,
- 16, 16, 13, 14, 13, 14, 12, 11, 14, 16, 13, 14, 14, 15, 12, 11,
- 14, 16, 13, 14, 13, 15, 12, 11, 16, 16, 13, 14, 13, 14, 11, 10,
- 6, 13, 8, 11, 9, 12, 10, 10, 10, 14, 10, 12, 11, 13, 11, 11,
- 16, 16, 13, 14, 14, 14, 13, 12, 8, 14, 8, 12, 10, 13, 10, 11,
- 11, 15, 10, 12, 12, 13, 11, 11, 16, 16, 14, 14, 15, 16, 13, 12,
- 11, 16, 9, 12, 12, 14, 11, 11, 13, 16, 11, 13, 13, 16, 11, 11,
- 16, 16, 13, 14, 16, 16, 13, 12, 8, 14, 10, 12, 9, 12, 10, 11,
- 11, 15, 11, 13, 11, 13, 11, 11, 16, 16, 14, 15, 14, 15, 13, 12,
- 10, 15, 10, 13, 11, 13, 11, 11, 11, 15, 11, 13, 12, 13, 11, 11,
- 16, 16, 13, 15, 14, 15, 13, 12, 12, 16, 11, 13, 13, 15, 11, 11,
- 13, 16, 11, 13, 13, 15, 11, 11, 16, 16, 12, 14, 14, 16, 12, 11,
- 11, 16, 12, 14, 10, 13, 11, 11, 13, 16, 13, 15, 12, 14, 12, 12,
- 16, 16, 15, 16, 14, 15, 13, 12, 12, 16, 13, 14, 12, 14, 12, 12,
- 13, 16, 13, 14, 12, 14, 12, 12, 16, 16, 14, 15, 13, 14, 12, 12,
- 15, 16, 13, 15, 14, 16, 12, 12, 14, 16, 13, 14, 13, 15, 12, 12,
- 15, 16, 12, 13, 13, 14, 11, 10, 9, 15, 10, 13, 11, 14, 11, 12,
- 12, 16, 12, 14, 12, 14, 12, 12, 16, 16, 14, 14, 14, 15, 13, 12,
- 10, 16, 10, 13, 12, 14, 12, 12, 13, 16, 12, 14, 13, 15, 12, 12,
- 16, 16, 14, 14, 15, 16, 13, 12, 11, 16, 9, 12, 13, 15, 11, 11,
- 14, 16, 11, 13, 14, 16, 11, 11, 16, 16, 13, 14, 16, 16, 12, 11,
- 10, 16, 11, 14, 11, 14, 12, 12, 13, 16, 13, 14, 12, 14, 12, 12,
- 16, 16, 14, 15, 15, 15, 13, 12, 11, 16, 12, 14, 12, 15, 12, 12,
- 13, 16, 12, 14, 13, 15, 12, 12, 16, 16, 14, 15, 15, 16, 13, 12,
- 12, 16, 11, 13, 13, 15, 11, 11, 13, 16, 11, 13, 13, 15, 11, 11,
- 16, 16, 12, 13, 14, 16, 12, 10, 11, 16, 12, 14, 10, 13, 11, 11,
- 14, 16, 13, 14, 12, 14, 11, 11, 16, 16, 15, 16, 14, 14, 12, 11,
- 12, 16, 13, 14, 11, 14, 11, 11, 13, 16, 13, 14, 12, 14, 11, 11,
- 16, 16, 14, 15, 13, 14, 12, 11, 14, 16, 12, 14, 13, 14, 11, 10,
- 13, 16, 12, 13, 12, 14, 11, 10, 14, 16, 11, 12, 12, 12, 10, 8,
- ], [
- 0, 8, 4, 9, 5, 9, 8, 10, 6, 11, 8, 11, 9, 12, 11, 12,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 11, 6, 11, 9, 12, 10, 12,
- 9, 13, 10, 13, 11, 16, 12, 13, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 11, 16, 16, 16, 14, 16, 14, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 11, 8, 12, 7, 12, 10, 12,
- 8, 13, 10, 13, 10, 13, 12, 14, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 13, 10, 14, 11, 16, 12, 14, 11, 16, 12, 16, 12, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 14, 16, 12, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 1, 10, 5, 10, 7, 11, 9, 11,
- 8, 12, 9, 12, 10, 13, 12, 13, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 12, 7, 12, 10, 13, 11, 12, 9, 16, 10, 13, 12, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 10, 16, 16, 16, 14, 16,
- 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 6, 12, 9, 13, 8, 12, 11, 13, 10, 16, 11, 16, 11, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 10, 14, 11, 16, 12, 16,
- 10, 16, 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 14, 16, 11, 16, 14, 16,
- 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 6, 16, 9, 13, 10, 16, 12, 14, 11, 16, 12, 16, 12, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 9, 14, 12, 16, 13, 16,
- 12, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 10, 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 11, 16, 10, 16, 12, 16,
- 12, 16, 13, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 12, 16, 13, 16, 14, 16, 11, 16, 13, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 16, 16,
- 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 11, 16, 14, 16, 16, 16, 16, 16, 14, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 11, 16, 12, 16, 13, 16,
- 13, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 11, 16, 13, 16, 14, 16, 14, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 10, 16, 16, 16, 13, 16,
- 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 12, 16, 12, 16, 13, 16, 13, 16, 16, 16, 14, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 14, 16, 16, 16,
- 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 12, 16, 16, 16, 14, 16, 14, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 11, 16, 13, 16,
- 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 15,
- ],
- ], [
- [
- 0, 7, 3, 7, 4, 7, 6, 7, 6, 9, 7, 9, 7, 9, 8, 9,
- 13, 14, 12, 13, 13, 13, 12, 12, 4, 9, 5, 9, 7, 9, 8, 9,
- 7, 11, 8, 10, 9, 11, 9, 10, 13, 16, 12, 14, 13, 14, 12, 12,
- 9, 14, 8, 12, 12, 14, 10, 11, 11, 16, 10, 13, 13, 14, 11, 12,
- 15, 16, 13, 14, 14, 16, 12, 12, 5, 10, 7, 9, 6, 9, 8, 9,
- 8, 11, 8, 11, 8, 10, 9, 10, 14, 16, 12, 14, 13, 14, 12, 12,
- 7, 12, 8, 11, 9, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 11,
- 14, 16, 12, 14, 13, 14, 12, 12, 12, 16, 11, 13, 13, 15, 11, 12,
- 13, 16, 11, 14, 13, 15, 12, 12, 15, 16, 13, 15, 14, 16, 13, 13,
- 10, 15, 12, 14, 9, 13, 11, 12, 12, 16, 12, 14, 11, 13, 12, 12,
- 15, 16, 13, 15, 14, 15, 13, 13, 12, 16, 12, 14, 12, 14, 12, 12,
- 13, 16, 13, 14, 12, 14, 12, 12, 16, 16, 14, 15, 14, 16, 13, 13,
- 15, 16, 13, 15, 14, 16, 12, 13, 16, 16, 14, 16, 14, 16, 13, 13,
- 16, 16, 14, 16, 15, 16, 13, 13, 3, 9, 5, 9, 6, 9, 8, 9,
- 7, 11, 8, 10, 9, 11, 9, 10, 14, 15, 13, 14, 13, 14, 12, 12,
- 5, 11, 6, 10, 8, 11, 9, 10, 9, 12, 9, 11, 10, 12, 10, 11,
- 14, 16, 13, 14, 14, 15, 13, 13, 9, 15, 8, 12, 12, 14, 10, 11,
- 12, 16, 10, 13, 13, 15, 11, 12, 15, 16, 13, 14, 14, 16, 13, 13,
- 6, 11, 8, 11, 7, 10, 9, 10, 9, 13, 10, 12, 9, 12, 10, 11,
- 14, 16, 13, 14, 14, 14, 13, 13, 8, 13, 9, 12, 9, 12, 10, 11,
- 9, 13, 9, 12, 10, 12, 10, 11, 14, 16, 12, 14, 13, 14, 12, 12,
- 12, 16, 11, 13, 13, 15, 11, 12, 12, 16, 11, 13, 13, 15, 11, 12,
- 14, 16, 12, 14, 14, 15, 12, 12, 10, 15, 11, 14, 9, 13, 11, 12,
- 12, 16, 12, 14, 11, 14, 12, 12, 16, 16, 14, 16, 14, 15, 13, 13,
- 12, 16, 12, 14, 11, 14, 12, 12, 12, 16, 13, 14, 11, 14, 12, 12,
- 15, 16, 14, 15, 13, 15, 12, 13, 14, 16, 13, 15, 14, 16, 13, 13,
- 14, 16, 13, 15, 14, 16, 12, 13, 15, 16, 13, 15, 13, 15, 12, 12,
- 6, 13, 8, 12, 9, 12, 10, 11, 10, 14, 11, 13, 11, 13, 12, 12,
- 15, 16, 14, 15, 15, 15, 14, 13, 8, 14, 9, 12, 11, 13, 11, 12,
- 11, 15, 11, 13, 12, 14, 12, 12, 16, 16, 14, 15, 15, 16, 14, 14,
- 10, 16, 9, 13, 12, 15, 11, 12, 13, 16, 11, 14, 13, 16, 12, 12,
- 16, 16, 14, 15, 16, 16, 13, 13, 8, 14, 10, 13, 9, 13, 11, 12,
- 11, 15, 12, 14, 11, 14, 12, 12, 16, 16, 15, 16, 15, 16, 14, 14,
- 10, 15, 10, 13, 11, 14, 11, 12, 11, 15, 11, 14, 12, 14, 12, 12,
- 15, 16, 14, 15, 14, 16, 13, 13, 12, 16, 11, 14, 13, 16, 12, 12,
- 12, 16, 11, 14, 13, 15, 12, 12, 15, 16, 12, 14, 15, 16, 13, 13,
- 11, 16, 12, 14, 10, 14, 11, 12, 13, 16, 13, 16, 12, 14, 12, 13,
- 16, 16, 16, 16, 15, 16, 14, 13, 12, 16, 13, 15, 12, 14, 12, 13,
- 13, 16, 13, 15, 12, 14, 12, 13, 16, 16, 14, 16, 13, 15, 13, 13,
- 15, 16, 14, 16, 14, 16, 13, 13, 14, 16, 13, 15, 13, 16, 13, 13,
- 14, 16, 12, 14, 13, 14, 12, 12, 9, 16, 11, 14, 11, 15, 12, 13,
- 13, 16, 12, 14, 12, 15, 13, 13, 16, 16, 14, 15, 15, 15, 14, 13,
- 11, 16, 11, 14, 12, 16, 12, 13, 13, 16, 12, 14, 13, 16, 13, 13,
- 16, 16, 14, 15, 16, 16, 14, 13, 11, 16, 10, 13, 13, 16, 11, 12,
- 14, 16, 11, 14, 14, 16, 12, 12, 16, 16, 14, 14, 16, 16, 13, 12,
- 11, 16, 12, 14, 11, 15, 12, 13, 13, 16, 13, 15, 13, 16, 13, 13,
- 16, 16, 15, 16, 15, 16, 14, 13, 11, 16, 12, 15, 12, 16, 12, 13,
- 13, 16, 13, 15, 13, 16, 13, 13, 16, 16, 15, 16, 15, 16, 14, 13,
- 12, 16, 11, 14, 13, 16, 12, 12, 13, 16, 11, 14, 13, 16, 12, 12,
- 16, 16, 13, 14, 15, 16, 12, 12, 11, 16, 12, 14, 10, 14, 11, 12,
- 14, 16, 13, 15, 12, 15, 12, 12, 16, 16, 16, 16, 14, 15, 13, 12,
- 12, 16, 13, 15, 12, 14, 12, 12, 13, 16, 13, 15, 12, 14, 12, 12,
- 16, 16, 14, 16, 14, 15, 12, 12, 14, 16, 13, 15, 13, 16, 11, 12,
- 13, 16, 12, 14, 13, 15, 11, 11, 14, 16, 12, 13, 12, 13, 11, 10,
- ], [
- 0, 8, 4, 9, 5, 10, 9, 11, 5, 11, 9, 12, 9, 13, 12, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 11, 6, 12, 9, 13, 11, 13,
- 9, 16, 10, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 12, 8, 13, 7, 12, 11, 16,
- 8, 16, 11, 16, 11, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 10, 16, 11, 16, 13, 16, 11, 16, 12, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 1, 10, 6, 11, 7, 12, 10, 13,
- 7, 12, 10, 13, 10, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 13, 7, 12, 10, 16, 12, 16, 10, 16, 11, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 16, 16, 16, 16, 16,
- 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 13, 9, 16, 8, 16, 12, 16, 9, 16, 12, 16, 11, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 11, 16, 12, 16, 13, 16,
- 10, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 6, 16, 9, 16, 10, 16, 13, 16, 11, 16, 12, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 9, 16, 12, 16, 13, 16,
- 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 10, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 11, 16, 11, 16, 13, 16,
- 12, 16, 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 12, 16, 13, 16, 16, 16, 11, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 11, 16, 12, 16, 16, 16,
- 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 11, 16, 13, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 10, 16, 16, 16, 16, 16,
- 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 11, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ],
- ], [
- [
- 0, 7, 4, 8, 4, 8, 7, 8, 6, 10, 7, 10, 8, 10, 9, 10,
- 13, 16, 13, 15, 13, 15, 13, 14, 4, 10, 5, 10, 7, 10, 9, 10,
- 7, 12, 8, 11, 9, 12, 10, 11, 13, 16, 13, 15, 13, 16, 13, 14,
- 9, 16, 9, 13, 12, 16, 11, 13, 11, 16, 11, 14, 13, 16, 12, 14,
- 15, 16, 14, 16, 15, 16, 14, 14, 4, 10, 7, 10, 6, 10, 9, 10,
- 8, 12, 9, 12, 9, 11, 10, 12, 13, 16, 13, 16, 14, 16, 13, 14,
- 7, 12, 8, 12, 9, 12, 10, 12, 9, 13, 10, 13, 10, 13, 11, 12,
- 14, 16, 13, 16, 14, 16, 13, 14, 12, 16, 11, 14, 13, 16, 12, 14,
- 13, 16, 12, 16, 14, 16, 13, 14, 16, 16, 14, 16, 15, 16, 14, 14,
- 10, 16, 12, 15, 10, 14, 12, 13, 12, 16, 13, 16, 12, 14, 13, 14,
- 15, 16, 14, 16, 14, 16, 14, 14, 12, 16, 13, 16, 12, 16, 13, 14,
- 13, 16, 13, 16, 13, 16, 13, 14, 16, 16, 14, 16, 15, 16, 14, 15,
- 15, 16, 14, 16, 15, 16, 13, 15, 16, 16, 14, 16, 15, 16, 14, 15,
- 16, 16, 16, 16, 16, 16, 15, 15, 2, 9, 5, 10, 6, 10, 8, 10,
- 7, 11, 8, 11, 9, 11, 10, 11, 14, 16, 13, 15, 14, 15, 14, 14,
- 5, 11, 6, 11, 8, 12, 9, 11, 8, 13, 9, 12, 10, 13, 11, 12,
- 14, 16, 13, 15, 14, 16, 14, 14, 9, 16, 8, 13, 12, 16, 11, 13,
- 12, 16, 11, 14, 13, 16, 12, 13, 16, 16, 14, 16, 15, 16, 14, 15,
- 5, 12, 8, 11, 7, 11, 9, 11, 9, 13, 10, 13, 10, 13, 11, 12,
- 14, 16, 14, 16, 14, 16, 14, 15, 8, 13, 9, 13, 10, 13, 11, 12,
- 9, 13, 10, 13, 10, 13, 11, 13, 13, 16, 13, 15, 13, 16, 13, 14,
- 12, 16, 11, 14, 13, 16, 12, 14, 12, 16, 11, 14, 13, 16, 12, 14,
- 14, 16, 13, 16, 14, 16, 13, 14, 10, 16, 12, 15, 9, 14, 11, 13,
- 12, 16, 13, 16, 12, 15, 12, 14, 16, 16, 15, 16, 15, 16, 14, 14,
- 12, 16, 13, 16, 12, 16, 12, 14, 12, 16, 13, 16, 12, 15, 13, 14,
- 15, 16, 14, 16, 14, 16, 14, 14, 15, 16, 14, 16, 14, 16, 14, 15,
- 14, 16, 13, 16, 14, 16, 13, 14, 16, 16, 14, 16, 14, 16, 13, 14,
- 6, 14, 9, 13, 9, 14, 11, 12, 10, 14, 11, 13, 11, 14, 12, 13,
- 16, 16, 15, 16, 15, 16, 14, 15, 8, 15, 9, 13, 11, 14, 11, 13,
- 11, 16, 11, 14, 12, 15, 12, 14, 16, 16, 15, 16, 16, 16, 15, 16,
- 10, 16, 9, 14, 12, 16, 12, 13, 13, 16, 11, 15, 14, 16, 13, 14,
- 16, 16, 15, 16, 16, 16, 15, 16, 8, 15, 10, 13, 10, 14, 11, 13,
- 11, 16, 12, 14, 12, 14, 12, 14, 16, 16, 16, 16, 16, 16, 15, 16,
- 10, 16, 11, 14, 11, 15, 12, 13, 11, 16, 11, 14, 12, 15, 12, 14,
- 16, 16, 14, 16, 15, 16, 14, 15, 12, 16, 11, 15, 13, 16, 13, 14,
- 12, 16, 11, 14, 13, 16, 13, 14, 15, 16, 13, 16, 16, 16, 14, 15,
- 10, 16, 12, 15, 10, 15, 12, 13, 13, 16, 13, 16, 12, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 15, 15, 12, 16, 13, 16, 12, 16, 13, 14,
- 12, 16, 13, 16, 12, 16, 13, 14, 16, 16, 15, 16, 14, 16, 14, 15,
- 15, 16, 14, 16, 15, 16, 14, 15, 14, 16, 13, 16, 14, 16, 13, 14,
- 14, 16, 13, 15, 14, 16, 13, 14, 9, 16, 11, 16, 11, 16, 12, 14,
- 13, 16, 12, 16, 13, 16, 13, 14, 16, 16, 15, 16, 16, 16, 15, 15,
- 11, 16, 11, 16, 12, 16, 13, 14, 13, 16, 12, 16, 13, 16, 13, 14,
- 16, 16, 15, 16, 16, 16, 15, 15, 11, 16, 10, 15, 13, 16, 12, 13,
- 14, 16, 12, 16, 14, 16, 13, 14, 16, 16, 15, 16, 16, 16, 14, 14,
- 11, 16, 12, 16, 11, 16, 13, 14, 13, 16, 13, 16, 13, 16, 13, 14,
- 16, 16, 16, 16, 16, 16, 15, 15, 11, 16, 12, 16, 12, 16, 13, 14,
- 13, 16, 13, 16, 13, 16, 13, 14, 16, 16, 15, 16, 16, 16, 15, 14,
- 12, 16, 12, 15, 13, 16, 12, 14, 13, 16, 12, 16, 14, 16, 13, 14,
- 16, 16, 14, 16, 16, 16, 14, 14, 11, 16, 12, 16, 11, 16, 12, 14,
- 14, 16, 14, 16, 12, 16, 13, 14, 16, 16, 16, 16, 16, 16, 15, 14,
- 12, 16, 13, 16, 12, 16, 12, 14, 13, 16, 13, 16, 12, 16, 13, 14,
- 16, 16, 16, 16, 15, 16, 14, 14, 14, 16, 13, 16, 14, 16, 12, 14,
- 13, 16, 13, 16, 13, 16, 12, 13, 15, 16, 13, 14, 14, 15, 13, 13,
- ], [
- 0, 8, 4, 10, 5, 11, 10, 16, 5, 12, 9, 16, 10, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 12, 7, 12, 9, 16, 12, 16,
- 9, 16, 11, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 12, 9, 16, 8, 16, 12, 16,
- 8, 16, 11, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 8, 16, 11, 16, 12, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 1, 11, 6, 12, 7, 16, 11, 16,
- 7, 16, 10, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 16, 7, 16, 10, 16, 12, 16, 9, 16, 11, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 16, 10, 16, 8, 16, 12, 16, 9, 16, 12, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 11, 16, 12, 16, 16, 16,
- 10, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 16, 9, 16, 10, 16, 16, 16, 11, 16, 12, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 9, 16, 12, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 11, 16, 11, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 12, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 11, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 12, 16, 16, 16,
- 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 9, 16, 16, 16, 16, 16,
- 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 11, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ],
- ], [
- [
- 0, 8, 4, 10, 5, 9, 8, 10, 6, 11, 8, 12, 8, 11, 10, 13,
- 14, 16, 14, 16, 14, 16, 16, 16, 3, 11, 5, 11, 8, 12, 10, 12,
- 7, 12, 9, 13, 10, 13, 11, 13, 14, 16, 14, 16, 16, 16, 16, 16,
- 9, 16, 9, 16, 12, 16, 12, 16, 11, 16, 11, 16, 14, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 11, 7, 12, 6, 11, 10, 12,
- 8, 13, 9, 13, 9, 13, 11, 14, 13, 16, 14, 16, 14, 16, 16, 16,
- 7, 13, 9, 13, 9, 13, 11, 13, 9, 14, 10, 16, 11, 16, 12, 16,
- 15, 16, 14, 16, 16, 16, 16, 16, 12, 16, 12, 16, 14, 16, 13, 16,
- 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 12, 16, 10, 16, 13, 16, 12, 16, 13, 16, 12, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 13, 16, 13, 16, 14, 16,
- 13, 16, 14, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 2, 10, 5, 11, 6, 11, 9, 11,
- 7, 12, 9, 13, 9, 13, 11, 13, 14, 16, 16, 16, 16, 16, 16, 16,
- 4, 12, 6, 12, 8, 13, 10, 13, 8, 13, 9, 13, 11, 16, 12, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 8, 16, 12, 16, 12, 16,
- 12, 16, 11, 16, 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 12, 8, 13, 7, 13, 10, 13, 8, 14, 10, 14, 10, 14, 12, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 7, 14, 9, 16, 10, 16, 11, 14,
- 8, 14, 10, 16, 11, 16, 12, 16, 13, 16, 14, 16, 16, 16, 16, 16,
- 11, 16, 11, 16, 13, 16, 13, 16, 12, 16, 12, 16, 14, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 12, 16, 10, 16, 12, 16,
- 12, 16, 13, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 13, 16, 12, 16, 14, 16, 12, 16, 13, 16, 12, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 6, 16, 8, 16, 9, 16, 11, 13, 10, 16, 11, 16, 11, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 9, 16, 10, 16, 12, 16,
- 11, 16, 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 9, 16, 12, 16, 13, 16, 13, 16, 12, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 10, 16, 9, 16, 12, 16,
- 11, 16, 12, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 16, 11, 16, 11, 16, 12, 16, 11, 16, 12, 16, 13, 16, 13, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 12, 16, 14, 16, 14, 16,
- 12, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 12, 16, 10, 16, 13, 16, 13, 16, 14, 16, 13, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 13, 16, 12, 16, 14, 16,
- 12, 16, 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 11, 16, 11, 16, 13, 16,
- 12, 16, 13, 16, 13, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 11, 16, 13, 16, 13, 16, 13, 16, 13, 16, 14, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 16, 14, 16, 13, 16,
- 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 12, 16, 12, 16, 13, 16, 13, 16, 13, 16, 13, 16, 14, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 12, 16, 13, 16, 14, 16,
- 13, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 12, 16, 14, 16, 14, 16, 14, 16, 14, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 11, 16, 14, 16,
- 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 14, 16, 13, 16, 14, 16, 16, 16, 16, 16, 14, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 0, 10, 4, 12, 5, 16, 11, 16, 6, 16, 10, 16, 11, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 3, 16, 7, 16, 10, 16, 16, 16,
- 9, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 4, 16, 10, 16, 9, 16, 16, 16,
- 9, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 16, 12, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 6, 16, 8, 16, 16, 16,
- 8, 16, 11, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 16, 8, 16, 11, 16, 16, 16, 10, 16, 12, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 11, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 16, 11, 16, 9, 16, 16, 16, 10, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 12, 16, 16, 16, 16, 16,
- 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 5, 16, 9, 16, 11, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 10, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 16, 11, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 12, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 11, 16, 15, 16, 16, 16,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 9, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 9, 16, 16, 16, 16, 16,
- 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ],
- ],
-];
-
-const RV34_INTER_SECONDPAT: &'static [[[u8; 108]; 2]; 7] = &[
- [
- [
- 0, 4, 8, 3, 6, 8, 6, 7, 8, 4, 6, 8, 6, 7, 8, 7,
- 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 3, 6, 8, 4, 6,
- 9, 7, 7, 8, 5, 7, 9, 6, 7, 9, 8, 8, 8, 7, 8, 8,
- 8, 8, 8, 8, 8, 7, 6, 8, 9, 7, 8, 9, 7, 8, 9, 7,
- 8, 9, 7, 8, 9, 8, 8, 9, 8, 8, 9, 8, 9, 9, 8, 8,
- 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 9,
- 8, 8, 8, 7, 8, 8, 8, 8, 8, 7, 7, 6,
- ], [
- 0, 4, 9, 3, 6, 9, 7, 8, 10, 3, 6, 9, 5, 7, 10, 9,
- 9, 10, 7, 8, 10, 8, 9, 10, 10, 10, 10, 2, 6, 9, 4, 7,
- 10, 8, 9, 10, 4, 7, 10, 6, 7, 10, 9, 9, 10, 7, 8, 10,
- 8, 9, 10, 10, 10, 10, 6, 8, 10, 7, 9, 11, 9, 10, 11, 7,
- 9, 11, 8, 9, 11, 10, 10, 11, 8, 9, 11, 9, 10, 11, 11, 11,
- 10, 8, 10, 11, 9, 10, 11, 9, 10, 11, 8, 10, 11, 9, 10, 11,
- 10, 10, 11, 8, 10, 11, 9, 10, 10, 10, 10, 9,
- ],
- ], [
- [
- 0, 4, 8, 3, 6, 8, 6, 7, 9, 4, 6, 8, 5, 7, 8, 8,
- 8, 9, 7, 7, 8, 8, 8, 8, 8, 9, 8, 3, 6, 8, 4, 6,
- 9, 7, 7, 9, 5, 6, 9, 6, 7, 9, 8, 8, 9, 7, 8, 8,
- 8, 8, 8, 8, 8, 8, 6, 8, 9, 7, 8, 10, 7, 8, 9, 7,
- 8, 10, 7, 8, 10, 8, 8, 9, 7, 8, 9, 8, 9, 9, 9, 9,
- 8, 7, 9, 10, 8, 9, 10, 8, 8, 8, 8, 9, 10, 8, 9, 9,
- 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 7, 6,
- ], [
- 0, 4, 9, 3, 6, 10, 8, 9, 11, 3, 5, 9, 5, 7, 10, 9,
- 10, 11, 7, 8, 10, 9, 9, 11, 11, 11, 12, 2, 5, 10, 4, 7,
- 10, 8, 9, 11, 4, 6, 10, 6, 7, 10, 9, 10, 11, 7, 9, 10,
- 9, 9, 11, 11, 11, 11, 6, 8, 11, 7, 9, 11, 9, 10, 12, 7,
- 9, 11, 8, 9, 12, 10, 10, 12, 8, 10, 11, 10, 10, 11, 12, 11,
- 11, 8, 10, 12, 9, 11, 12, 10, 11, 12, 9, 10, 12, 10, 11, 12,
- 11, 11, 12, 9, 10, 12, 10, 10, 11, 11, 11, 10,
- ],
- ], [
- [
- 0, 4, 8, 3, 6, 9, 7, 8, 9, 4, 6, 8, 5, 7, 9, 8,
- 9, 9, 7, 8, 9, 8, 8, 9, 9, 9, 9, 2, 6, 9, 4, 6,
- 9, 7, 8, 10, 5, 7, 9, 6, 7, 9, 8, 8, 9, 7, 8, 9,
- 8, 8, 9, 9, 9, 9, 6, 8, 10, 7, 8, 10, 8, 9, 10, 6,
- 8, 10, 8, 8, 10, 9, 9, 10, 8, 9, 10, 9, 9, 10, 10, 10,
- 9, 8, 9, 10, 8, 9, 10, 8, 9, 10, 8, 9, 10, 9, 9, 10,
- 9, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, 8,
- ], [
- 0, 4, 10, 3, 6, 10, 8, 10, 12, 2, 6, 10, 6, 8, 11, 10,
- 11, 12, 7, 9, 11, 9, 10, 12, 12, 13, 13, 2, 6, 10, 4, 7,
- 11, 9, 10, 13, 4, 7, 11, 7, 8, 11, 10, 11, 12, 8, 9, 12,
- 10, 10, 12, 12, 12, 13, 6, 9, 12, 8, 10, 13, 10, 12, 14, 7,
- 10, 13, 9, 10, 13, 11, 11, 13, 9, 11, 13, 11, 11, 13, 13, 13,
- 13, 9, 11, 13, 10, 12, 14, 11, 12, 14, 9, 11, 14, 11, 12, 14,
- 12, 12, 14, 9, 12, 13, 11, 12, 13, 13, 12, 12,
- ],
- ], [
- [
- 0, 4, 9, 3, 6, 9, 7, 8, 10, 3, 6, 9, 6, 7, 9, 9,
- 9, 10, 7, 8, 9, 8, 9, 10, 10, 10, 11, 2, 6, 9, 4, 7,
- 10, 7, 9, 10, 4, 7, 10, 6, 7, 10, 9, 9, 10, 7, 8, 10,
- 8, 9, 10, 10, 10, 10, 6, 8, 11, 7, 9, 11, 8, 10, 11, 6,
- 9, 11, 8, 9, 11, 9, 9, 11, 8, 9, 11, 9, 10, 11, 11, 10,
- 10, 8, 10, 11, 9, 10, 11, 9, 10, 11, 8, 10, 11, 9, 10, 11,
- 10, 10, 11, 8, 10, 11, 9, 10, 11, 10, 10, 10,
- ], [
- 0, 4, 12, 3, 7, 12, 10, 11, 14, 3, 6, 12, 7, 9, 13, 12,
- 13, 14, 8, 11, 13, 11, 12, 14, 14, 14, 14, 1, 7, 12, 5, 8,
- 13, 10, 12, 14, 4, 8, 13, 8, 9, 13, 12, 13, 14, 9, 11, 14,
- 11, 12, 14, 14, 14, 14, 7, 10, 14, 9, 11, 14, 11, 13, 16, 8,
- 11, 14, 10, 12, 14, 13, 13, 16, 10, 12, 15, 12, 13, 15, 15, 15,
- 15, 10, 13, 15, 12, 13, 14, 13, 15, 15, 10, 13, 15, 12, 13, 15,
- 13, 14, 15, 10, 13, 14, 12, 13, 14, 14, 14, 14,
- ],
- ], [
- [
- 0, 4, 9, 3, 6, 10, 7, 9, 11, 3, 5, 9, 5, 7, 10, 9,
- 10, 12, 7, 8, 10, 9, 10, 11, 11, 12, 12, 2, 6, 10, 4, 7,
- 10, 7, 9, 12, 4, 7, 10, 6, 7, 11, 9, 10, 12, 7, 9, 11,
- 9, 9, 11, 11, 11, 12, 5, 8, 11, 7, 9, 12, 9, 10, 13, 6,
- 9, 12, 8, 9, 12, 10, 10, 12, 8, 10, 12, 10, 10, 12, 12, 12,
- 12, 8, 10, 12, 9, 11, 13, 10, 11, 13, 9, 11, 13, 10, 11, 13,
- 11, 11, 13, 9, 11, 12, 10, 11, 12, 11, 11, 12,
- ], [
- 0, 4, 12, 3, 7, 13, 10, 12, 15, 3, 7, 13, 7, 9, 14, 12,
- 12, 13, 8, 11, 14, 11, 13, 15, 15, 14, 14, 1, 6, 13, 5, 8,
- 13, 10, 13, 15, 4, 8, 13, 8, 9, 14, 13, 13, 15, 8, 11, 14,
- 12, 12, 15, 15, 14, 14, 7, 10, 13, 9, 11, 13, 12, 14, 16, 8,
- 11, 14, 10, 12, 15, 13, 13, 16, 10, 12, 15, 12, 13, 15, 15, 14,
- 15, 11, 12, 14, 12, 14, 14, 13, 15, 15, 10, 12, 14, 12, 13, 15,
- 14, 15, 15, 10, 13, 13, 12, 13, 15, 14, 14, 15,
- ],
- ], [
- [
- 0, 5, 10, 3, 7, 11, 9, 11, 14, 3, 7, 11, 7, 8, 12, 11,
- 12, 14, 7, 9, 12, 10, 11, 14, 13, 14, 16, 1, 7, 11, 5, 8,
- 12, 9, 11, 15, 4, 8, 12, 7, 9, 13, 11, 12, 15, 8, 10, 13,
- 10, 11, 14, 14, 14, 16, 6, 9, 13, 8, 11, 14, 10, 13, 16, 7,
- 10, 14, 9, 11, 15, 12, 13, 16, 9, 11, 15, 12, 12, 15, 14, 14,
- 16, 10, 12, 14, 11, 13, 15, 12, 14, 16, 10, 12, 15, 11, 13, 16,
- 13, 14, 16, 10, 13, 16, 12, 13, 15, 14, 15, 16,
- ], [
- 0, 5, 16, 3, 8, 14, 11, 13, 14, 2, 8, 14, 8, 10, 16, 13,
- 13, 14, 9, 13, 16, 12, 13, 16, 16, 14, 16, 1, 7, 14, 6, 10,
- 14, 12, 16, 16, 5, 9, 14, 9, 11, 16, 15, 16, 16, 10, 12, 16,
- 13, 13, 16, 16, 14, 16, 8, 11, 14, 11, 13, 14, 14, 14, 16, 8,
- 12, 14, 11, 13, 16, 16, 16, 16, 10, 12, 15, 13, 14, 16, 16, 16,
- 16, 11, 14, 14, 14, 15, 16, 16, 15, 16, 10, 13, 16, 13, 14, 14,
- 16, 16, 16, 10, 13, 16, 13, 14, 16, 16, 16, 16,
- ],
- ], [
- [
- 0, 5, 11, 3, 7, 13, 9, 12, 16, 3, 7, 12, 6, 9, 14, 11,
- 13, 16, 7, 10, 16, 11, 12, 16, 16, 16, 16, 1, 6, 12, 5, 9,
- 16, 9, 13, 16, 4, 8, 16, 7, 10, 16, 12, 15, 16, 7, 11, 16,
- 11, 12, 16, 16, 16, 16, 6, 10, 15, 8, 11, 16, 11, 14, 16, 7,
- 11, 16, 10, 12, 16, 13, 16, 16, 9, 13, 16, 13, 14, 16, 16, 16,
- 16, 10, 12, 16, 12, 16, 16, 16, 16, 16, 11, 13, 16, 13, 16, 16,
- 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 0, 5, 16, 3, 8, 16, 12, 12, 16, 2, 8, 16, 8, 10, 16, 13,
- 13, 16, 9, 13, 16, 12, 13, 16, 16, 16, 16, 1, 8, 16, 6, 10,
- 16, 12, 16, 16, 5, 9, 16, 9, 11, 16, 13, 16, 16, 9, 12, 14,
- 12, 12, 16, 16, 16, 16, 8, 11, 13, 11, 12, 16, 14, 16, 16, 8,
- 12, 16, 11, 13, 16, 16, 15, 16, 9, 13, 14, 12, 13, 16, 16, 16,
- 16, 10, 12, 13, 14, 13, 16, 16, 16, 16, 9, 13, 16, 13, 12, 16,
- 16, 16, 16, 10, 12, 16, 14, 15, 16, 16, 16, 16,
- ],
- ],
-];
-
-const RV34_INTER_THIRDPAT: &'static [[[u8; 108]; 2]; 7] = &[
- [
- [
- 0, 5, 8, 3, 6, 9, 6, 7, 9, 4, 6, 9, 6, 7, 9, 8,
- 8, 9, 7, 8, 9, 8, 9, 9, 9, 9, 9, 2, 6, 9, 4, 7,
- 9, 7, 8, 9, 5, 7, 9, 6, 7, 9, 8, 8, 9, 7, 8, 9,
- 8, 9, 9, 9, 9, 8, 5, 8, 10, 6, 8, 10, 8, 9, 9, 7,
- 8, 10, 7, 9, 10, 8, 9, 9, 8, 9, 10, 9, 9, 10, 9, 9,
- 9, 7, 9, 10, 8, 9, 10, 8, 8, 9, 8, 9, 10, 8, 9, 10,
- 8, 8, 9, 8, 9, 9, 8, 9, 9, 8, 8, 7,
- ], [
- 0, 4, 9, 2, 6, 10, 7, 8, 10, 3, 6, 10, 6, 7, 10, 9,
- 9, 10, 8, 9, 11, 9, 10, 11, 10, 11, 11, 2, 6, 10, 4, 7,
- 10, 8, 9, 10, 5, 7, 10, 7, 8, 10, 9, 9, 10, 9, 10, 11,
- 10, 10, 11, 11, 11, 11, 6, 9, 11, 7, 9, 11, 9, 10, 12, 8,
- 9, 11, 8, 10, 11, 10, 10, 11, 10, 11, 12, 11, 11, 12, 11, 11,
- 11, 9, 11, 12, 10, 11, 12, 10, 11, 12, 10, 11, 12, 10, 11, 12,
- 11, 11, 12, 11, 12, 12, 11, 12, 12, 12, 11, 11,
- ],
- ], [
- [
- 0, 4, 9, 3, 6, 9, 6, 8, 9, 4, 6, 9, 5, 7, 9, 8,
- 8, 9, 7, 8, 10, 8, 9, 10, 9, 9, 9, 2, 6, 9, 4, 7,
- 9, 7, 8, 9, 5, 7, 9, 6, 7, 10, 8, 9, 9, 7, 9, 10,
- 8, 9, 10, 9, 9, 9, 5, 8, 10, 6, 8, 10, 8, 9, 10, 7,
- 8, 10, 7, 9, 11, 9, 9, 10, 8, 9, 10, 9, 10, 10, 10, 10,
- 9, 7, 9, 10, 8, 9, 11, 8, 9, 10, 8, 9, 11, 8, 9, 11,
- 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 8,
- ], [
- 0, 4, 9, 2, 5, 10, 7, 8, 11, 3, 6, 10, 6, 7, 10, 9,
- 10, 11, 8, 9, 11, 9, 10, 11, 11, 11, 12, 2, 6, 10, 4, 7,
- 10, 8, 9, 11, 5, 7, 10, 6, 8, 10, 9, 10, 11, 9, 10, 12,
- 10, 10, 12, 11, 12, 12, 6, 9, 11, 8, 9, 12, 9, 11, 13, 8,
- 10, 12, 9, 10, 12, 11, 11, 12, 10, 12, 13, 11, 12, 13, 13, 12,
- 13, 10, 11, 13, 10, 12, 13, 11, 12, 13, 11, 12, 13, 11, 12, 13,
- 12, 12, 13, 12, 13, 14, 13, 13, 14, 13, 13, 13,
- ],
- ], [
- [
- 0, 4, 9, 3, 6, 9, 7, 8, 10, 3, 6, 9, 5, 7, 10, 8,
- 9, 10, 7, 9, 10, 8, 9, 10, 10, 10, 10, 2, 6, 9, 4, 7,
- 10, 7, 9, 10, 4, 7, 10, 6, 8, 10, 8, 9, 10, 8, 9, 10,
- 9, 9, 10, 10, 10, 10, 5, 8, 11, 7, 9, 11, 8, 10, 11, 7,
- 9, 11, 8, 9, 11, 9, 10, 11, 9, 10, 11, 10, 10, 11, 11, 11,
- 11, 8, 10, 11, 9, 10, 11, 9, 10, 11, 9, 10, 12, 9, 10, 12,
- 10, 11, 11, 9, 10, 11, 10, 11, 11, 10, 10, 10,
- ], [
- 0, 4, 10, 3, 6, 11, 8, 10, 12, 3, 6, 11, 6, 8, 11, 10,
- 11, 13, 9, 10, 13, 11, 12, 14, 13, 13, 14, 1, 6, 10, 5, 8,
- 12, 9, 10, 13, 5, 8, 11, 7, 9, 12, 11, 11, 13, 10, 12, 13,
- 11, 12, 14, 14, 13, 15, 7, 10, 12, 9, 11, 14, 11, 12, 15, 9,
- 11, 13, 10, 11, 14, 12, 12, 14, 12, 14, 16, 13, 13, 16, 14, 14,
- 16, 12, 13, 15, 12, 14, 15, 13, 14, 16, 13, 14, 16, 14, 14, 16,
- 14, 15, 16, 14, 16, 16, 15, 16, 16, 15, 15, 16,
- ],
- ], [
- [
- 0, 4, 9, 2, 6, 9, 7, 9, 11, 3, 6, 10, 6, 7, 10, 9,
- 10, 11, 7, 9, 10, 9, 10, 11, 11, 11, 12, 2, 6, 10, 4, 7,
- 10, 8, 9, 11, 5, 7, 10, 7, 8, 10, 9, 10, 11, 8, 9, 11,
- 9, 10, 11, 11, 12, 11, 6, 9, 11, 7, 10, 12, 9, 11, 12, 7,
- 10, 12, 9, 10, 12, 11, 11, 12, 9, 11, 12, 10, 11, 12, 12, 12,
- 12, 9, 11, 12, 9, 11, 13, 11, 12, 13, 9, 11, 13, 10, 12, 13,
- 11, 12, 13, 11, 12, 13, 11, 12, 13, 12, 13, 12,
- ], [
- 0, 4, 11, 2, 6, 12, 9, 11, 16, 4, 7, 12, 7, 9, 15, 11,
- 12, 16, 10, 11, 16, 11, 13, 16, 16, 16, 16, 1, 6, 11, 5, 8,
- 16, 9, 12, 16, 6, 9, 15, 8, 10, 16, 12, 13, 16, 12, 14, 16,
- 12, 16, 16, 16, 16, 16, 8, 11, 14, 10, 12, 16, 12, 16, 16, 10,
- 13, 16, 12, 16, 16, 13, 14, 16, 14, 16, 16, 16, 16, 16, 16, 16,
- 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ],
- ], [
- [
- 0, 5, 9, 3, 6, 10, 8, 10, 12, 3, 6, 10, 6, 8, 10, 10,
- 11, 12, 8, 9, 11, 10, 10, 12, 13, 13, 13, 1, 6, 10, 5, 8,
- 11, 9, 11, 13, 5, 8, 11, 7, 9, 11, 11, 11, 13, 8, 9, 11,
- 10, 10, 12, 13, 13, 14, 6, 9, 12, 8, 11, 13, 11, 13, 15, 8,
- 10, 13, 10, 11, 13, 12, 13, 15, 10, 12, 13, 12, 12, 13, 14, 14,
- 14, 9, 12, 14, 11, 13, 15, 13, 15, 16, 11, 13, 15, 12, 14, 15,
- 14, 15, 16, 13, 14, 15, 14, 14, 15, 15, 16, 16,
- ], [
- 0, 4, 16, 2, 7, 16, 10, 13, 16, 3, 8, 16, 7, 10, 16, 16,
- 16, 16, 12, 16, 16, 15, 16, 16, 16, 16, 16, 1, 7, 16, 6, 9,
- 16, 10, 16, 16, 7, 12, 16, 9, 13, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 9, 16, 16, 11, 13, 16, 16, 16, 16, 12,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ],
- ], [
- [
- 0, 4, 9, 3, 6, 11, 9, 12, 16, 3, 6, 10, 6, 8, 11, 12,
- 13, 16, 8, 9, 12, 10, 11, 13, 16, 16, 16, 1, 6, 10, 5, 8,
- 12, 10, 13, 16, 5, 8, 11, 8, 9, 13, 13, 14, 16, 9, 10, 14,
- 11, 12, 15, 16, 16, 16, 6, 10, 13, 9, 12, 16, 14, 16, 16, 9,
- 12, 14, 11, 13, 16, 16, 16, 16, 12, 14, 16, 14, 16, 16, 16, 16,
- 16, 11, 16, 16, 13, 16, 16, 16, 16, 16, 12, 16, 16, 13, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 0, 4, 16, 2, 8, 16, 10, 16, 16, 3, 9, 16, 8, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 7, 16, 5, 10,
- 16, 16, 16, 16, 7, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 10, 15, 16, 10, 16, 16, 16, 16, 16, 14,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ],
- ], [
- [
- 0, 3, 9, 3, 7, 11, 11, 15, 16, 3, 6, 11, 7, 9, 12, 16,
- 16, 16, 8, 10, 16, 11, 16, 16, 16, 16, 16, 1, 6, 11, 6, 9,
- 15, 16, 16, 16, 5, 8, 16, 9, 11, 16, 16, 16, 16, 10, 16, 16,
- 16, 16, 16, 16, 16, 16, 7, 11, 16, 11, 16, 16, 16, 16, 16, 11,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ], [
- 0, 4, 16, 2, 8, 16, 16, 16, 16, 3, 12, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 7, 16, 5, 12,
- 16, 16, 16, 16, 6, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 9, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- ],
- ],
-];
-
-const RV34_INTER_COEFFS: &[[u8; 32]; 7] = &[
-[
- 1, 2, 4, 4, 5, 5, 6, 7, 7, 7, 8, 8, 8, 9, 9, 10,
- 10, 10, 10, 11, 11, 11, 11, 12, 11, 11, 11, 13, 14, 15, 16, 16,
-], [
- 1, 2, 3, 5, 5, 6, 6, 7, 7, 8, 9, 9, 9, 10, 10, 10,
- 11, 11, 12, 12, 12, 12, 13, 13, 12, 12, 13, 14, 16, 16, 16, 16,
-], [
- 1, 2, 3, 4, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12,
- 12, 12, 13, 13, 13, 14, 14, 15, 14, 14, 16, 16, 16, 16, 16, 16,
-], [
- 1, 2, 3, 4, 5, 6, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12,
- 13, 13, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-], [
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-], [
- 1, 2, 3, 4, 5, 6, 7, 8, 10, 10, 11, 11, 13, 12, 12, 13,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-], [
- 1, 2, 3, 4, 5, 6, 7, 8, 10, 10, 10, 11, 14, 13, 15, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16,
-]];
diff --git a/src/codecs/real/rv34dsp.rs b/src/codecs/real/rv34dsp.rs
deleted file mode 100644
index c8c87fb..0000000
--- a/src/codecs/real/rv34dsp.rs
+++ /dev/null
@@ -1,564 +0,0 @@
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy)]
-pub enum PredType4x4 {
- Ver,
- Hor,
- DC,
- DiagDownLeft,
- DiagDownRight,
- VerRight,
- HorDown,
- VerLeft,
- HorUp,
- LeftDC,
- TopDC,
- DC128,
- DiagDownLeftNoDown,
- HorUpNoDown,
- VerLeftNoDown
-}
-
-#[allow(dead_code)]
-#[derive(Debug,Clone,Copy)]
-pub enum PredType8x8 {
- DC,
- Hor,
- Ver,
- Plane,
- LeftDC,
- TopDC,
- DC128
-}
-
-pub struct RV34CommonDSP {
- pub ipred4x4: [fn(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]); 15],
- pub ipred8x8: [fn(buf: &mut [u8], idx: usize, stride: usize); 7],
- pub ipred16x16: [fn(buf: &mut [u8], idx: usize, stride: usize); 7],
-}
-
-fn row_transform(src: &[i16], dst: &mut [i32]) {
- for i in 0..4 {
- let z0 = 13 * ((src[i + 4*0] as i32) + (src[i + 4*2] as i32));
- let z1 = 13 * ((src[i + 4*0] as i32) - (src[i + 4*2] as i32));
- let z2 = 7 * (src[i + 4*1] as i32) - 17 * (src[i + 4*3] as i32);
- let z3 = 17 * (src[i + 4*1] as i32) + 7 * (src[i + 4*3] as i32);
- dst[4 * i + 0] = z0 + z3;
- dst[4 * i + 1] = z1 + z2;
- dst[4 * i + 2] = z1 - z2;
- dst[4 * i + 3] = z0 - z3;
- }
-}
-
-fn clip8(a: i16) -> u8 {
- if a < 0 { 0 }
- else if a > 255 { 255 }
- else { a as u8 }
-}
-
-#[inline(always)]
-fn mclip8(a: i32) -> u8 {
- if (a as u32) > 255 { !(a >> 16) as u8 }
- else { a as u8 }
-}
-
-impl RV34CommonDSP {
- pub fn new() -> Self {
- Self {
- ipred4x4: IPRED_FUNCS4X4,
- ipred8x8: IPRED_FUNCS8X8,
- ipred16x16: IPRED_FUNCS16X16,
- }
- }
- pub fn add_coeffs(&self, dst: &mut [u8], idx: usize, stride: usize, coeffs: &[i16]) {
- let out = &mut dst[idx..][..stride * 3 + 4];
- let mut sidx: usize = 0;
- for el in out.chunks_mut(stride).take(4) {
- assert!(el.len() >= 4);
- el[0] = mclip8((el[0] as i32) + (coeffs[0 + sidx] as i32));
- el[1] = mclip8((el[1] as i32) + (coeffs[1 + sidx] as i32));
- el[2] = mclip8((el[2] as i32) + (coeffs[2 + sidx] as i32));
- el[3] = mclip8((el[3] as i32) + (coeffs[3 + sidx] as i32));
- sidx += 4;
- }
- }
- pub fn transform(&self, coeffs: &mut [i16]) {
- let mut tmp: [i32; 16] = [0; 16];
- row_transform(coeffs, &mut tmp);
- for i in 0..4 {
- let z0 = 13*(tmp[4*0+i] + tmp[4*2+i]) + 0x200;
- let z1 = 13*(tmp[4*0+i] - tmp[4*2+i]) + 0x200;
- let z2 = 7* tmp[4*1+i] - 17*tmp[4*3+i];
- let z3 = 17* tmp[4*1+i] + 7*tmp[4*3+i];
- coeffs[i * 4 + 0] = ((z0 + z3) >> 10) as i16;
- coeffs[i * 4 + 1] = ((z1 + z2) >> 10) as i16;
- coeffs[i * 4 + 2] = ((z1 - z2) >> 10) as i16;
- coeffs[i * 4 + 3] = ((z0 - z3) >> 10) as i16;
- }
- }
- pub fn transform_dc(&self, coeffs: &mut [i16]) {
- let val = (((coeffs[0] as i32) * 13 * 13 + 0x200) >> 10) as i16;
- for i in 0..16 { coeffs[i] = val; }
- }
- pub fn transform16(&self, coeffs: &mut [i16]) {
- let mut tmp: [i32; 16] = [0; 16];
- row_transform(coeffs, &mut tmp);
- for i in 0..4 {
- let z0 = 39*(tmp[4*0+i] + tmp[4*2+i]);
- let z1 = 39*(tmp[4*0+i] - tmp[4*2+i]);
- let z2 = 21* tmp[4*1+i] - 51*tmp[4*3+i];
- let z3 = 51* tmp[4*1+i] + 21*tmp[4*3+i];
-
- coeffs[i * 4 + 0] = ((z0 + z3) >> 11) as i16;
- coeffs[i * 4 + 1] = ((z1 + z2) >> 11) as i16;
- coeffs[i * 4 + 2] = ((z1 - z2) >> 11) as i16;
- coeffs[i * 4 + 3] = ((z0 - z3) >> 11) as i16;
- }
- }
- pub fn transform16_dc(&self, coeffs: &mut [i16]) {
- let val = (((coeffs[0] as i32) * 13 * 13 * 3) >> 11) as i16;
- for i in 0..16 { coeffs[i] = val; }
- }
- pub fn weight(&self, dst: &mut [u8], mut didx: usize, dstride: usize,
- src: &[u8], mut sidx: usize, sstride: usize, ratio1: u32, ratio2: u32,
- size: usize) {
- for _ in 0..size {
- for x in 0..size {
- dst[didx + x] = (((((dst[didx + x] as u32) * ratio1) >> 9)
- + (((src[sidx + x] as u32) * ratio2) >> 9) + 0x10) >> 5) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
- }
- pub fn avg(&self, dst: &mut [u8], mut didx: usize, dstride: usize,
- src: &[u8], mut sidx: usize, sstride: usize,
- size: usize) {
- for _ in 0..size {
- for x in 0..size {
- dst[didx + x] = (((dst[didx + x] as u16) + (src[sidx + x] as u16) + 1) >> 1) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
- }
-}
-
-fn ipred_dc128(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize) {
- for _ in 0..bsize {
- for x in 0..bsize { buf[idx + x] = 128; }
- idx += stride;
- }
-}
-fn ipred_ver(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize) {
- let oidx = idx - stride;
- for _ in 0..bsize {
- for x in 0..bsize { buf[idx + x] = buf[oidx + x]; }
- idx += stride;
- }
-}
-fn ipred_hor(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize) {
- for _ in 0..bsize {
- for x in 0..bsize { buf[idx + x] = buf[idx - 1]; }
- idx += stride;
- }
-}
-fn ipred_dc(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize, shift: u8) {
- let mut adc: u16 = 0;
- for i in 0..bsize { adc += buf[idx - stride + i] as u16; }
- for i in 0..bsize { adc += buf[idx - 1 + i * stride] as u16; }
- let dc = ((adc + (1 << (shift - 1))) >> shift) as u8;
-
- for _ in 0..bsize {
- for x in 0..bsize { buf[idx + x] = dc; }
- idx += stride;
- }
-}
-fn ipred_left_dc(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize, shift: u8) {
- let mut adc: u16 = 0;
- for i in 0..bsize { adc += buf[idx - 1 + i * stride] as u16; }
- let dc = ((adc + (1 << (shift - 1))) >> shift) as u8;
-
- for _ in 0..bsize {
- for x in 0..bsize { buf[idx + x] = dc; }
- idx += stride;
- }
-}
-fn ipred_top_dc(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize, shift: u8) {
- let mut adc: u16 = 0;
- for i in 0..bsize { adc += buf[idx - stride + i] as u16; }
- let dc = ((adc + (1 << (shift - 1))) >> shift) as u8;
-
- for _ in 0..bsize {
- for x in 0..bsize { buf[idx + x] = dc; }
- idx += stride;
- }
-}
-
-fn load_top(dst: &mut [u16], buf: &mut [u8], idx: usize, stride: usize, len: usize) {
- for i in 0..len { dst[i] = buf[idx - stride + i] as u16; }
-}
-fn load_left(dst: &mut [u16], buf: &mut [u8], idx: usize, stride: usize, len: usize) {
- for i in 0..len { dst[i] = buf[idx - 1 + i * stride] as u16; }
-}
-
-fn ipred_4x4_ver(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) {
- ipred_ver(buf, idx, stride, 4);
-}
-fn ipred_4x4_hor(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) {
- ipred_hor(buf, idx, stride, 4);
-}
-fn ipred_4x4_diag_down_left(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) {
- let mut t: [u16; 8] = [0; 8];
- let mut l: [u16; 8] = [0; 8];
- load_top(&mut t, buf, idx, stride, 4);
- for i in 0..4 { t[i + 4] = tr[i] as u16; }
- load_left(&mut l, buf, idx, stride, 8);
- let dst = &mut buf[idx..];
-
- dst[0 + 0 * stride] = ((t[0] + t[2] + 2*t[1] + 2 + l[0] + l[2] + 2*l[1] + 2) >> 3) as u8;
- let pix = ((t[1] + t[3] + 2*t[2] + 2 + l[1] + l[3] + 2*l[2] + 2) >> 3) as u8;
- dst[1 + 0 * stride] = pix;
- dst[0 + 1 * stride] = pix;
- let pix = ((t[2] + t[4] + 2*t[3] + 2 + l[2] + l[4] + 2*l[3] + 2) >> 3) as u8;
- dst[2 + 0 * stride] = pix;
- dst[1 + 1 * stride] = pix;
- dst[0 + 2 * stride] = pix;
- let pix = ((t[3] + t[5] + 2*t[4] + 2 + l[3] + l[5] + 2*l[4] + 2) >> 3) as u8;
- dst[3 + 0 * stride] = pix;
- dst[2 + 1 * stride] = pix;
- dst[1 + 2 * stride] = pix;
- dst[0 + 3 * stride] = pix;
- let pix = ((t[4] + t[6] + 2*t[5] + 2 + l[4] + l[6] + 2*l[5] + 2) >> 3) as u8;
- dst[3 + 1 * stride] = pix;
- dst[2 + 2 * stride] = pix;
- dst[1 + 3 * stride] = pix;
- let pix = ((t[5] + t[7] + 2*t[6] + 2 + l[5] + l[7] + 2*l[6] + 2) >> 3) as u8;
- dst[3 + 2 * stride] = pix;
- dst[2 + 3 * stride] = pix;
- dst[3 + 3 * stride] = ((t[6] + t[7] + 1 + l[6] + l[7] + 1) >> 2) as u8;
-}
-fn ipred_4x4_diag_down_left_nodown(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) {
- let mut t: [u16; 8] = [0; 8];
- let mut l: [u16; 4] = [0; 4];
- load_top(&mut t, buf, idx, stride, 4);
- for i in 0..4 { t[i + 4] = tr[i] as u16; }
- load_left(&mut l, buf, idx, stride, 4);
- let dst = &mut buf[idx..];
-
- dst[0 + 0 * stride] = ((t[0] + t[2] + 2*t[1] + 2 + l[0] + l[2] + 2*l[1] + 2) >> 3) as u8;
- let pix = ((t[1] + t[3] + 2*t[2] + 2 + l[1] + l[3] + 2*l[2] + 2) >> 3) as u8;
- dst[1 + 0 * stride] = pix;
- dst[0 + 1 * stride] = pix;
- let pix = ((t[2] + t[4] + 2*t[3] + 2 + l[2] + 3*l[3] + 2) >> 3) as u8;
- dst[2 + 0 * stride] = pix;
- dst[1 + 1 * stride] = pix;
- dst[0 + 2 * stride] = pix;
- let pix = ((t[3] + t[5] + 2*t[4] + 2 + l[3]*4 + 2) >> 3) as u8;
- dst[3 + 0 * stride] = pix;
- dst[2 + 1 * stride] = pix;
- dst[1 + 2 * stride] = pix;
- dst[0 + 3 * stride] = pix;
- let pix = ((t[4] + t[6] + 2*t[5] + 2 + l[3]*4 + 2) >> 3) as u8;
- dst[3 + 1 * stride] = pix;
- dst[2 + 2 * stride] = pix;
- dst[1 + 3 * stride] = pix;
- let pix = ((t[5] + t[7] + 2*t[6] + 2 + l[3]*4 + 2) >> 3) as u8;
- dst[3 + 2 * stride] = pix;
- dst[2 + 3 * stride] = pix;
- dst[3 + 3 * stride] = ((t[6] + t[7] + 1 + 2*l[3] + 1) >> 2) as u8;
-}
-fn ipred_4x4_diag_down_right(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) {
- let mut t: [u16; 5] = [0; 5];
- let mut l: [u16; 5] = [0; 5];
- load_top(&mut t, buf, idx - 1, stride, 5);
- load_left(&mut l, buf, idx - stride, stride, 5);
- let dst = &mut buf[idx..];
-
- for j in 0..4 {
- for i in 0..j {
- dst[i + j * stride] = ((l[j - i - 1] + 2 * l[j - i] + l[j - i + 1] + 2) >> 2) as u8;
- }
- dst[j + j * stride] = ((l[1] + 2 * l[0] + t[1] + 2) >> 2) as u8;
- for i in (j+1)..4 {
- dst[i + j * stride] = ((t[i - j - 1] + 2 * t[i - j] + t[i - j + 1] + 2) >> 2) as u8;
- }
- }
-}
-fn ipred_4x4_ver_right(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) {
- let mut t: [u16; 5] = [0; 5];
- let mut l: [u16; 5] = [0; 5];
- load_top(&mut t, buf, idx - 1, stride, 5);
- load_left(&mut l, buf, idx - stride, stride, 5);
- let dst = &mut buf[idx..];
-
- for j in 0..4 {
- for i in 0..4 {
- let zvr = ((2 * i) as i8) - (j as i8);
- let pix;
- if zvr >= 0 {
- if (zvr & 1) == 0 {
- pix = (t[i - (j >> 1)] + t[i - (j >> 1) + 1] + 1) >> 1;
- } else {
- pix = (t[i - (j >> 1) - 1] + 2 * t[i - (j >> 1)] + t[i - (j >> 1) + 1] + 2) >> 2;
- }
- } else {
- if zvr == -1 {
- pix = (l[1] + 2 * l[0] + t[1] + 2) >> 2;
- } else {
- pix = (l[j] + 2 * l[j - 1] + l[j - 2] + 2) >> 2;
- }
- }
- dst[i + j * stride] = pix as u8;
- }
- }
-}
-fn ipred_4x4_ver_left_common(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8], no_down: bool) {
- let mut t: [u16; 8] = [0; 8];
- let mut l: [u16; 5] = [0; 5];
- load_top(&mut t, buf, idx, stride, 4);
- for i in 0..4 { t[i + 4] = tr[i] as u16; }
- load_left(&mut l, buf, idx, stride, 4);
- l[4] = if no_down { l[3] } else { buf[idx - 1 + 4 * stride] as u16 };
- let dst = &mut buf[idx..];
-
- dst[0 + 0 * stride] = ((2*t[0] + 2*t[1] + l[1] + 2*l[2] + l[3] + 4) >> 3) as u8;
- let pix = ((t[1] + t[2] + 1) >> 1) as u8;
- dst[1 + 0 * stride] = pix;
- dst[0 + 2 * stride] = pix;
- let pix = ((t[2] + t[3] + 1) >> 1) as u8;
- dst[2 + 0 * stride] = pix;
- dst[1 + 2 * stride] = pix;
- let pix = ((t[3] + t[4] + 1) >> 1) as u8;
- dst[3 + 0 * stride] = pix;
- dst[2 + 2 * stride] = pix;
- dst[3 + 2 * stride] = ((t[4] + t[5] + 1) >> 1) as u8;
- dst[0 + 1 * stride] = ((t[0] + 2*t[1] + t[2] + l[2] + 2*l[3] + l[4] + 4) >> 3) as u8;
- let pix = ((t[1] + 2*t[2] + t[3] + 2) >> 2) as u8;
- dst[1 + 1 * stride] = pix;
- dst[0 + 3 * stride] = pix;
- let pix = ((t[2] + 2*t[3] + t[4] + 2) >> 2) as u8;
- dst[2 + 1 * stride] = pix;
- dst[1 + 3 * stride] = pix;
- let pix = ((t[3] + 2*t[4] + t[5] + 2) >> 2) as u8;
- dst[3 + 1 * stride] = pix;
- dst[2 + 3 * stride] = pix;
- dst[3 + 3 * stride] = ((t[4] + 2*t[5] + t[6] + 2) >> 2) as u8;
-}
-
-fn ipred_4x4_ver_left(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) {
- ipred_4x4_ver_left_common(buf, idx, stride, tr, false);
-}
-fn ipred_4x4_ver_left_nodown(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) {
- ipred_4x4_ver_left_common(buf, idx, stride, tr, true);
-}
-fn ipred_4x4_hor_down(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) {
- let mut t: [u16; 5] = [0; 5];
- let mut l: [u16; 5] = [0; 5];
- load_top(&mut t, buf, idx - 1, stride, 5);
- load_left(&mut l, buf, idx - stride, stride, 5);
- let dst = &mut buf[idx..];
-
- for j in 0..4 {
- for i in 0..4 {
- let zhd = ((2 * j) as i8) - (i as i8);
- let pix;
- if zhd >= 0 {
- if (zhd & 1) == 0 {
- pix = (l[j - (i >> 1)] + l[j - (i >> 1) + 1] + 1) >> 1;
- } else {
- pix = (l[j - (i >> 1) - 1] + 2 * l[j - (i >> 1)] + l[j - (i >> 1) + 1] + 2) >> 2;
- }
- } else {
- if zhd == -1 {
- pix = (l[1] + 2 * l[0] + t[1] + 2) >> 2;
- } else {
- pix = (t[i - 2] + 2 * t[i - 1] + t[i] + 2) >> 2;
- }
- }
- dst[i + j * stride] = pix as u8;
- }
- }
-}
-fn ipred_4x4_hor_up(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) {
- let mut t: [u16; 8] = [0; 8];
- let mut l: [u16; 8] = [0; 8];
- load_top(&mut t, buf, idx, stride, 4);
- for i in 0..4 { t[i + 4] = tr[i] as u16; }
- load_left(&mut l, buf, idx, stride, 8);
- let dst = &mut buf[idx..];
-
- dst[0 + 0 * stride] = ((t[1] + 2*t[2] + t[3] + 2*l[0] + 2*l[1] + 4) >> 3) as u8;
- dst[1 + 0 * stride] = ((t[2] + 2*t[3] + t[4] + l[0] + 2*l[1] + l[2] + 4) >> 3) as u8;
- let pix = ((t[3] + 2*t[4] + t[5] + 2*l[1] + 2*l[2] + 4) >> 3) as u8;
- dst[2 + 0 * stride] = pix;
- dst[0 + 1 * stride] = pix;
- let pix = ((t[4] + 2*t[5] + t[6] + l[1] + 2*l[2] + l[3] + 4) >> 3) as u8;
- dst[3 + 0 * stride] = pix;
- dst[1 + 1 * stride] = pix;
- let pix = ((t[5] + 2*t[6] + t[7] + 2*l[2] + 2*l[3] + 4) >> 3) as u8;
- dst[2 + 1 * stride] = pix;
- dst[0 + 2 * stride] = pix;
- let pix = ((t[6] + 3*t[7] + l[2] + 3*l[3] + 4) >> 3) as u8;
- dst[3 + 1 * stride] = pix;
- dst[1 + 2 * stride] = pix;
- let pix = ((l[3] + 2*l[4] + l[5] + 2) >> 2) as u8;
- dst[3 + 2 * stride] = pix;
- dst[1 + 3 * stride] = pix;
- let pix = ((t[6] + t[7] + l[3] + l[4] + 2) >> 2) as u8;
- dst[0 + 3 * stride] = pix;
- dst[2 + 2 * stride] = pix;
- dst[2 + 3 * stride] = ((l[4] + l[5] + 1) >> 1) as u8;
- dst[3 + 3 * stride] = ((l[4] + 2*l[5] + l[6] + 2) >> 2) as u8;
-}
-fn ipred_4x4_hor_up_nodown(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) {
- let mut t: [u16; 8] = [0; 8];
- let mut l: [u16; 4] = [0; 4];
- load_top(&mut t, buf, idx, stride, 4);
- for i in 0..4 { t[i + 4] = tr[i] as u16; }
- load_left(&mut l, buf, idx, stride, 4);
- let dst = &mut buf[idx..];
-
- dst[0 + 0 * stride] = ((t[1] + 2*t[2] + t[3] + 2*l[0] + 2*l[1] + 4) >> 3) as u8;
- dst[1 + 0 * stride] = ((t[2] + 2*t[3] + t[4] + l[0] + 2*l[1] + l[2] + 4) >> 3) as u8;
- let pix = ((t[3] + 2*t[4] + t[5] + 2*l[1] + 2*l[2] + 4) >> 3) as u8;
- dst[2 + 0 * stride] = pix;
- dst[0 + 1 * stride] = pix;
- let pix = ((t[4] + 2*t[5] + t[6] + l[1] + 2*l[2] + l[3] + 4) >> 3) as u8;
- dst[3 + 0 * stride] = pix;
- dst[1 + 1 * stride] = pix;
- let pix = ((t[5] + 2*t[6] + t[7] + 2*l[2] + 2*l[3] + 4) >> 3) as u8;
- dst[2 + 1 * stride] = pix;
- dst[0 + 2 * stride] = pix;
- let pix = ((t[6] + 3*t[7] + l[2] + 3*l[3] + 4) >> 3) as u8;
- dst[3 + 1 * stride] = pix;
- dst[1 + 2 * stride] = pix;
- dst[3 + 2 * stride] = l[3] as u8;
- dst[1 + 3 * stride] = l[3] as u8;
- let pix = ((t[6] + t[7] + 2*l[3] + 2) >> 2) as u8;
- dst[0 + 3 * stride] = pix;
- dst[2 + 2 * stride] = pix;
- dst[2 + 3 * stride] = l[3] as u8;
- dst[3 + 3 * stride] = l[3] as u8;
-}
-fn ipred_4x4_dc(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) {
- ipred_dc(buf, idx, stride, 4, 3);
-}
-fn ipred_4x4_left_dc(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) {
- ipred_left_dc(buf, idx, stride, 4, 2);
-}
-fn ipred_4x4_top_dc(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) {
- ipred_top_dc(buf, idx, stride, 4, 2);
-}
-fn ipred_4x4_dc128(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) {
- ipred_dc128(buf, idx, stride, 4);
-}
-
-fn ipred_8x8_ver(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_ver(buf, idx, stride, 8);
-}
-fn ipred_8x8_hor(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_hor(buf, idx, stride, 8);
-}
-fn ipred_8x8_dc(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_dc(buf, idx, stride, 8, 4);
-}
-fn ipred_8x8_left_dc(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_left_dc(buf, idx, stride, 8, 3);
-}
-fn ipred_8x8_top_dc(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_top_dc(buf, idx, stride, 8, 3);
-}
-fn ipred_8x8_dc128(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_dc128(buf, idx, stride, 8);
-}
-fn ipred_8x8_plane(_buf: &mut [u8], _idx: usize, _stride: usize) {
- unreachable!();
-/* let mut h: i16 = 0;
- let mut v: i16 = 0;
- for i in 0..4 {
- let i1 = (i + 1) as i16;
- h += i1 * ((buf[idx + (4 + i) - stride] as i16) - (buf[idx + (2 - i) - stride] as i16));
- v += i1 * ((buf[idx + (4 + i) * stride - 1] as i16) - (buf[idx + (2 - i) * stride - 1] as i16));
- }
- let a = 16 * ((buf[idx - 1 + 7 * stride] as i16) + (buf[idx + 7 - stride] as i16));
- let b = (17 * h + 16) >> 5;
- let c = (17 * v + 16) >> 5;
- for y in 0..8 {
- let j3 = (y as i16) - 3;
- for x in 0..8 {
- let i3 = (x as i16) - 3;
- buf[idx + x] = clip8((a + b * i3 + c * j3 + 16) >> 5);
- }
- idx += stride;
- }*/
-}
-
-fn ipred_16x16_ver(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_ver(buf, idx, stride, 16);
-}
-fn ipred_16x16_hor(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_hor(buf, idx, stride, 16);
-}
-fn ipred_16x16_dc(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_dc(buf, idx, stride, 16, 5);
-}
-fn ipred_16x16_left_dc(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_left_dc(buf, idx, stride, 16, 4);
-}
-fn ipred_16x16_top_dc(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_top_dc(buf, idx, stride, 16, 4);
-}
-fn ipred_16x16_dc128(buf: &mut [u8], idx: usize, stride: usize) {
- ipred_dc128(buf, idx, stride, 16);
-}
-fn ipred_16x16_plane(buf: &mut [u8], mut idx: usize, stride: usize) {
- let idx0 = idx + 7 - stride;
- let mut idx1 = idx + 8*stride - 1;
- let mut idx2 = idx1 - 2*stride;
-
- let mut h = (buf[idx0 + 1] as i16) - (buf[idx0 - 1] as i16);
- let mut v = (buf[idx1 + 0] as i16) - (buf[idx2 + 0] as i16);
-
- for k in 2..9 {
- idx1 += stride;
- idx2 -= stride;
- h += (k as i16) * ((buf[idx0 + k] as i16) - (buf[idx0 - k] as i16));
- v += (k as i16) * ((buf[idx1 + 0] as i16) - (buf[idx2 + 0] as i16));
- }
- h = (h + (h >> 2)) >> 4;
- v = (v + (v >> 2)) >> 4;
-
- let mut a = 16 * ((buf[idx1 + 0] as i16) + (buf[idx2 + 16] as i16) + 1) - 7 * (v + h);
-
- for _ in 0..16 {
- let mut b = a;
- a += v;
-
- for x in 0..4 {
- buf[idx + x * 4 + 0] = clip8((b ) >> 5);
- buf[idx + x * 4 + 1] = clip8((b + h) >> 5);
- buf[idx + x * 4 + 2] = clip8((b + 2*h) >> 5);
- buf[idx + x * 4 + 3] = clip8((b + 3*h) >> 5);
- b += h * 4;
- }
- idx += stride;
- }
-}
-
-const IPRED_FUNCS4X4: [fn(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]); 15] = [
- ipred_4x4_ver, ipred_4x4_hor, ipred_4x4_dc,
- ipred_4x4_diag_down_left, ipred_4x4_diag_down_right,
- ipred_4x4_ver_right, ipred_4x4_hor_down, ipred_4x4_ver_left, ipred_4x4_hor_up,
- ipred_4x4_left_dc, ipred_4x4_top_dc, ipred_4x4_dc128,
- ipred_4x4_diag_down_left_nodown, ipred_4x4_hor_up_nodown, ipred_4x4_ver_left_nodown
-];
-
-const IPRED_FUNCS8X8: [fn(buf: &mut [u8], idx: usize, stride: usize); 7] = [
- ipred_8x8_dc, ipred_8x8_hor, ipred_8x8_ver, ipred_8x8_plane,
- ipred_8x8_left_dc, ipred_8x8_top_dc, ipred_8x8_dc128
-];
-
-const IPRED_FUNCS16X16: [fn(buf: &mut [u8], idx: usize, stride: usize); 7] = [
- ipred_16x16_dc, ipred_16x16_hor, ipred_16x16_ver, ipred_16x16_plane,
- ipred_16x16_left_dc, ipred_16x16_top_dc, ipred_16x16_dc128
-];
diff --git a/src/codecs/real/rv40.rs b/src/codecs/real/rv40.rs
deleted file mode 100644
index c664598..0000000
--- a/src/codecs/real/rv40.rs
+++ /dev/null
@@ -1,1062 +0,0 @@
-use crate::formats;
-use crate::io::bitreader::*;
-use crate::io::codebook::*;
-use crate::io::intcode::*;
-use crate::codecs::*;
-use super::rv3040::*;
-use super::rv40dsp::*;
-
-struct AICCodeReader8 {
- lengths: &'static [u8],
- codes: &'static [u8],
-}
-
-impl CodebookDescReader<i8> for AICCodeReader8 {
- fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> i8 { idx as i8 }
- fn len (&mut self) -> usize { self.lengths.len() }
-}
-
-struct AICCodeReader16 {
- lengths: &'static [u8],
- codes: &'static [u16],
-}
-
-impl CodebookDescReader<i8> for AICCodeReader16 {
- fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> i8 { idx as i8 }
- fn len (&mut self) -> usize { self.lengths.len() }
-}
-
-struct TypeCodeReader {
- lengths: &'static [u8],
- codes: &'static [u8],
- syms: &'static [MBType],
-}
-
-impl CodebookDescReader<MBType> for TypeCodeReader {
- fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
- fn sym (&mut self, idx: usize) -> MBType{ self.syms[idx] }
- fn len (&mut self) -> usize { self.lengths.len() }
-}
-
-struct RealVideo40BR {
- width: usize,
- height: usize,
- aic_top_cb: Codebook<i8>,
- aic_mode1_cb: Vec<Codebook<i8>>,
- aic_mode2_cb: Vec<Codebook<i8>>,
- ptype_cb: Vec<Codebook<MBType>>,
- btype_cb: Vec<Codebook<MBType>>,
- had_skip_run: bool,
-}
-
-impl RealVideo40BR {
- fn new() -> Self {
- let mut coderead = AICCodeReader8{ lengths: &RV40_AIC_TOP_BITS, codes: &RV40_AIC_TOP_CODES };
- let aic_top_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
-
- let mut aic_mode1_cb: Vec<Codebook<i8>> = Vec::with_capacity(RV40_AIC_MODE1_BITS.len());
- for i in 0..RV40_AIC_MODE1_BITS.len() {
- if (i % 10) != 9 {
- let mut coderead = AICCodeReader8{ lengths: &RV40_AIC_MODE1_BITS[i], codes: &RV40_AIC_MODE1_CODES[i] };
- let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- aic_mode1_cb.push(cb);
- } else {
- let mut coderead = AICCodeReader8{ lengths: &RV40_AIC_MODE1_BITS_DUMMY, codes: &RV40_AIC_MODE1_CODES_DUMMY };
- let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- aic_mode1_cb.push(cb);
- }
- }
-
- let mut aic_mode2_cb: Vec<Codebook<i8>> = Vec::with_capacity(RV40_AIC_MODE2_BITS.len());
- for i in 0..RV40_AIC_MODE2_BITS.len() {
- let mut coderead = AICCodeReader16{ lengths: &RV40_AIC_MODE2_BITS[i], codes: &RV40_AIC_MODE2_CODES[i] };
- let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- aic_mode2_cb.push(cb);
- }
-
- let mut ptype_cb: Vec<Codebook<MBType>> = Vec::with_capacity(RV40_PTYPE_BITS.len());
- for i in 0..RV40_PTYPE_BITS.len() {
- let mut coderead = TypeCodeReader{ lengths: &RV40_PTYPE_BITS[i], codes: &RV40_PTYPE_CODES[i], syms: RV40_PTYPE_SYMS };
- let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- ptype_cb.push(cb);
- }
-
- let mut btype_cb: Vec<Codebook<MBType>> = Vec::with_capacity(RV40_BTYPE_BITS.len());
- for i in 0..RV40_BTYPE_BITS.len() {
- let mut coderead = TypeCodeReader{ lengths: &RV40_BTYPE_BITS[i], codes: &RV40_BTYPE_CODES[i], syms: RV40_BTYPE_SYMS };
- let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
- btype_cb.push(cb);
- }
-
- RealVideo40BR {
- width: 0,
- height: 0,
- aic_top_cb: aic_top_cb,
- aic_mode1_cb: aic_mode1_cb,
- aic_mode2_cb: aic_mode2_cb,
- ptype_cb: ptype_cb,
- btype_cb: btype_cb,
- had_skip_run: false,
- }
- }
- fn predict_b_mv_component(&self, sstate: &SState, mvi: &MVInfo, mbinfo: &Vec<RV34MBInfo>, mbtype: MBType, fwd: bool) -> MV {
- let mut pred_mvs: [MV; 3] = [ZERO_MV; 3];
- let mut mv_count: usize = 0;
- let mb_x = sstate.mb_x;
- let mb_y = sstate.mb_y;
- let mb_stride = sstate.mb_w;
- let mb_idx = mb_x + mb_y * mb_stride;
-
- if !mbtype.has_mv_dir(fwd) {
- return ZERO_MV;
- }
-
- if sstate.has_left && mbinfo[mb_idx - 1].mbtype.has_mv_dir(fwd) {
- pred_mvs[mv_count] = mvi.get_mv(mb_x - 1, mb_y, 0, 0, fwd);
- mv_count += 1;
- }
- if !sstate.has_top {
- return pred_mvs[0];
- }
- if mbinfo[mb_idx - mb_stride].mbtype.has_mv_dir(fwd) {
- pred_mvs[mv_count] = mvi.get_mv(mb_x, mb_y - 1, 0, 0, fwd);
- mv_count += 1;
- }
- if sstate.has_tr {
- if mbinfo[mb_idx - mb_stride + 1].mbtype.has_mv_dir(fwd) {
- pred_mvs[mv_count] = mvi.get_mv(mb_x + 1, mb_y - 1, 0, 0, fwd);
- mv_count += 1;
- }
- } else {
- if sstate.has_tl && mbinfo[mb_idx - mb_stride - 1].mbtype.has_mv_dir(fwd) {
- pred_mvs[mv_count] = mvi.get_mv(mb_x - 1, mb_y - 1, 0, 0, fwd);
- mv_count += 1;
- }
- }
-
- match mv_count {
- 3 => MV::pred(pred_mvs[0], pred_mvs[1], pred_mvs[2]),
- 2 => { let sum_mv = pred_mvs[0] + pred_mvs[1]; MV { x: sum_mv.x / 2, y: sum_mv.y / 2 } },
- 1 => pred_mvs[0],
- _ => ZERO_MV,
- }
- }
-}
-
-fn get_dimension(br: &mut BitReader, tab: &'static [i16]) -> DecoderResult<usize> {
- let t = br.read(3)? as usize;
- if tab[t] > 0 { return Ok(tab[t] as usize); }
- if tab[t] < 0 {
- let idx = (-tab[t] as usize) + (br.read(1)? as usize);
- if tab[idx] != 0 { return Ok(tab[idx] as usize); }
- }
- let mut size: usize = 0;
- loop {
- let t = br.read(8)? as usize;
- size += t << 2;
- if t != 255 { break; }
- }
- Ok(size)
-}
-
-impl RV34BitstreamDecoder for RealVideo40BR {
- fn decode_slice_header(&mut self, br: &mut BitReader, old_w: usize, old_h: usize) -> DecoderResult<RV34SliceHeader> {
- if br.read(1)? != 0 { return Err(DecoderError::InvalidData); }
- let ft_idx = br.read(2)?;
- let ftype = match ft_idx {
- 0|1 => FrameType::I,
- 2 => FrameType::P,
- _ => FrameType::B,
- };
- let q = br.read(5)? as u8;
- if br.read(2)? != 0 { return Err(DecoderError::InvalidData); }
- let set_idx = br.read(2)? as usize;
- let deblock = !br.read_bool()?;
- let pts = br.read(13)? as u16;
- let w;
- let h;
- if (ftype == FrameType::I) || !br.read_bool()? {
- w = get_dimension(br, &RV40_STANDARD_WIDTHS)?;
- h = get_dimension(br, &RV40_STANDARD_HEIGHTS)?;
- } else {
- w = old_w;
- h = old_h;
- }
- let start = br.read(get_slice_start_offset_bits(w, h))? as usize;
-
- self.had_skip_run = false;
-
- Ok(RV34SliceHeader{ ftype: ftype, quant: q, deblock: deblock, pts: pts, width: w, height: h, start: start, end: 0, set_idx: set_idx })
- }
- fn decode_intra_pred(&mut self, br: &mut BitReader, types: &mut [i8], mut pos: usize, tstride: usize, has_top: bool) -> DecoderResult<()> {
- let start;
- if has_top {
- start = 0;
- } else {
- let code = br.read_cb(&self.aic_top_cb)?;
- types[pos + 0] = (code >> 2) & 2;
- types[pos + 1] = (code >> 1) & 2;
- types[pos + 2] = (code >> 0) & 2;
- types[pos + 3] = (code << 1) & 2;
- pos += tstride;
- start = 1;
- }
- for _ in start..4 {
- let mut x: usize = 0;
- while x < 4 {
- let tr = types[pos + x - tstride + 1];
- let t = types[pos + x - tstride];
- let l = types[pos + x - 1];
- let ctx = if x < 3 { ((tr & 0xF) as u16) + (((t as u16) & 0xF) << 4) + (((l as u16) & 0xF) << 8) } else { 0xFFF };
- let res = RV40_AIC_PATTERNS.iter().position(|&x| x == ctx);
- if let Some(idx) = res {
- let code = br.read_cb(&self.aic_mode2_cb[idx])?;
- types[pos + x + 0] = code / 9;
- types[pos + x + 1] = code % 9;
- x += 2;
- } else {
- if (t != -1) && (l != -1) {
- let idx = (t as usize) + (l as usize) * 10;
- types[pos + x] = br.read_cb(&self.aic_mode1_cb[idx])?;
- } else {
- match l {
- -1 if t < 2 => { types[pos + x] = (br.read(1)? as i8) ^ 1; },
- 0 | 2 => { types[pos + x] = ((br.read(1)? as i8) ^ 1) << 1; },
- _ => { types[pos + x] = 0; },
- };
- }
- x += 1;
- }
- }
- pos += tstride;
- }
- Ok(())
- }
- fn decode_inter_mb_hdr(&mut self, br: &mut BitReader, ftype: FrameType, mbtype_ref: MBType) -> DecoderResult<MBInfo> {
- let skip_run = if self.had_skip_run { 0 } else { br.read_code(UintCodeType::Gamma)? as usize };
- if skip_run > 0 {
- self.had_skip_run = true;
- return Ok(MBInfo { mbtype: MBType::MBSkip, skip_run: skip_run - 1, dquant: false })
- }
- self.had_skip_run = false;
- let mut mbtype;
- let idx;
- if ftype == FrameType::P {
- idx = match mbtype_ref {
- MBType::MBIntra => 0,
- MBType::MBIntra16 => 1,
- MBType::MBP16x16 => 2,
- MBType::MBP8x8 => 3,
- MBType::MBP16x8 => 4,
- MBType::MBP8x16 => 5,
- MBType::MBP16x16Mix => 6,
- _ => unreachable!(),
- };
- mbtype = br.read_cb(&self.ptype_cb[idx])?;
- } else {
- idx = match mbtype_ref {
- MBType::MBIntra => 0,
- MBType::MBIntra16 => 1,
- MBType::MBForward => 2,
- MBType::MBBackward => 3,
- MBType::MBBidir => 4,
- MBType::MBDirect => 5,
- _ => 0,
- };
- mbtype = br.read_cb(&self.btype_cb[idx])?;
- }
- let dquant = mbtype == MBType::Invalid;
- if dquant {
- mbtype = if ftype == FrameType::P { br.read_cb(&self.ptype_cb[idx])? }
- else { br.read_cb(&self.btype_cb[idx])? };
- }
- Ok(MBInfo { mbtype: mbtype, skip_run: 0, dquant: dquant })
- }
- fn predict_b_mv(&self, sstate: &SState, mvi: &MVInfo, mbtype: MBType, mvs: &[MV], mbinfo: &Vec<RV34MBInfo>) -> (MV, MV) {
- let mut mv_f = self.predict_b_mv_component(sstate, mvi, mbinfo, mbtype, true);
- let mut mv_b = self.predict_b_mv_component(sstate, mvi, mbinfo, mbtype, false);
-
- match mbtype {
- MBType::MBForward => { mv_f += mvs[0]; },
- MBType::MBBackward => { mv_b += mvs[0]; },
- MBType::MBBidir => {
- mv_f += mvs[0];
- mv_b += mvs[1];
- },
- _ => {},
- };
-
- (mv_f, mv_b)
- }
- fn quant_dc(&self, is_intra: bool, q: u8) -> u8 { RV40_QUANT_DC[if is_intra { 0 } else { 1 }][q as usize] }
-}
-
-struct RealVideo40Decoder {
- bd: RealVideo40BR,
- info: Rc<NACodecInfo>,
- dec: RV34Decoder,
-}
-
-impl RealVideo40Decoder {
- fn new() -> Self {
- RealVideo40Decoder{
- bd: RealVideo40BR::new(),
- info: Rc::new(DUMMY_CODEC_INFO),
- dec: RV34Decoder::new(false, Box::new(RV40DSP::new())),
- }
- }
-}
-
-impl NADecoder for RealVideo40Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
- let fmt = formats::YUV420_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, false, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
-
- let edata = info.get_extradata().unwrap();
- let src: &[u8] = &edata;
-
-{
-println!("edata:");
-for i in 0..src.len() { print!(" {:02X}", src[i]); } println!("");
-}
- if src.len() < 2 { return Err(DecoderError::InvalidData); }
-
- self.bd.width = vinfo.get_width();
- self.bd.height = vinfo.get_height();
- Ok(())
- } else {
-println!("???");
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
-
- let (bufinfo, ftype, ts) = self.dec.parse_frame(src.as_slice(), &mut self.bd)?;
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(ftype == FrameType::I);
- frm.set_frame_type(ftype);
- frm.set_pts(Some(ts));
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(RealVideo40Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_rv40() {
-// test_file_decoding("realmedia", "assets/RV/rv40_ralf.rmvb", Some(1000), true, false, /*None*/Some("rv40"));
- test_file_decoding("realmedia", "assets/RV/rv40_weighted_mc.rmvb", Some(400), true, false, None/*Some("rv40")*/);
-// test_file_decoding("realmedia", "assets/RV/rv40_weighted_mc_2.rmvb", Some(1000), true, false, /*None*/Some("rv40"));
-//panic!("end");
- }
-}
-
-const RV40_STANDARD_WIDTHS: [i16; 8] = [ 160, 172, 240, 320, 352, 640, 704, 0 ];
-const RV40_STANDARD_HEIGHTS: [i16; 12] = [ 120, 132, 144, 240, 288, 480, -8, -10, 180, 360, 576, 0 ];
-
-const RV40_QUANT_DC: [[u8; 32]; 2] = [
- [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 22, 22, 22, 22
- ], [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 20, 21, 21, 22, 23, 23, 23, 24, 24, 24, 24
- ]
-];
-
-const RV40_AIC_PATTERNS: [u16; 20] = [
- 0x000, 0x100, 0x200,
- 0x011, 0x111, 0x211, 0x511, 0x611,
- 0x022, 0x122, 0x222, 0x722,
- 0x272, 0x227,
- 0x822, 0x282, 0x228,
- 0x112, 0x116, 0x221
-];
-
-const RV40_AIC_TOP_CODES: [u8; 16] = [
- 0x01, 0x05, 0x01, 0x00, 0x03, 0x3D, 0x1D, 0x02,
- 0x04, 0x3C, 0x3F, 0x1C, 0x0D, 0x3E, 0x0C, 0x01
-];
-const RV40_AIC_TOP_BITS: [u8; 16] = [
- 1, 4, 5, 5, 5, 7, 6, 5, 4, 7, 7, 6, 5, 7, 5, 3
-];
-
-const RV40_AIC_MODE1_CODES_DUMMY: [u8; 1] = [ 0 ];
-const RV40_AIC_MODE1_BITS_DUMMY: [u8; 1] = [ 1 ];
-
-const RV40_AIC_MODE1_CODES: [[u8; 9]; 90] = [
- [ 0x01, 0x01, 0x01, 0x11, 0x00, 0x09, 0x03, 0x10, 0x05 ],
- [ 0x09, 0x01, 0x01, 0x05, 0x11, 0x00, 0x03, 0x21, 0x20 ],
- [ 0x01, 0x01, 0x01, 0x11, 0x09, 0x10, 0x05, 0x00, 0x03 ],
- [ 0x01, 0x01, 0x00, 0x03, 0x21, 0x05, 0x09, 0x20, 0x11 ],
- [ 0x01, 0x09, 0x00, 0x29, 0x08, 0x15, 0x03, 0x0B, 0x28 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x03, 0x02 ],
- [ 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x01, 0x09, 0x08 ],
- [ 0x01, 0x01, 0x01, 0x09, 0x01, 0x08, 0x00, 0x03, 0x05 ],
- [ 0x01, 0x01, 0x01, 0x00, 0x05, 0x11, 0x09, 0x10, 0x03 ],
- [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ],
-
- [ 0x01, 0x01, 0x01, 0x05, 0x01, 0x00, 0x03, 0x09, 0x08 ],
- [ 0x09, 0x01, 0x01, 0x05, 0x11, 0x00, 0x03, 0x21, 0x20 ],
- [ 0x01, 0x01, 0x01, 0x0D, 0x05, 0x04, 0x00, 0x07, 0x0C ],
- [ 0x01, 0x01, 0x00, 0x05, 0x11, 0x03, 0x09, 0x21, 0x20 ],
- [ 0x05, 0x01, 0x01, 0x11, 0x00, 0x09, 0x03, 0x21, 0x20 ],
- [ 0x09, 0x01, 0x01, 0x00, 0x05, 0x01, 0x03, 0x11, 0x10 ],
- [ 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x03, 0x02 ],
- [ 0x01, 0x01, 0x01, 0x09, 0x00, 0x05, 0x01, 0x03, 0x08 ],
- [ 0x01, 0x01, 0x01, 0x09, 0x11, 0x05, 0x00, 0x10, 0x03 ],
- [ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ],
-
- [ 0x01, 0x00, 0x01, 0x09, 0x08, 0x15, 0x14, 0x0B, 0x03 ],
- [ 0x0D, 0x01, 0x01, 0x05, 0x0C, 0x04, 0x01, 0x00, 0x07 ],
- [ 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x03, 0x01, 0x01 ],
- [ 0x05, 0x01, 0x01, 0x04, 0x19, 0x07, 0x18, 0x0D, 0x00 ],
- [ 0x11, 0x09, 0x01, 0x21, 0x05, 0x20, 0x01, 0x00, 0x03 ],
- [ 0x41, 0x01, 0x00, 0x05, 0x40, 0x03, 0x09, 0x21, 0x11 ],
- [ 0x29, 0x01, 0x00, 0x28, 0x09, 0x15, 0x03, 0x08, 0x0B ],
- [ 0x01, 0x00, 0x01, 0x11, 0x09, 0x10, 0x05, 0x01, 0x03 ],
- [ 0x05, 0x01, 0x01, 0x04, 0x0D, 0x0C, 0x07, 0x00, 0x01 ],
- [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ],
-
- [ 0x01, 0x00, 0x03, 0x05, 0x11, 0x10, 0x25, 0x24, 0x13 ],
- [ 0x21, 0x01, 0x01, 0x00, 0x11, 0x03, 0x05, 0x20, 0x09 ],
- [ 0x01, 0x01, 0x01, 0x00, 0x09, 0x11, 0x10, 0x05, 0x03 ],
- [ 0x21, 0x05, 0x01, 0x01, 0x09, 0x00, 0x11, 0x20, 0x03 ],
- [ 0x05, 0x01, 0x00, 0x04, 0x01, 0x19, 0x07, 0x18, 0x0D ],
- [ 0x11, 0x01, 0x00, 0x01, 0x09, 0x01, 0x03, 0x10, 0x05 ],
- [ 0x1D, 0x01, 0x05, 0x0D, 0x0C, 0x04, 0x00, 0x1C, 0x0F ],
- [ 0x05, 0x19, 0x01, 0x04, 0x00, 0x18, 0x1B, 0x1A, 0x07 ],
- [ 0x09, 0x01, 0x00, 0x01, 0x05, 0x03, 0x11, 0x10, 0x01 ],
- [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ],
-
- [ 0x01, 0x00, 0x03, 0x41, 0x05, 0x40, 0x09, 0x11, 0x21 ],
- [ 0x05, 0x01, 0x01, 0x19, 0x04, 0x07, 0x00, 0x18, 0x0D ],
- [ 0x01, 0x01, 0x01, 0x05, 0x01, 0x04, 0x01, 0x00, 0x03 ],
- [ 0x01, 0x05, 0x00, 0x0D, 0x01, 0x04, 0x07, 0x19, 0x18 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02 ],
- [ 0x31, 0x01, 0x05, 0x19, 0x04, 0x07, 0x00, 0x30, 0x0D ],
- [ 0x01, 0x00, 0x03, 0x11, 0x01, 0x05, 0x01, 0x09, 0x10 ],
- [ 0x01, 0x05, 0x01, 0x11, 0x01, 0x10, 0x00, 0x03, 0x09 ],
- [ 0x01, 0x09, 0x00, 0x29, 0x03, 0x08, 0x28, 0x15, 0x0B ],
- [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ],
-
- [ 0x01, 0x01, 0x00, 0x09, 0x15, 0x03, 0x08, 0x14, 0x0B ],
- [ 0x11, 0x01, 0x01, 0x00, 0x09, 0x01, 0x03, 0x10, 0x05 ],
- [ 0x01, 0x00, 0x03, 0x25, 0x11, 0x05, 0x10, 0x24, 0x13 ],
- [ 0x11, 0x01, 0x00, 0x01, 0x09, 0x01, 0x05, 0x10, 0x03 ],
- [ 0x05, 0x01, 0x00, 0x0D, 0x0C, 0x04, 0x0F, 0x1D, 0x1C ],
- [ 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x03, 0x02 ],
- [ 0x21, 0x01, 0x05, 0x09, 0x11, 0x00, 0x03, 0x41, 0x40 ],
- [ 0x05, 0x01, 0x00, 0x1D, 0x1C, 0x0D, 0x0C, 0x0F, 0x04 ],
- [ 0x05, 0x01, 0x00, 0x0D, 0x31, 0x04, 0x19, 0x30, 0x07 ],
- [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ],
-
- [ 0x01, 0x01, 0x00, 0x21, 0x05, 0x11, 0x03, 0x09, 0x20 ],
- [ 0x01, 0x01, 0x00, 0x11, 0x03, 0x05, 0x01, 0x09, 0x10 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02 ],
- [ 0x05, 0x01, 0x04, 0x19, 0x07, 0x0D, 0x00, 0x31, 0x30 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02 ],
- [ 0x05, 0x01, 0x01, 0x11, 0x09, 0x00, 0x03, 0x21, 0x20 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02 ],
- [ 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x01, 0x01, 0x02 ],
- [ 0x09, 0x01, 0x00, 0x29, 0x08, 0x15, 0x03, 0x28, 0x0B ],
- [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ],
-
- [ 0x01, 0x01, 0x01, 0x05, 0x01, 0x04, 0x00, 0x01, 0x03 ],
- [ 0x09, 0x01, 0x00, 0x29, 0x28, 0x15, 0x08, 0x03, 0x0B ],
- [ 0x01, 0x00, 0x01, 0x11, 0x05, 0x10, 0x09, 0x01, 0x03 ],
- [ 0x05, 0x04, 0x01, 0x1D, 0x0D, 0x0C, 0x1C, 0x00, 0x0F ],
- [ 0x09, 0x11, 0x01, 0x41, 0x00, 0x40, 0x05, 0x03, 0x21 ],
- [ 0x0D, 0x05, 0x01, 0x1D, 0x1C, 0x0C, 0x04, 0x00, 0x0F ],
- [ 0x41, 0x09, 0x01, 0x40, 0x00, 0x11, 0x05, 0x03, 0x21 ],
- [ 0x01, 0x01, 0x01, 0x05, 0x01, 0x04, 0x00, 0x01, 0x03 ],
- [ 0x05, 0x04, 0x01, 0x0D, 0x01, 0x0C, 0x07, 0x01, 0x00 ],
- [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ],
-
- [ 0x05, 0x04, 0x01, 0x07, 0x19, 0x31, 0x30, 0x0D, 0x00 ],
- [ 0x21, 0x01, 0x01, 0x00, 0x11, 0x09, 0x20, 0x05, 0x03 ],
- [ 0x05, 0x01, 0x01, 0x04, 0x07, 0x0D, 0x0C, 0x00, 0x01 ],
- [ 0x21, 0x09, 0x01, 0x00, 0x20, 0x05, 0x23, 0x22, 0x03 ],
- [ 0x31, 0x0D, 0x01, 0x19, 0x05, 0x30, 0x04, 0x07, 0x00 ],
- [ 0x31, 0x05, 0x01, 0x04, 0x19, 0x00, 0x0D, 0x30, 0x07 ],
- [ 0x31, 0x01, 0x00, 0x0D, 0x05, 0x19, 0x04, 0x30, 0x07 ],
- [ 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02, 0x01, 0x01 ],
- [ 0x01, 0x00, 0x01, 0x01, 0x05, 0x09, 0x08, 0x03, 0x01 ],
- [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ],
-];
-static RV40_AIC_MODE1_BITS: [[u8; 9]; 90] = [
- [ 1, 4, 2, 7, 4, 6, 4, 7, 5 ],
- [ 5, 1, 3, 4, 6, 3, 3, 7, 7 ],
- [ 1, 4, 2, 7, 6, 7, 5, 4, 4 ],
- [ 1, 3, 3, 3, 7, 4, 5, 7, 6 ],
- [ 2, 4, 2, 6, 4, 5, 2, 4, 6 ],
- [ 7, 2, 3, 4, 7, 1, 5, 7, 7 ],
- [ 5, 1, 3, 6, 5, 5, 2, 7, 7 ],
- [ 2, 5, 1, 7, 3, 7, 5, 5, 6 ],
- [ 2, 4, 1, 4, 5, 7, 6, 7, 4 ],
- [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
-
- [ 2, 1, 3, 6, 5, 5, 5, 7, 7 ],
- [ 5, 1, 3, 4, 6, 3, 3, 7, 7 ],
- [ 4, 1, 2, 6, 5, 5, 4, 5, 6 ],
- [ 3, 1, 3, 4, 6, 3, 5, 7, 7 ],
- [ 4, 1, 3, 6, 3, 5, 3, 7, 7 ],
- [ 6, 1, 4, 4, 5, 2, 4, 7, 7 ],
- [ 7, 1, 5, 7, 4, 3, 2, 7, 7 ],
- [ 5, 3, 2, 7, 5, 6, 1, 5, 7 ],
- [ 4, 1, 2, 6, 7, 5, 4, 7, 4 ],
- [ 1, 0, 1, 0, 0, 0, 0, 0, 0 ],
-
- [ 3, 3, 1, 5, 5, 6, 6, 5, 3 ],
- [ 6, 2, 1, 5, 6, 5, 4, 4, 5 ],
- [ 6, 4, 1, 7, 6, 7, 6, 3, 2 ],
- [ 4, 3, 1, 4, 6, 4, 6, 5, 3 ],
- [ 6, 5, 1, 7, 4, 7, 3, 3, 3 ],
- [ 7, 2, 2, 3, 7, 2, 4, 6, 5 ],
- [ 6, 2, 2, 6, 4, 5, 2, 4, 4 ],
- [ 4, 4, 1, 7, 6, 7, 5, 2, 4 ],
- [ 5, 4, 1, 5, 6, 6, 5, 4, 2 ],
- [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
-
- [ 2, 2, 2, 3, 5, 5, 6, 6, 5 ],
- [ 7, 1, 3, 3, 6, 3, 4, 7, 5 ],
- [ 2, 4, 1, 4, 6, 7, 7, 5, 4 ],
- [ 7, 4, 3, 1, 5, 3, 6, 7, 3 ],
- [ 4, 3, 3, 4, 1, 6, 4, 6, 5 ],
- [ 7, 4, 4, 2, 6, 1, 4, 7, 5 ],
- [ 5, 2, 3, 4, 4, 3, 2, 5, 4 ],
- [ 3, 5, 2, 3, 2, 5, 5, 5, 3 ],
- [ 6, 4, 4, 2, 5, 4, 7, 7, 1 ],
- [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
-
- [ 2, 2, 2, 7, 3, 7, 4, 5, 6 ],
- [ 4, 1, 3, 6, 4, 4, 3, 6, 5 ],
- [ 2, 4, 1, 7, 3, 7, 6, 6, 6 ],
- [ 3, 4, 3, 5, 1, 4, 4, 6, 6 ],
- [ 4, 5, 2, 7, 1, 7, 3, 7, 7 ],
- [ 6, 2, 3, 5, 3, 3, 2, 6, 4 ],
- [ 4, 4, 4, 7, 2, 5, 1, 6, 7 ],
- [ 4, 5, 2, 7, 1, 7, 4, 4, 6 ],
- [ 2, 4, 2, 6, 2, 4, 6, 5, 4 ],
- [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
-
- [ 1, 3, 3, 5, 6, 3, 5, 6, 5 ],
- [ 7, 1, 4, 4, 6, 2, 4, 7, 5 ],
- [ 2, 2, 2, 6, 5, 3, 5, 6, 5 ],
- [ 7, 4, 4, 2, 6, 1, 5, 7, 4 ],
- [ 3, 2, 2, 4, 4, 3, 4, 5, 5 ],
- [ 7, 2, 5, 3, 7, 1, 4, 7, 7 ],
- [ 6, 2, 3, 4, 5, 2, 2, 7, 7 ],
- [ 3, 2, 2, 5, 5, 4, 4, 4, 3 ],
- [ 3, 2, 2, 4, 6, 3, 5, 6, 3 ],
- [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
-
- [ 1, 3, 3, 7, 4, 6, 3, 5, 7 ],
- [ 4, 1, 4, 7, 4, 5, 2, 6, 7 ],
- [ 2, 4, 1, 7, 5, 7, 3, 7, 7 ],
- [ 3, 2, 3, 5, 3, 4, 2, 6, 6 ],
- [ 3, 5, 4, 7, 2, 7, 1, 7, 7 ],
- [ 4, 1, 3, 6, 5, 3, 3, 7, 7 ],
- [ 4, 2, 5, 7, 3, 7, 1, 7, 7 ],
- [ 7, 4, 1, 7, 3, 7, 2, 5, 7 ],
- [ 4, 2, 2, 6, 4, 5, 2, 6, 4 ],
- [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
-
- [ 3, 4, 1, 7, 6, 7, 6, 2, 6 ],
- [ 4, 2, 2, 6, 6, 5, 4, 2, 4 ],
- [ 4, 4, 1, 7, 5, 7, 6, 2, 4 ],
- [ 3, 3, 2, 5, 4, 4, 5, 2, 4 ],
- [ 4, 5, 2, 7, 2, 7, 3, 2, 6 ],
- [ 4, 3, 2, 5, 5, 4, 3, 2, 4 ],
- [ 7, 4, 2, 7, 2, 5, 3, 2, 6 ],
- [ 4, 6, 2, 7, 3, 7, 6, 1, 6 ],
- [ 5, 5, 1, 6, 4, 6, 5, 2, 4 ],
- [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
-
- [ 3, 3, 2, 3, 5, 6, 6, 4, 2 ],
- [ 7, 1, 3, 3, 6, 5, 7, 4, 3 ],
- [ 5, 4, 1, 5, 5, 6, 6, 4, 2 ],
- [ 6, 4, 2, 2, 6, 3, 6, 6, 2 ],
- [ 6, 4, 2, 5, 3, 6, 3, 3, 2 ],
- [ 6, 3, 2, 3, 5, 2, 4, 6, 3 ],
- [ 6, 2, 2, 4, 3, 5, 3, 6, 3 ],
- [ 7, 5, 1, 7, 4, 7, 7, 3, 2 ],
- [ 5, 5, 2, 3, 6, 7, 7, 5, 1 ],
- [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
-];
-
-const RV40_AIC_MODE2_CODES: [[u16; 81]; 20] = [
- [
- 0x0001, 0x0001, 0x0005, 0x01F5, 0x0011, 0x0049, 0x0000, 0x0048, 0x004B,
- 0x0035, 0x0003, 0x0034, 0x03C9, 0x01F4, 0x00C9, 0x004A, 0x0FD9, 0x03C8,
- 0x0010, 0x0037, 0x0001, 0x00C8, 0x0075, 0x01F7, 0x00CB, 0x0074, 0x0002,
- 0x01F6, 0x00CA, 0x01F1, 0x01F0, 0x1F81, 0x07F9, 0x1F80, 0x1F83, 0x07F8,
- 0x0077, 0x00F5, 0x0036, 0x07FB, 0x0076, 0x1F82, 0x00F4, 0x00F7, 0x07FA,
- 0x0071, 0x00F6, 0x03CB, 0x03CA, 0x0FD8, 0x00F1, 0x03F5, 0x1F8D, 0x07E5,
- 0x0013, 0x0031, 0x00F0, 0x0FDB, 0x00F3, 0x07E4, 0x0030, 0x01F3, 0x07E7,
- 0x03F4, 0x07E6, 0x0070, 0x3F19, 0x01F2, 0x3F18, 0x0FDA, 0x0033, 0x07E1,
- 0x01FD, 0x01FC, 0x0073, 0x01FF, 0x0FC5, 0x0FC4, 0x0FC7, 0x03F7, 0x0072,
- ], [
- 0x0005, 0x0005, 0x0005, 0x0079, 0x0005, 0x000D, 0x001D, 0x0078, 0x0069,
- 0x0004, 0x0001, 0x0007, 0x0068, 0x001C, 0x001F, 0x0004, 0x006B, 0x000C,
- 0x0004, 0x001E, 0x0006, 0x006A, 0x0015, 0x000F, 0x0014, 0x0017, 0x0007,
- 0x0016, 0x000E, 0x0011, 0x0009, 0x00D1, 0x00D0, 0x0181, 0x00D3, 0x007B,
- 0x0010, 0x0013, 0x0004, 0x00D2, 0x0007, 0x0319, 0x0008, 0x007A, 0x00DD,
- 0x0019, 0x0006, 0x000B, 0x0065, 0x00DC, 0x0012, 0x0064, 0x0180, 0x00DF,
- 0x0006, 0x0018, 0x0001, 0x00DE, 0x001D, 0x00D9, 0x001B, 0x0067, 0x000A,
- 0x00D8, 0x00DB, 0x001C, 0x0318, 0x00DA, 0x0635, 0x0183, 0x0000, 0x00C5,
- 0x0066, 0x0061, 0x0035, 0x00C4, 0x0182, 0x0634, 0x031B, 0x00C7, 0x001F,
- ], [
- 0x0005, 0x0001, 0x001D, 0x01C1, 0x0035, 0x00F1, 0x006D, 0x00F0, 0x0049,
- 0x0000, 0x0004, 0x0003, 0x00F3, 0x0048, 0x0034, 0x006C, 0x01C0, 0x01C3,
- 0x0007, 0x0006, 0x0001, 0x006F, 0x0002, 0x004B, 0x006E, 0x001C, 0x0005,
- 0x0069, 0x0068, 0x006B, 0x0037, 0x01C2, 0x00F2, 0x0395, 0x01CD, 0x00FD,
- 0x006A, 0x0036, 0x0015, 0x01CC, 0x0014, 0x0394, 0x004A, 0x00FC, 0x00FF,
- 0x0017, 0x0031, 0x00FE, 0x01CF, 0x0397, 0x00F9, 0x01CE, 0x0725, 0x0396,
- 0x0016, 0x0030, 0x0075, 0x0724, 0x00F8, 0x0727, 0x0033, 0x0391, 0x0390,
- 0x0011, 0x0032, 0x001F, 0x00FB, 0x0074, 0x0726, 0x00FA, 0x001E, 0x0077,
- 0x0019, 0x0018, 0x0004, 0x0010, 0x003D, 0x0076, 0x0071, 0x0013, 0x0001,
- ], [
- 0x000D, 0x0019, 0x0011, 0x0015, 0x0061, 0x0019, 0x0014, 0x01AD, 0x0060,
- 0x0018, 0x0001, 0x0005, 0x001B, 0x0010, 0x0019, 0x0005, 0x0017, 0x0018,
- 0x0016, 0x0004, 0x0004, 0x0013, 0x000C, 0x0012, 0x001A, 0x0018, 0x0005,
- 0x000F, 0x001B, 0x0004, 0x001D, 0x0011, 0x001C, 0x0010, 0x000E, 0x001B,
- 0x0013, 0x001F, 0x001A, 0x0029, 0x0005, 0x0063, 0x001E, 0x0009, 0x0062,
- 0x0008, 0x0007, 0x0007, 0x0019, 0x0004, 0x001A, 0x0018, 0x006D, 0x0007,
- 0x001B, 0x0007, 0x001A, 0x006C, 0x0006, 0x0012, 0x0005, 0x006F, 0x000B,
- 0x006E, 0x0069, 0x001D, 0x0359, 0x0028, 0x002B, 0x002A, 0x001C, 0x00D5,
- 0x0358, 0x001F, 0x0001, 0x001E, 0x0068, 0x00D4, 0x00D7, 0x0019, 0x0000,
- ], [
- 0x00B9, 0x0061, 0x0060, 0x00B8, 0x02B5, 0x01AD, 0x00BB, 0x0AF5, 0x0151,
- 0x0001, 0x0001, 0x0005, 0x0000, 0x0003, 0x0005, 0x0004, 0x0063, 0x0025,
- 0x00BA, 0x0004, 0x0007, 0x0062, 0x00A5, 0x0024, 0x006D, 0x0002, 0x006C,
- 0x02B4, 0x000D, 0x006F, 0x0027, 0x00A4, 0x0026, 0x01AC, 0x0150, 0x01AF,
- 0x01AE, 0x0021, 0x006E, 0x02B7, 0x0020, 0x0153, 0x0023, 0x00A7, 0x0152,
- 0x00A6, 0x0006, 0x000C, 0x0022, 0x01A9, 0x0019, 0x002D, 0x02B6, 0x01A8,
- 0x000F, 0x0007, 0x000E, 0x00A1, 0x0069, 0x002C, 0x0001, 0x01AB, 0x00A0,
- 0x02B1, 0x00A3, 0x002F, 0x0AF4, 0x02B0, 0x0AF7, 0x02B3, 0x0068, 0x015D,
- 0x0AF6, 0x01AA, 0x0055, 0x015C, 0x02B2, 0x0579, 0x0578, 0x015F, 0x00A2,
- ], [
- 0x0905, 0x013D, 0x013C, 0x0904, 0x121D, 0x049D, 0x049C, 0x243D, 0x0907,
- 0x00ED, 0x0001, 0x0015, 0x0041, 0x013F, 0x0031, 0x0014, 0x025D, 0x025C,
- 0x013E, 0x000D, 0x0000, 0x0040, 0x0139, 0x0043, 0x0030, 0x0017, 0x0033,
- 0x0906, 0x0032, 0x0042, 0x00EC, 0x025F, 0x00EF, 0x025E, 0x049F, 0x0138,
- 0x0901, 0x013B, 0x0259, 0x121C, 0x049E, 0x0900, 0x0258, 0x243C, 0x121F,
- 0x0903, 0x003D, 0x00EE, 0x025B, 0x025A, 0x004D, 0x013A, 0x0902, 0x0245,
- 0x00E9, 0x0016, 0x00E8, 0x0499, 0x0125, 0x0244, 0x004C, 0x0498, 0x090D,
- 0x00EB, 0x003C, 0x0011, 0x049B, 0x049A, 0x0485, 0x00EA, 0x003F, 0x0124,
- 0x090C, 0x003E, 0x0039, 0x0095, 0x0247, 0x0246, 0x0484, 0x0094, 0x0038,
- ], [
- 0x0F09, 0x00CD, 0x01FD, 0x0791, 0x1E6D, 0x0790, 0x03D9, 0x3CD1, 0x3CD0,
- 0x0075, 0x0001, 0x0001, 0x0035, 0x00CC, 0x0011, 0x0000, 0x03D8, 0x01FC,
- 0x03DB, 0x0010, 0x0003, 0x00CF, 0x03DA, 0x00CE, 0x0074, 0x0034, 0x0077,
- 0x0793, 0x0013, 0x0076, 0x0071, 0x03C5, 0x0070, 0x01FF, 0x0792, 0x01FE,
- 0x01F9, 0x0037, 0x00C9, 0x0F08, 0x01F8, 0x03C4, 0x00C8, 0x0F0B, 0x079D,
- 0x03C7, 0x0001, 0x0012, 0x0073, 0x00CB, 0x0005, 0x0036, 0x03C6, 0x0072,
- 0x007D, 0x0002, 0x00CA, 0x079C, 0x01FB, 0x00F5, 0x0031, 0x079F, 0x0F0A,
- 0x0F35, 0x079E, 0x01FA, 0x1E6C, 0x1E6F, 0x3CD3, 0x0799, 0x03C1, 0x1E6E,
- 0x3CD2, 0x0030, 0x00F4, 0x007C, 0x03C0, 0x03C3, 0x0798, 0x01E5, 0x00F7,
- ], [
- 0x01A5, 0x0001, 0x001D, 0x0021, 0x00A1, 0x000D, 0x0061, 0x06B9, 0x00A0,
- 0x0060, 0x0001, 0x0005, 0x000C, 0x0020, 0x001C, 0x0004, 0x01A4, 0x01A7,
- 0x00A3, 0x001F, 0x001E, 0x0023, 0x0022, 0x002D, 0x002C, 0x0063, 0x0062,
- 0x1A81, 0x01A6, 0x01A1, 0x06B8, 0x06BB, 0x00A2, 0x06BA, 0x0D59, 0x06A5,
- 0x01A0, 0x000F, 0x006D, 0x06A4, 0x002F, 0x00AD, 0x006C, 0x06A7, 0x00AC,
- 0x0D58, 0x000E, 0x01A3, 0x00AF, 0x00AE, 0x006F, 0x01A2, 0x0D5B, 0x00A9,
- 0x0019, 0x0001, 0x0009, 0x00A8, 0x006E, 0x002E, 0x0000, 0x01AD, 0x00AB,
- 0x00AA, 0x0355, 0x0029, 0x1A80, 0x1A83, 0x1A82, 0x0354, 0x01AC, 0x0D5A,
- 0x1A8D, 0x01AF, 0x0357, 0x0D45, 0x0D44, 0x0D47, 0x1A8C, 0x06A6, 0x06A1,
- ], [
- 0x0001, 0x0011, 0x0005, 0x0775, 0x00F9, 0x00F8, 0x0031, 0x0030, 0x0049,
- 0x00FB, 0x0010, 0x0033, 0x0EC9, 0x038D, 0x038C, 0x00FA, 0x038F, 0x0774,
- 0x0048, 0x0032, 0x0000, 0x01D5, 0x00E5, 0x038E, 0x00E4, 0x0013, 0x000D,
- 0x0389, 0x0777, 0x0388, 0x038B, 0x1DF9, 0x0EC8, 0x3BC9, 0x1DF8, 0x038A,
- 0x03B5, 0x0776, 0x00E7, 0x3BC8, 0x01D4, 0x3BCB, 0x0ECB, 0x0771, 0x0ECA,
- 0x01D7, 0x03B4, 0x01D6, 0x1DFB, 0x0EF5, 0x0770, 0x0EF4, 0x3BCA, 0x0773,
- 0x00E6, 0x03B7, 0x004B, 0x1DFA, 0x03B6, 0x0EF7, 0x00E1, 0x0EF6, 0x0EF1,
- 0x03B1, 0x01D1, 0x003D, 0x0EF0, 0x0772, 0x077D, 0x077C, 0x003C, 0x01D0,
- 0x03B0, 0x01D3, 0x003F, 0x03B3, 0x01D2, 0x0EF3, 0x077F, 0x00E0, 0x004A,
- ], [
- 0x0015, 0x0049, 0x0014, 0x07D1, 0x03FD, 0x03FC, 0x01C1, 0x01C0, 0x00F1,
- 0x0017, 0x0001, 0x0001, 0x01C3, 0x0048, 0x004B, 0x0016, 0x0031, 0x01C2,
- 0x004A, 0x0011, 0x0000, 0x01CD, 0x00F0, 0x01CC, 0x0075, 0x0010, 0x000D,
- 0x03FF, 0x01CF, 0x01CE, 0x07D0, 0x0F81, 0x07D3, 0x1F1D, 0x0F80, 0x07D2,
- 0x01C9, 0x03FE, 0x0074, 0x07DD, 0x00F3, 0x1F1C, 0x07DC, 0x03F9, 0x07DF,
- 0x00F2, 0x00FD, 0x0077, 0x07DE, 0x07D9, 0x01C8, 0x07D8, 0x0F83, 0x03F8,
- 0x0030, 0x0076, 0x0013, 0x0F82, 0x00FC, 0x03FB, 0x0033, 0x03FA, 0x03E5,
- 0x03E4, 0x01CB, 0x0032, 0x1F1F, 0x03E7, 0x07DB, 0x07DA, 0x003D, 0x01CA,
- 0x07C5, 0x03E6, 0x0071, 0x0F8D, 0x07C4, 0x1F1E, 0x0F8C, 0x03E1, 0x01F5,
- ], [
- 0x0019, 0x0065, 0x0018, 0x0351, 0x0350, 0x0353, 0x0021, 0x0020, 0x0064,
- 0x001D, 0x0005, 0x0005, 0x01A5, 0x0023, 0x0067, 0x0005, 0x0066, 0x0022,
- 0x001B, 0x0004, 0x0001, 0x0004, 0x001C, 0x0061, 0x001A, 0x0005, 0x0004,
- 0x0007, 0x002D, 0x0006, 0x002C, 0x01A4, 0x002F, 0x0352, 0x035D, 0x0060,
- 0x0001, 0x002E, 0x001F, 0x035C, 0x0000, 0x06B1, 0x01A7, 0x0029, 0x01A6,
- 0x0028, 0x0063, 0x0062, 0x035F, 0x01A1, 0x002B, 0x06B0, 0x06B3, 0x01A0,
- 0x0003, 0x006D, 0x001E, 0x035E, 0x006C, 0x06B2, 0x0002, 0x01A3, 0x01A2,
- 0x000D, 0x0005, 0x0007, 0x01AD, 0x006F, 0x002A, 0x006E, 0x0004, 0x0004,
- 0x000C, 0x0007, 0x0006, 0x000F, 0x000E, 0x00D5, 0x0009, 0x0006, 0x0007,
- ], [
- 0x0065, 0x0181, 0x0064, 0x36C9, 0x06D5, 0x0DB5, 0x0379, 0x0180, 0x0183,
- 0x00D5, 0x001D, 0x001C, 0x0DB4, 0x0182, 0x0378, 0x00D4, 0x00D7, 0x06D4,
- 0x0067, 0x001F, 0x0001, 0x00D6, 0x00D1, 0x018D, 0x0066, 0x0001, 0x0000,
- 0x037B, 0x06D7, 0x037A, 0x0DB7, 0x36C8, 0x06D6, 0x0DB6, 0x1B79, 0x0DB1,
- 0x018C, 0x0365, 0x00D0, 0x1B78, 0x00D3, 0x1B7B, 0x0364, 0x06D1, 0x06D0,
- 0x018F, 0x018E, 0x00D2, 0x36CB, 0x0367, 0x0366, 0x06D3, 0x0DB0, 0x06D2,
- 0x0361, 0x06DD, 0x0189, 0x36CA, 0x0360, 0x36F5, 0x0188, 0x0DB3, 0x36F4,
- 0x0009, 0x0008, 0x0005, 0x06DC, 0x00DD, 0x018B, 0x00DC, 0x0004, 0x000B,
- 0x018A, 0x0061, 0x0003, 0x0363, 0x00DF, 0x06DF, 0x0362, 0x000A, 0x001E,
- ], [
- 0x001D, 0x0061, 0x000D, 0x0D55, 0x06B9, 0x06B8, 0x01A5, 0x0021, 0x0020,
- 0x0023, 0x000C, 0x0060, 0x0D54, 0x00AD, 0x00AC, 0x0022, 0x00AF, 0x06BB,
- 0x000F, 0x001C, 0x0001, 0x002D, 0x0063, 0x01A4, 0x000E, 0x0001, 0x0005,
- 0x01A7, 0x06BA, 0x01A6, 0x06A5, 0x0D57, 0x0D56, 0x1ABD, 0x0D51, 0x00AE,
- 0x002C, 0x00A9, 0x002F, 0x0D50, 0x01A1, 0x1ABC, 0x06A4, 0x06A7, 0x06A6,
- 0x00A8, 0x06A1, 0x01A0, 0x1ABF, 0x0D53, 0x06A0, 0x0D52, 0x1ABE, 0x06A3,
- 0x0062, 0x002E, 0x0009, 0x0D5D, 0x01A3, 0x0D5C, 0x006D, 0x00AB, 0x06A2,
- 0x006C, 0x001F, 0x0001, 0x06AD, 0x0029, 0x01A2, 0x0028, 0x0004, 0x001E,
- 0x01AD, 0x006F, 0x0000, 0x01AC, 0x01AF, 0x06AC, 0x00AA, 0x006E, 0x0019,
- ], [
- 0x0019, 0x007D, 0x0018, 0x01B5, 0x000D, 0x01B4, 0x007C, 0x007F, 0x01B7,
- 0x000C, 0x001B, 0x001A, 0x01B6, 0x000F, 0x00D5, 0x0019, 0x007E, 0x00D4,
- 0x0018, 0x001B, 0x0001, 0x000E, 0x0011, 0x0009, 0x0005, 0x0005, 0x0005,
- 0x00D7, 0x01B1, 0x0008, 0x01B0, 0x0079, 0x06FD, 0x0371, 0x0370, 0x00D6,
- 0x0078, 0x01B3, 0x0010, 0x0373, 0x0013, 0x06FC, 0x007B, 0x007A, 0x00D1,
- 0x00D0, 0x00D3, 0x0065, 0x0372, 0x06FF, 0x0064, 0x06FE, 0x037D, 0x00D2,
- 0x00DD, 0x0067, 0x0004, 0x037C, 0x0012, 0x01B2, 0x0007, 0x0066, 0x01BD,
- 0x0006, 0x0061, 0x0004, 0x01BC, 0x001A, 0x0060, 0x001D, 0x0004, 0x001C,
- 0x0063, 0x0001, 0x0007, 0x000B, 0x0000, 0x0062, 0x000A, 0x0005, 0x0007,
- ], [
- 0x0069, 0x0045, 0x0068, 0x04BD, 0x0255, 0x04BC, 0x00E5, 0x00E4, 0x0031,
- 0x0030, 0x0019, 0x0001, 0x0121, 0x00E7, 0x00E6, 0x0033, 0x00E1, 0x00E0,
- 0x006B, 0x0018, 0x0001, 0x0044, 0x0032, 0x0047, 0x006A, 0x001B, 0x0005,
- 0x003D, 0x0046, 0x0015, 0x0041, 0x0120, 0x0123, 0x04BF, 0x0122, 0x0040,
- 0x003C, 0x00E3, 0x0014, 0x0254, 0x0043, 0x0975, 0x012D, 0x00E2, 0x00ED,
- 0x0042, 0x00EC, 0x004D, 0x0257, 0x0256, 0x0251, 0x04BE, 0x0974, 0x0250,
- 0x00EF, 0x00EE, 0x004C, 0x04B9, 0x012C, 0x04B8, 0x004F, 0x04BB, 0x0253,
- 0x003F, 0x0017, 0x0001, 0x0252, 0x00E9, 0x00E8, 0x00EB, 0x0000, 0x0003,
- 0x0016, 0x0002, 0x0004, 0x004E, 0x003E, 0x00EA, 0x0049, 0x000D, 0x0007,
- ], [
- 0x000D, 0x01BD, 0x000C, 0x0D31, 0x0D30, 0x0D33, 0x0359, 0x0358, 0x002D,
- 0x0065, 0x001D, 0x001C, 0x0D32, 0x035B, 0x035A, 0x002C, 0x01BC, 0x0345,
- 0x000F, 0x001F, 0x0001, 0x002F, 0x0064, 0x01BF, 0x0067, 0x0001, 0x0005,
- 0x0066, 0x002E, 0x0061, 0x0029, 0x0695, 0x0694, 0x0697, 0x0696, 0x0060,
- 0x01BE, 0x0D3D, 0x0028, 0x1A49, 0x0344, 0x1A48, 0x1A4B, 0x0D3C, 0x0691,
- 0x002B, 0x01B9, 0x002A, 0x0D3F, 0x0690, 0x0347, 0x0D3E, 0x1A4A, 0x0346,
- 0x00D5, 0x0341, 0x0063, 0x0D39, 0x0340, 0x0D38, 0x01B8, 0x0D3B, 0x0D3A,
- 0x00D4, 0x0062, 0x0000, 0x0693, 0x01BB, 0x0343, 0x0342, 0x001E, 0x000E,
- 0x006D, 0x0009, 0x0001, 0x006C, 0x00D7, 0x034D, 0x01BA, 0x0008, 0x0004,
- ], [
- 0x0075, 0x00CD, 0x0035, 0x03C1, 0x03C0, 0x07F9, 0x03C3, 0x1F8D, 0x00CC,
- 0x0074, 0x0011, 0x0010, 0x03C2, 0x0FD9, 0x01F1, 0x00CF, 0x03CD, 0x00CE,
- 0x0034, 0x0001, 0x0001, 0x0037, 0x00C9, 0x00C8, 0x0036, 0x0000, 0x0001,
- 0x0FD8, 0x03CC, 0x00CB, 0x01F0, 0x07F8, 0x03CF, 0x07FB, 0x07FA, 0x00CA,
- 0x01F3, 0x03CE, 0x00F5, 0x0FDB, 0x00F4, 0x07E5, 0x07E4, 0x07E7, 0x01F2,
- 0x07E6, 0x03C9, 0x01FD, 0x0FDA, 0x1F8C, 0x07E1, 0x1F8F, 0x1F8E, 0x03C8,
- 0x03CB, 0x0077, 0x0076, 0x0FC5, 0x03CA, 0x07E0, 0x00F7, 0x0FC4, 0x03F5,
- 0x00F6, 0x01FC, 0x0003, 0x03F4, 0x0071, 0x03F7, 0x00F1, 0x0013, 0x0031,
- 0x0030, 0x0070, 0x0005, 0x0012, 0x0073, 0x01FF, 0x0072, 0x007D, 0x0002,
- ], [
- 0x0061, 0x0055, 0x0060, 0x02C9, 0x02C8, 0x02CB, 0x0171, 0x00B5, 0x0054,
- 0x0001, 0x0001, 0x0001, 0x0057, 0x0001, 0x0063, 0x001D, 0x0062, 0x0039,
- 0x006D, 0x0000, 0x0005, 0x0038, 0x0056, 0x00B4, 0x006C, 0x0003, 0x001C,
- 0x006F, 0x003B, 0x0002, 0x003A, 0x0170, 0x00B7, 0x0173, 0x0051, 0x006E,
- 0x0025, 0x0050, 0x0069, 0x02CA, 0x0024, 0x0027, 0x0172, 0x00B6, 0x00B1,
- 0x000D, 0x000C, 0x001F, 0x017D, 0x0026, 0x0068, 0x0053, 0x017C, 0x006B,
- 0x001E, 0x000F, 0x0004, 0x017F, 0x006A, 0x02F5, 0x0019, 0x0021, 0x0052,
- 0x02F4, 0x02F7, 0x0020, 0x0BCD, 0x05E5, 0x05E4, 0x0BCC, 0x0023, 0x00B0,
- 0x02F6, 0x00B3, 0x0022, 0x02F1, 0x02F0, 0x0BCF, 0x0BCE, 0x017E, 0x005D,
- ], [
- 0x00BD, 0x0025, 0x01A1, 0x0159, 0x0299, 0x00BC, 0x0024, 0x0505, 0x0504,
- 0x01A0, 0x0001, 0x001D, 0x006D, 0x001C, 0x0001, 0x0005, 0x0027, 0x01A3,
- 0x0158, 0x001F, 0x001E, 0x01A2, 0x0026, 0x0021, 0x000D, 0x0020, 0x0023,
- 0x0298, 0x006C, 0x0022, 0x00BF, 0x00BE, 0x01AD, 0x002D, 0x029B, 0x00B9,
- 0x01AC, 0x00B8, 0x01AF, 0x029A, 0x006F, 0x015B, 0x006E, 0x0285, 0x0284,
- 0x01AE, 0x0019, 0x002C, 0x01A9, 0x01A8, 0x000C, 0x000F, 0x015A, 0x00BB,
- 0x000E, 0x0000, 0x0069, 0x01AB, 0x0018, 0x01AA, 0x0004, 0x0055, 0x00BA,
- 0x0507, 0x0145, 0x0054, 0x0506, 0x00A5, 0x0501, 0x00A4, 0x0057, 0x0500,
- 0x0A05, 0x0144, 0x00A7, 0x0287, 0x0286, 0x0503, 0x0147, 0x0A04, 0x0146,
- ], [
- 0x0759, 0x0041, 0x00E5, 0x03BD, 0x0E9D, 0x012D, 0x012C, 0x3A1D, 0x03BC,
- 0x012F, 0x000D, 0x0040, 0x00E4, 0x03BF, 0x0043, 0x0042, 0x0758, 0x03BE,
- 0x00E7, 0x0001, 0x0000, 0x003D, 0x00E6, 0x0015, 0x0014, 0x0017, 0x003C,
- 0x743D, 0x012E, 0x03B9, 0x03B8, 0x0E9C, 0x03BB, 0x075B, 0x3A1C, 0x0E9F,
- 0x0129, 0x00E1, 0x0128, 0x0E9E, 0x012B, 0x075A, 0x00E0, 0x0E99, 0x0745,
- 0x3A1F, 0x03BA, 0x0744, 0x0E98, 0x1D0D, 0x03A5, 0x0E9B, 0x743C, 0x0E9A,
- 0x012A, 0x004D, 0x00E3, 0x0E85, 0x01D5, 0x0E84, 0x004C, 0x0747, 0x1D0C,
- 0x01D4, 0x003F, 0x0016, 0x0746, 0x03A4, 0x0741, 0x004F, 0x003E, 0x01D7,
- 0x0740, 0x000C, 0x0011, 0x004E, 0x00E2, 0x00ED, 0x00EC, 0x0049, 0x0048,
- ]
-];
-const RV40_AIC_MODE2_BITS: [[u8; 81]; 20] = [
- [
-1, 5, 4, 10, 6, 8, 5, 8, 8,
- 7, 5, 7, 11, 10, 9, 8, 13, 11,
- 6, 7, 3, 9, 8, 10, 9, 8, 5,
- 10, 9, 10, 10, 14, 12, 14, 14, 12,
- 8, 9, 7, 12, 8, 14, 9, 9, 12,
- 8, 9, 11, 11, 13, 9, 11, 14, 12,
- 6, 7, 9, 13, 9, 12, 7, 10, 12,
- 11, 12, 8, 15, 10, 15, 13, 7, 12,
- 10, 10, 8, 10, 13, 13, 13, 11, 8,
- ], [
- 4, 6, 5, 11, 8, 10, 7, 11, 9,
- 4, 1, 4, 9, 7, 7, 5, 9, 10,
- 6, 7, 4, 9, 9, 10, 9, 9, 6,
- 9, 10, 9, 10, 12, 12, 13, 12, 11,
- 9, 9, 8, 12, 8, 14, 10, 11, 12,
- 7, 8, 10, 11, 12, 9, 11, 13, 12,
- 6, 7, 8, 12, 9, 12, 7, 11, 10,
- 12, 12, 9, 14, 12, 15, 13, 8, 12,
- 11, 11, 10, 12, 13, 15, 14, 12, 9,
- ], [
- 5, 7, 6, 12, 9, 11, 8, 11, 10,
- 7, 5, 7, 11, 10, 9, 8, 12, 12,
- 5, 5, 1, 8, 7, 10, 8, 6, 4,
- 8, 8, 8, 9, 12, 11, 13, 12, 11,
- 8, 9, 8, 12, 8, 13, 10, 11, 11,
- 8, 9, 11, 12, 13, 11, 12, 14, 13,
- 8, 9, 10, 14, 11, 14, 9, 13, 13,
- 8, 9, 6, 11, 10, 14, 11, 6, 10,
- 6, 6, 4, 8, 9, 10, 10, 8, 5,
- ], [
- 11, 7, 8, 10, 12, 9, 10, 14, 12,
- 7, 1, 5, 7, 8, 6, 4, 10, 9,
- 10, 5, 4, 8, 11, 8, 7, 6, 7,
- 11, 6, 7, 8, 10, 8, 10, 11, 9,
- 10, 8, 9, 13, 9, 12, 8, 11, 12,
- 11, 4, 7, 8, 9, 6, 8, 12, 9,
- 8, 5, 8, 12, 9, 10, 6, 12, 11,
- 12, 12, 10, 15, 13, 13, 13, 10, 13,
- 15, 10, 9, 10, 12, 13, 13, 10, 9,
- ], [
- 11, 8, 8, 11, 13, 10, 11, 15, 12,
- 7, 1, 4, 7, 7, 5, 4, 8, 9,
- 11, 5, 5, 8, 11, 9, 8, 7, 8,
- 13, 7, 8, 9, 11, 9, 10, 12, 10,
- 10, 9, 8, 13, 9, 12, 9, 11, 12,
- 11, 5, 7, 9, 10, 6, 9, 13, 10,
- 7, 4, 7, 11, 8, 9, 5, 10, 11,
- 13, 11, 9, 15, 13, 15, 13, 8, 12,
- 15, 10, 10, 12, 13, 14, 14, 12, 11,
- ], [
- 12, 9, 9, 12, 13, 11, 11, 14, 12,
- 8, 2, 5, 7, 9, 6, 5, 10, 10,
- 9, 4, 2, 7, 9, 7, 6, 5, 6,
- 12, 6, 7, 8, 10, 8, 10, 11, 9,
- 12, 9, 10, 13, 11, 12, 10, 14, 13,
- 12, 6, 8, 10, 10, 7, 9, 12, 10,
- 8, 5, 8, 11, 9, 10, 7, 11, 12,
- 8, 6, 5, 11, 11, 11, 8, 6, 9,
- 12, 6, 6, 8, 10, 10, 11, 8, 6,
- ], [
- 13, 9, 10, 12, 14, 12, 11, 15, 15,
- 8, 1, 5, 7, 9, 6, 5, 11, 10,
- 11, 6, 5, 9, 11, 9, 8, 7, 8,
- 12, 6, 8, 8, 11, 8, 10, 12, 10,
- 10, 7, 9, 13, 10, 11, 9, 13, 12,
- 11, 3, 6, 8, 9, 4, 7, 11, 8,
- 8, 5, 9, 12, 10, 9, 7, 12, 13,
- 13, 12, 10, 14, 14, 15, 12, 11, 14,
- 15, 7, 9, 8, 11, 11, 12, 10, 9,
- ], [
- 10, 5, 6, 9, 11, 7, 8, 12, 11,
- 8, 1, 4, 7, 9, 6, 4, 10, 10,
- 11, 6, 6, 9, 9, 9, 9, 8, 8,
- 14, 10, 10, 12, 12, 11, 12, 13, 12,
- 10, 7, 8, 12, 9, 11, 8, 12, 11,
- 13, 7, 10, 11, 11, 8, 10, 13, 11,
- 6, 3, 7, 11, 8, 9, 5, 10, 11,
- 11, 11, 9, 14, 14, 14, 11, 10, 13,
- 14, 10, 11, 13, 13, 13, 14, 12, 12,
- ], [
- 2, 5, 3, 11, 8, 8, 6, 6, 7,
- 8, 5, 6, 12, 10, 10, 8, 10, 11,
- 7, 6, 2, 9, 8, 10, 8, 5, 4,
- 10, 11, 10, 10, 13, 12, 14, 13, 10,
- 10, 11, 8, 14, 9, 14, 12, 11, 12,
- 9, 10, 9, 13, 12, 11, 12, 14, 11,
- 8, 10, 7, 13, 10, 12, 8, 12, 12,
- 10, 9, 6, 12, 11, 11, 11, 6, 9,
- 10, 9, 6, 10, 9, 12, 11, 8, 7,
- ], [
- 6, 8, 6, 12, 11, 11, 10, 10, 9,
- 6, 1, 3, 10, 8, 8, 6, 7, 10,
- 8, 6, 3, 10, 9, 10, 8, 6, 5,
- 11, 10, 10, 12, 13, 12, 14, 13, 12,
- 10, 11, 8, 12, 9, 14, 12, 11, 12,
- 9, 9, 8, 12, 12, 10, 12, 13, 11,
- 7, 8, 6, 13, 9, 11, 7, 11, 11,
- 11, 10, 7, 14, 11, 12, 12, 7, 10,
- 12, 11, 8, 13, 12, 14, 13, 11, 10,
- ], [
- 7, 10, 7, 13, 13, 13, 11, 11, 10,
- 8, 5, 6, 12, 11, 10, 9, 10, 11,
- 7, 5, 1, 9, 8, 10, 7, 4, 4,
- 9, 11, 9, 11, 12, 11, 13, 13, 10,
- 9, 11, 8, 13, 9, 14, 12, 11, 12,
- 11, 10, 10, 13, 12, 11, 14, 14, 12,
- 9, 10, 8, 13, 10, 14, 9, 12, 12,
- 9, 7, 4, 12, 10, 11, 10, 6, 7,
- 9, 7, 4, 9, 9, 11, 9, 7, 5,
- ], [
- 7, 9, 7, 14, 11, 12, 10, 9, 9,
- 8, 5, 5, 12, 9, 10, 8, 8, 11,
- 7, 5, 2, 8, 8, 9, 7, 4, 4,
- 10, 11, 10, 12, 14, 11, 12, 13, 12,
- 9, 10, 8, 13, 8, 13, 10, 11, 11,
- 9, 9, 8, 14, 10, 10, 11, 12, 11,
- 10, 11, 9, 14, 10, 14, 9, 12, 14,
- 6, 6, 3, 11, 8, 9, 8, 3, 6,
- 9, 7, 4, 10, 8, 11, 10, 6, 5,
- ], [
- 6, 8, 7, 13, 12, 12, 10, 9, 9,
- 9, 7, 8, 13, 11, 11, 9, 11, 12,
- 7, 6, 1, 9, 8, 10, 7, 5, 4,
- 10, 12, 10, 12, 13, 13, 14, 13, 11,
- 9, 11, 9, 13, 10, 14, 12, 12, 12,
- 11, 12, 10, 14, 13, 12, 13, 14, 12,
- 8, 9, 7, 13, 10, 13, 8, 11, 12,
- 8, 6, 3, 12, 9, 10, 9, 4, 6,
- 10, 8, 5, 10, 10, 12, 11, 8, 6,
- ], [
- 7, 10, 7, 12, 9, 12, 10, 10, 12,
- 9, 7, 7, 12, 9, 11, 6, 10, 11,
- 6, 6, 1, 9, 8, 9, 7, 4, 5,
- 11, 12, 9, 12, 10, 14, 13, 13, 11,
- 10, 12, 8, 13, 8, 14, 10, 10, 11,
- 11, 11, 10, 13, 14, 10, 14, 13, 11,
- 11, 10, 7, 13, 8, 12, 7, 10, 12,
- 7, 10, 4, 12, 6, 10, 8, 5, 8,
- 10, 7, 4, 9, 7, 10, 9, 6, 5,
- ], [
- 7, 9, 7, 13, 12, 13, 10, 10, 8,
- 8, 5, 6, 11, 10, 10, 8, 10, 10,
- 7, 5, 2, 9, 8, 9, 7, 5, 3,
- 8, 9, 7, 9, 11, 11, 13, 11, 9,
- 8, 10, 7, 12, 9, 14, 11, 10, 10,
- 9, 10, 9, 12, 12, 12, 13, 14, 12,
- 10, 10, 9, 13, 11, 13, 9, 13, 12,
- 8, 7, 4, 12, 10, 10, 10, 6, 6,
- 7, 6, 3, 9, 8, 10, 9, 6, 3,
- ], [
- 7, 10, 7, 13, 13, 13, 11, 11, 9,
- 8, 6, 6, 13, 11, 11, 9, 10, 11,
- 7, 6, 1, 9, 8, 10, 8, 5, 4,
- 8, 9, 8, 9, 12, 12, 12, 12, 8,
- 10, 13, 9, 14, 11, 14, 14, 13, 12,
- 9, 10, 9, 13, 12, 11, 13, 14, 11,
- 9, 11, 8, 13, 11, 13, 10, 13, 13,
- 9, 8, 5, 12, 10, 11, 11, 6, 7,
- 8, 7, 3, 8, 9, 11, 10, 7, 4,
- ], [
- 8, 9, 7, 11, 11, 12, 11, 14, 9,
- 8, 6, 6, 11, 13, 10, 9, 11, 9,
- 7, 5, 1, 7, 9, 9, 7, 5, 3,
- 13, 11, 9, 10, 12, 11, 12, 12, 9,
- 10, 11, 9, 13, 9, 12, 12, 12, 10,
- 12, 11, 10, 13, 14, 12, 14, 14, 11,
- 11, 8, 8, 13, 11, 12, 9, 13, 11,
- 9, 10, 5, 11, 8, 11, 9, 6, 7,
- 7, 8, 4, 6, 8, 10, 8, 8, 5,
- ], [
- 8, 10, 8, 13, 13, 13, 12, 11, 10,
- 5, 1, 3, 10, 7, 8, 6, 8, 9,
- 8, 7, 4, 9, 10, 11, 8, 7, 6,
- 8, 9, 7, 9, 12, 11, 12, 10, 8,
- 9, 10, 8, 13, 9, 9, 12, 11, 11,
- 7, 7, 6, 12, 9, 8, 10, 12, 8,
- 6, 7, 4, 12, 8, 13, 6, 9, 10,
- 13, 13, 9, 15, 14, 14, 15, 9, 11,
- 13, 11, 9, 13, 13, 15, 15, 12, 10,
- ], [
- 10, 8, 9, 11, 12, 10, 8, 13, 13,
- 9, 2, 5, 7, 5, 4, 3, 8, 9,
- 11, 5, 5, 9, 8, 8, 6, 8, 8,
- 12, 7, 8, 10, 10, 9, 8, 12, 10,
- 9, 10, 9, 12, 7, 11, 7, 12, 12,
- 9, 5, 8, 9, 9, 6, 6, 11, 10,
- 6, 4, 7, 9, 5, 9, 3, 9, 10,
- 13, 11, 9, 13, 10, 13, 10, 9, 13,
- 14, 11, 10, 12, 12, 13, 11, 14, 11,
- ], [
- 11, 7, 8, 10, 12, 9, 9, 14, 10,
- 9, 4, 7, 8, 10, 7, 7, 11, 10,
- 8, 2, 2, 6, 8, 5, 5, 5, 6,
- 15, 9, 10, 10, 12, 10, 11, 14, 12,
- 9, 8, 9, 12, 9, 11, 8, 12, 11,
- 14, 10, 11, 12, 13, 10, 12, 15, 12,
- 9, 7, 8, 12, 9, 12, 7, 11, 13,
- 9, 6, 5, 11, 10, 11, 7, 6, 9,
- 11, 4, 5, 7, 8, 8, 8, 7, 7,
- ]
-];
-
-const RV40_PTYPE_CODES: &[[u8; 8]; 7] = &[
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ],
- [ 0x0D, 0x05, 0x01, 0x04, 0x01, 0x00, 0x07, 0x0C ],
- [ 0x09, 0x11, 0x01, 0x00, 0x05, 0x03, 0x21, 0x20 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ]
-];
-const RV40_PTYPE_BITS: &[[u8; 8]; 7] = &[
- [ 1, 2, 3, 6, 5, 4, 7, 7 ],
- [ 3, 1, 2, 7, 6, 5, 4, 7 ],
- [ 5, 4, 1, 4, 3, 3, 4, 5 ],
- [ 4, 5, 2, 2, 3, 2, 6, 6 ],
- [ 5, 6, 1, 4, 2, 3, 7, 7 ],
- [ 5, 6, 1, 4, 3, 2, 7, 7 ],
- [ 6, 3, 2, 7, 5, 4, 1, 7 ]
-];
-const RV40_PTYPE_SYMS: &[MBType; 8] = &[
- MBType::MBIntra,
- MBType::MBIntra16,
- MBType::MBP16x16,
- MBType::MBP8x8,
- MBType::MBP16x8,
- MBType::MBP8x16,
- MBType::MBP16x16Mix,
- MBType::Invalid,
-];
-
-const RV40_BTYPE_CODES: &[[u8; 7]; 6] = &[
- [ 0x01, 0x05, 0x00, 0x03, 0x11, 0x09, 0x10 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ],
- [ 0x09, 0x01, 0x00, 0x01, 0x05, 0x03, 0x08 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ],
- [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ]
-];
-const RV40_BTYPE_BITS: &[[u8; 7]; 6] = &[
- [ 2, 3, 2, 2, 5, 4, 5 ],
- [ 4, 1, 3, 2, 6, 5, 6 ],
- [ 6, 4, 1, 2, 5, 3, 6 ],
- [ 5, 3, 3, 1, 4, 3, 5 ],
- [ 6, 5, 3, 2, 4, 1, 6 ],
- [ 6, 5, 3, 1, 4, 2, 6 ]
-];
-const RV40_BTYPE_SYMS: &[MBType; 7] = &[
- MBType::MBIntra,
- MBType::MBIntra16,
- MBType::MBForward,
- MBType::MBBackward,
- MBType::MBBidir,
- MBType::MBDirect,
- MBType::Invalid,
-];
diff --git a/src/codecs/real/rv40dsp.rs b/src/codecs/real/rv40dsp.rs
deleted file mode 100644
index a6ee607..0000000
--- a/src/codecs/real/rv40dsp.rs
+++ /dev/null
@@ -1,875 +0,0 @@
-use crate::frame::{FrameType, NAVideoBuffer};
-use crate::codecs::MV;
-use crate::codecs::blockdsp::edge_emu;
-use super::rv3040::{RV34DSP, RV34MBInfo};
-
-fn clip8(a: i16) -> u8 {
- if a < 0 { 0 }
- else if a > 255 { 255 }
- else { a as u8 }
-}
-
-macro_rules! el {
- ($s: ident, $o: expr) => ( $s[$o] as i16 )
-}
-
-macro_rules! filter {
- (01; $s: ident, $o: expr, $step: expr) => (
- clip8((( el!($s, $o - 2 * $step)
- -5 * el!($s, $o - 1 * $step)
- +52 * el!($s, $o - 0 * $step)
- +20 * el!($s, $o + 1 * $step)
- -5 * el!($s, $o + 2 * $step)
- + el!($s, $o + 3 * $step) + 32) >> 6) as i16)
- );
- (02; $s: ident, $o: expr, $step: expr) => (
- clip8((( el!($s, $o - 2 * $step)
- -5 * el!($s, $o - 1 * $step)
- +20 * el!($s, $o - 0 * $step)
- +20 * el!($s, $o + 1 * $step)
- -5 * el!($s, $o + 2 * $step)
- + el!($s, $o + 3 * $step) + 16) >> 5) as i16)
- );
- (03; $s: ident, $o: expr, $step: expr) => (
- clip8((( el!($s, $o - 2 * $step)
- -5 * el!($s, $o - 1 * $step)
- +20 * el!($s, $o - 0 * $step)
- +52 * el!($s, $o + 1 * $step)
- -5 * el!($s, $o + 2 * $step)
- + el!($s, $o + 3 * $step) + 32) >> 6) as i16)
- );
-}
-
-macro_rules! mc_func {
- (copy; $name: ident, $size: expr) => (
- fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- for _ in 0..$size {
- let d = &mut dst[didx..][..$size];
- let s = &src[sidx..][..$size];
- for x in 0..$size { d[x] = s[x]; }
- didx += dstride;
- sidx += sstride;
- }
- }
- );
- (mc01; $name: ident, $size: expr, $ver: expr) => (
- fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- let step = if $ver { sstride } else { 1 };
- for _ in 0..$size {
- for x in 0..$size {
- dst[didx + x] = filter!(01; src, sidx + x, step);
- }
- sidx += sstride;
- didx += dstride;
- }
- }
- );
- (mc02; $name: ident, $size: expr, $ver: expr) => (
- fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- let step = if $ver { sstride } else { 1 };
- for _ in 0..$size {
- for x in 0..$size {
- dst[didx + x] = filter!(02; src, sidx + x, step);
- }
- sidx += sstride;
- didx += dstride;
- }
- }
- );
- (mc03; $name: ident, $size: expr, $ver: expr) => (
- fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- let step = if $ver { sstride } else { 1 };
- for _ in 0..$size {
- for x in 0..$size {
- dst[didx + x] = filter!(03; src, sidx + x, step);
- }
- sidx += sstride;
- didx += dstride;
- }
- }
- );
- (cm01; $name: ident, $size: expr, $ofilt: ident) => (
- fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- let mut buf: [u8; ($size + 5) * $size] = [0; ($size + 5) * $size];
- let mut bidx = 0;
- let bstride = $size;
- sidx -= sstride * 2;
- for _ in 0..$size+5 {
- for x in 0..$size { buf[bidx + x] = filter!(01; src, sidx + x, 1); }
- bidx += bstride;
- sidx += sstride;
- }
- $ofilt(dst, didx, dstride, &buf, 2*bstride, $size);
- }
- );
- (cm02; $name: ident, $size: expr, $ofilt: ident) => (
- fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- let mut buf: [u8; ($size + 5) * $size] = [0; ($size + 5) * $size];
- let mut bidx = 0;
- let bstride = $size;
- sidx -= sstride * 2;
- for _ in 0..$size+5 {
- for x in 0..$size { buf[bidx + x] = filter!(02; src, sidx + x, 1); }
- bidx += bstride;
- sidx += sstride;
- }
- $ofilt(dst, didx, dstride, &buf, 2*bstride, $size);
- }
- );
- (cm03; $name: ident, $size: expr, $ofilt: ident) => (
- fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) {
- let mut buf: [u8; ($size + 5) * $size] = [0; ($size + 5) * $size];
- let mut bidx = 0;
- let bstride = $size;
- sidx -= sstride * 2;
- for _ in 0..$size+5 {
- for x in 0..$size { buf[bidx + x] = filter!(03; src, sidx + x, 1); }
- bidx += bstride;
- sidx += sstride;
- }
- $ofilt(dst, didx, dstride, &buf, 2*bstride, $size);
- }
- );
-}
-mc_func!(copy; copy_16, 16);
-mc_func!(copy; copy_8, 8);
-mc_func!(mc01; luma_mc_10_16, 16, false);
-mc_func!(mc01; luma_mc_10_8, 8, false);
-mc_func!(mc02; luma_mc_20_16, 16, false);
-mc_func!(mc02; luma_mc_20_8, 8, false);
-mc_func!(mc03; luma_mc_30_16, 16, false);
-mc_func!(mc03; luma_mc_30_8, 8, false);
-mc_func!(mc01; luma_mc_01_16, 16, true);
-mc_func!(mc01; luma_mc_01_8, 8, true);
-mc_func!(mc02; luma_mc_02_16, 16, true);
-mc_func!(mc02; luma_mc_02_8, 8, true);
-mc_func!(mc03; luma_mc_03_16, 16, true);
-mc_func!(mc03; luma_mc_03_8, 8, true);
-mc_func!(cm01; luma_mc_11_16, 16, luma_mc_01_16);
-mc_func!(cm01; luma_mc_11_8, 8, luma_mc_01_8);
-mc_func!(cm01; luma_mc_12_16, 16, luma_mc_02_16);
-mc_func!(cm01; luma_mc_12_8, 8, luma_mc_02_8);
-mc_func!(cm01; luma_mc_13_16, 16, luma_mc_03_16);
-mc_func!(cm01; luma_mc_13_8, 8, luma_mc_03_8);
-mc_func!(cm02; luma_mc_21_16, 16, luma_mc_01_16);
-mc_func!(cm02; luma_mc_21_8, 8, luma_mc_01_8);
-mc_func!(cm02; luma_mc_22_16, 16, luma_mc_02_16);
-mc_func!(cm02; luma_mc_22_8, 8, luma_mc_02_8);
-mc_func!(cm02; luma_mc_23_16, 16, luma_mc_03_16);
-mc_func!(cm02; luma_mc_23_8, 8, luma_mc_03_8);
-mc_func!(cm03; luma_mc_31_16, 16, luma_mc_01_16);
-mc_func!(cm03; luma_mc_31_8, 8, luma_mc_01_8);
-mc_func!(cm03; luma_mc_32_16, 16, luma_mc_02_16);
-mc_func!(cm03; luma_mc_32_8, 8, luma_mc_02_8);
-mc_func!(cm03; luma_mc_33_16, 16, luma_mc_03_16);
-mc_func!(cm03; luma_mc_33_8, 8, luma_mc_03_8);
-
-const RV40_CHROMA_BIAS: [[u16; 4]; 4] = [
- [ 0, 4, 8, 4 ],
- [ 8, 7, 8, 7 ],
- [ 0, 8, 4, 8 ],
- [ 8, 7, 8, 7 ]
-];
-
-fn rv40_chroma_mc(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, size: usize, x: usize, y: usize) {
- if (x == 0) && (y == 0) {
- for _ in 0..size {
- for x in 0..size { dst[didx + x] = src[sidx + x]; }
- didx += dstride;
- sidx += sstride;
- }
- return;
- }
- let bias = RV40_CHROMA_BIAS[y >> 1][x >> 1];
- if (x > 0) && (y > 0) {
- let a = ((4 - x) * (4 - y)) as u16;
- let b = (( x) * (4 - y)) as u16;
- let c = ((4 - x) * ( y)) as u16;
- let d = (( x) * ( y)) as u16;
- for _ in 0..size {
- for x in 0..size {
- dst[didx + x] = ((a * (src[sidx + x] as u16)
- + b * (src[sidx + x + 1] as u16)
- + c * (src[sidx + x + sstride] as u16)
- + d * (src[sidx + x + 1 + sstride] as u16) + bias) >> 4) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
- } else {
- let a = ((4 - x) * (4 - y)) as u16;
- let e = (( x) * (4 - y) + (4 - x) * ( y)) as u16;
- let step = if y > 0 { sstride } else { 1 };
- for _ in 0..size {
- for x in 0..size {
- dst[didx + x] = ((a * (src[sidx + x] as u16)
- + e * (src[sidx + x + step] as u16) + bias) >> 4) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
- }
-}
-
-pub struct RV40DSP {
- luma_mc: [[fn (&mut [u8], usize, usize, &[u8], usize, usize); 16]; 2],
-}
-
-impl RV40DSP {
- pub fn new() -> Self {
- RV40DSP {
- luma_mc: [
- [ copy_16, luma_mc_10_16, luma_mc_20_16, luma_mc_30_16,
- luma_mc_01_16, luma_mc_11_16, luma_mc_21_16, luma_mc_31_16,
- luma_mc_02_16, luma_mc_12_16, luma_mc_22_16, luma_mc_32_16,
- luma_mc_03_16, luma_mc_13_16, luma_mc_23_16, luma_mc_33_16 ],
- [ copy_8, luma_mc_10_8, luma_mc_20_8, luma_mc_30_8,
- luma_mc_01_8, luma_mc_11_8, luma_mc_21_8, luma_mc_31_8,
- luma_mc_02_8, luma_mc_12_8, luma_mc_22_8, luma_mc_32_8,
- luma_mc_03_8, luma_mc_13_8, luma_mc_23_8, luma_mc_33_8 ] ],
- }
- }
-}
-
-macro_rules! el {
- ($src: ident, $o: expr) => ($src[$o] as i16);
-}
-
-fn clip_symm(a: i16, lim: i16) -> i16 {
- if a < -lim {
- -lim
- } else if a > lim {
- lim
- } else {
- a
- }
-}
-
-fn rv40_weak_loop_filter4(pix: &mut [u8], mut off: usize, step: usize, stride: usize,
- filter_p1: bool, filter_q1: bool, alpha: i16, beta: i16,
- lim_p0q0: i16, lim_p1: i16, lim_q1: i16) {
- for _ in 0..4 {
- let p0 = el!(pix, off - step);
- let q0 = el!(pix, off);
-
- let t = q0 - p0;
- if t == 0 {
- off += stride;
- continue;
- }
-
- let u = (alpha * t.wrapping_abs()) >> 7;
- if u > (if filter_p1 && filter_q1 { 2 } else { 3 }) {
- off += stride;
- continue;
- }
-
- let p2 = el!(pix, off - 3*step);
- let p1 = el!(pix, off - 2*step);
- let q1 = el!(pix, off + step);
- let q2 = el!(pix, off + 2*step);
-
- let str;
- if filter_p1 && filter_q1 {
- str = (t << 2) + (p1 - q1);
- } else {
- str = t << 2;
- }
-
- let diff = clip_symm((str + 4) >> 3, lim_p0q0);
- pix[off - step] = clip8(p0 + diff);
- pix[off ] = clip8(q0 - diff);
-
- if filter_p1 && ((p1 - p0).wrapping_abs() <= beta) {
- let p1_diff = ((p1 - p0) + (p1 - p2) - diff) >> 1;
- pix[off - 2*step] = clip8(p1 - clip_symm(p1_diff, lim_p1));
- }
-
- if filter_q1 && ((q1 - q0).wrapping_abs() <= beta) {
- let q1_diff = ((q1 - q0) + (q1 - q2) + diff) >> 1;
- pix[off + step] = clip8(q1 - clip_symm(q1_diff, lim_q1));
- }
-
- off += stride;
- }
-}
-
-fn rv40_weak_loop_filter4_h(pix: &mut [u8], off: usize, stride: usize,
- filter_p1: bool, filter_q1: bool, alpha: i16, beta: i16,
- lim_p0q0: i16, lim_p1: i16, lim_q1: i16) {
- rv40_weak_loop_filter4(pix, off, stride, 1, filter_p1, filter_q1, alpha, beta, lim_p0q0, lim_p1, lim_q1);
-}
-fn rv40_weak_loop_filter4_v(pix: &mut [u8], off: usize, stride: usize,
- filter_p1: bool, filter_q1: bool, alpha: i16, beta: i16,
- lim_p0q0: i16, lim_p1: i16, lim_q1: i16) {
- let src = &mut pix[off - 3..][..stride * 3 + 3 + 3];
- for ch in src.chunks_mut(stride).take(4) {
- assert!(ch.len() >= 3 + 3);
- let p0 = el!(ch, 3 - 1);
- let q0 = el!(ch, 3);
-
- let t = q0 - p0;
- if t == 0 {
- continue;
- }
-
- let u = (alpha * t.wrapping_abs()) >> 7;
- if u > (if filter_p1 && filter_q1 { 2 } else { 3 }) {
- continue;
- }
-
- let p2 = el!(ch, 3 - 3);
- let p1 = el!(ch, 3 - 2);
- let q1 = el!(ch, 3 + 1);
- let q2 = el!(ch, 3 + 2);
-
- let str;
- if filter_p1 && filter_q1 {
- str = (t << 2) + (p1 - q1);
- } else {
- str = t << 2;
- }
-
- let diff = clip_symm((str + 4) >> 3, lim_p0q0);
- ch[3 - 1] = clip8(p0 + diff);
- ch[3 ] = clip8(q0 - diff);
-
- if filter_p1 && ((p1 - p0).wrapping_abs() <= beta) {
- let p1_diff = ((p1 - p0) + (p1 - p2) - diff) >> 1;
- ch[3 - 2] = clip8(p1 - clip_symm(p1_diff, lim_p1));
- }
-
- if filter_q1 && ((q1 - q0).wrapping_abs() <= beta) {
- let q1_diff = ((q1 - q0) + (q1 - q2) + diff) >> 1;
- ch[3 + 1] = clip8(q1 - clip_symm(q1_diff, lim_q1));
- }
- }
-}
-
-
-const RV40_DITHER_L: [i16; 16] = [
- 0x40, 0x50, 0x20, 0x60, 0x30, 0x50, 0x40, 0x30,
- 0x50, 0x40, 0x50, 0x30, 0x60, 0x20, 0x50, 0x40
-];
-const RV40_DITHER_R: [i16; 16] = [
- 0x40, 0x30, 0x60, 0x20, 0x50, 0x30, 0x30, 0x40,
- 0x40, 0x40, 0x50, 0x30, 0x20, 0x60, 0x30, 0x40
-];
-
-fn sfilter(a: i16, b: i16, c: i16, d: i16, e: i16, dither: i16, clip: bool, lims: i16) -> i16 {
- let val = (25 * (a + e) + 26 * (b + c + d) + dither) >> 7;
- if clip {
- if val < c - lims {
- c - lims
- } else if val > c + lims {
- c + lims
- } else {
- c
- }
- } else {
- val
- }
-}
-
-fn rv40_strong_loop_filter4(pix: &mut [u8], mut off: usize, step: usize, stride: usize,
- alpha: i16, lims: i16, dmode: usize, chroma: bool) {
- for i in 0..4 {
- let p0 = el!(pix, off - step);
- let q0 = el!(pix, off);
-
- let t = q0 - p0;
- if t == 0 {
- off += stride;
- continue;
- }
-
- let fmode = (alpha * t.wrapping_abs()) >> 7;
- if fmode > 1 {
- off += stride;
- continue;
- }
-
- let p3 = el!(pix, off - 4*step);
- let p2 = el!(pix, off - 3*step);
- let p1 = el!(pix, off - 2*step);
- let q1 = el!(pix, off + step);
- let q2 = el!(pix, off + 2*step);
- let q3 = el!(pix, off + 3*step);
-
- let np0 = sfilter(p2, p1, p0, q0, q1, RV40_DITHER_L[dmode + i], fmode != 0, lims);
- let nq0 = sfilter( p1, p0, q0, q1, q0, RV40_DITHER_R[dmode + i], fmode != 0, lims);
-
- let np1 = sfilter(p3, p2, p1, np0, q0, RV40_DITHER_L[dmode + i], fmode != 0, lims);
- let nq1 = sfilter( p0, nq0, q1, q2, q3, RV40_DITHER_R[dmode + i], fmode != 0, lims);
-
- pix[off - 2*step] = np1 as u8;
- pix[off - step] = np0 as u8;
- pix[off] = nq0 as u8;
- pix[off + step] = nq1 as u8;
-
- if !chroma {
- let np2 = sfilter(np0, np1, p2, p3, np1, 64, false, 0);
- let nq2 = sfilter(nq0, nq1, q2, q3, q2, 64, false, 0);
- pix[off - 3*step] = np2 as u8;
- pix[off + 2*step] = nq2 as u8;
- }
-
- off += stride;
- }
-}
-
-fn rv40_loop_strength(pix: &[u8], off: usize, step: usize, stride: usize,
- beta: i16, beta2: i16, edge: bool) -> (bool, bool, bool) {
- let mut sum_p1p0 = 0;
- let mut sum_q1q0 = 0;
-
- let mut off1 = off;
- for _ in 0..4 {
- sum_p1p0 += el!(pix, off1 - 2 * step) - el!(pix, off1 - step);
- sum_q1q0 += el!(pix, off1 + step) - el!(pix, off1);
- off1 += stride;
- }
-
- let filter_p1 = sum_p1p0.wrapping_abs() < beta * 4;
- let filter_q1 = sum_q1q0.wrapping_abs() < beta * 4;
-
- if (!filter_p1 || !filter_q1) || !edge {
- return (false, filter_p1, filter_q1);
- }
-
- let mut sum_p1p2 = 0;
- let mut sum_q1q2 = 0;
-
- let mut off1 = off;
- for _ in 0..4 {
- sum_p1p2 += el!(pix, off1 - 2 * step) - el!(pix, off1 - 3 * step);
- sum_q1q2 += el!(pix, off1 + step) - el!(pix, off1 + 2 * step);
- off1 += stride;
- }
-
- let strong = (sum_p1p2.wrapping_abs() < beta2) && (sum_q1q2.wrapping_abs() < beta2);
-
- (strong, filter_p1, filter_q1)
-}
-
-fn rv40_loop_strength_h(pix: &[u8], off: usize, stride: usize,
- beta: i16, beta2: i16, edge: bool) -> (bool, bool, bool) {
- rv40_loop_strength(pix, off, stride, 1, beta, beta2, edge)
-}
-
-fn rv40_loop_strength_v(pix: &[u8], off: usize, stride: usize,
- beta: i16, beta2: i16, edge: bool) -> (bool, bool, bool) {
- let src = &pix[off - 3..][..stride * 3 + 3 + 3];
- let mut sum_p1p0 = 0;
- let mut sum_q1q0 = 0;
-
- for ch in src.chunks(stride).take(4) {
- assert!(ch.len() >= 3 + 3);
- sum_p1p0 += el!(ch, 3 - 2) - el!(ch, 3 - 1);
- sum_q1q0 += el!(ch, 3 + 1) - el!(ch, 3);
- }
-
- let filter_p1 = sum_p1p0.wrapping_abs() < beta * 4;
- let filter_q1 = sum_q1q0.wrapping_abs() < beta * 4;
-
- if (!filter_p1 || !filter_q1) || !edge {
- return (false, filter_p1, filter_q1);
- }
-
- let mut sum_p1p2 = 0;
- let mut sum_q1q2 = 0;
-
- for ch in src.chunks(stride).take(4) {
- assert!(ch.len() >= 3 + 3);
- sum_p1p2 += el!(ch, 3 - 2) - el!(ch, 3 - 3);
- sum_q1q2 += el!(ch, 3 + 1) - el!(ch, 3 + 2);
- }
-
- let strong = (sum_p1p2.wrapping_abs() < beta2) && (sum_q1q2.wrapping_abs() < beta2);
-
- (strong, filter_p1, filter_q1)
-}
-
-fn rv40_loop_filter4_h(pix: &mut [u8], off: usize, stride: usize,
- dmode: usize, lim_p1: i16, lim_q1: i16, alpha: i16, beta: i16, beta2: i16,
- chroma: bool, edge: bool) {
- let (strong, filter_p1, filter_q1) = rv40_loop_strength_h(pix, off, stride, beta, beta2, edge);
- let lims = (filter_p1 as i16) + (filter_q1 as i16) + ((lim_p1 + lim_q1) >> 1) + 1;
-
- if strong {
- rv40_strong_loop_filter4(pix, off, stride, 1, alpha, lims, dmode, chroma);
- } else if filter_p1 && filter_q1 {
- rv40_weak_loop_filter4_h(pix, off, stride, true, true, alpha, beta,
- lims, lim_p1, lim_q1);
- } else if filter_p1 || filter_q1 {
- rv40_weak_loop_filter4_h(pix, off, stride, filter_p1, filter_q1, alpha, beta,
- lims >> 1, lim_p1 >> 1, lim_q1 >> 1);
- }
-}
-
-fn rv40_loop_filter4_v(pix: &mut [u8], off: usize, stride: usize,
- dmode: usize, lim_p1: i16, lim_q1: i16, alpha: i16, beta: i16, beta2: i16,
- chroma: bool, edge: bool) {
- let (strong, filter_p1, filter_q1) = rv40_loop_strength_v(pix, off, stride, beta, beta2, edge);
- let lims = (filter_p1 as i16) + (filter_q1 as i16) + ((lim_p1 + lim_q1) >> 1) + 1;
-
- if strong {
- rv40_strong_loop_filter4(pix, off, 1, stride, alpha, lims, dmode, chroma);
- } else if filter_p1 && filter_q1 {
- rv40_weak_loop_filter4_v(pix, off, stride, true, true, alpha, beta,
- lims, lim_p1, lim_q1);
- } else if filter_p1 || filter_q1 {
- rv40_weak_loop_filter4_v(pix, off, stride, filter_p1, filter_q1, alpha, beta,
- lims >> 1, lim_p1 >> 1, lim_q1 >> 1);
- }
-}
-
-const RV40_ALPHA_TAB: [i16; 32] = [
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 122, 96, 75, 59, 47, 37,
- 29, 23, 18, 15, 13, 11, 10, 9,
- 8, 7, 6, 5, 4, 3, 2, 1
-];
-
-const RV40_BETA_TAB: [i16; 32] = [
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, 4, 4, 6, 6,
- 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 15, 16, 17
-];
-
-const RV40_FILTER_CLIP_TBL: [[i16; 32]; 3] = [
- [
- 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, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5
- ], [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 7, 8, 9
- ]
-];
-
-macro_rules! test_bit {
- ($pat: expr, $x: expr) => ( (($pat >> $x) & 1) != 0 )
-}
-
-fn check_pos(x: usize, y: usize, size: usize, w: usize, h: usize, dx: i16, dy: i16, e0: isize, e1: isize, e2: isize, e3: isize) -> bool {
- let xn = (x as isize) + (dx as isize);
- let yn = (y as isize) + (dy as isize);
-
- (xn - e0 >= 0) && (xn + (size as isize) + e1 <= (w as isize)) && (yn - e2 >= 0) && (yn + (size as isize) + e3 <= (h as isize))
-}
-
-const RV40_EDGE1: [isize; 4] = [ 0, 2, 2, 2 ];
-const RV40_EDGE2: [isize; 4] = [ 0, 3, 3, 3 ];
-
-impl RV34DSP for RV40DSP {
- fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, _ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, row: usize) {
- // todo proper B-frame filtering?
- let mut offs: [usize; 3] = [0; 3];
- let mut stride: [usize; 3] = [0; 3];
- let (w, h) = frame.get_dimensions(0);
- let small_frame = w * h <= 176*144;
-
- for comp in 0..3 {
- stride[comp] = frame.get_stride(comp);
- let start = if comp == 0 { row * 16 } else { row * 8 };
- offs[comp] = frame.get_offset(comp) + start * stride[comp];
- }
-
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
-
- let mut mb_pos: usize = row * mb_w;
- let mut left_q: usize = 0;
- for mb_x in 0..mb_w {
- let q = mbinfo[mb_pos].q as usize;
- let alpha = RV40_ALPHA_TAB[q];
- let beta = RV40_BETA_TAB[q];
- let beta_y = if small_frame { beta * 4 } else { beta * 3 };
- let beta_c = beta * 3;
-
- let cur_dbk = mbinfo[mb_pos].deblock;
- let cur_cbp = mbinfo[mb_pos].cbp_c;
-
- let is_strong = mbinfo[mb_pos].mbtype.is_intra_or_16();
- let top_is_strong = is_strong || (row > 0 && mbinfo[mb_pos - mb_w].mbtype.is_intra_or_16());
- let left_is_strong = is_strong || (mb_x > 0 && mbinfo[mb_pos - 1].mbtype.is_intra_or_16());
-
- for y in 0..4 {
- let yoff = offs[0] + mb_x * 16 + y * 4 * stride[0];
- for x in 0..4 {
- let bpos = x + y * 4;
- let filter_hor_down = (y != 3) && !is_strong;
- let filter_ver = (x > 0) || (mb_x > 0);
- let filter_hor_up = (row > 0) && (x == 0) && top_is_strong;
- let ver_strong = (x == 0) && (mb_x > 0) && left_is_strong;
-
- let cur_strength: usize;
- if is_strong {
- cur_strength = 2;
- } else if test_bit!(cur_dbk, bpos) {
- cur_strength = 1;
- } else {
- cur_strength = 0;
- }
-
- let left_strength: usize;
- if x > 0 {
- if is_strong {
- left_strength = 2;
- } else if test_bit!(cur_dbk, bpos - 1) {
- left_strength = 1;
- } else {
- left_strength = 0;
- }
- } else if mb_x > 0 {
- if left_is_strong {
- left_strength = 2;
- } else if test_bit!(mbinfo[mb_pos - 1].deblock, bpos + 3) {
- left_strength = 1;
- } else {
- left_strength = 0;
- }
- } else {
- left_strength = 0;
- }
-
- let bot_strength: usize;
- if y < 3 {
- if is_strong {
- bot_strength = 2;
- } else if test_bit!(cur_dbk, bpos + 4) {
- bot_strength = 1;
- } else {
- bot_strength = 0;
- }
- } else {
- bot_strength = 0;
- }
-
- let top_strength: usize;
- if y > 0 {
- if is_strong {
- top_strength = 2;
- } else if test_bit!(cur_dbk, bpos - 4) {
- top_strength = 1;
- } else {
- top_strength = 0;
- }
- } else if row > 0 {
- if top_is_strong {
- top_strength = 2;
- } else if test_bit!(mbinfo[mb_pos - mb_w].deblock, bpos + 12) {
- top_strength = 1;
- } else {
- top_strength = 0;
- }
- } else {
- top_strength = 0;
- }
-
- let l_q = if x > 0 { q } else { left_q };
- let top_q = if row > 0 { mbinfo[mb_pos - mb_w].q as usize } else { 0 };
-
- let lim_cur = RV40_FILTER_CLIP_TBL [cur_strength][q];
- let lim_top = RV40_FILTER_CLIP_TBL [top_strength][top_q];
- let lim_left = RV40_FILTER_CLIP_TBL[left_strength][l_q];
- let lim_bottom = RV40_FILTER_CLIP_TBL [bot_strength][q];
-
- let dmode = if y > 0 { x + y * 4 } else { x * 4 };
-
- if filter_hor_down {
- rv40_loop_filter4_h(dst, yoff + 4 * stride[0] + x * 4, stride[0],
- dmode, lim_cur, lim_bottom, alpha, beta, beta_y, false, false);
- }
- if filter_ver && !ver_strong {
- rv40_loop_filter4_v(dst, yoff + x * 4, stride[0],
- dmode, lim_left, lim_cur, alpha, beta, beta_y, false, false);
- }
- if filter_hor_up {
- rv40_loop_filter4_h(dst, yoff + x * 4, stride[0],
- dmode, lim_top, lim_cur, alpha, beta, beta_y, false, true);
- }
- if filter_ver && ver_strong {
- rv40_loop_filter4_v(dst, yoff + x * 4, stride[0],
- dmode, lim_left, lim_cur, alpha, beta, beta_y, false, true);
- }
- }
- }
-
- for comp in 1..3 {
- for y in 0..2 {
- let coff = offs[comp] + mb_x * 8 + y * 4 * stride[comp];
- for x in 0..2 {
- let bpos = x + y * 2 + (comp - 1) * 4;
-
- let filter_hor_down = (y != 1) && !is_strong;
- let filter_ver = (x > 0) || (mb_x > 0);
- let filter_hor_up = (row > 0) && (x == 0) && top_is_strong;
- let ver_strong = (x == 0) && (mb_x > 0) && left_is_strong;
-
- let cur_strength: usize;
- if is_strong {
- cur_strength = 2;
- } else if test_bit!(cur_cbp, bpos) {
- cur_strength = 1;
- } else {
- cur_strength = 0;
- }
-
- let left_strength: usize;
- if x > 0 {
- if is_strong {
- left_strength = 2;
- } else if test_bit!(cur_cbp, bpos - 1) {
- left_strength = 1;
- } else {
- left_strength = 0;
- }
- } else if mb_x > 0 {
- if left_is_strong {
- left_strength = 2;
- } else if test_bit!(mbinfo[mb_pos - 1].cbp_c, bpos + 1) {
- left_strength = 1;
- } else {
- left_strength = 0;
- }
- } else {
- left_strength = 0;
- }
-
- let bot_strength: usize;
- if y == 0 {
- if is_strong {
- bot_strength = 2;
- } else if test_bit!(cur_cbp, bpos + 2) {
- bot_strength = 1;
- } else {
- bot_strength = 0;
- }
- } else {
- bot_strength = 0;
- }
-
- let top_strength: usize;
- if y > 0 {
- if is_strong {
- top_strength = 2;
- } else if test_bit!(cur_cbp, bpos - 2) {
- top_strength = 1;
- } else {
- top_strength = 0;
- }
- } else if row > 0 {
- if top_is_strong {
- top_strength = 2;
- } else if test_bit!(mbinfo[mb_pos - mb_w].cbp_c, bpos + 2) {
- top_strength = 1;
- } else {
- top_strength = 0;
- }
- } else {
- top_strength = 0;
- }
-
- let l_q = if x > 0 { q } else { left_q };
- let top_q = if row > 0 { mbinfo[mb_pos - mb_w].q as usize } else { 0 };
-
- let lim_cur = RV40_FILTER_CLIP_TBL [cur_strength][q];
- let lim_top = RV40_FILTER_CLIP_TBL [top_strength][top_q];
- let lim_left = RV40_FILTER_CLIP_TBL[left_strength][l_q];
- let lim_bottom = RV40_FILTER_CLIP_TBL [bot_strength][q];
-
- if filter_hor_down {
- rv40_loop_filter4_h(dst, coff + 4 * stride[comp] + x * 4, stride[comp],
- x * 8, lim_cur, lim_bottom, alpha, beta, beta_c, true, false);
- }
- if filter_ver && !ver_strong {
- rv40_loop_filter4_v(dst, coff + x * 4, stride[comp],
- y * 8, lim_left, lim_cur, alpha, beta, beta_c, true, false);
- }
- if filter_hor_up {
- rv40_loop_filter4_h(dst, coff + x * 4, stride[comp],
- x * 8, lim_top, lim_cur, alpha, beta, beta_c, true, true);
- }
- if filter_ver && ver_strong {
- rv40_loop_filter4_v(dst, coff + x * 4, stride[comp],
- y * 8, lim_left, lim_cur, alpha, beta, beta_c, true, true);
- }
- }
- }
- }
-
- left_q = q;
-
- mb_pos += 1;
- }
- }
- fn do_luma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, mv: MV, use16: bool, avg: bool) {
- let size: usize = if use16 { 16 } else { 8 };
- let dstride = frame.get_stride(0);
- let doffset = frame.get_offset(0) + (if !avg { x + y * dstride } else { 0 });
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
-
- let (w_, h_) = prev_frame.get_dimensions(0);
- let w = (w_ + 15) & !15;
- let h = (h_ + 15) & !15;
-
- let dx = mv.x >> 2;
- let cx = (mv.x & 3) as usize;
- let dy = mv.y >> 2;
- let cy = (mv.y & 3) as usize;
- let mode = cx + cy * 4;
-
- if check_pos(x, y, size, w, h, dx, dy, RV40_EDGE1[cx], RV40_EDGE2[cx], RV40_EDGE1[cy], RV40_EDGE2[cy]) {
- let sstride = prev_frame.get_stride(0);
- let mut soffset = prev_frame.get_offset(0) + x + y * sstride;
- let data = prev_frame.get_data();
- let src: &[u8] = data.as_slice();
- soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize;
- self.luma_mc[if use16 { 0 } else { 1 }][mode](dst, doffset, dstride, src, soffset, sstride);
- } else {
- let mut ebuf: [u8; 32*22] = [0; 32*22];
- edge_emu(prev_frame, (x as isize) + (dx as isize) - 2, (y as isize) + (dy as isize) - 2, 16+5, 16+5, &mut ebuf, 32, 0);
- self.luma_mc[if use16 { 0 } else { 1 }][mode](dst, doffset, dstride, &ebuf, 32*2 + 2, 32);
- }
- }
- fn do_chroma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, comp: usize, mv: MV, use8: bool, avg: bool) {
- let size: usize = if use8 { 8 } else { 4 };
- let dstride = frame.get_stride(comp);
- let doffset = frame.get_offset(comp) + (if !avg { x + y * dstride } else { 0 });
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
-
- let (w_, h_) = prev_frame.get_dimensions(comp);
- let w = (w_ + 7) & !7;
- let h = (h_ + 7) & !7;
-
- let mvx = mv.x / 2;
- let mvy = mv.y / 2;
- let dx = mvx >> 2;
- let mut cx = (mvx & 3) as usize;
- let dy = mvy >> 2;
- let mut cy = (mvy & 3) as usize;
-
- if (cx == 3) && (cy == 3) {
- cx = 2;
- cy = 2;
- }
-
- if check_pos(x, y, size, w, h, dx, dy, 0, 1, 0, 1) {
- let sstride = prev_frame.get_stride(comp);
- let mut soffset = prev_frame.get_offset(comp) + x + y * sstride;
- let data = prev_frame.get_data();
- let src: &[u8] = data.as_slice();
- soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize;
- rv40_chroma_mc(dst, doffset, dstride, src, soffset, sstride, size, cx, cy);
- } else {
- let mut ebuf: [u8; 16*10] = [0; 16*10];
- edge_emu(prev_frame, (x as isize) + (dx as isize), (y as isize) + (dy as isize), 8+1, 8+1, &mut ebuf, 16, comp);
- rv40_chroma_mc(dst, doffset, dstride, &ebuf, 0, 16, size, cx, cy);
- }
- }
-}
diff --git a/src/codecs/real/rv60.rs b/src/codecs/real/rv60.rs
deleted file mode 100644
index 2d1262b..0000000
--- a/src/codecs/real/rv60.rs
+++ /dev/null
@@ -1,1490 +0,0 @@
-use std::rc::Rc;
-use std::cell::RefCell;
-use crate::formats::YUV420_FORMAT;
-use crate::frame::*;
-use crate::codecs::{NADecoder, MV, ZERO_MV, DecoderError, DecoderResult, IPBShuffler};
-use crate::io::byteio::{MemoryReader,ByteReader};
-use crate::io::bitreader::{BitReader,BitReaderMode};
-use crate::io::intcode::*;
-
-use super::rv60codes::*;
-use super::rv60dsp::*;
-
-struct UniqueList<A> {
- list: [A; 4],
- fill: usize,
- max_size: usize,
-}
-
-impl<A:Copy+Default+PartialEq> UniqueList<A> {
- fn new(max_size: usize) -> Self {
- Self { list: [A::default(); 4], fill: 0, max_size }
- }
- fn add(&mut self, cand: A) {
- if self.fill == self.max_size { return; }
- let mut unique = true;
- for el in self.list.into_iter().take(self.fill) {
- if *el == cand {
- unique = false;
- break;
- }
- }
- if unique {
- self.list[self.fill] = cand;
- self.fill += 1;
- }
- }
-}
-
-const RV60_FRAME_TYPES: [FrameType; 4] = [ FrameType::I, FrameType::P, FrameType::B, FrameType::Other ];
-const MAX_IMODE: u8 = 34;
-
-#[derive(Clone,Copy,Debug)]
-struct FrameHeader {
- profile: u8,
- ftype: FrameType,
- qp: u8,
- osvquant: u8,
- ts: u32,
- width: usize,
- height: usize,
- two_f_refs: bool,
- qp_off_type: u8,
- deblock: bool,
- deblock_chroma: bool,
-}
-
-const RV60_CUSTOM_MSG_LENS: [u32; 4] = [ 2, 4, 16, 32 ];
-impl FrameHeader {
- fn read(br: &mut BitReader) -> DecoderResult<Self> {
- let marker = br.read(2)?;
- validate!(marker == 3);
- let profile = br.read(2)? as u8;
- validate!(profile == 0);
- let _someval = br.read(4)?;
- let ftypeid = br.read(2)? as usize;
- let ftype = RV60_FRAME_TYPES[ftypeid];
- let qp = br.read(6)? as u8;
- let marker = br.read(1)?;
- validate!(marker == 0);
- let toolset = br.read(2)?;
- validate!(toolset == 0);
- let osvquant = br.read(2)? as u8;
- let _some_flag = br.read_bool()?;
- let _some_val = br.read(2)?;
- let ts = br.read(24)?;
- let width = ((br.read(11)? as usize) + 1) * 4;
- let height = ((br.read(11)? as usize) + 0) * 4;
- validate!(height > 0);
- let _some_flag = br.read_bool()?;
- let two_f_refs;
- if ftype == FrameType::I {
-//byte17 = 0
- two_f_refs = false;
- } else {
- let flag = br.read_bool()?;
- if flag { // untested
- br.skip(1)?;
- br.skip(1)?;
- br.skip(1)?;
- }
-//byte17 = flag?
- two_f_refs = br.read_bool()?;
- }
-// if byte17 { dw40 = 2; dw3C = 2; } else { dw40 = 1; dw3C = 1; }
- let _some_val = br.read_code(UintCodeType::Unary012)?; // luma_qp_diff?
- let chroma_qp_diff = br.read(1)?;
- validate!(chroma_qp_diff == 0);
- let qp_off_type = br.read_code(UintCodeType::Unary012)? as u8;
- let deblock = br.read_bool()?;
- let deblock_chroma = deblock && !br.read_bool()?;
- if br.read_bool()? {
- let custom_msg_hdr_len = br.read(2)? as usize;
- if custom_msg_hdr_len != 0 {
- for i in 0..custom_msg_hdr_len {
- br.skip(RV60_CUSTOM_MSG_LENS[i] * 8)?;
- }
- }
- }
-
- Ok(FrameHeader {
- profile, ftype, qp, osvquant, ts, width, height, two_f_refs, qp_off_type,
- deblock, deblock_chroma,
- })
- }
- fn parse_slice_sizes(&self, br: &mut BitReader, sizes: &mut Vec<usize>) -> DecoderResult<()> {
- let nslices = self.get_height_cu();
- let nbits = (br.read(5)? as u8) + 1;
- validate!(nbits < 32);
- let mut signs: Vec<bool> = Vec::with_capacity(nslices);
- for _ in 0..nslices {
- let sign = br.read_bool()?;
- signs.push(sign);
- }
- validate!(signs[0]);
- sizes.truncate(0);
- let mut sum = 0;
- let first_size = br.read(nbits)? as usize;
- validate!(first_size > 0);
- sum += first_size;
- let mut lastsize = first_size;
- sizes.push(first_size);
- for i in 1..nslices {
- let diff = br.read(nbits)? as isize;
- let size;
- if signs[i] {
- let sum = (lastsize as isize).checked_add(diff);
- validate!(sum.is_some());
- size = sum.unwrap() as usize;
- } else {
- let sum = (lastsize as isize).checked_sub(diff);
- validate!(sum.is_some());
- size = sum.unwrap() as usize;
- }
- sizes.push(size);
- sum += size;
- lastsize = size;
- }
- br.align();
-if ((br.left() >> 3) as usize) != sum {
-println!(" left {} / {}", br.left() >> 3, sum);
-}
- validate!((br.left() >> 3) >= (sum as isize));
- Ok(())
- }
- fn read_line_qp_offset(&self, br: &mut BitReader) -> DecoderResult<i8> {
- match self.qp_off_type {
- 0 => Ok(0),
- 1 => {
- let val = br.read_code(UintCodeType::Unary012)?;
- if val != 2 {
- Ok(val as i8)
- } else {
- Ok(-1)
- }
- },
- _ => {
- if br.read(1)? == 0 {
- Ok(0)
- } else {
- let val = br.read(2)? as i8;
- if (val & 2) == 0 {
- Ok(val + 1)
- } else {
- Ok(-((val & 1) + 1))
- }
- }
- },
- }
- }
- fn get_width_cu(&self) -> usize {
- (self.width + 63) >> 6
- }
- fn get_height_cu(&self) -> usize {
- (self.height + 63) >> 6
- }
- fn has_top_block(&self, xpos: usize, ypos: usize, dx: usize, dy: usize, size: usize) -> bool {
- if (ypos + dy) == 0 { return false; }
- let xpos2 = xpos + dx;
- if (xpos2 + size) > self.width { return false; }
- true
- }
- fn has_top_right_block(&self, xpos: usize, ypos: usize, dx: usize, dy: usize, size: usize) -> bool {
- if (ypos + dy) == 0 { return false; }
- let xpos2 = xpos + dx;
- if (xpos2 + size * 2) > self.width { return false; }
- let cxpos = ((xpos + dx) & 63) >> RV60_BLOCK_LOG2[size];
- let cypos = ((ypos + dy) & 63) >> RV60_BLOCK_LOG2[size];
- ((cypos as u8) & RV60_AVAIL_MASK[cxpos]) == 0
- }
- fn has_left_block(&self, xpos: usize, ypos: usize, dx: usize, dy: usize, size: usize) -> bool {
- if (xpos + dx) == 0 { return false; }
- let ypos2 = ypos + dy;
- if (ypos2 + size) > self.height { return false; }
- true
- }
- fn has_left_down_block(&self, xpos: usize, ypos: usize, dx: usize, dy: usize, size: usize) -> bool {
- if (xpos + dx) == 0 { return false; }
- let ypos2 = ypos + dy;
- if (ypos2 + size * 2) > self.height { return false; }
- let cxpos = (!(xpos + dx) & 63) >> RV60_BLOCK_LOG2[size];
- let cypos = (!(ypos + dy) & 63) >> RV60_BLOCK_LOG2[size];
- ((cypos as u8) & RV60_AVAIL_MASK[cxpos]) >= 1
- }
-}
-
-const RV60_BLOCK_LOG2: [u8; 65] = [
- 0,
- 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
- 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, 6
-];
-const RV60_AVAIL_MASK: [u8; 64] = [
- 0, 1, 0, 3, 0, 1, 0, 7, 0, 1, 0, 3, 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
-];
-
-#[derive(Clone,Copy,PartialEq,Debug)]
-enum CUType {
- Intra,
- InterMV,
- Skip,
- InterNoMV,
-}
-
-impl Default for CUType {
- fn default() -> Self { CUType::Intra }
-}
-
-const RV60_CU_TYPES: [CUType; 4] = [ CUType::Intra, CUType::InterMV, CUType::Skip, CUType::InterNoMV ];
-
-#[derive(Clone,Copy,PartialEq,Debug)]
-enum PUType {
- Full,
- N2Hor,
- N2Ver,
- Quarters,
- N4Hor,
- N34Hor,
- N4Ver,
- N34Ver,
-}
-
-const RV60_PU_TYPES: [PUType; 8] = [
- PUType::Full, PUType::N2Hor, PUType::N2Ver, PUType::Quarters,
- PUType::N4Hor, PUType::N34Hor, PUType::N4Ver, PUType::N34Ver,
-];
-
-impl PUType {
- fn get_num_mvs(&self) -> usize {
- match *self {
- PUType::Full => 1,
- PUType::Quarters => 4,
- _ => 2,
- }
- }
- fn get_mv_size(&self, part_no: usize, size: usize) -> (usize, usize) {
- let mv_size = size >> 2;
- match *self {
- PUType::Full => (mv_size, mv_size),
- PUType::N2Hor => (mv_size, mv_size >> 1),
- PUType::N2Ver => (mv_size >> 1, mv_size),
- PUType::Quarters => (mv_size >> 1, mv_size >> 1),
- PUType::N4Hor => {
- if part_no == 0 {
- (mv_size, mv_size >> 2)
- } else {
- (mv_size, 3 * mv_size >> 2)
- }
- },
- PUType::N34Hor => {
- if part_no == 0 {
- (mv_size, 3 * mv_size >> 2)
- } else {
- (mv_size, mv_size >> 2)
- }
- },
- PUType::N4Ver => {
- if part_no == 0 {
- ( mv_size >> 2, mv_size)
- } else {
- (3 * mv_size >> 2, mv_size)
- }
- },
- PUType::N34Ver => {
- if part_no == 0 {
- (3 * mv_size >> 2, mv_size)
- } else {
- ( mv_size >> 2, mv_size)
- }
- },
- }
- }
- fn has_hor_split(&self) -> bool {
- match *self {
- PUType::N2Hor | PUType::N4Hor | PUType::N34Hor | PUType::Quarters => true,
- _ => false,
- }
- }
- fn has_ver_split(&self) -> bool {
- match *self {
- PUType::N2Ver | PUType::N4Ver | PUType::N34Ver | PUType::Quarters => true,
- _ => false,
- }
- }
-}
-
-impl Default for PUType {
- fn default() -> Self { PUType::Full }
-}
-
-#[derive(Clone,Copy,Debug)]
-enum IntraMode {
- Index(u8),
- Mode(u8),
- DC64,
- Plane64,
-}
-
-#[derive(Clone,Copy,PartialEq,Debug)]
-enum TransformType {
- None,
- T4X4,
- T8X8,
- T16X16,
-}
-
-impl Default for TransformType {
- fn default() -> Self { TransformType::None }
-}
-
-#[derive(Clone,Copy,PartialEq,Debug)]
-enum MVRef {
- None,
- Ref0,
- Ref1,
- BRef,
- Ref0AndBRef,
- Skip0,
- Skip1,
- Skip2,
- Skip3,
-}
-
-const SKIP_MV_REF: [MVRef; 4] = [ MVRef::Skip0, MVRef::Skip1, MVRef::Skip2, MVRef::Skip3 ];
-
-impl MVRef {
- fn get_skip_mv_num(&self) -> usize {
- match *self {
- MVRef::Skip1 => 1,
- MVRef::Skip2 => 2,
- MVRef::Skip3 => 3,
- _ => 0,
- }
- }
- fn is_ref0(&self) -> bool {
- match *self {
- MVRef::Ref0 | MVRef::Ref0AndBRef => true,
- _ => false,
- }
- }
- fn is_fwd(&self) -> bool {
- match *self {
- MVRef::Ref0 | MVRef::Ref1 | MVRef::Ref0AndBRef => true,
- _ => false,
- }
- }
- fn is_bwd(&self) -> bool {
- match *self {
- MVRef::BRef | MVRef::Ref0AndBRef => true,
- _ => false,
- }
- }
-}
-
-#[derive(Clone,Copy,PartialEq,Debug)]
-struct MVInfo {
- f_mv: MV,
- b_mv: MV,
- mvref: MVRef,
-}
-
-impl MVInfo {
- fn is_some(&self) -> bool { self.mvref != MVRef::None }
- fn matches_fwd(&self, mvref: MVRef) -> bool {
- (self.mvref == mvref) || (self.mvref.is_ref0() && mvref.is_ref0())
- }
- fn matches_bwd(&self, mvref: MVRef) -> bool {
- self.mvref.is_bwd() && mvref.is_bwd()
- }
- fn is_deblock_cand(&self, other: &MVInfo) -> bool {
- if self.mvref != other.mvref { return true; }
- let mut mvdiff = 0;
- if self.mvref.is_fwd() {
- let diff = self.f_mv - other.f_mv;
- mvdiff += diff.x.abs() + diff.y.abs();
- }
- if self.mvref.is_bwd() {
- let diff = self.b_mv - other.b_mv;
- mvdiff += diff.x.abs() + diff.y.abs();
- }
- mvdiff > 4
- }
-}
-
-impl Default for MVInfo {
- fn default() -> Self { Self { f_mv: ZERO_MV, b_mv: ZERO_MV, mvref: MVRef::None } }
-}
-
-#[derive(Clone,Copy,Debug)]
-struct CBHeader {
- cu_type: CUType,
- pu_type: PUType,
- ttype: TransformType,
- imode: [IntraMode; 4],
- mv: [MVInfo; 4],
-}
-
-impl CBHeader {
- fn read(br: &mut BitReader, ftype: FrameType, two_f_refs: bool, size: usize) -> DecoderResult<Self> {
- let cu_type;
- let pu_type;
- let mut imode: [IntraMode; 4] = [IntraMode::Index(0); 4];
- let mut mv: [MVInfo; 4] = [MVInfo::default(); 4];
- if ftype == FrameType::I {
- cu_type = CUType::Intra;
- } else {
- cu_type = RV60_CU_TYPES[br.read(2)? as usize];
- }
- match cu_type {
- CUType::Intra => {
- if (size == 8) && br.read_bool()? {
- pu_type = PUType::Quarters;
- } else {
- pu_type = PUType::Full;
- }
- if pu_type == PUType::Quarters {
- for i in 0..4 {
- imode[i] = CBHeader::read_intra_mode(br)?;
- }
- } else if size <= 32 {
- imode[0] = CBHeader::read_intra_mode(br)?;
- } else {
- if !br.read_bool()? {
- imode[0] = IntraMode::DC64;
- } else {
- imode[0] = IntraMode::Plane64;
- }
- }
- },
- CUType::InterMV => {
- let bits = if size == 8 { 2 } else { 3 };
- pu_type = RV60_PU_TYPES[br.read(bits)? as usize];
- CBHeader::read_mv_data(br, ftype, two_f_refs, size, pu_type, &mut mv)?;
- },
- _ => {
- pu_type = PUType::Full;
- let skip_mv_no = br.read_code(UintCodeType::LimitedUnary(3, 0))?;
- mv[0].mvref = SKIP_MV_REF[skip_mv_no as usize];
- },
- };
- let ttype;
- if cu_type == CUType::Skip {
- ttype = TransformType::None;
- } else if size >= 32 {
- ttype = TransformType::T16X16;
- } else if size == 16 {
- if (cu_type == CUType::Intra) || (pu_type == PUType::Full) {
- ttype = TransformType::T16X16;
- } else {
- ttype = TransformType::T4X4;
- }
- } else {
- if pu_type == PUType::Full {
- ttype = TransformType::T8X8;
- } else {
- ttype = TransformType::T4X4;
- }
- }
- Ok(Self {
- cu_type, pu_type, ttype, imode, mv,
- })
- }
- fn read_intra_mode(br: &mut BitReader) -> DecoderResult<IntraMode> {
- if br.read_bool()? {
- let idx = br.read_code(UintCodeType::Unary012)? as u8;
- Ok(IntraMode::Index(idx))
- } else {
- let mode = br.read(5)? as u8;
- Ok(IntraMode::Mode(mode))
- }
- }
- fn read_mv_data(br: &mut BitReader, ftype: FrameType, two_f_refs: bool, size: usize, pu_type: PUType, mv: &mut [MVInfo; 4]) -> DecoderResult<()> {
- let mv_count = pu_type.get_num_mvs();
- for i in 0..mv_count {
- mv[i] = CBHeader::read_mv_info(br, ftype, two_f_refs, size, pu_type)?;
- }
- Ok(())
- }
- fn read_mv_info(br: &mut BitReader, ftype: FrameType, two_f_refs: bool, size: usize, pu_type: PUType) -> DecoderResult<MVInfo> {
- let mut f_mv = ZERO_MV;
- let mut b_mv = ZERO_MV;
- let mvref;
- if ftype != FrameType::B {
- if two_f_refs && br.read_bool()? {
- mvref = MVRef::Ref1;
- } else {
- mvref = MVRef::Ref0;
- }
- f_mv = CBHeader::read_mv(br)?;
- Ok(MVInfo { f_mv, b_mv: ZERO_MV, mvref })
- } else {
- if ((size <= 8) && ((size != 8) || (pu_type != PUType::Full))) || br.read_bool()? {
- if !br.read_bool()? {
- mvref = MVRef::Ref0;
- f_mv = CBHeader::read_mv(br)?;
- } else {
- mvref = MVRef::BRef;
- b_mv = CBHeader::read_mv(br)?;
- }
- } else {
- mvref = MVRef::Ref0AndBRef;
- f_mv = CBHeader::read_mv(br)?;
- b_mv = CBHeader::read_mv(br)?;
- }
- Ok(MVInfo { f_mv, b_mv, mvref })
- }
- }
- fn read_mv(br: &mut BitReader) -> DecoderResult<MV> {
- let x = br.read_code_signed(IntCodeType::Gamma)? as i16;
- let y = br.read_code_signed(IntCodeType::Gamma)? as i16;
- Ok(MV { x, y })
- }
-}
-
-#[derive(Clone,Copy,Default)]
-struct PUInfo {
- cu_type: CUType,
- ttype: TransformType,
-}
-
-impl PUInfo {
- fn is_intra(&self) -> bool { self.cu_type == CUType::Intra }
-}
-
-const RV60_CANDIDATE_INTRA_ANGLES: [u8; 6] = [ 0, 1, 10, 26, 18, 2 ];
-
-#[derive(Clone,Copy,Default)]
-struct BlockInfo {
- mv: MVInfo,
- imode: u8,
-}
-
-struct DeblockInfo {
- left_str: Vec<u8>,
- top_str: Vec<u8>,
- stride: usize,
-}
-
-impl DeblockInfo {
- fn new() -> Self {
- Self { left_str: Vec::new(), top_str: Vec::new(), stride: 0 }
- }
- fn reinit(&mut self, w: usize, h: usize) {
- self.left_str.clear();
- self.top_str.clear();
- self.stride = w >> 2;
- let size = self.stride * (h >> 2);
- self.left_str.resize(size, 0);
- self.top_str.resize(size, 0);
- }
- fn set_strength(&mut self, xpos: usize, ypos: usize, size: usize, q: u8, strength: u8) {
- let pos = self.get_pos(xpos, ypos);
- let dsize = size >> 2;
- let dval = (q << 2) | strength;
- for x in 0..dsize {
- self.top_str[pos + x] = dval;
- }
- for y in 0..dsize {
- self.left_str[pos + y * self.stride] = dval;
- }
- }
- fn get_pos(&self, xpos: usize, ypos: usize) -> usize {
- (xpos >> 2) + (ypos >> 2) * self.stride
- }
- fn get_top_strength(&self, pos: usize) -> u8 {
- self.top_str[pos] & 3
- }
- fn get_left_strength(&self, pos: usize) -> u8 {
- self.left_str[pos] & 3
- }
- fn set_top_strength(&mut self, pos: usize, str: u8) {
- self.top_str[pos] |= str;
- }
- fn set_left_strength(&mut self, pos: usize, str: u8) {
- self.left_str[pos] |= str;
- }
-}
-
-struct RealVideo60Decoder {
- info: Rc<NACodecInfo>,
- cbs: RV60Codebooks,
- ipbs: IPBShuffler,
- dsp: RV60DSP,
- ipred: IntraPredContext,
-
- avg_buf: NAVideoBuffer<u8>,
-
- y_coeffs: [i16; 16 * 16],
- u_coeffs: [i16; 8 * 8],
- v_coeffs: [i16; 8 * 8],
- qp: u8,
- sel_qp: u8,
-
- cu_splits: Vec<bool>,
- coded_blk: [bool; 64],
- dblk: DeblockInfo,
-
- pu_info: Vec<PUInfo>,
- pu_stride: usize,
- pu_pos: usize,
-
- blk_info: Vec<BlockInfo>,
- blk_stride: usize,
- blk_pos: usize,
-
- xpos: usize,
- ypos: usize,
-}
-
-impl RealVideo60Decoder {
- fn new() -> Self {
- let tmp_vinfo = NAVideoInfo::new(64, 64, false, YUV420_FORMAT);
- let mut vt = alloc_video_buffer(tmp_vinfo, 4).unwrap();
- let vb = vt.get_vbuf();
- let avg_buf = vb.unwrap();
- RealVideo60Decoder{
- info: Rc::new(DUMMY_CODEC_INFO),
- cbs: RV60Codebooks::init(),
- ipbs: IPBShuffler::new(),
- ipred: IntraPredContext::new(),
- dsp: RV60DSP::new(),
- avg_buf: avg_buf,
- y_coeffs: [0; 16 * 16],
- u_coeffs: [0; 8 * 8],
- v_coeffs: [0; 8 * 8],
- qp: 0,
- sel_qp: 0,
- cu_splits: Vec::with_capacity(24),
- coded_blk: [false; 64],
- dblk: DeblockInfo::new(),
- pu_info: Vec::new(),
- pu_stride: 0,
- pu_pos: 0,
- blk_info: Vec::new(),
- blk_stride: 0,
- blk_pos: 0,
- xpos: 0,
- ypos: 0,
- }
- }
- fn decode_cu_line(&mut self, buf: &mut NAVideoBuffer<u8>, hdr: &FrameHeader, src: &[u8], cu_y: usize) -> DecoderResult<()> {
- let mut br = BitReader::new(src, src.len(), BitReaderMode::BE);
- let cu_w = hdr.get_width_cu();
- let dqp = hdr.read_line_qp_offset(&mut br)?;
- let qps = (hdr.qp as i8) + dqp;
- validate!((qps >= 0) && (qps < 32));
- let qp = qps as u8;
- self.qp = qp;
- self.sel_qp = match hdr.osvquant {
- 0 => qp,
- 1 => {
- if qp <= 25 {
- qp + 5
- } else {
- qp
- }
- },
- _ => {
- if qp <= 18 {
- qp + 10
- } else if qp <= 25 {
- qp + 5
- } else {
- qp
- }
- },
- };
-
- for cu_x in 0..cu_w {
- self.cu_splits.clear();
- self.coded_blk = [false; 64];
- self.decode_cb_tree(buf, hdr, &mut br, cu_x << 6, cu_y << 6, 6)?;
- if hdr.deblock {
- self.cu_splits.reverse();
- self.deblock_cb_tree(buf, hdr, cu_x << 6, cu_y << 6, 6);
- }
- }
-if br.left() >= 8 {
-println!(" left {} bits", br.left());
-}
- Ok(())
- }
- fn decode_cb_tree(&mut self, buf: &mut NAVideoBuffer<u8>, hdr: &FrameHeader, br: &mut BitReader, xpos: usize, ypos: usize, log_size: u8) -> DecoderResult<()> {
- if (xpos >= hdr.width) || (ypos >= hdr.height) { return Ok(()); }
-
- let size = 1 << log_size;
- let split = (xpos + size > hdr.width) || (ypos + size > hdr.height) || (size > 8 && br.read_bool()?);
- self.cu_splits.push(split);
- if split {
- let hsize = size >> 1;
- self.decode_cb_tree(buf, hdr, br, xpos, ypos, log_size - 1)?;
- self.decode_cb_tree(buf, hdr, br, xpos + hsize, ypos, log_size - 1)?;
- self.decode_cb_tree(buf, hdr, br, xpos, ypos + hsize, log_size - 1)?;
- self.decode_cb_tree(buf, hdr, br, xpos + hsize, ypos + hsize, log_size - 1)?;
- } else {
- let cbh = CBHeader::read(br, hdr.ftype, hdr.two_f_refs, size)?;
- self.pu_pos = (xpos >> 3) + (ypos >> 3) * self.pu_stride;
- self.blk_pos = (xpos >> 2) + (ypos >> 2) * self.blk_stride;
- self.xpos = xpos;
- self.ypos = ypos;
- self.reconstruct_info(hdr, &cbh, size)?;
-
- let split_i4x4 = (cbh.cu_type == CUType::Intra) && (size == 8) && (cbh.pu_type == PUType::Quarters);
- match cbh.cu_type {
- CUType::Intra => {
- let itype = self.blk_info[self.blk_pos].imode;
- if !split_i4x4 {
- let dstride = buf.get_stride(0);
- let off = xpos + ypos * dstride;
- let mut data = buf.get_data_mut();
- let dst = &mut data;
- self.populate_ipred(hdr, dst, 0, dstride, 0, 0, size, true);
- self.ipred.pred_angle(dst, off, dstride, size, itype as usize, true);
- }
- for comp in 1..3 {
- let dstride = buf.get_stride(comp);
- let soff = buf.get_offset(comp);
- let off = soff + (xpos >> 1) + (ypos >> 1) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.populate_ipred(hdr, dst, soff, dstride, 0, 0, size >> 1, false);
- self.ipred.pred_angle(&mut dst, off, dstride, size >> 1, itype as usize, false);
- }
- },
- _ => {
- let mut mv_x = xpos >> 2;
- let mut mv_y = ypos >> 2;
- let mut mv_pos = mv_x + mv_y * self.blk_stride;
- for part_no in 0..cbh.pu_type.get_num_mvs() {
- let (mv_w, mv_h) = cbh.pu_type.get_mv_size(part_no, size);
- let mv = self.blk_info[mv_pos].mv;
- let bw = mv_w << 2;
- let bh = mv_h << 2;
- let bx = mv_x << 2;
- let by = mv_y << 2;
- match mv.mvref {
- MVRef::Ref0 => {
- if hdr.ftype != FrameType::B {
- if let Some(ref prevbuf) = self.ipbs.get_lastref() {
- self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.f_mv, false);
- }
- } else {
- if let Some(ref prevbuf) = self.ipbs.get_b_fwdref() {
- self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.f_mv, false);
- }
- }
- },
- MVRef::Ref1 => {
- if let Some(ref prevbuf) = self.ipbs.get_nextref() {
- self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.f_mv, false);
- }
- },
- MVRef::BRef => {
- validate!(hdr.ftype == FrameType::B);
- if let Some(ref prevbuf) = self.ipbs.get_b_bwdref() {
- self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.b_mv, false);
- }
- },
- MVRef::Ref0AndBRef => {
- validate!(hdr.ftype == FrameType::B);
- if let (Some(ref prevbuf), Some(ref nextbuf)) = (self.ipbs.get_b_fwdref(), self.ipbs.get_b_bwdref()) {
- self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.f_mv, false);
- self.dsp.do_mc(&mut self.avg_buf, nextbuf, bx, by, bw, bh, mv.b_mv, true);
- self.dsp.do_avg(buf, &self.avg_buf, bx, by, bw, bh);
- }
- },
- _ => unreachable!(),
- };
- if cbh.pu_type == PUType::Quarters {
- if part_no != 1 {
- mv_pos += mv_w;
- mv_x += mv_w;
- } else {
- mv_pos += mv_h * self.blk_stride - mv_w;
- mv_x -= mv_w;
- mv_y += mv_h;
- }
- } else if cbh.pu_type.has_hor_split() {
- mv_pos += mv_h * self.blk_stride;
- mv_y += mv_h;
- } else if cbh.pu_type.has_ver_split() {
- mv_pos += mv_w;
- mv_x += mv_w;
- }
- }
- },
- };
- if cbh.ttype != TransformType::None {
- self.y_coeffs = [0; 16 * 16];
- self.u_coeffs = [0; 8 * 8];
- self.v_coeffs = [0; 8 * 8];
- }
- let is_intra = cbh.cu_type == CUType::Intra;
- let cb_pos = ((xpos & 63) >> 3) + ((ypos & 63) >> 3) * 8;
- match cbh.ttype {
- TransformType::T4X4 => {
- let subset = if is_intra { 0 } else { 2 };
- if size == 16 {
- let cbp16;
- if br.read_bool()? {
- cbp16 = rv6_decode_cbp16(br, &self.cbs, subset, self.sel_qp)?;
- } else {
- cbp16 = 0;
- }
- if cbp16 != 0 {
- self.coded_blk[cb_pos + 0] = true;
- self.coded_blk[cb_pos + 1] = true;
- self.coded_blk[cb_pos + 8] = true;
- self.coded_blk[cb_pos + 9] = true;
- rv6_decode_cu_4x4in16x16(br, &self.cbs, is_intra, self.qp, self.sel_qp, &mut self.y_coeffs, &mut self.u_coeffs, &mut self.v_coeffs, cbp16)?;
- for y in 0..4 {
- for x in 0..4 {
- let i = x + y * 4;
- if ((cbp16 >> i) & 1) != 0 {
- self.dsp.transform4x4(&mut self.y_coeffs[i * 16..][..16]);
- let dstride = buf.get_stride(0);
- let off = xpos + x * 4 + (ypos + y * 4) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.y_coeffs[i*16..][..16], 4);
- }
- }
- }
- for y in 0..2 {
- for x in 0..2 {
- let i = x + y * 2;
- let xoff = (xpos >> 1) + x * 4;
- let yoff = (ypos >> 1) + y * 4;
- if ((cbp16 >> (16 + i)) & 1) != 0 {
- self.dsp.transform4x4(&mut self.u_coeffs[i * 16..][..16]);
- let dstride = buf.get_stride(1);
- let off = buf.get_offset(1) + xoff + yoff * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.u_coeffs[i * 16..][..16], 4);
- }
- if ((cbp16 >> (20 + i)) & 1) != 0 {
- self.dsp.transform4x4(&mut self.v_coeffs[i * 16..][..16]);
- let dstride = buf.get_stride(2);
- let off = buf.get_offset(2) + xoff + yoff * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.v_coeffs[i * 16..][..16], 4);
- }
- }
- }
- }
- } else {
- let cbp8 = rv6_decode_cbp8(br, &self.cbs, subset, self.sel_qp)?;
- if cbp8 != 0 {
- self.coded_blk[cb_pos] = true;
- rv6_decode_cu_8x8(br, &self.cbs, is_intra, self.qp, self.sel_qp, &mut self.y_coeffs, &mut self.u_coeffs, &mut self.v_coeffs, cbp8, true)?;
- }
- for i in 0..4 {
- let xoff = (i & 1) * 4;
- let yoff = (i & 2) * 2;
- if split_i4x4 {
- let dstride = buf.get_stride(0);
- let off = xpos + xoff + (ypos + yoff) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.populate_ipred(hdr, dst, 0, dstride, xoff, yoff, 4, true);
- let itype = self.blk_info[self.blk_pos + (i & 1) + (i >> 1) * self.blk_stride].imode;
- self.ipred.pred_angle(&mut dst, off, dstride, 4, itype as usize, false);
- }
- if ((cbp8 >> i) & 1) != 0 {
- let blk = &mut self.y_coeffs[i * 16..][..16];
- self.dsp.transform4x4(blk);
- let dstride = buf.get_stride(0);
- let soff = buf.get_offset(0);
- let off = soff + xpos + xoff + (ypos + yoff) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, blk, 4);
- }
- }
- if ((cbp8 >> 4) & 1) != 0 {
- self.dsp.transform4x4(&mut self.u_coeffs);
- let dstride = buf.get_stride(1);
- let soff = buf.get_offset(1);
- let off = soff + (xpos >> 1) + (ypos >> 1) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.u_coeffs, 4);
- }
- if ((cbp8 >> 5) & 1) != 0 {
- self.dsp.transform4x4(&mut self.v_coeffs);
- let dstride = buf.get_stride(2);
- let soff = buf.get_offset(2);
- let off = soff + (xpos >> 1) + (ypos >> 1) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.v_coeffs, 4);
- }
- }
- },
- TransformType::T8X8 => {
- let subset = if is_intra { 1 } else { 3 };
- let cbp8 = rv6_decode_cbp8(br, &self.cbs, subset, self.sel_qp)?;
- if cbp8 != 0 {
- self.coded_blk[cb_pos] = true;
- rv6_decode_cu_8x8(br, &self.cbs, is_intra, self.qp, self.sel_qp, &mut self.y_coeffs, &mut self.u_coeffs, &mut self.v_coeffs, cbp8, false)?;
- if (cbp8 & 0xF) != 0 {
- self.dsp.transform8x8(&mut self.y_coeffs);
- let dstride = buf.get_stride(0);
- let off = xpos + ypos * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.y_coeffs, 8);
- }
- if ((cbp8 >> 4) & 1) != 0 {
- self.dsp.transform4x4(&mut self.u_coeffs);
- let dstride = buf.get_stride(1);
- let soff = buf.get_offset(1);
- let off = soff + (xpos >> 1) + (ypos >> 1) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.u_coeffs, 4);
- }
- if ((cbp8 >> 5) & 1) != 0 {
- self.dsp.transform4x4(&mut self.v_coeffs);
- let dstride = buf.get_stride(2);
- let soff = buf.get_offset(2);
- let off = soff + (xpos >> 1) + (ypos >> 1) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.v_coeffs, 4);
- }
- }
- },
- TransformType::T16X16 => {
- let subset = if is_intra { 1 } else { 3 };
- let num_clusters = size >> 4;
- let cl_cbp = br.read((num_clusters * num_clusters) as u8)?;
- for y in 0..num_clusters {
- for x in 0..num_clusters {
- if ((cl_cbp >> (x + y * num_clusters)) & 1) == 0 { continue; }
- self.coded_blk[cb_pos + x * 2 + y * 2 * 8 + 0] = true;
- self.coded_blk[cb_pos + x * 2 + y * 2 * 8 + 1] = true;
- self.coded_blk[cb_pos + x * 2 + y * 2 * 8 + 8] = true;
- self.coded_blk[cb_pos + x * 2 + y * 2 * 8 + 9] = true;
- let super_cbp = rv6_decode_cbp16(br, &self.cbs, subset, self.sel_qp)?;
- if super_cbp != 0 {
- self.y_coeffs = [0; 16 * 16];
- self.u_coeffs = [0; 8 * 8];
- self.v_coeffs = [0; 8 * 8];
- rv6_decode_cu_16x16(br, &self.cbs, is_intra, self.qp, self.sel_qp, &mut self.y_coeffs, &mut self.u_coeffs, &mut self.v_coeffs, super_cbp)?;
- if (super_cbp & 0xFFFF) != 0 {
- self.dsp.transform16x16(&mut self.y_coeffs);
- let dstride = buf.get_stride(0);
- let off = xpos + x * 16 + (ypos + y * 16) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.y_coeffs, 16);
- }
- if ((super_cbp >> 16) & 0xF) != 0 {
- self.dsp.transform8x8(&mut self.u_coeffs);
- let dstride = buf.get_stride(1);
- let soff = buf.get_offset(1);
- let off = soff + (xpos >> 1) + x * 8 + ((ypos >> 1) + y * 8) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.u_coeffs, 8);
- }
- if ((super_cbp >> 20) & 0xF) != 0 {
- self.dsp.transform8x8(&mut self.v_coeffs);
- let dstride = buf.get_stride(2);
- let soff = buf.get_offset(2);
- let off = soff + (xpos >> 1) + x * 8 + ((ypos >> 1) + y * 8) * dstride;
- let mut data = buf.get_data_mut();
- let mut dst = &mut data;
- self.dsp.add_block(&mut dst, off, dstride, &self.v_coeffs, 8);
- }
- }
- }
- }
- },
- _ => {},
- };
- }
- Ok(())
- }
- fn reconstruct_info(&mut self, hdr: &FrameHeader, cbh: &CBHeader, size: usize) -> DecoderResult<()>{
- let mut pui = PUInfo::default();
- let pu_size = size >> 3;
- pui.cu_type = cbh.cu_type;
- pui.ttype = cbh.ttype;
- if (cbh.cu_type == CUType::Intra) && (cbh.pu_type == PUType::Quarters) { // very special case
- self.pu_info[self.pu_pos] = pui;
- for y in 0..2 {
- for x in 0..2 {
- let imode = self.reconstruct_intra(hdr, cbh, 4, x + y * 2);
- validate!(imode <= MAX_IMODE);
- self.blk_info[self.blk_pos + x + y * self.blk_stride].imode = imode;
- self.blk_info[self.blk_pos + x + y * self.blk_stride].mv = MVInfo::default();
- }
- }
- return Ok(());
- }
- match cbh.cu_type {
- CUType::Intra => {
- self.pu_info[self.pu_pos] = pui;
- let imode = self.reconstruct_intra(hdr, cbh, size, 0);
- validate!(imode <= MAX_IMODE);
- for y in 0..(size >> 2) {
- for x in 0..(size >> 2) {
- self.blk_info[self.blk_pos + x + y * self.blk_stride].imode = imode;
- }
- }
- },
- CUType::InterMV => {
- let mut mv_x = self.xpos >> 2;
- let mut mv_y = self.ypos >> 2;
- let mut mv_pos = self.blk_pos;
- let pu_type = cbh.pu_type;
- for part_no in 0..pu_type.get_num_mvs() {
- let (mv_w, mv_h) = pu_type.get_mv_size(part_no, size);
- let mv = self.predict_mv(hdr, mv_x, mv_y, mv_w, &cbh.mv[part_no]);
- for y in 0..mv_h {
- for x in 0..mv_w {
- self.blk_info[mv_pos + x + y * self.blk_stride].mv = mv;
- }
- }
- if pu_type == PUType::Quarters {
- if part_no != 1 {
- mv_pos += mv_w;
- mv_x += mv_w;
- } else {
- mv_pos += mv_h * self.blk_stride - mv_w;
- mv_x -= mv_w;
- mv_y += mv_h;
- }
- } else if pu_type.has_hor_split() {
- mv_pos += mv_h * self.blk_stride;
- mv_y += mv_h;
- } else if pu_type.has_ver_split() {
- mv_pos += mv_w;
- mv_x += mv_w;
- }
- }
- },
- _ => {
- let skip_idx = cbh.mv[0].mvref.get_skip_mv_num();
- let mut skip_cand: UniqueList<MVInfo> = UniqueList::new(4);
- self.fill_skip_cand(hdr, &mut skip_cand, size);
- let mv = skip_cand.list[skip_idx];
-
- let mv_size = size >> 2;
- for y in 0..mv_size {
- for x in 0..mv_size {
- self.blk_info[self.blk_pos + x + y * self.blk_stride].mv = mv;
- }
- }
- },
- };
- for y in 0..pu_size {
- for x in 0..pu_size {
- self.pu_info[self.pu_pos + x + y * self.pu_stride] = pui;
- }
- }
- Ok(())
- }
- fn reconstruct_intra(&self, hdr: &FrameHeader, cbh: &CBHeader, size: usize, sub: usize) -> u8 {
- match cbh.imode[0] {
- IntraMode::DC64 => { return 1; },
- IntraMode::Plane64 => { return 0; },
- _ => {},
- };
- // form list of predictors
- let blk_pos = self.blk_pos + (sub & 1) + (sub >> 1) * self.blk_stride;
- let mut ipm_cand: UniqueList<u8> = UniqueList::new(3);
- if hdr.has_top_block(self.xpos, self.ypos, (sub & 1) * 4, 0, size) {
- let pu = &self.pu_info[self.pu_pos - self.pu_stride];
- if pu.is_intra() {
- ipm_cand.add(self.blk_info[self.blk_pos + (sub & 1) - self.blk_stride].imode);
- }
- }
- if hdr.has_left_block(self.xpos, self.ypos, 0, (sub & 2) * 2, size) {
- let pu = &self.pu_info[self.pu_pos - 1];
- if pu.is_intra() {
- ipm_cand.add(self.blk_info[blk_pos - 1 - (sub & 1)].imode);
- }
- }
- let tl_x = if (sub & 2) == 0 { self.xpos + (sub & 1) * 4 } else { self.xpos };
- let tl_y = self.ypos + (sub & 2) * 4;
- if (tl_x > 0) && (tl_y > 0) {
- let pu = match sub {
- 0 => &self.pu_info[self.pu_pos - self.pu_stride - 1],
- 1 => &self.pu_info[self.pu_pos - self.pu_stride],
- 2 => &self.pu_info[self.pu_pos - 1],
- _ => &self.pu_info[self.pu_pos - 1],
- };
- if pu.is_intra() {
- if sub != 3 {
- ipm_cand.add(self.blk_info[blk_pos - self.blk_stride - 1].imode);
- } else {
- ipm_cand.add(self.blk_info[blk_pos - self.blk_stride - 2].imode);
- }
- }
- }
- for el in RV60_CANDIDATE_INTRA_ANGLES.into_iter() {
- ipm_cand.add(*el);
- }
- // actually decode prediction mode
- match cbh.imode[sub] {
- IntraMode::Index(idx) => {
- ipm_cand.list[idx as usize]
- },
- IntraMode::Mode(mode) => {
- let mut imode = mode;
- let mut ipm_cs: [u8; 3] = [ipm_cand.list[0], ipm_cand.list[1], ipm_cand.list[2]];
- ipm_cs.sort();
- for ic in ipm_cs.into_iter() {
- if imode >= *ic {
- imode += 1;
- }
- }
- imode
- },
- _ => unreachable!(),
- }
- }
- fn populate_ipred(&mut self, hdr: &FrameHeader, src: &[u8], soff: usize, stride: usize, xoff: usize, yoff: usize, size: usize, is_luma: bool) {
- let src_off = if is_luma {
- soff + self.xpos + xoff + (self.ypos + yoff) * stride
- } else {
- soff + (self.xpos >> 1) + (self.ypos >> 1) * stride
- };
- self.ipred = IntraPredContext::new();
- if (self.ypos + yoff) > 0 {
- self.ipred.has_t = true;
- for x in 0..size {
- self.ipred.t[x + 1] = src[src_off - stride + x];
- }
- if (is_luma && hdr.has_top_right_block(self.xpos, self.ypos, xoff, yoff, size)) ||
- (!is_luma && hdr.has_top_right_block(self.xpos, self.ypos, 0, 0, size << 1)) {
- self.ipred.has_tr = true;
- for x in size..size*2 {
- self.ipred.t[x + 1] = src[src_off - stride + x];
- }
- } else {
- for i in 0..size {
- self.ipred.t[size + i + 1] = self.ipred.t[size];
- }
- }
- if (self.xpos + xoff) > 0 {
- self.ipred.t[0] = src[src_off - stride - 1];
- }
- }
- if (self.xpos + xoff) > 0 {
- self.ipred.has_l = true;
- for y in 0..size {
- self.ipred.l[y + 1] = src[src_off - 1 + y * stride];
- }
- if (is_luma && hdr.has_left_down_block(self.xpos, self.ypos, xoff, yoff, size)) ||
- (!is_luma && hdr.has_left_down_block(self.xpos, self.ypos, 0, 0, size << 1)) {
- self.ipred.has_ld = true;
- for y in size..size*2 {
- self.ipred.l[y + 1] = src[src_off - 1 + y * stride];
- }
- } else {
- for i in 0..size {
- self.ipred.l[size + i + 1] = self.ipred.l[size];
- }
- }
- if (self.ypos + yoff) > 0 {
- self.ipred.l[0] = src[src_off - stride - 1];
- }
- }
- }
- fn predict_mv(&self, hdr: &FrameHeader, mv_x: usize, mv_y: usize, mv_w: usize, mvi: &MVInfo) -> MVInfo {
- let mv_pos = mv_x + mv_y * self.blk_stride;
- let f_mv: MV;
- let b_mv: MV;
- if mvi.mvref.is_fwd() {
- let mut mv_cand: [MV; 3] = [ZERO_MV; 3];
- let mut mv_cand_size: usize = 0;
- if mv_x > 0 {
- let ref_mv = &self.blk_info[mv_pos - 1].mv;
- if ref_mv.matches_fwd(mvi.mvref) {
- mv_cand[mv_cand_size] = ref_mv.f_mv;
- mv_cand_size += 1;
- }
- }
- if mv_y > 0 {
- let ref_mv = &self.blk_info[mv_pos - self.blk_stride].mv;
- if ref_mv.matches_fwd(mvi.mvref) {
- mv_cand[mv_cand_size] = ref_mv.f_mv;
- mv_cand_size += 1;
- }
- }
- if hdr.has_top_block(mv_x << 2, mv_y << 2, mv_w << 2, 0, 4) {
- let ref_mv = &self.blk_info[mv_pos - self.blk_stride + mv_w].mv;
- if ref_mv.matches_fwd(mvi.mvref) {
- mv_cand[mv_cand_size] = ref_mv.f_mv;
- mv_cand_size += 1;
- }
- }
- f_mv = match mv_cand_size {
- 1 | 2 => {
- let x = mv_cand[0].x + mv_cand[1].x + mv_cand[2].x;
- let y = mv_cand[0].y + mv_cand[1].y + mv_cand[2].y;
- if mv_cand_size == 1 {
- MV { x, y }
- } else {
- MV { x: x >> 1, y: y >> 1 }
- }
- },
- 3 => MV::pred(mv_cand[0], mv_cand[1], mv_cand[2]),
- _ => ZERO_MV,
- };
- } else {
- f_mv = ZERO_MV;
- }
- if mvi.mvref.is_bwd() {
- let mut mv_cand: [MV; 3] = [ZERO_MV; 3];
- let mut mv_cand_size: usize = 0;
- if mv_x > 0 {
- let ref_mv = &self.blk_info[mv_pos - 1].mv;
- if ref_mv.matches_bwd(mvi.mvref) {
- mv_cand[mv_cand_size] = ref_mv.b_mv;
- mv_cand_size += 1;
- }
- }
- if mv_y > 0 {
- let ref_mv = &self.blk_info[mv_pos - self.blk_stride].mv;
- if ref_mv.matches_bwd(mvi.mvref) {
- mv_cand[mv_cand_size] = ref_mv.b_mv;
- mv_cand_size += 1;
- }
- }
- if hdr.has_top_block(mv_x << 2, mv_y << 2, mv_w << 2, 0, 4) {
- let ref_mv = &self.blk_info[mv_pos - self.blk_stride + mv_w].mv;
- if ref_mv.matches_bwd(mvi.mvref) {
- mv_cand[mv_cand_size] = ref_mv.b_mv;
- mv_cand_size += 1;
- }
- }
- b_mv = match mv_cand_size {
- 1 | 2 => {
- let x = mv_cand[0].x + mv_cand[1].x + mv_cand[2].x;
- let y = mv_cand[0].y + mv_cand[1].y + mv_cand[2].y;
- if mv_cand_size == 1 {
- MV { x, y }
- } else {
- MV { x: x >> 1, y: y >> 1 }
- }
- },
- 3 => MV::pred(mv_cand[0], mv_cand[1], mv_cand[2]),
- _ => ZERO_MV,
- };
- } else {
- b_mv = ZERO_MV;
- }
-
- MVInfo { f_mv: mvi.f_mv + f_mv, b_mv: mvi.b_mv + b_mv, mvref: mvi.mvref }
- }
- fn fill_skip_cand(&mut self, hdr: &FrameHeader, skip_cand: &mut UniqueList<MVInfo>, size: usize) {
- let mv_size = size >> 2;
-
- if self.xpos > 0 {
- let mv = &self.blk_info[self.blk_pos - 1].mv;
- if mv.is_some() {
- skip_cand.add(*mv);
- }
- }
- if self.ypos > 0 {
- let mv = &self.blk_info[self.blk_pos - self.blk_stride].mv;
- if mv.is_some() {
- skip_cand.add(*mv);
- }
- }
- if hdr.has_top_right_block(self.xpos, self.ypos, 0, 0, size) {
- let mv = &self.blk_info[self.blk_pos - self.blk_stride + mv_size].mv;
- if mv.is_some() {
- skip_cand.add(*mv);
- }
- }
- if hdr.has_left_down_block(self.xpos, self.ypos, 0, 0, size) {
- let mv = &self.blk_info[self.blk_pos + self.blk_stride * mv_size - 1].mv;
- if mv.is_some() {
- skip_cand.add(*mv);
- }
- }
- if hdr.has_left_block(self.xpos, self.ypos, 0, 0, size) {
- let mv = &self.blk_info[self.blk_pos + self.blk_stride * (mv_size - 1) - 1].mv;
- if mv.is_some() {
- skip_cand.add(*mv);
- }
- }
- if hdr.has_top_block(self.xpos, self.ypos, 0, 0, size) {
- let mv = &self.blk_info[self.blk_pos - self.blk_stride + mv_size - 1].mv;
- if mv.is_some() {
- skip_cand.add(*mv);
- }
- }
- if (self.xpos > 0) && (self.ypos > 0) {
- let mv = &self.blk_info[self.blk_pos - self.blk_stride - 1].mv;
- if mv.is_some() {
- skip_cand.add(*mv);
- }
- }
- for i in skip_cand.fill..4 {
- skip_cand.list[i] = MVInfo { f_mv: ZERO_MV, b_mv: ZERO_MV, mvref: MVRef::Ref0 };
- }
- }
- fn deblock_cb_tree(&mut self, buf: &mut NAVideoBuffer<u8>, hdr: &FrameHeader, xpos: usize, ypos: usize, log_size: u8) {
- if (xpos >= hdr.width) || (ypos >= hdr.height) { return; }
- let split = (log_size > 3) && self.cu_splits.pop().unwrap();
- if split {
- let hsize = 1 << (log_size - 1);
- self.deblock_cb_tree(buf, hdr, xpos, ypos, log_size - 1);
- self.deblock_cb_tree(buf, hdr, xpos + hsize, ypos, log_size - 1);
- self.deblock_cb_tree(buf, hdr, xpos, ypos + hsize, log_size - 1);
- self.deblock_cb_tree(buf, hdr, xpos + hsize, ypos + hsize, log_size - 1);
- } else {
- let pu_pos = (xpos >> 3) + (ypos >> 3) * self.pu_stride;
- let cu_type = self.pu_info[pu_pos].cu_type;
- let tsize = if self.pu_info[pu_pos].ttype == TransformType::T16X16 { 4 } else { 3 };
- let ntiles = 1 << (log_size - tsize);
- let dparams = RV60DeblockParams {
- deblock_chroma: hdr.deblock_chroma,
- width: hdr.width,
- height: hdr.height,
- dblkstride: self.dblk.stride,
- };
- for ty in 0..ntiles {
- for tx in 0..ntiles {
- let x = xpos + (tx << tsize);
- let y = ypos + (ty << tsize);
- let cb_pos = ((x & 63) >> 3) + ((y & 63) >> 3) * 8;
- if cu_type == CUType::Intra {
- self.dblk.set_strength(x, y, 1 << tsize, self.qp, 2);
- } else if (cu_type != CUType::Skip) && self.coded_blk[cb_pos] {
- self.dblk.set_strength(x, y, 1 << tsize, self.qp, 1);
- } else {
- self.dblk.set_strength(x, y, 1 << tsize, self.qp, 0);
- self.derive_deblock_strength(x, y, 1 << (tsize - 2));
- }
- self.dsp.do_deblock(&dparams, buf, x, y, 1 << tsize,
- self.dblk.top_str.as_slice(),
- self.dblk.left_str.as_slice(),
- self.dblk.get_pos(x, y));
- }
- }
- }
- }
- fn derive_deblock_strength(&mut self, xpos: usize, ypos: usize, size4: usize) {
- let blk_pos = (xpos >> 2) + (ypos >> 2) * self.blk_stride;
- let mut dblk_pos = self.dblk.get_pos(xpos, ypos);
- if ypos > 0 {
- let top_blk_pos = blk_pos - self.blk_stride;
- for i in 0..size4 {
- if self.dblk.get_top_strength(dblk_pos + i) == 0 {
- if self.blk_info[blk_pos + i].mv.is_deblock_cand(&self.blk_info[top_blk_pos + i].mv) {
- self.dblk.set_top_strength(dblk_pos + i, 1);
- }
- }
- }
- }
- if xpos > 0 {
- for i in 0..size4 {
- if self.dblk.get_left_strength(dblk_pos) == 0 {
- if self.blk_info[blk_pos + i].mv.is_deblock_cand(&self.blk_info[blk_pos + i - 1].mv) {
- self.dblk.set_left_strength(dblk_pos, 1);
- }
- }
- dblk_pos += self.dblk.stride;
- }
- }
- }
-}
-
-impl NADecoder for RealVideo60Decoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Video(_vinfo) = info.get_properties() {
- let fmt = YUV420_FORMAT;
- let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, false, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
-
- let edata = info.get_extradata().unwrap();
- let src: &[u8] = &edata;
-
- if src.len() < 8 { return Err(DecoderError::InvalidData); }
- let mut mr = MemoryReader::new_read(src);
- let mut br = ByteReader::new(&mut mr);
- let _flags = br.read_u32be()?;
- let version = br.read_u32be()?;
- let _unk = br.read_u16be()?;
- validate!((version >> 28) == 4);
- // then width and height again as 16be
-
- //self.bd.width = vinfo.get_width();
- //self.bd.height = vinfo.get_height();
- //self.frmmgr.clear();
- Ok(())
- } else {
-println!("???");
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let src = pkt.get_buffer();
-
- validate!(src.len() > 9);
- let hsize = (src[0] as usize) * 8 + 9;
- let mut br = BitReader::new(&src[hsize..], src.len() - hsize, BitReaderMode::BE);
- let hdr = FrameHeader::read(&mut br)?;
- let mut slices: Vec<usize> = Vec::new();
- hdr.parse_slice_sizes(&mut br, &mut slices)?;
-
- let tmp_vinfo = NAVideoInfo::new(hdr.width, hdr.height, false, YUV420_FORMAT);
- let res = alloc_video_buffer(tmp_vinfo, 6);
- if !res.is_ok() { return Err(DecoderError::InvalidData); }
- let mut bufinfo = res.unwrap();
- let mut buf = bufinfo.get_vbuf().unwrap();
-
- let cu_w = hdr.get_width_cu();
- let cu_h = hdr.get_height_cu();
- self.pu_stride = cu_w << 3;
- self.pu_info.resize(self.pu_stride * (cu_h << 3), PUInfo::default());
- self.blk_stride = cu_w << 4;
- self.blk_info.truncate(0);
- self.blk_info.resize(self.blk_stride * (cu_h << 4), BlockInfo::default());
- if hdr.deblock {
- self.dblk.reinit(hdr.width, hdr.height);
- }
- let mut off = hsize + ((br.tell() >> 3) as usize);
- for (cu_y, size) in slices.into_iter().enumerate() {
- self.decode_cu_line(&mut buf, &hdr, &src[off..][..size], cu_y)?;
- off += size;
- }
- if (hdr.ftype == FrameType::I) || (hdr.ftype == FrameType::P) {
- self.ipbs.add_frame(buf);
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
- frm.set_keyframe(hdr.ftype == FrameType::I);
- frm.set_pts(Some(hdr.ts as u64));
- frm.set_frame_type(hdr.ftype);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(RealVideo60Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::test_file_decoding;
- #[test]
- fn test_rv60() {
- test_file_decoding("realmedia", "assets/RV/RV60.rmhd", Some(4000), true, false, None/*Some("rv60")*/);
-//panic!("end");
- }
-}
diff --git a/src/codecs/real/rv60codes.rs b/src/codecs/real/rv60codes.rs
deleted file mode 100644
index 3b85a80..0000000
--- a/src/codecs/real/rv60codes.rs
+++ /dev/null
@@ -1,1437 +0,0 @@
-use crate::codecs::*;
-use crate::io::bitreader::BitReader;
-use crate::io::codebook::*;
-use std::mem;
-use std::ptr;
-
-const NUM_INTRA_SETS: usize = 5;
-const NUM_INTER_SETS: usize = 7;
-
-const NUM_COEFF_ENTRIES: usize = 3 * 3 * 3 * 4;
-const NUM_ESC_ENTRIES: usize = 32;
-const NUM_CBP_ENTRIES: usize = 64;
-struct CoeffCodebooks {
- l0_cb: [Codebook<u16>; 2],
- l12_cb: [Codebook<u16>; 2],
- l3_cb: [Codebook<u16>; 2],
- esc_cb: Codebook<u16>,
-}
-
-const MAX_ELEMS: usize = NUM_COEFF_ENTRIES * 8;
-struct RV60CodebookDescReader {
- len: usize,
- codes: [u32; MAX_ELEMS],
- bits: [u8; MAX_ELEMS],
-}
-
-impl RV60CodebookDescReader {
- fn new(table: &'static [u32], len: usize, ignfirst: bool) -> Self {
- let mut prefixes: [u32; 18] = [0; 18];
- let mut counts: [usize; 17] = [0; 17];
-
- let mut codes: [u32; MAX_ELEMS] = [0; MAX_ELEMS];
- let mut bits: [u8; MAX_ELEMS] = [0; MAX_ELEMS];
- for i in 0..(len + 7) >> 3 {
- let code = table[i];
- for j in 0..8 {
- if (i * 8 + j) == len { break; }
- let b = if !ignfirst || (i != 0) || (j != 0) {
- (((code >> ((7 - j) * 4)) & 0xF) as u8) + 1
- } else {
- 0
- };
- bits[i * 8 + j] = b;
- counts[b as usize] += 1;
- }
- }
- for i in 1..17 {
- prefixes[i + 1] = (prefixes[i] + (counts[i] as u32)) << 1;
- }
- for i in 0..len {
- codes[i] = prefixes[bits[i] as usize];
- prefixes[bits[i] as usize] += 1;
- }
-
- Self { len, codes, bits }
- }
-}
-
-impl CodebookDescReader<u16> for RV60CodebookDescReader {
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx] }
- fn sym (&mut self, idx: usize) -> u16 { idx as u16 }
- fn len(&mut self) -> usize { self.len }
-}
-
-impl CoeffCodebooks {
- fn init(set_no: usize, intra: bool) -> Self {
- let coeff_tabs = if intra { &RV60_INTRA_COEFFS_CB_DESC[set_no] } else { &RV60_INTER_COEFFS_CB_DESC[set_no] };
- let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l0_tab[0], NUM_COEFF_ENTRIES * 8, true);
- let l0c0 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
- let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l0_tab[1], NUM_COEFF_ENTRIES * 8, true);
- let l0c1 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
- let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l12_tab[0], NUM_COEFF_ENTRIES, true);
- let l12c0 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
- let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l12_tab[1], NUM_COEFF_ENTRIES, true);
- let l12c1 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
- let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l3_tab[0], NUM_COEFF_ENTRIES, true);
- let l3c0 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
- let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l3_tab[1], NUM_COEFF_ENTRIES, true);
- let l3c1 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
- let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.esc_tab, NUM_ESC_ENTRIES, false);
- let esc_cb = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap();
- Self {
- l0_cb: [ l0c0, l0c1 ],
- l12_cb: [ l12c0, l12c1 ],
- l3_cb: [ l3c0, l3c1 ],
- esc_cb,
- }
- }
-}
-
-pub struct RV60Codebooks {
- cbp8_cb: [[Codebook<u16>; 4]; NUM_INTER_SETS],
- cbp16_cb: [[Codebook<u16>; 12]; NUM_INTER_SETS],
- intra_coeff_cb: [CoeffCodebooks; NUM_INTRA_SETS],
- inter_coeff_cb: [CoeffCodebooks; NUM_INTER_SETS],
-}
-
-impl RV60Codebooks {
- pub fn init() -> Self {
- let mut cbp8_cb: [[Codebook<u16>; 4]; NUM_INTER_SETS];
- let mut cbp16_cb: [[Codebook<u16>; 12]; NUM_INTER_SETS];
- unsafe {
- cbp8_cb = mem::uninitialized();
- cbp16_cb = mem::uninitialized();
- for set_no in 0..NUM_INTER_SETS {
- for i in 0..4 {
- let mut cbr = RV60CodebookDescReader::new(&RV60_CBP8_TABS[set_no][i], NUM_CBP_ENTRIES, false);
- ptr::write(&mut cbp8_cb[set_no][i], Codebook::new(&mut cbr, CodebookMode::MSB).unwrap());
- }
- for i in 0..12 {
- let mut cbr = RV60CodebookDescReader::new(&RV60_CBP16_TABS[set_no][i], NUM_CBP_ENTRIES, false);
- ptr::write(&mut cbp16_cb[set_no][i], Codebook::new(&mut cbr, CodebookMode::MSB).unwrap());
- }
- }
- }
- let mut intra_coeff_cb: [CoeffCodebooks; NUM_INTRA_SETS];
- let mut inter_coeff_cb: [CoeffCodebooks; NUM_INTER_SETS];
- unsafe {
- intra_coeff_cb = mem::uninitialized();
- for set_no in 0..NUM_INTRA_SETS {
- ptr::write(&mut intra_coeff_cb[set_no], CoeffCodebooks::init(set_no, true));
- }
- inter_coeff_cb = mem::uninitialized();
- for set_no in 0..NUM_INTER_SETS {
- ptr::write(&mut inter_coeff_cb[set_no], CoeffCodebooks::init(set_no, false));
- }
- }
- Self { cbp8_cb, cbp16_cb, intra_coeff_cb, inter_coeff_cb }
- }
- fn get_c4x4_set(qp: u8, is_intra: bool) -> usize {
- if is_intra {
- RV60_QP_TO_IDX[(qp as usize) + 32]
- } else {
- RV60_QP_TO_IDX[qp as usize]
- }
- }
-}
-
-fn decode_coeff(br: &mut BitReader, cb: &Codebook<u16>, inval: i16, esc_val: i16) -> DecoderResult<i16> {
- if inval != esc_val {
- if inval != 0 && br.read_bool()? {
- Ok(-inval)
- } else {
- Ok(inval)
- }
- } else {
- let esc_sym = br.read_cb(cb)?;
- let val = (if esc_sym > 23 {
- let esc_bits = (esc_sym - 23) as u8;
- let extrabits = br.read(esc_bits)? as i16;
- (1 << esc_bits) + extrabits + 22
- } else {
- esc_sym as i16
- }) + esc_val;
- if br.read_bool()? {
- Ok(-val)
- } else {
- Ok(val)
- }
- }
-}
-
-fn quant(val: i16, q: i16) -> i16 { (val * q + 8) >> 4 }
-
-fn decode_2x2_dc(br: &mut BitReader, cb: &Codebook<u16>, coeffs: &mut [i16], stride: usize, block2: bool, dsc: usize, q_dc: i16, q_ac: i16) -> DecoderResult<()> {
- if dsc == 0 { return Ok(()); }
- let lx = RV60_DSC_TO_LX[dsc as usize];
- let l0 = ((lx >> 0) & 0xFF) as i16;
- let l1 = ((lx >> 8) & 0xFF) as i16;
- let l2 = ((lx >> 16) & 0xFF) as i16;
- let l3 = ((lx >> 24) & 0xFF) as i16;
- coeffs[0] = quant(decode_coeff(br, cb, l0, 3)?, q_dc);
- if !block2 {
- coeffs[1] = quant(decode_coeff(br, cb, l1, 2)?, q_ac);
- coeffs[stride] = quant(decode_coeff(br, cb, l2, 2)?, q_ac);
- } else {
- coeffs[stride] = quant(decode_coeff(br, cb, l1, 2)?, q_ac);
- coeffs[1] = quant(decode_coeff(br, cb, l2, 2)?, q_ac);
- }
- coeffs[stride + 1] = quant(decode_coeff(br, cb, l3, 2)?, q_ac);
- Ok(())
-}
-fn decode_2x2(br: &mut BitReader, cb: &Codebook<u16>, coeffs: &mut [i16], stride: usize, block2: bool, dsc: usize, q_ac: i16) -> DecoderResult<()> {
- if dsc == 0 { return Ok(()); }
- let lx = RV60_DSC_TO_LX[dsc as usize];
- let l0 = ((lx >> 0) & 0xFF) as i16;
- let l1 = ((lx >> 8) & 0xFF) as i16;
- let l2 = ((lx >> 16) & 0xFF) as i16;
- let l3 = ((lx >> 24) & 0xFF) as i16;
- coeffs[0] = quant(decode_coeff(br, cb, l0, 3)?, q_ac);
- if !block2 {
- coeffs[1] = quant(decode_coeff(br, cb, l1, 2)?, q_ac);
- coeffs[stride] = quant(decode_coeff(br, cb, l2, 2)?, q_ac);
- } else {
- coeffs[stride] = quant(decode_coeff(br, cb, l1, 2)?, q_ac);
- coeffs[1] = quant(decode_coeff(br, cb, l2, 2)?, q_ac);
- }
- coeffs[stride + 1] = quant(decode_coeff(br, cb, l3, 2)?, q_ac);
- Ok(())
-}
-
-fn decode_4x4_block_dc(br: &mut BitReader, cbs: &CoeffCodebooks, is_luma: bool, coeffs: &mut [i16], stride: usize, q_dc: i16, q_ac: i16) -> DecoderResult<()> {
- let tab_idx = if is_luma { 0 } else { 1 };
- let sym0 = br.read_cb(&cbs.l0_cb[tab_idx])?;
- let grp0 = (sym0 >> 3) as usize;
- let esc_cb = &cbs.esc_cb;
- if grp0 != 0 {
- decode_2x2_dc(br, esc_cb, &mut coeffs[0..], stride, false, grp0, q_dc, q_ac)?;
- }
- if (sym0 & 4) != 0 {
- let grp = br.read_cb(&cbs.l12_cb[tab_idx])? as usize;
- decode_2x2(br, esc_cb, &mut coeffs[2..], stride, false, grp, q_ac)?;
- }
- if (sym0 & 2) != 0 {
- let grp = br.read_cb(&cbs.l12_cb[tab_idx])? as usize;
- decode_2x2(br, esc_cb, &mut coeffs[2*stride..], stride, true, grp, q_ac)?;
- }
- if (sym0 & 1) != 0 {
- let grp = br.read_cb(&cbs.l3_cb[tab_idx])? as usize;
- decode_2x2(br, esc_cb, &mut coeffs[2*stride+2..], stride, false, grp, q_ac)?;
- }
- Ok(())
-}
-
-fn decode_4x4_block(br: &mut BitReader, cbs: &CoeffCodebooks, is_luma: bool, coeffs: &mut [i16], stride: usize, q_ac: i16) -> DecoderResult<()> {
- let tab_idx = if is_luma { 0 } else { 1 };
- let sym0 = br.read_cb(&cbs.l0_cb[tab_idx])?;
- let grp0 = (sym0 >> 3) as usize;
- let esc_cb = &cbs.esc_cb;
- if grp0 != 0 {
- decode_2x2(br, esc_cb, &mut coeffs[0..], stride, false, grp0, q_ac)?;
- }
- if (sym0 & 4) != 0 {
- let grp = br.read_cb(&cbs.l12_cb[tab_idx])? as usize;
- decode_2x2(br, esc_cb, &mut coeffs[2..], stride, false, grp, q_ac)?;
- }
- if (sym0 & 2) != 0 {
- let grp = br.read_cb(&cbs.l12_cb[tab_idx])? as usize;
- decode_2x2(br, esc_cb, &mut coeffs[2*stride..], stride, true, grp, q_ac)?;
- }
- if (sym0 & 1) != 0 {
- let grp = br.read_cb(&cbs.l3_cb[tab_idx])? as usize;
- decode_2x2(br, esc_cb, &mut coeffs[2*stride+2..], stride, false, grp, q_ac)?;
- }
- Ok(())
-}
-
-fn decode_cbp8(br: &mut BitReader, cbs: &[[Codebook<u16>; 4]; NUM_INTER_SETS], qp: u8, subset: usize) -> DecoderResult<u16> {
- let cb_set = RV60_QP_TO_IDX[qp as usize];
- let cbp = br.read_cb(&cbs[cb_set][subset])?;
- Ok(cbp)
-}
-
-fn decode_super_cbp(br: &mut BitReader, cbs: &[Codebook<u16>]) -> DecoderResult<u32> {
- let sym0 = br.read_cb(&cbs[0])? as u32;
- let sym1 = br.read_cb(&cbs[1])? as u32;
- let sym2 = br.read_cb(&cbs[2])? as u32;
- let sym3 = br.read_cb(&cbs[3])? as u32;
-
- // luma/chroma interleaved CBPs
- Ok(0
- + ((sym0 & 0x03) << 0)
- + ((sym0 & 0x0C) << 2)
- + ((sym0 & 0x10) << 12)
- + ((sym0 & 0x20) << 15)
- + ((sym1 & 0x03) << 2)
- + ((sym1 & 0x0C) << 4)
- + ((sym1 & 0x10) << 13)
- + ((sym1 & 0x20) << 16)
- + ((sym2 & 0x03) << 8)
- + ((sym2 & 0x0C) << 10)
- + ((sym2 & 0x10) << 14)
- + ((sym2 & 0x20) << 17)
- + ((sym3 & 0x03) << 10)
- + ((sym3 & 0x0C) << 12)
- + ((sym3 & 0x10) << 15)
- + ((sym3 & 0x20) << 18)
- )
-}
-
-pub fn rv6_decode_cbp8(br: &mut BitReader, cbs: &RV60Codebooks, subset: usize, qp: u8) -> DecoderResult<u32> {
- let cbp8 = decode_cbp8(br, &cbs.cbp8_cb, qp, subset)?;
- Ok(cbp8 as u32)
-}
-
-pub fn rv6_decode_cbp16(br: &mut BitReader, cbs: &RV60Codebooks, subset: usize, qp: u8) -> DecoderResult<u32> {
- let cb_set = RV60_QP_TO_IDX[qp as usize];
- let cbp16;
- if subset == 0 {
- cbp16 = decode_super_cbp(br, &cbs.cbp8_cb[cb_set])?;
- } else {
- cbp16 = decode_super_cbp(br, &cbs.cbp16_cb[cb_set][(subset - 1) * 4..][..4])?;
- }
- Ok(cbp16)
-}
-
-pub fn rv6_decode_cu_8x8(br: &mut BitReader, cbs: &RV60Codebooks, is_intra: bool, qp: u8, sel_qp: u8, y_coeffs: &mut [i16; 16 * 16], u_coeffs: &mut [i16; 8 * 8], v_coeffs: &mut [i16; 8 * 8], ccbp: u32, mode4x4: bool) -> DecoderResult<()> {
- let cb_set = RV60Codebooks::get_c4x4_set(sel_qp, is_intra);
- let cb = if is_intra { &cbs.intra_coeff_cb[cb_set] } else { &cbs.inter_coeff_cb[cb_set] };
- let q_y = RV60_QUANTS_B[qp as usize];
- let q_c_dc = RV60_QUANTS_B[RV60_CHROMA_QUANT_DC[qp as usize] as usize];
- let q_c_ac = RV60_QUANTS_B[RV60_CHROMA_QUANT[qp as usize] as usize];
- for i in 0..4 {
- if ((ccbp >> i) & 1) != 0 {
- let (off, stride) = if mode4x4 {
- (i * 16, 4)
- } else {
- ((i & 1) * 4 + (i & 2) * 2 * 8, 8)
- };
- decode_4x4_block(br, cb, true, &mut y_coeffs[off..], stride, q_y)?;
- }
- }
- if ((ccbp >> 4) & 1) != 0 {
- decode_4x4_block_dc(br, cb, false, u_coeffs, 4, q_c_dc, q_c_ac)?;
- }
- if ((ccbp >> 5) & 1) != 0 {
- decode_4x4_block_dc(br, cb, false, v_coeffs, 4, q_c_dc, q_c_ac)?;
- }
- Ok(())
-}
-
-pub fn rv6_decode_cu_16x16(br: &mut BitReader, cbs: &RV60Codebooks, is_intra: bool, qp: u8, sel_qp: u8, y_coeffs: &mut [i16; 16 * 16], u_coeffs: &mut [i16; 8 * 8], v_coeffs: &mut [i16; 8 * 8], ccbp: u32) -> DecoderResult<()> {
- let cb_set = RV60Codebooks::get_c4x4_set(sel_qp, is_intra);
- let cb = if is_intra { &cbs.intra_coeff_cb[cb_set] } else { &cbs.inter_coeff_cb[cb_set] };
- let q_y = RV60_QUANTS_B[qp as usize];
- let q_c_dc = RV60_QUANTS_B[RV60_CHROMA_QUANT_DC[qp as usize] as usize];
- let q_c_ac = RV60_QUANTS_B[RV60_CHROMA_QUANT[qp as usize] as usize];
- for i in 0..16 {
- if ((ccbp >> i) & 1) != 0 {
- let off = (i & 3) * 4 + (i >> 2) * 4 * 16;
- decode_4x4_block(br, cb, true, &mut y_coeffs[off..], 16, q_y)?;
- }
- }
- for i in 16..20 {
- if ((ccbp >> i) & 1) != 0 {
- let off = (i & 1) * 4 + (i & 2) * 2 * 8;
- if i == 16 {
- decode_4x4_block_dc(br, cb, false, &mut u_coeffs[off..], 8, q_c_dc, q_c_ac)?;
- } else {
- decode_4x4_block(br, cb, false, &mut u_coeffs[off..], 8, q_c_ac)?;
- }
- }
- }
- for i in 20..24 {
- if ((ccbp >> i) & 1) != 0 {
- let off = (i & 1) * 4 + (i & 2) * 2 * 8;
- if i == 20 {
- decode_4x4_block_dc(br, cb, false, &mut v_coeffs[off..], 8, q_c_dc, q_c_ac)?;
- } else {
- decode_4x4_block(br, cb, false, &mut v_coeffs[off..], 8, q_c_ac)?;
- }
- }
- }
- Ok(())
-}
-
-pub fn rv6_decode_cu_4x4in16x16(br: &mut BitReader, cbs: &RV60Codebooks, is_intra: bool, qp: u8, sel_qp: u8, y_coeffs: &mut [i16; 16 * 16], u_coeffs: &mut [i16; 8 * 8], v_coeffs: &mut [i16; 8 * 8], ccbp: u32) -> DecoderResult<()> {
- let cb_set = RV60Codebooks::get_c4x4_set(sel_qp, is_intra);
- let cb = if is_intra { &cbs.intra_coeff_cb[cb_set] } else { &cbs.inter_coeff_cb[cb_set] };
- let q_y = RV60_QUANTS_B[qp as usize];
- let q_c_dc = RV60_QUANTS_B[RV60_CHROMA_QUANT_DC[qp as usize] as usize];
- let q_c_ac = RV60_QUANTS_B[RV60_CHROMA_QUANT[qp as usize] as usize];
- for i in 0..16 {
- if ((ccbp >> i) & 1) != 0 {
- let off = i * 16;
- decode_4x4_block(br, cb, true, &mut y_coeffs[off..], 4, q_y)?;
- }
- }
- for i in 16..20 {
- if ((ccbp >> i) & 1) != 0 {
- let off = (i - 16) * 16;
- decode_4x4_block_dc(br, cb, false, &mut u_coeffs[off..], 4, q_c_dc, q_c_ac)?;
- }
- }
- for i in 20..24 {
- if ((ccbp >> i) & 1) != 0 {
- let off = (i - 20) * 16;
- decode_4x4_block_dc(br, cb, false, &mut v_coeffs[off..], 4, q_c_dc, q_c_ac)?;
- }
- }
- Ok(())
-}
-
-const RV60_QP_TO_IDX: [usize; 64] = [
- 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0
-];
-const RV60_QUANTS_B: [i16; 32] = [
- 60, 67, 76, 85, 96, 108, 121, 136,
- 152, 171, 192, 216, 242, 272, 305, 341,
- 383, 432, 481, 544, 606, 683, 767, 854,
- 963, 1074, 1212, 1392, 1566, 1708, 1978, 2211
-];
-const RV60_CHROMA_QUANT_DC: [u8; 32] = [
- 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 15, 15, 16, 17, 18, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23
-];
-const RV60_CHROMA_QUANT: [u8; 32] = [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25
-];
-
-const RV60_DSC_TO_LX: [u32; NUM_COEFF_ENTRIES] = [
- 0x00000000, 0x01000000, 0x02000000, 0x00010000, 0x01010000, 0x02010000, 0x00020000, 0x01020000, 0x02020000,
- 0x00000100, 0x01000100, 0x02000100, 0x00010100, 0x01010100, 0x02010100, 0x00020100, 0x01020100, 0x02020100,
- 0x00000200, 0x01000200, 0x02000200, 0x00010200, 0x01010200, 0x02010200, 0x00020200, 0x01020200, 0x02020200,
-
- 0x00000001, 0x01000001, 0x02000001, 0x00010001, 0x01010001, 0x02010001, 0x00020001, 0x01020001, 0x02020001,
- 0x00000101, 0x01000101, 0x02000101, 0x00010101, 0x01010101, 0x02010101, 0x00020101, 0x01020101, 0x02020101,
- 0x00000201, 0x01000201, 0x02000201, 0x00010201, 0x01010201, 0x02010201, 0x00020201, 0x01020201, 0x02020201,
-
- 0x00000002, 0x01000002, 0x02000002, 0x00010002, 0x01010002, 0x02010002, 0x00020002, 0x01020002, 0x02020002,
- 0x00000102, 0x01000102, 0x02000102, 0x00010102, 0x01010102, 0x02010102, 0x00020102, 0x01020102, 0x02020102,
- 0x00000202, 0x01000202, 0x02000202, 0x00010202, 0x01010202, 0x02010202, 0x00020202, 0x01020202, 0x02020202,
-
- 0x00000003, 0x01000003, 0x02000003, 0x00010003, 0x01010003, 0x02010003, 0x00020003, 0x01020003, 0x02020003,
- 0x00000103, 0x01000103, 0x02000103, 0x00010103, 0x01010103, 0x02010103, 0x00020103, 0x01020103, 0x02020103,
- 0x00000203, 0x01000203, 0x02000203, 0x00010203, 0x01010203, 0x02010203, 0x00020203, 0x01020203, 0x02020203
-];
-
-const RV60_CBP8_TABS: [[[u32; 8]; 4]; NUM_INTER_SETS] = [
- [
- [ 0x66666675, 0x66656553, 0x77767675, 0x77656552, 0x88878786, 0x88767663, 0x88868674, 0x87646441 ],
- [ 0x6383B594, 0xD8B7B6A2, 0x84A5B5A3, 0xD8C7B6A2, 0x94B5D5C5, 0xEAE9E8C4, 0xA4D4C4B3, 0xE9D7D6B2 ],
- [ 0x45555565, 0x56555552, 0x66666675, 0x67656552, 0x88888897, 0x88878774, 0x88978786, 0x88867661 ],
- [ 0x73639483, 0xB796A683, 0x849495A4, 0xD8C7B692, 0xA5B5C6C5, 0xEAD8D9C4, 0xA5B5B5C4, 0xE9D8D7B1 ],
- ], [
- [ 0x66666675, 0x66656553, 0x77767675, 0x77656552, 0x88878786, 0x88767663, 0x88868674, 0x87646441 ],
- [ 0x6383B594, 0xD8B7B6A2, 0x84A5B5A3, 0xD8C7B6A2, 0x94B5D5C5, 0xEAE9E8C4, 0xA4D4C4B3, 0xE9D7D6B2 ],
- [ 0x45555565, 0x56555552, 0x66666675, 0x67656552, 0x88888897, 0x88878774, 0x88978786, 0x88867661 ],
- [ 0x73639483, 0xB796A683, 0x849495A4, 0xD8C7B692, 0xA5B5C6C5, 0xEAD8D9C4, 0xA5B5B5C4, 0xE9D8D7B1 ],
- ], [
- [ 0x45555565, 0x56545543, 0x66666675, 0x67656553, 0x77777786, 0x78767664, 0x77867675, 0x87656551 ],
- [ 0x41848493, 0x86959582, 0x73A584A4, 0xA7B7A7A4, 0x84C6C6D6, 0xD9D8D8C5, 0x94D5B4D4, 0xD9D8D7D4 ],
- [ 0x34544554, 0x45444442, 0x66766675, 0x67656552, 0x88988897, 0x89877774, 0x99989896, 0x99868663 ],
- [ 0x52637373, 0x86857562, 0x84958494, 0xB8A79582, 0x94B6B6B6, 0xDAC8C8A4, 0x95B6A6C5, 0xDAC8C7A3 ],
- ], [
- [ 0x34445565, 0x45445443, 0x66667675, 0x77656553, 0x77777786, 0x78667664, 0x77867685, 0x88656552 ],
- [ 0x218383A4, 0x8696A694, 0x63B594C5, 0xC8D8C8D5, 0x63C5B5D6, 0xD9D9D9E7, 0x83C5B5E5, 0xD9E8E8D5 ],
- [ 0x24444454, 0x45443442, 0x66766675, 0x67666653, 0x78878787, 0x88777775, 0x99988797, 0x99877774 ],
- [ 0x41636373, 0x85757462, 0x73958595, 0xB8A79684, 0x84A6A6B6, 0xD9B8C8A5, 0x95B6A6B6, 0xDAC8C8B5 ],
- ], [
- [ 0x34444455, 0x45444443, 0x66666675, 0x67656653, 0x67777786, 0x78667664, 0x77767685, 0x87656553 ],
- [ 0x208494C5, 0xA8B7E9D7, 0x63C5B5E6, 0xEAEAEAE7, 0x63C6C6E7, 0xEBEAEBE8, 0x84D5C6E6, 0xEBEAEAE6 ],
- [ 0x23333454, 0x35443443, 0x67766676, 0x67666665, 0x77777787, 0x78777775, 0x99988898, 0x99888886 ],
- [ 0x40636374, 0x96757563, 0x749596A6, 0xB9A8A896, 0x84A6A6A7, 0xCAB8B9A7, 0x86A7B7C7, 0xDBC9DAB7 ],
- ], [
- [ 0x24444455, 0x35444443, 0x56666676, 0x67666664, 0x67777787, 0x78667665, 0x77767685, 0x78667663 ],
- [ 0x109495E7, 0xDAD9EAE8, 0x63C6C6E7, 0xECEBEBE9, 0x64C7C7E9, 0xEDEBECE9, 0x84D6D7E7, 0xECEBEBE8 ],
- [ 0x13343454, 0x35443444, 0x67776787, 0x68777776, 0x67777787, 0x79787886, 0x899988A8, 0x9A998997 ],
- [ 0x30535374, 0x87767665, 0x738586A7, 0xB9A9A9A7, 0x749697A8, 0xCAA9B9A8, 0x85A7B8C8, 0xDCCADAC8 ],
- ], [
- [ 0x13343455, 0x35454544, 0x56666777, 0x67676776, 0x67777787, 0x78777776, 0x77777787, 0x78777776 ],
- [ 0x018485D7, 0xDADADAD9, 0x53B6C7D9, 0xDDDCDCDB, 0x54C7C8DA, 0xDDDCDDDB, 0x64D7D8DA, 0xDDDDDDDB ],
- [ 0x03353456, 0x35464666, 0x67887899, 0x798A8999, 0x68898899, 0x8A9A9999, 0x8AAA9ABB, 0xABABABBA ],
- [ 0x10536487, 0x98879887, 0x74A7A8CA, 0xDCCBDBDA, 0x74A7B8CA, 0xDCDBCCCB, 0x85B8C9DB, 0xDDDCDDDB ]
- ]
-];
-
-const RV60_CBP16_TABS: [[[u32; 8]; 12]; NUM_INTER_SETS] = [
- [
- [ 0x8563A594, 0xA795B7A4, 0x9584B5A4, 0xB8A6C7A3, 0x9674B6A4, 0xB8A6D8B2, 0xA594C4C3, 0xD8C6C6B1 ],
- [ 0x02525474, 0x87978695, 0x56858797, 0xAAA9A796, 0x56A6A9DA, 0xEEEDECFB, 0x98B7B9D8, 0xFDDAEAC8 ],
- [ 0x02545475, 0x67867674, 0x55978696, 0xA9B8A784, 0x459897B9, 0xBBDBCAD9, 0x87B8A6C7, 0xCBDAD8C5 ],
- [ 0x03553364, 0x66876474, 0x67988585, 0xA8978474, 0x6BCCCACB, 0xCCCCCCCA, 0xBBCBCAB9, 0xCBB9B997 ],
- [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ],
- [ 0x35555565, 0x46555553, 0x56666675, 0x67656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ],
- [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ],
- [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ],
- [ 0x85639684, 0x9685A672, 0x96859594, 0xB795A582, 0xA786C7B6, 0xC9B7C8A3, 0xA796B5A3, 0xC7B6B591 ],
- [ 0x12534363, 0x66867473, 0x45766575, 0x98A89694, 0x65A786A7, 0xCBDBC9C6, 0x87A897B6, 0xCBD9B8C4 ],
- [ 0x12435464, 0x66757673, 0x44657585, 0x87979783, 0x558697A7, 0xA9A8B9A6, 0x879796A6, 0xB9B8B8A4 ],
- [ 0x02454464, 0x66867484, 0x579986A5, 0xA9B8A5A4, 0x79BAA9C9, 0xDCDBDAD7, 0xABDCCAD8, 0xDDDBD9C5 ],
- ], [
- [ 0x8563A594, 0xA795B7A4, 0x9584B5A4, 0xB8A6C7A3, 0x9674B6A4, 0xB8A6D8B2, 0xA594C4C3, 0xD8C6C6B1 ],
- [ 0x02525474, 0x87978695, 0x56858797, 0xAAA9A796, 0x56A6A9DA, 0xEEEDECFB, 0x98B7B9D8, 0xFDDAEAC8 ],
- [ 0x02545475, 0x67867674, 0x55978696, 0xA9B8A784, 0x459897B9, 0xBBDBCAD9, 0x87B8A6C7, 0xCBDAD8C5 ],
- [ 0x03553364, 0x66876474, 0x67988585, 0xA8978474, 0x6BCCCACB, 0xCCCCCCCA, 0xBBCBCAB9, 0xCBB9B997 ],
- [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ],
- [ 0x35555565, 0x46555553, 0x56666675, 0x67656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ],
- [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ],
- [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ],
- [ 0x85639684, 0x9685A672, 0x96859594, 0xB795A582, 0xA786C7B6, 0xC9B7C8A3, 0xA796B5A3, 0xC7B6B591 ],
- [ 0x12534363, 0x66867473, 0x45766575, 0x98A89694, 0x65A786A7, 0xCBDBC9C6, 0x87A897B6, 0xCBD9B8C4 ],
- [ 0x12435464, 0x66757673, 0x44657585, 0x87979783, 0x558697A7, 0xA9A8B9A6, 0x879796A6, 0xB9B8B8A4 ],
- [ 0x02454464, 0x66867484, 0x579986A5, 0xA9B8A5A4, 0x79BAA9C9, 0xDCDBDAD7, 0xABDCCAD8, 0xDDDBD9C5 ],
- ], [
- [ 0x63638493, 0x8696A6B4, 0x63847493, 0x87A696A4, 0x749595B4, 0xB8D7B7C4, 0x84A494A2, 0xA7B6A6D3 ],
- [ 0x02333455, 0x57677776, 0x56767797, 0x899A99A9, 0x78B8BADA, 0xDDDDDCDC, 0x98C8D9D9, 0xDDDCDCD9 ],
- [ 0x02444466, 0x56666666, 0x55776575, 0x77877575, 0x67AAA9DB, 0xCDDBDCDA, 0x98CAA7C8, 0xDCDBC9D8 ],
- [ 0x02452366, 0x56896698, 0x46786689, 0x789A88B9, 0xACCCCCCC, 0xCCCCCCCC, 0xCCCCCCCC, 0xCCCCCDDC ],
- [ 0x23443454, 0x45444443, 0x56666675, 0x67666663, 0x78878897, 0x89878775, 0x89979796, 0x99878773 ],
- [ 0x24344454, 0x35444443, 0x56666676, 0x67656663, 0x78888897, 0x89878775, 0x89979896, 0x99868773 ],
- [ 0x23443454, 0x45444443, 0x56666676, 0x67666663, 0x68888897, 0x89877775, 0x88988896, 0x99877673 ],
- [ 0x24344455, 0x35444443, 0x56666676, 0x67666653, 0x68888897, 0x89878774, 0x89989897, 0x99877763 ],
- [ 0x63537473, 0x85748562, 0x73848484, 0x96959683, 0x8596A5A4, 0xC8A7B794, 0x85A595A4, 0xC7B6B6A3 ],
- [ 0x02443374, 0x77867684, 0x568776A7, 0xA9BAA8B6, 0x78C9A8C9, 0xDDECDAD7, 0x99B8B9C8, 0xEDEAEAD6 ],
- [ 0x02445565, 0x56656664, 0x55878686, 0x98978674, 0x67A9A8C9, 0xABAACAB7, 0x87B9A7B8, 0xDBDAC9B6 ],
- [ 0x02553264, 0x66877585, 0x67997697, 0x98B997A6, 0x9ACBA9DA, 0xDDDCDBC8, 0xCCDCDADA, 0xDCDCDAD8 ],
- ], [
- [ 0x626383A3, 0x97A6C6C4, 0x538484B4, 0xA8C7C7E5, 0x74A4B5D5, 0xD9E8E8E5, 0x73B3B3E3, 0xC8E7E7E4 ],
- [ 0x02324464, 0x78778786, 0x569697C8, 0xBCCCCCCA, 0x88B8BACB, 0xCCCCCCCB, 0xA8B8CAC9, 0xCCCCCCCA ],
- [ 0x02444466, 0x46666767, 0x35775588, 0x78A988A8, 0x68CBB8CB, 0xCDCBDDDB, 0x98CAB8CA, 0xCCCCCBCA ],
- [ 0x02452366, 0x56987697, 0x38AA79AB, 0x9ABBBBBA, 0xBBBBBBBB, 0xBBBBBBBB, 0xBBBBBBBB, 0xBBBBBBBB ],
- [ 0x13343454, 0x45444553, 0x56666676, 0x67766675, 0x68878897, 0x89888885, 0x89989897, 0x99888885 ],
- [ 0x13344454, 0x35444543, 0x56667786, 0x78766765, 0x68888898, 0x89878875, 0x89989898, 0x99878885 ],
- [ 0x13343454, 0x35454453, 0x56766786, 0x78776675, 0x68888898, 0x89888786, 0x899898A8, 0x9A988785 ],
- [ 0x14343455, 0x35444543, 0x56676777, 0x67776764, 0x68888898, 0x89878875, 0x89989898, 0x99888875 ],
- [ 0x51536373, 0x85758573, 0x63848495, 0xA796A694, 0x749595A5, 0xB8B7B8A5, 0x85A695A5, 0xB9B7B8A5 ],
- [ 0x02433454, 0x67867674, 0x569787A7, 0xBBC9C9B7, 0x78B8A9C8, 0xDDDADBC8, 0x99A8BAC8, 0xDDDADBC7 ],
- [ 0x02444465, 0x56556664, 0x55876686, 0x88988786, 0x68AAA8BA, 0xABBACAB8, 0x87BA98C9, 0xCCCBCAB8 ],
- [ 0x02452364, 0x66877585, 0x57AA88B9, 0xA9CABAB8, 0x8ABAA9CA, 0xCCBBBBB9, 0xBBBBBBBB, 0xBBBBBBB9 ],
- ], [
- [ 0x716383B3, 0xB8D7D7E4, 0x6394A4D4, 0xC9E8E8E5, 0x73B5B5E5, 0xEAE9E9E6, 0x83C4C4E4, 0xE9E8E7E4 ],
- [ 0x01334575, 0x99A8A9B7, 0x66A7B8C8, 0xCCCCCCC8, 0x77B8CAC9, 0xCCCCCCCB, 0x98C8C9C9, 0xCCCCCBCA ],
- [ 0x01444486, 0x57777897, 0x55A876B8, 0xCACAB9C8, 0x67CAC8CA, 0xCCCACBCA, 0x98CAC8C9, 0xCCCCCBCA ],
- [ 0x01562486, 0x799998A8, 0x6AAA9999, 0x99999999, 0x99999999, 0x99999999, 0x9999999A, 0xAAAAAAA9 ],
- [ 0x13343454, 0x35444443, 0x56767787, 0x78777776, 0x67877797, 0x79888886, 0x899898A8, 0x9A999997 ],
- [ 0x13333454, 0x35444543, 0x57777787, 0x78777776, 0x67778898, 0x89888886, 0x899999A9, 0x9A989997 ],
- [ 0x13343454, 0x35453443, 0x57777787, 0x78777776, 0x67887798, 0x89888886, 0x899998A9, 0x9A999997 ],
- [ 0x13343454, 0x35443543, 0x57777787, 0x78777776, 0x68887898, 0x79888876, 0x899999A9, 0x9A999987 ],
- [ 0x60636384, 0x86859684, 0x63858596, 0xA8A7A8A6, 0x749696A6, 0xB9A8B9A6, 0x85A6A7B7, 0xC9B8C9B7 ],
- [ 0x02333454, 0x77768775, 0x678798A7, 0xCBB9CAB7, 0x6897A9B8, 0xDDC9DBB8, 0x89A8BAD8, 0xDDDADBC8 ],
- [ 0x02344465, 0x56556664, 0x558777A8, 0x99A9A9A8, 0x679A98CA, 0xABBBBAB9, 0x78BA98CB, 0xCCCCCBCA ],
- [ 0x01453366, 0x67777676, 0x79BBBABB, 0xBBBBBBB9, 0x8ABBABBB, 0xBBBBBBBA, 0xBBBBBBBB, 0xBBBBBBBB ],
- ], [
- [ 0x816383C4, 0xB9D8D8E5, 0x62A4B4E5, 0xEAE9E9E6, 0x63B5B5E6, 0xEAEAEAE7, 0x82C4C4E5, 0xEAE9E9E5 ],
- [ 0x01335485, 0x9AB9A8B7, 0x7697B8B8, 0xBBBBBBB9, 0x67B8BABB, 0xBBBBBBBB, 0x98B7BABA, 0xBBBBBBBB ],
- [ 0x01445396, 0x78879AA6, 0x559897A9, 0xAAA9AAA9, 0x67A9A9AA, 0xAA9AAAAA, 0x97A9A8AA, 0xAAAAAAAA ],
- [ 0x02643476, 0x76777776, 0x67777777, 0x77777777, 0x77777777, 0x77777777, 0x77777777, 0x77777777 ],
- [ 0x03343455, 0x46564665, 0x57777898, 0x79898888, 0x688888A8, 0x89999998, 0x899999B9, 0xABAAAAA9 ],
- [ 0x03344555, 0x36454655, 0x67788898, 0x79888998, 0x68888999, 0x8A899998, 0x899AAABA, 0xABAAAAA9 ],
- [ 0x03443465, 0x36564555, 0x57887898, 0x79898898, 0x688988A9, 0x8A998998, 0x89AA99BA, 0xABAAAAA9 ],
- [ 0x03344556, 0x36454655, 0x57787899, 0x79898988, 0x68898999, 0x8A898998, 0x8AAAAABA, 0x9BABABA9 ],
- [ 0x50536374, 0x86859685, 0x53858596, 0xA8A8B8A6, 0x648696A7, 0xB9A8B9B7, 0x759797B7, 0xB9B9CAC8 ],
- [ 0x02324465, 0x78768886, 0x668698A8, 0xBBB9CBB9, 0x6797A9B9, 0xCCB9CCB9, 0x7897BBC9, 0xCCCACCCA ],
- [ 0x02354366, 0x46666665, 0x458987BA, 0x9AAABAA9, 0x58AB99CA, 0xACBBBABA, 0x78BCA9CB, 0xCCCCCBCB ],
- [ 0x01453466, 0x66766675, 0x79AAA9AA, 0xAAAAAAAA, 0x7AAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA ],
- ], [
- [ 0x807473D6, 0xC9C9E9E7, 0x52B6A5E7, 0xDBEAEAE8, 0x53B6B6E8, 0xEBEAEBE9, 0x63C5B5E7, 0xEBEAEAE7 ],
- [ 0x01435495, 0x99999999, 0x66989999, 0x99999999, 0x57989999, 0x99999999, 0x97979999, 0x999999AA ],
- [ 0x01445487, 0x77778787, 0x55888888, 0x88999999, 0x57999999, 0x99999999, 0x77999999, 0x99999999 ],
- [ 0x03675677, 0x76666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66777777, 0x77666677 ],
- [ 0x02343566, 0x36575777, 0x588988AA, 0x8A9A9AAA, 0x588989BA, 0x8A9BAABA, 0x7AA9AABB, 0xACBCBCCB ],
- [ 0x03343556, 0x36464666, 0x577888A9, 0x8A8A9AAA, 0x588989AA, 0x8A9A9BBA, 0x7A9AAACB, 0xABABBCBA ],
- [ 0x03343466, 0x36564666, 0x578978A9, 0x7A9A8AA9, 0x578979AA, 0x8A9B99AA, 0x79AA9ABB, 0x9BABAABA ],
- [ 0x03343556, 0x36464666, 0x588979AA, 0x7B8A8A9A, 0x588989AA, 0x8A9A9AAA, 0x7AAB9ABB, 0x9BABABBA ],
- [ 0x50535385, 0x879797A7, 0x438686A8, 0xA9B9BAD9, 0x438686B8, 0xB9CACBDA, 0x649797C9, 0xBACADBDA ],
- [ 0x01334677, 0x78778887, 0x5797AAAB, 0xBBBBBBBB, 0x6898BBBB, 0xBBBAAAAA, 0x8AA9AAAA, 0xAAAAAAAA ],
- [ 0x01464488, 0x46566677, 0x57AAAAAA, 0xAAAAAAAA, 0x5AAAAAAA, 0xAAAAAAAA, 0x8AAAAAAA, 0xAAAAAAAA ],
- [ 0x02453466, 0x67777777, 0x77777777, 0x77777777, 0x77777777, 0x77777777, 0x77777777, 0x77777788 ],
- ]
-];
-
-struct CoeffsCBDesc {
- l0_tab: [[u32; 108]; 2],
- l12_tab: [[u32; 14]; 2],
- l3_tab: [[u32; 14]; 2],
- esc_tab: [u32; 4],
-}
-const RV60_INTRA_COEFFS_CB_DESC: [CoeffsCBDesc; NUM_INTRA_SETS] = [
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF6464655, 0x68677866, 0x9C9BAB99, 0x58576766, 0x8A788977, 0xBDBCCCA9, 0x8B8A9A88, 0xBD9ABB98,
- 0xBEBCCDA9, 0x58676766, 0x7A888877, 0xBDBCBCA9, 0x79788876, 0x9B999987, 0xDECCCCA9, 0xACAABB98,
- 0xCEABCCA9, 0xEECCDEB9, 0x8B9A8A88, 0xBDBBAB98, 0xBEBDBCA9, 0xADABAB98, 0xCEBCBBA9, 0xEEDDCDB9,
- 0xBEBCBCA9, 0xDECCCDA9, 0xDECDDDA8, 0x47566766, 0x79788877, 0xBDABBCA9, 0x59677876, 0x8A899987,
- 0xCEBCCCA9, 0x9C9AAB98, 0xBDAABC98, 0xDEBCDDB9, 0x69787876, 0x8A898987, 0xCECCCCA9, 0x7A898977,
- 0x9B9A9A87, 0xDECCCDBA, 0xADAABB98, 0xBEABBC98, 0xEECCDEB9, 0x9CAB9A98, 0xBDBCAB99, 0xDECDCCB9,
- 0xADBBAB98, 0xBEBCBBA9, 0xEEDDCCA9, 0xCEBCCCA9, 0xDECCCCA9, 0xEECCCD98, 0x69798987, 0x9B9AAA98,
- 0xBEBDCDBA, 0x8B899A88, 0xACAAAB98, 0xEEDDDDCA, 0xAD9BAB98, 0xCEBBCCA9, 0xDECDDEB9, 0x8B899A88,
- 0xACAAAB98, 0xEEDDDDCA, 0x9B9A9A98, 0xADABABA9, 0xEEDDDEBA, 0xBEABBCA9, 0xCEBCCCA9, 0xEECDEEB9,
- 0xADABAB99, 0xCECCBCA9, 0xDEDECDBA, 0xBEBCACA9, 0xCECCBCA9, 0xEEDECDB9, 0xCEBCCCA9, 0xDECCCDA9,
- 0xEECCCD98, 0x9C9AAA98, 0xBDBBBB98, 0xEEDDDDB9, 0x9C9A9A98, 0xBDBBBB98, 0xEEDDDDB9, 0xADAAAB97,
- 0xCEABBB98, 0xEECCCD97, 0x9C9AAB98, 0xBDABBB98, 0xEEDDDDB9, 0x9C9AAB98, 0xBEABBB98, 0xEEDDDDB9,
- 0xADAAAB97, 0xBEABBB97, 0xEEBBCC97, 0xADABAB98, 0xCEBBBB98, 0xEECDCC98, 0xADABAB98, 0xBEBBAB98,
- 0xEECCBC97, 0xBDAAAB87, 0xAD9AAB86, 0xCE9A9A75
- ], [
- 0xF6374878, 0x59798B9A, 0xDEDDEEDC, 0x49597A89, 0x8B8AACAA, 0xEEDEEEDD, 0x9D9BBDAB, 0xBEACDEBC,
- 0xEEDEEEDD, 0x49796A89, 0x8B9A9CAA, 0xEEDEEEDD, 0x7B8A9B9A, 0x9DABADAB, 0xEEDEEEDD, 0xBEACCEBC,
- 0xCEBDDECC, 0xEEEEEEDD, 0x9DBC9CAB, 0xBECDBDBC, 0xEEEEEEDD, 0xBEBDBDBC, 0xCECDBECC, 0xEEEEEEDD,
- 0xDEDEDECC, 0xEEDEDECD, 0xEEEEEEDC, 0x17485979, 0x6A798B9A, 0xEEDDDECC, 0x49697A89, 0x8B8AACAA,
- 0xEEDDEEDD, 0x9D8BBDAB, 0xBEACCEBC, 0xEEDEEEDD, 0x49797A89, 0x8C9B9CAA, 0xEEDEEEDD, 0x6B8A9B9A,
- 0x9D9BACAB, 0xEEDEEEDD, 0xAEACCEBB, 0xCEBDDEBC, 0xEEDEEEDD, 0x9DBC9CAB, 0xBECDBDBC, 0xEEEEDEDD,
- 0xAEBCBDBB, 0xCECDBDBC, 0xEEEEDEDD, 0xDEDEDECC, 0xDEDEDECC, 0xEEEEEECC, 0x39697A89, 0x8B9B9CAA,
- 0xEEDEEEDD, 0x6B7A9B9A, 0x9C9BBDAB, 0xEEEEEEDD, 0x9E9CBEBB, 0xBEBCDECC, 0xEEEEEEDD, 0x6B8A8B9A,
- 0x9DABACAB, 0xEEEEEEDD, 0x7C9B9CAB, 0x9DACBDBB, 0xEEEEEEDD, 0xAEACCEBC, 0xBEBDDECC, 0xEEDEEEDD,
- 0x9EBC9DBB, 0xBECDBDBC, 0xEEEEEEDD, 0xAEBDBDBC, 0xBECEBECC, 0xEEEEDEDD, 0xDEDEDECC, 0xDEDEDECC,
- 0xEEDEDECC, 0x6A7A8B99, 0x9C9BACAA, 0xEEDDDECC, 0x7B8A9B9A, 0x9DABACAB, 0xEEDDDECC, 0x9D9BAC9A,
- 0xBEACBDAB, 0xEEDDDEBB, 0x7B8A8B9A, 0x9DABACAB, 0xEEDDDECC, 0x7C9B9C9A, 0x9DABADAB, 0xEEDEDECC,
- 0x9D9BADAA, 0xAEACBDAA, 0xEECDDEBB, 0x8D9B9C9A, 0xBEBCACAA, 0xEEDECDBB, 0x9DAC9C9A, 0xAEBCACAA,
- 0xDEDECDBB, 0xAEACAC99, 0xAEACAC99, 0xCEABAB98
- ]],
- l12_tab: [
- [
- 0xF3624857, 0x82484587, 0x89578689, 0x89924735, 0x86794585, 0x69789679, 0x78989957, 0x867A7896,
- 0x7A78A89A, 0x79989A99, 0x97897897, 0x8878A789, 0x78888988, 0x87760000
- ], [
- 0xF3915968, 0xB25957A8, 0x9B78B89C, 0xBBC15936, 0xA79B46A5, 0x7A89C79B, 0x9ACBBC57, 0xB68B8AC6,
- 0x8B79C9AC, 0x9ACAACBB, 0xC79B89C9, 0xAB8AC8AC, 0x9AB9ACAA, 0xCAAB0000
- ]],
- l3_tab: [
- [
- 0xF3524747, 0x83574687, 0x8A588789, 0x89914735, 0x86894685, 0x6988A789, 0x89A9AA47, 0x868A79A6,
- 0x8A78A9AB, 0x7AA9AB9A, 0xA79A89A9, 0x9A89A99A, 0x99A9AA9A, 0xA9980000
- ], [
- 0xF4B16C7A, 0xE37C68CA, 0xBE9BEABE, 0xCCE06B37, 0xC8BE58C7, 0x9CABEABE, 0xACECDD68, 0xC79DACE8,
- 0xAD9ADBCE, 0xBCEBCEDD, 0xEAACABDC, 0xDEBBDBCD, 0xCDECDECD, 0xEDDD0000
- ]],
- esc_tab: [ 0x01334555, 0x66777788, 0x88999AAA, 0x999BCEED ],
- },
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF5364655, 0x58687877, 0xBECDCDBA, 0x48576766, 0x7A798988, 0xDECDDDBB, 0x9C8AAB99, 0xBE9BBCA9,
- 0xEECCDEBA, 0x48676766, 0x7A898978, 0xDECDCDBA, 0x6A797977, 0x8B9A9A88, 0xEECDCDBA, 0xADABBCA9,
- 0xBEACCDAA, 0xEECDDEBA, 0x9CAB8A99, 0xBDBC9BA9, 0xDEDECCBA, 0xBDBCAB99, 0xBEBDACAA, 0xEEDECDB9,
- 0xCECDCDA9, 0xDECDCDA9, 0xEECDCDA8, 0x37575766, 0x79798977, 0xDECDCDBA, 0x59687877, 0x8B8A9A88,
- 0xEECDDDBA, 0x9C9AAC99, 0xBEABBCA9, 0xEECDDEBA, 0x59786877, 0x8B8A8A88, 0xEEDDCDBA, 0x7A898988,
- 0x9B9A9A99, 0xEECDCDBA, 0xADABBC99, 0xBEABBDA9, 0xEEBDDEA9, 0x9DAB9A99, 0xBEBCABA9, 0xEEDECCBA,
- 0xADBCABA9, 0xBEBCACA9, 0xEEDEBCA9, 0xCECDCDA9, 0xDEBDBDA9, 0xEECDCD98, 0x6A798A88, 0x9C9BAB99,
- 0xEEDEDECB, 0x7B8A8A99, 0xACABABA9, 0xEEDEEECB, 0xAD9BBCA9, 0xBEACCDAA, 0xEECDEEBA, 0x8B9A8A99,
- 0xADABABA9, 0xEEEEDECB, 0x8C9B9B99, 0xADACACAA, 0xEEDEDECB, 0xBEACBCAA, 0xBEACCDAA, 0xEECDDEBA,
- 0xAEBCABA9, 0xBECDACAA, 0xEEEECDBA, 0xBEBDACAA, 0xBECDACAA, 0xEEDECDBA, 0xCECDCDA9, 0xCEBDBDA9,
- 0xEEBCCD98, 0x9C9A9B99, 0xBEBCBCA9, 0xEEDDDEBA, 0x9C9B9B99, 0xBEABACA9, 0xEEDDDDBA, 0xAD9BAB98,
- 0xBEABAC98, 0xEECCCD98, 0x9D9B9B99, 0xBEACBCA9, 0xEEDDDDBA, 0x9D9B9B99, 0xAEACACA9, 0xEEDDDDB9,
- 0xAD9BAB98, 0xAE9BAC98, 0xDEACCD98, 0xADAB9B98, 0xBEACAB98, 0xEECDCC98, 0xAEAB9B98, 0xBEACAB98,
- 0xDECCBC98, 0xAE9B9B87, 0xAE9B9B87, 0xBE8A9A75
- ], [
- 0xF7484979, 0x6A7A8BAB, 0xDEDEEEEE, 0x39598B9A, 0x8C8BADBC, 0xEEEEEEEE, 0x9E9CBEBD, 0xBEBEDECD,
- 0xEEEEEEEE, 0x3A7A6A9A, 0x8C9C9CAC, 0xEEEEEEEE, 0x6B8B9CAC, 0x9DADADBC, 0xEEEEEEDE, 0xAEBECECD,
- 0xCEBEDECD, 0xEEEEEEDE, 0x9EBD9DBD, 0xBECEADCD, 0xEEEEDEEE, 0xAECEBECD, 0xBEDEBECD, 0xEEEEDEDE,
- 0xDEDEDECD, 0xEEDEDECD, 0xEEEEEEDD, 0x18585A8A, 0x6A8A9BAB, 0xEEEEEEDE, 0x4A6A8B9B, 0x8C9BADBC,
- 0xEEEEEEEE, 0x8E8DBEBC, 0xBEADDECD, 0xEEDEEEEE, 0x4A7A6B9B, 0x8C9C9CAC, 0xEEEEEEEE, 0x6C8B9CAC,
- 0x8D9DADBC, 0xEEDEEEDE, 0xAEADCECD, 0xBEBEDECD, 0xEEDEEEDE, 0x8EBD8DBC, 0xBECEADCD, 0xEEEEDEDE,
- 0xAECEAEBD, 0xBECEAECD, 0xEEEEDEDD, 0xDEDEDECD, 0xDEDEDECD, 0xEEDEDECC, 0x3A6A7B9B, 0x8C9B9CBC,
- 0xEEEEEEEE, 0x5B7B8CAB, 0x9DACADBC, 0xEEEEEEEE, 0x8E9DBEBC, 0xBEBEDECD, 0xEEEEEEEE, 0x5B8B7CAB,
- 0x9DADADBD, 0xEEEEEEEE, 0x7C9C9DAC, 0x9DADADBD, 0xEEEEEEEE, 0xAEAECECD, 0xBEBEDECD, 0xEEDEEEDD,
- 0x9EBE9DBC, 0xBECEAECD, 0xEEEEDEEE, 0xAECEAECD, 0xBECEAECD, 0xEEEEDEDD, 0xCECEDECD, 0xCEDECECD,
- 0xEEDEDECC, 0x5B7B8B9B, 0x9D9CACAC, 0xEEDEDECC, 0x6C8C8C9B, 0x9DACADAC, 0xEEDEDECC, 0x8E8C9CAB,
- 0xAEADBDAB, 0xEEDEDECB, 0x6C8B8C9B, 0x9DADADAC, 0xEEDEDECC, 0x7C9C9CAB, 0x9DADADAC, 0xEEDEDECC,
- 0x8E9CADAB, 0x9E9CADAB, 0xDECDDEBB, 0x8D9C8C9B, 0xAEBDADAB, 0xEEDECECB, 0x8EAD9CAB, 0x9EAD9CAB,
- 0xDEDEBDBB, 0x9EACAC9A, 0x9DAC9C9A, 0xBDABAB99
- ]],
- l12_tab: [
- [
- 0xF3824968, 0x92494597, 0x89679789, 0x99924935, 0x96793595, 0x69789689, 0x78989857, 0xA67A78A6,
- 0x7A78A889, 0x89A89999, 0x87897897, 0x78789789, 0x77878878, 0x87760000
- ], [
- 0xF4B26C7A, 0xD26C58DA, 0xBD8AEABE, 0xCDE05C37, 0xC8AD47C6, 0x8CAAD9BD, 0xABECCE58, 0xC79D9BD7,
- 0xAD8ADABE, 0xACEBCECC, 0xE8AC9ACA, 0xBD9AD9BD, 0xABDACEBC, 0xDBCD0000
- ]],
- l3_tab: [
- [
- 0xF3824968, 0xA24946A8, 0x9B78A89A, 0x9AA14936, 0xA78A36A5, 0x7A89A89A, 0x89A99957, 0xA68B89B6,
- 0x8B78B99B, 0x89B9ABAA, 0xA79A89A8, 0x9989A89A, 0x89999999, 0x98880000
- ], [
- 0xF4B16C9B, 0xE36D58DA, 0xBE9BEABE, 0xCCE05B47, 0xD9BE47C7, 0x8CABEABE, 0xABECCE68, 0xB8ADBCE8,
- 0x9D9ACCCE, 0xBCEBDEDE, 0xEAABBBCD, 0xEEBCDBCD, 0xDDECDEDD, 0xEDDE0000
- ]],
- esc_tab: [ 0x02233455, 0x56667788, 0x88999AAA, 0x999BDDDD ],
- },
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF8484878, 0x6A7A7A89, 0xDECDCDBA, 0x4A597A89,
- 0x7B8A8B99, 0xDECDCDBA, 0x8E8BAD99, 0xAE8BBD9A,
- 0xDEBCCDAA, 0x4A7A5989, 0x7B8B8A99, 0xDECDCDBA,
- 0x6C7B8B89, 0x8C8B8B99, 0xDECDBDBA, 0xAE9CBD9A,
- 0xAE9CBD9A, 0xDEBCCDA9, 0x8EAC7B99, 0x9EBD8B9A,
- 0xDECEBCAA, 0xAEAD9C99, 0xAEBD9C9A, 0xDECDBCA9,
- 0xCEBDBDA9, 0xCEBDBD99, 0xEEBCBC98, 0x29595989,
- 0x7B8A8A99, 0xDECDCDBA, 0x4B6A7A89, 0x7C8B8B99,
- 0xDECDCDBA, 0x8E8BAC99, 0xAE8BBD9A, 0xDEBCCEA9,
- 0x5B7A6A89, 0x7C9B8A99, 0xDECDCCBA, 0x6C8B8B99,
- 0x8C8B8B99, 0xDECDCDBA, 0x9E9CAD99, 0xAE9BBD99,
- 0xDEACCDA9, 0x8EAC7B99, 0xAEBD8B99, 0xDECEBCA9,
- 0x9EAD9C99, 0xAEAD9C9A, 0xDECDACA9, 0xCEBDBD99,
- 0xCEACBC99, 0xDEACBC98, 0x5C7B7B99, 0x9D9B9BAA,
- 0xEEDDDDBB, 0x6C7B8B9A, 0x9D9BACAA, 0xEEDDDDBB,
- 0x9E8CAC99, 0xAE9CBDAA, 0xEEBDDEAA, 0x6C8B8B9A,
- 0x9D9C9CAA, 0xEEDDDDBB, 0x7D8B8C9A, 0x9D9C9CAA,
- 0xEECDCDBA, 0x9E9CAD9A, 0x9E8CBDAA, 0xDEACCEA9,
- 0x9EAC8B99, 0xAEBD9CAA, 0xDEDEBCAA, 0x9EAD9C9A,
- 0x9EBD9CAA, 0xDECEACA9, 0xBEBDBD99, 0xAEACAC99,
- 0xCEABAC88, 0x8D9C9C99, 0xAEACAC9A, 0xEEDDCDB9,
- 0x8D9C8C99, 0xAEACAC99, 0xEEDDCDB9, 0x9D8B9B88,
- 0xAE9CAC88, 0xDEBCCC98, 0x8E8C9C99, 0xAEACACAA,
- 0xEEDDCDB9, 0x7E8C8C99, 0x9EAC9C9A, 0xEECDCDA9,
- 0x8E8B9B88, 0x9E8B9C88, 0xCEABBC98, 0x9E9B8B88,
- 0xAE9C9C88, 0xDECCBC98, 0x9E9B8B88, 0x9E9B8B88,
- 0xDEBCAB98, 0x9E8B9B77, 0x8D8A8A77, 0x9D798965,
- ], [
- 0xFA5C5BAD, 0x7CAD9DCE, 0xEEEEEEEE, 0x4D7D9EBD,
- 0x8EAEBEDE, 0xEEEEEEEE, 0x9EAEDEDE, 0xCECEEEEE,
- 0xEEEEEEEE, 0x3D9E7DBE, 0x8EBEAEDE, 0xEEEEEEEE,
- 0x7EAEAECE, 0x9EBEBEDE, 0xEEEEEEEE, 0xBECEDEDE,
- 0xCECEEEEE, 0xEEEEEEEE, 0x9EDEAEDE, 0xBEEEBEEE,
- 0xEEEEEEEE, 0xBEDEBEDE, 0xCEEECEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x0B6C6CBC,
- 0x7CAD9DCE, 0xEEEEEEEE, 0x4D7D9EBD, 0x8EAEBEDE,
- 0xEEEEEEEE, 0x9E9ECECE, 0xCEBEEEEE, 0xEEEEEEEE,
- 0x4D9E7DBD, 0x8EBEAEDE, 0xEEEEEEEE, 0x6EAE9ECE,
- 0x8EBEAECE, 0xEEEEEEEE, 0xBEBEDEDE, 0xCECEDEDE,
- 0xEEEEEEEE, 0x9ECE9EDE, 0xBEEEBEEE, 0xEEEEEEEE,
- 0xAEDEBEDE, 0xBEEEBEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0x3D8D7DBD, 0x8DAEAEDE,
- 0xEEEEEEEE, 0x5E8E9ECD, 0x9EBEBEDE, 0xEEEEEEEE,
- 0x9E9ECECE, 0xCECEEEEE, 0xEEEEEEEE, 0x5E9E8ECE,
- 0x9ECEBEDE, 0xEEEEEEEE, 0x7EAEAECE, 0x9EBEBEDE,
- 0xEEEEEEEE, 0xAEBEDEDE, 0xBEBEDEDE, 0xEEEEEEEE,
- 0x8ECE9ECE, 0xBEEEBEDE, 0xEEEEEEEE, 0xAEDEBEDE,
- 0xBEDEBEDE, 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEEEEE,
- 0xEEEEEEEE, 0x5D9E8EBD, 0x9EBEAECD, 0xEEEEEEEE,
- 0x6E9E9EBD, 0xAEBEBECE, 0xEEEEEEEE, 0x8E9EAEBD,
- 0xBEBECECD, 0xEEEEEEDE, 0x6E9E9EBD, 0xAEBEAECE,
- 0xEEEEEEEE, 0x7EAE9EBD, 0x9EBEAECD, 0xEEEEEEEE,
- 0x8E9EBEBD, 0xAEAEBEBD, 0xEEDEEEDE, 0x8EAE9EBD,
- 0xBECEBECD, 0xEEEEEEDE, 0x8EBE9EBD, 0xAEBEAEBD,
- 0xEEEEDEDE, 0xAEBEBEAC, 0xAEBDBDBC, 0xCECDBDBC,
- ]],
- l12_tab: [
- [
- 0xF4925967, 0x93595697, 0x79789889, 0x88915935, 0x96794695, 0x69779789, 0x88988846, 0x95796795,
- 0x7A67A779, 0x78988988, 0x86796796, 0x78689679, 0x77878878, 0x87760000
- ], [
- 0xF5D26E7A, 0xE27D68E9, 0xBE8BEACE, 0xCDD05C37, 0xD7AE48E6, 0x8D9BE9BE, 0xABEEEE48, 0xD69D9BE6,
- 0x9E7AEACE, 0xACEBCEED, 0xE7AD8AEA, 0xCE8BE9BE, 0xBCEBCEBC, 0xEDCE0000
- ]],
- l3_tab: [
- [
- 0xF4926968, 0xA26946A7, 0x8A78A78A, 0x89915936, 0x968A3695, 0x7978A78A, 0x78A89946, 0x957A78A5,
- 0x7A68A89A, 0x89A89A99, 0x96797898, 0x99789789, 0x89989989, 0x98880000
- ], [
- 0xF3B27C9D, 0xD26D57C9, 0xBC8BD9CD, 0xBCD04B48, 0xCACD47B6, 0x8DBBD9DD, 0xABCDBD57, 0x989CDCC7,
- 0xAC9BCCDD, 0xBBDBDDDD, 0xD99BDDDD, 0xDDBBCBAD, 0xDDDDDDCD, 0xDDDD0000
- ]],
- esc_tab: [ 0x01244556, 0x6778999A, 0xAABBCCCC, 0xCCCEEEFF ],
- },
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF8494978, 0x6A7A7A89, 0xDECDCDBB, 0x4B597A89,
- 0x7C7A8B99, 0xDECDCDBB, 0x8E8BAD9A, 0xAE8BBDAA,
- 0xDEBCCEAA, 0x3A7A5989, 0x7B8B7A99, 0xDECDCDBB,
- 0x6C8A8B89, 0x7C8B8B99, 0xDECDBDBA, 0xAE9CBD9A,
- 0xAE9CBDAA, 0xEEBCCEAA, 0x8EAD8B99, 0x9EBD8B9A,
- 0xDECEBCAA, 0xAEBD9C9A, 0xAEBD9CAA, 0xDECDBCAA,
- 0xCEBDBDAA, 0xCEBDBDA9, 0xEEBDBDA9, 0x2A595989,
- 0x7B8A8A99, 0xEECDCCBB, 0x4B6A7A89, 0x7C8B8B99,
- 0xEECDCDBB, 0x8E8BAD99, 0xAE8BBD9A, 0xDEBCCEAA,
- 0x4B7A6A89, 0x7C9B8B99, 0xEECDCCBB, 0x6C8B7B89,
- 0x7C8B8B99, 0xDEBDCDBA, 0x9E9CAD9A, 0xAE8BBD9A,
- 0xDEACCDAA, 0x8EAC7B99, 0xAEBD8B9A, 0xDECEBCAA,
- 0xAEAD9C9A, 0xAEAD8C9A, 0xDECDACAA, 0xCEBDBDA9,
- 0xBEBDBD99, 0xDEACBC98, 0x5C7B7B99, 0x9D9B9BAA,
- 0xEEDDDDBB, 0x6C7B8B9A, 0x9D9B9CAA, 0xEEDDDEBB,
- 0x9E8CAC9A, 0xAE9CBDAA, 0xEECDDEBA, 0x6D8B8B9A,
- 0x9D9C9CAA, 0xEEDDDDCB, 0x7D8B8C9A, 0x8D9C9CAA,
- 0xEECECEBB, 0x9E9CAD9A, 0x9E8CBDAA, 0xDEACCEAA,
- 0x9EAD8C9A, 0xAEBD9CAA, 0xEEDECDBA, 0x9EBD9CAA,
- 0x9EBD9C9A, 0xDECEBCAA, 0xBEBDBDA9, 0xAEACAD99,
- 0xCEACAC98, 0x7E9C9C9A, 0xAEACACAA, 0xEEDDCDBA,
- 0x8E9C8C9A, 0xAEACACAA, 0xEEDDDDBA, 0x9E8B9C89,
- 0xBE9CAC99, 0xEECCCD99, 0x8E9C9C9A, 0xAEACACAA,
- 0xEEDDDDBA, 0x7E9C8C9A, 0x9EAC9C9A, 0xEECDDDBA,
- 0x8E8B9C89, 0x9E8B9C89, 0xDEABBC98, 0x9E9C8C89,
- 0xAEAC9C99, 0xDECDBC98, 0x9E9C8C89, 0x9EAC8C99,
- 0xDECCAC98, 0x9E9B9B77, 0x8D8A8B77, 0x9D898A76,
- ], [
- 0xFA6C6CBD, 0x7CAEAEDE, 0xEEEEEEEE, 0x3D7E9ECE,
- 0x8EAEBEDE, 0xEEEEEEEE, 0x9EAEDEEE, 0xCECEEEEE,
- 0xEEEEEEEE, 0x3D9E7DCE, 0x8DCEAEDE, 0xEEEEEEEE,
- 0x7EAEAECE, 0x9EBEBEEE, 0xEEEEEEEE, 0xBECEEEEE,
- 0xDEDEEEEE, 0xEEEEEEEE, 0x9EDEAEDE, 0xCEEECEEE,
- 0xEEEEEEEE, 0xBEEECEEE, 0xDEEECEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x0B6C6CBD,
- 0x7CAEADDE, 0xEEEEEEEE, 0x4E7E9ECE, 0x8EAEBEDE,
- 0xEEEEEEEE, 0x9EAEDEEE, 0xCECEEEEE, 0xEEEEEEEE,
- 0x4E9E7DCE, 0x8ECEAEDE, 0xEEEEEEEE, 0x6EAEAECE,
- 0x8EBEBEDE, 0xEEEEEEEE, 0xBECEDEDE, 0xCECEEEEE,
- 0xEEEEEEEE, 0x9EDE9EDE, 0xCEEECEEE, 0xEEEEEEEE,
- 0xBEDEBEEE, 0xCEEECEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0x3D8E8ECE, 0x8DBEAEDE,
- 0xEEEEEEEE, 0x5E8E9ECE, 0x9EBECEDE, 0xEEEEEEEE,
- 0x9EAECEDE, 0xCECEEEEE, 0xEEEEEEEE, 0x5E9E8ECE,
- 0x9ECEBEDE, 0xEEEEEEEE, 0x7EAEAECE, 0x9ECEBEDE,
- 0xEEEEEEEE, 0xAEBEDEDE, 0xBEBEEEEE, 0xEEEEEEEE,
- 0x8ECE9EDE, 0xCEEECEEE, 0xEEEEEEEE, 0xAEDEBEEE,
- 0xBEEEBEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xDEEEEEEE,
- 0xEEEEEEEE, 0x5E9E8EBE, 0x9EBEAECE, 0xEEEEEEEE,
- 0x6E9E9EBE, 0xAEBEBECE, 0xEEEEEEEE, 0x8E9EBEBE,
- 0xBEBECECE, 0xEEEEEEEE, 0x6E9E9EBE, 0xAEBEBECE,
- 0xEEEEEEEE, 0x7EAE9EBE, 0x9EBEBECE, 0xEEEEEEEE,
- 0x9EAEBEBE, 0xAEAECECE, 0xEEEEEEEE, 0x8EBE9EBE,
- 0xBEDEBECE, 0xEEEEEEEE, 0x9EBEAECE, 0xAECEAECE,
- 0xEEEEDEEE, 0xAEBEBEBD, 0xAEBEBEBD, 0xDECECECD,
- ]],
- l12_tab: [
- [
- 0xF4925967, 0xA3595697, 0x89789889, 0x99915935, 0x96793695, 0x69779789, 0x78998946, 0x957A68A5,
- 0x7A67A78A, 0x78A88A98, 0x96796897, 0x89689779, 0x77878978, 0x97770000
- ], [
- 0xF5D26D7A, 0xD27D68D9, 0xBD8BDACD, 0xDDD05C37, 0xD8AD47D6, 0x8DABD8BD, 0xBCDDDD47, 0xD69D9CD6,
- 0x9D8ADBBD, 0xACDBDDDD, 0xD7AD8BDA, 0xDD8BD9BD, 0xCCDBDDCD, 0xDDCD0000
- ]],
- l3_tab: [
- [
- 0xF4925A68, 0xB25A46A7, 0x8A78A78A, 0x99A14936, 0x978B36A5, 0x6A78A78A, 0x88A99A46, 0x957A89B5,
- 0x7A68A89B, 0x89B89B9A, 0xA78978A9, 0x9A78A89A, 0x99A99A99, 0xA9990000
- ], [
- 0xF3D26DAE, 0xE26E58BA, 0xBEADDBDD, 0xDDD04848, 0xDADD47D6, 0x8DBDDDBD, 0xDDDBDD56, 0x979DBBD8,
- 0xADABDDDD, 0xBDDADDDD, 0xDB9BBBDD, 0xDDDBDDDD, 0xDDDDDDDD, 0xDDDD0000
- ]],
- esc_tab: [ 0x01234577, 0x8899ABBB, 0xCCDDDEEE, 0xEEEEEFFE ],
- },
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF8494989, 0x6A7A7A9A, 0xEEDEDDCC, 0x3B5A7A89,
- 0x7C8B8B9A, 0xEECDDECC, 0x9E8CBDAB, 0xAE9CBEAB,
- 0xEECDDECC, 0x3A7A5A89, 0x7B8B8A9A, 0xEEDEDDCC,
- 0x6C8B8B9A, 0x7C8B8B9A, 0xDECECDBC, 0xAEADBEAB,
- 0xBE9DBEAB, 0xEECDDECC, 0x8EBD8CAA, 0xAECE9CAB,
- 0xEEEECDCC, 0xAEBD9DAB, 0xBECEADAB, 0xEEEECDBB,
- 0xDECECEBB, 0xDECECEBB, 0xEEDEDEBB, 0x1A5A5989,
- 0x7B8B8A9A, 0xEEDDDDCC, 0x4B6A7A89, 0x7C8B9B9A,
- 0xEECDDECC, 0x8E8CAD9A, 0xAE9CBDAB, 0xEECDEECB,
- 0x4B7B6A89, 0x7C9B8B9A, 0xEEDECDCC, 0x6C8B8B9A,
- 0x7C8B8B9A, 0xEECDCEBC, 0xAE9DBDAB, 0xAE9CBDAB,
- 0xEEBDDEBB, 0x8EBD7C9A, 0xAEBE9CAB, 0xEEEECDCB,
- 0xAEBD9DAB, 0xAEBE9CAB, 0xEEDEBDBB, 0xCECECEBB,
- 0xCEBDCEBB, 0xEECDCDBA, 0x5C7B7B9A, 0x9D9C9CAB,
- 0xEEEEDECC, 0x6D7C8C9A, 0x9E9CACAB, 0xEEDEEEDC,
- 0x9E8CADAB, 0xBEADCEBB, 0xEEDEEECC, 0x6D8C8C9A,
- 0x9DAD9CAB, 0xEEEEDECC, 0x7D9C8CAB, 0x8E9C9CAB,
- 0xEEDEDECC, 0x9E9DBDAB, 0x9E8DBDAB, 0xEEBDEECB,
- 0x9EAD8CAA, 0xBECEADAB, 0xEEEEDECC, 0xAEBE9DAB,
- 0xAEBE9CAB, 0xEEEECDCB, 0xCECECEBB, 0xBEBDBDBB,
- 0xCEBCBDAA, 0x7E9D9DAB, 0xAEBDADAB, 0xEEEEDECB,
- 0x8E9D9CAB, 0xAEADADAB, 0xEEEEEECB, 0x9E9CAC9A,
- 0xBEADADAA, 0xEEDDDEBA, 0x8E9D9DAB, 0xBEADADAB,
- 0xEEEEEECB, 0x8E9D9DAB, 0xAEADADAB, 0xEEDEDECB,
- 0x8E8CAC9A, 0xAE8CAD9A, 0xEEBDCDBA, 0x9EAC9D9A,
- 0xBEBDADAA, 0xEEDEDDBA, 0x9EAD9D9A, 0xAEAD9D9A,
- 0xEEDDCDBA, 0x9E9CAC89, 0x9E9B9C99, 0xBEAAAB98,
- ], [
- 0xFB6D6DCD, 0x7CADAEDE, 0xEEDDDDDD, 0x4D7DADDD,
- 0x9DBDDDDD, 0xDDDDDDDD, 0xADADDDDD, 0xCDDDDDDD,
- 0xDDDDDEEE, 0x3EAE7EDE, 0x9ECEBEEE, 0xEEEEEEEE,
- 0x7EBEBECE, 0x9ECECEEE, 0xEEEEEEEE, 0xCEDEEEEE,
- 0xDEDEEEEE, 0xEEEEEEEE, 0x9EEEAEEE, 0xDEEECEEE,
- 0xEEEEEEEE, 0xCEEECEEE, 0xDEEEDEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x0C7D6ECE,
- 0x7CBEAEEE, 0xEEEEEEEE, 0x4E8E9ECE, 0x9EBECEEE,
- 0xEEEEEEEE, 0x9EAEEEEE, 0xDEDEEEEE, 0xEEEEEEEE,
- 0x4EAE7EDE, 0x9ECEBEEE, 0xEEEEEEEE, 0x7EBEAEDE,
- 0x8ECEBEEE, 0xEEEEEEEE, 0xBECEEEEE, 0xCECEEEEE,
- 0xEEEEEEEE, 0x9EEEAEEE, 0xCEEECEEE, 0xEEEEEEEE,
- 0xBEEECEEE, 0xCEEECEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0x2E8E8ECE, 0x8DBEBEDE,
- 0xEEEEEEEE, 0x5E9E9EDE, 0xAECEDEEE, 0xEEEEEEEE,
- 0x9EAEDEEE, 0xCEDEEEEE, 0xEEEEEEEE, 0x5EAE8ECE,
- 0xAEDEBEEE, 0xEEEEEEEE, 0x7EBEAEDE, 0x9ECECEEE,
- 0xEEEEEEEE, 0xBECEEEEE, 0xCECEEEEE, 0xEEEEEEEE,
- 0x9EEE9EEE, 0xCEEECEEE, 0xEEEEEEEE, 0xBEEEBEEE,
- 0xBEEECEEE, 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEEEEE,
- 0xEEEEEEEE, 0x5E9E9ECE, 0x9EBEBEDE, 0xEEEEEEEE,
- 0x6E9E9ECE, 0xAECEBEDE, 0xEEEEEEEE, 0x9EAEBECE,
- 0xDECECEDE, 0xEEEEEEEE, 0x6EAE9ECE, 0xAECEBEDD,
- 0xDDDDDDDD, 0x7DAD9DCD, 0xADCDBDDD, 0xDDDDDDDD,
- 0x9DADCDCD, 0xBDBDCDDD, 0xDDDDDDDD, 0x8DBD9DCD,
- 0xCDDDBDDD, 0xDDDDDDDD, 0x9DCDADCD, 0xBDCDADDD,
- 0xDDDDDDDD, 0xADCDCDCD, 0xBDDDBDCD, 0xDDDDDDDD,
- ]],
- l12_tab: [
- [
- 0xF5B26B79, 0xC36B57B8, 0x9B89B99B, 0xABC05A36, 0xB78C47B5, 0x7B89B79B, 0x99BAAB57, 0xB68B89C6,
- 0x8B68B99C, 0x8AB99CAA, 0xB79B89B8, 0x9B89B89B, 0x99B9AB99, 0xB9AA0000
- ], [
- 0xF5D27E8B, 0xE27E68EA, 0xBE9CDBDE, 0xEEE06B37, 0xC9BC38E7, 0x8EBCE9CE, 0xBDEDED48, 0xC69EABC6,
- 0xAE8BEBEE, 0x9CDCCDCE, 0xE8AD9CEA, 0xCD8CEABE, 0xCEECCEBC, 0xDDDD0000
- ]],
- l3_tab: [
- [
- 0xF4B26B8A, 0xC26B57B8, 0xAC89C99D, 0xABC05A46, 0xB8AC47A5, 0x7B9AC8AC, 0x9ACBBC57, 0xB78B9BC7,
- 0x8B79BABD, 0x9BCABCBC, 0xD89B9ABC, 0xCC9ABABC, 0xBCCBBCBB, 0xDBCC0000
- ], [
- 0xF4D29DDD, 0xD27D57D8, 0xDD8DDDDD, 0xDDD04D48, 0xD7DD38D6, 0xDDDDDDDD, 0xDDDDDD46, 0xD88DDDDD,
- 0xDD9DDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDD9DDDDD, 0xEEEEEEEE, 0xDDDD0000
- ]],
- esc_tab: [ 0x01234577, 0x8899ABBD, 0xDDDDDDDD, 0xDDDDDEED ],
- },
-];
-const RV60_INTER_COEFFS_CB_DESC: [CoeffsCBDesc; NUM_INTER_SETS] = [
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF5354544, 0x57676765, 0xACAABA97, 0x57566765,
- 0x79788876, 0xCDBBCBA8, 0x9B89AA87, 0xBDAABB98,
- 0xDECCDDB9, 0x57676765, 0x79888876, 0xCDBBCBA8,
- 0x79788876, 0x9B999987, 0xDECBCCA8, 0xBDAABB98,
- 0xDEBBCCA8, 0xEEDDDDB9, 0x9B9A9A87, 0xBDBBBB98,
- 0xDECCDCA8, 0xBDABBB98, 0xDECBCBA8, 0xEEDDDDB9,
- 0xCEBCCCA8, 0xEEDDDDB9, 0xEEDDEDB8, 0x47565765,
- 0x79788876, 0xBDBBBBA8, 0x69787876, 0x9B999987,
- 0xDEBBCCA8, 0xAC9ABB98, 0xCEBBCCA8, 0xEECCDDB9,
- 0x69787876, 0x9B999987, 0xDECCCCA8, 0x8A899987,
- 0xACAAAA97, 0xEECCDCB9, 0xCDABCCA8, 0xDEBCCCA8,
- 0xEEDDEDB9, 0xACAAAA97, 0xCEBBBBA8, 0xEEDDDCB9,
- 0xCEBBBBA8, 0xDECCCCA8, 0xEEDDDDB9, 0xDECCDDB9,
- 0xEEDDDDB9, 0xEEDDEDB8, 0x7A898987, 0xACAAAB98,
- 0xDECCDDB9, 0x9B9AAA98, 0xCDBBBBA8, 0xEEDDEDB9,
- 0xBEABCCA9, 0xDECCDDB9, 0xEEDDEECA, 0x9CAA9A98,
- 0xCDBBBBA8, 0xEEDDEDB9, 0xBDABBBA8, 0xCECCCCA9,
- 0xEEEDEDCA, 0xDEBCDDB9, 0xEECCDDB9, 0xEEEEEEC9,
- 0xBEBCBBA9, 0xDEDDCCB9, 0xEEEEEDC9, 0xDECCCCB9,
- 0xEEDDDDB9, 0xEEEEEEC9, 0xEEDDDDB9, 0xEEDDEEB9,
- 0xEEEDEEB9, 0xACABABA9, 0xCECCCCB9, 0xEEDDEECA,
- 0xBDBBBCA9, 0xDECCDDB9, 0xEEEEEECA, 0xCEBCCDA9,
- 0xEECCDDB9, 0xEEDDEEB9, 0xBDBCBCA9, 0xDECDCCB9,
- 0xEEEEEECA, 0xCECCCCB9, 0xEEDDDDBA, 0xEEEEEECA,
- 0xDECCDDB9, 0xEECDEDB9, 0xEEDDEEB9, 0xCECDBCA9,
- 0xEEDDCCB9, 0xEEEEEDB9, 0xDEDDCCB9, 0xEEDDDDB9,
- 0xEEEEEDB9, 0xEECDDDA8, 0xEEDDDDA8, 0xEECCDCA7,
- ], [
- 0xF5263656, 0x48687978, 0xCECCDDBB, 0x38576978,
- 0x7A899A99, 0xEEDDDECB, 0xADABCDAA, 0xCEBCDEBB,
- 0xEEEEEEED, 0x48686878, 0x7A899A99, 0xEEDDDECB,
- 0x7A899A99, 0xACAAABAA, 0xEEDDEECC, 0xCEBCDEBB,
- 0xEEDDEECC, 0xEEEEEEED, 0xBDBCACBA, 0xDECDCDCB,
- 0xEEEEEEED, 0xCECDCDBB, 0xEEDDDECC, 0xEEEEEEED,
- 0xEEEEEEDD, 0xEEEEEEED, 0xEEEEEEEE, 0x17475867,
- 0x69798988, 0xDECCDDCB, 0x59687988, 0x8B9AAB99,
- 0xEEDDEECB, 0xBDABCDBA, 0xDECCDECB, 0xEEEEEEED,
- 0x59797988, 0x8B9A9B99, 0xEEDDEECC, 0x8B8A9B99,
- 0xACABBCAA, 0xEEDDEEDC, 0xDECCDECB, 0xEECDEECC,
- 0xEEEEEEED, 0xBEBCACBB, 0xDEDDCDCB, 0xEEEEEEED,
- 0xDECDCDCB, 0xEEDEDECC, 0xEEEEEEED, 0xEEEEEEDD,
- 0xEEEEEEED, 0xEEEEEEED, 0x6A898A99, 0xACABBCAA,
- 0xEEEEEEDC, 0x8C9AACAA, 0xBDBCCDBB, 0xEEEEEEDD,
- 0xCEBDDECB, 0xEEDDEEDC, 0xEEEEEEEE, 0x9C9B9BAA,
- 0xBDBCBCBB, 0xEEEEEEDD, 0xADBBBCBA, 0xCECCCDBB,
- 0xEEEEEEED, 0xEEDDEEDC, 0xEEDEEEDC, 0xEEEEEEED,
- 0xCEDDBDCB, 0xEEEEDEDC, 0xEEEEEEEE, 0xEEEEDECC,
- 0xEEEEDEDC, 0xEEEEEEED, 0xEEEEEEED, 0xEEEEEEED,
- 0xEEEEEEED, 0x9DACBDBB, 0xCECDDECB, 0xEEEEEEED,
- 0xBEBCCDBB, 0xDEDDDECC, 0xEEEEEEED, 0xDECDEECC,
- 0xEEDEEEDC, 0xEEEEEEED, 0xBECCBDBB, 0xDEDDDECC,
- 0xEEEEEEED, 0xCECDCECC, 0xEEDEEECC, 0xEEEEEEED,
- 0xDEDEEEDC, 0xEEDEEEDC, 0xEEEEEEED, 0xCEDEBECC,
- 0xEEEEDEDC, 0xEEEEEEED, 0xDEEEDECC, 0xEEEEDEDC,
- 0xEEEEEEED, 0xEEEEEEDC, 0xEEEEEEDC, 0xEEEEEECB,
- ]],
- l12_tab: [
- [
- 0xF3624757, 0x82474577, 0x78568678, 0x78824735, 0x86784575, 0x68788678, 0x78888857, 0x86797896,
- 0x79789899, 0x78989999, 0x979989A8, 0x9989989A, 0x99989989, 0x98880000
- ], [
- 0xF3815978, 0xB2594698, 0x9B78A89B, 0xABC14936, 0x979B4695, 0x7A99B79B, 0x89BBBC68, 0xA78B9AC7,
- 0x8B89BABC, 0x9ACABCCC, 0xC9ACABDB, 0xCD9BCABD, 0xBCDABDBC, 0xDCCC0000
- ]],
- l3_tab: [
- [
- 0xF3624757, 0x82474586, 0x78578778, 0x78824735, 0x76784575, 0x68789678, 0x78989847, 0x86797896,
- 0x79789899, 0x79989999, 0x979A89A8, 0x9989A99A, 0x9999AA9A, 0xA9980000
- ], [
- 0xF2915A69, 0xC25A47B8, 0xAD89C9AD, 0xCCE15A36, 0xB79D47B6, 0x8B9AD9AD, 0xABDCDE68, 0xB79CACE8,
- 0x9C9ADBCE, 0xBCEBCEDD, 0xEABDBCED, 0xDEBCECDE, 0xDEEDDEDD, 0xEEEE0000
- ]],
- esc_tab: [ 0x01235566, 0x788899AA, 0xABBBBBCC, 0xBBBCEEEE ],
- },
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF5354544, 0x57676765, 0xACAABA97, 0x57566765,
- 0x79788876, 0xCDBBCBA8, 0x9B89AA87, 0xBDAABB98,
- 0xDECCDDB9, 0x57676765, 0x79888876, 0xCDBBCBA8,
- 0x79788876, 0x9B999987, 0xDECBCCA8, 0xBDAABB98,
- 0xDEBBCCA8, 0xEEDDDDB9, 0x9B9A9A87, 0xBDBBBB98,
- 0xDECCDCA8, 0xBDABBB98, 0xDECBCBA8, 0xEEDDDDB9,
- 0xCEBCCCA8, 0xEEDDDDB9, 0xEEDDEDB8, 0x47565765,
- 0x79788876, 0xBDBBBBA8, 0x69787876, 0x9B999987,
- 0xDEBBCCA8, 0xAC9ABB98, 0xCEBBCCA8, 0xEECCDDB9,
- 0x69787876, 0x9B999987, 0xDECCCCA8, 0x8A899987,
- 0xACAAAA97, 0xEECCDCB9, 0xCDABCCA8, 0xDEBCCCA8,
- 0xEEDDEDB9, 0xACAAAA97, 0xCEBBBBA8, 0xEEDDDCB9,
- 0xCEBBBBA8, 0xDECCCCA8, 0xEEDDDDB9, 0xDECCDDB9,
- 0xEEDDDDB9, 0xEEDDEDB8, 0x7A898987, 0xACAAAB98,
- 0xDECCDDB9, 0x9B9AAA98, 0xCDBBBBA8, 0xEEDDEDB9,
- 0xBEABCCA9, 0xDECCDDB9, 0xEEDDEECA, 0x9CAA9A98,
- 0xCDBBBBA8, 0xEEDDEDB9, 0xBDABBBA8, 0xCECCCCA9,
- 0xEEEDEDCA, 0xDEBCDDB9, 0xEECCDDB9, 0xEEEEEEC9,
- 0xBEBCBBA9, 0xDEDDCCB9, 0xEEEEEDC9, 0xDECCCCB9,
- 0xEEDDDDB9, 0xEEEEEEC9, 0xEEDDDDB9, 0xEEDDEEB9,
- 0xEEEDEEB9, 0xACABABA9, 0xCECCCCB9, 0xEEDDEECA,
- 0xBDBBBCA9, 0xDECCDDB9, 0xEEEEEECA, 0xCEBCCDA9,
- 0xEECCDDB9, 0xEEDDEEB9, 0xBDBCBCA9, 0xDECDCCB9,
- 0xEEEEEECA, 0xCECCCCB9, 0xEEDDDDBA, 0xEEEEEECA,
- 0xDECCDDB9, 0xEECDEDB9, 0xEEDDEEB9, 0xCECDBCA9,
- 0xEEDDCCB9, 0xEEEEEDB9, 0xDEDDCCB9, 0xEEDDDDB9,
- 0xEEEEEDB9, 0xEECDDDA8, 0xEEDDDDA8, 0xEECCDCA7,
- ], [
- 0xF5263656, 0x48687978, 0xCECCDDBB, 0x38576978,
- 0x7A899A99, 0xEEDDDECB, 0xADABCDAA, 0xCEBCDEBB,
- 0xEEEEEEED, 0x48686878, 0x7A899A99, 0xEEDDDECB,
- 0x7A899A99, 0xACAAABAA, 0xEEDDEECC, 0xCEBCDEBB,
- 0xEEDDEECC, 0xEEEEEEED, 0xBDBCACBA, 0xDECDCDCB,
- 0xEEEEEEED, 0xCECDCDBB, 0xEEDDDECC, 0xEEEEEEED,
- 0xEEEEEEDD, 0xEEEEEEED, 0xEEEEEEEE, 0x17475867,
- 0x69798988, 0xDECCDDCB, 0x59687988, 0x8B9AAB99,
- 0xEEDDEECB, 0xBDABCDBA, 0xDECCDECB, 0xEEEEEEED,
- 0x59797988, 0x8B9A9B99, 0xEEDDEECC, 0x8B8A9B99,
- 0xACABBCAA, 0xEEDDEEDC, 0xDECCDECB, 0xEECDEECC,
- 0xEEEEEEED, 0xBEBCACBB, 0xDEDDCDCB, 0xEEEEEEED,
- 0xDECDCDCB, 0xEEDEDECC, 0xEEEEEEED, 0xEEEEEEDD,
- 0xEEEEEEED, 0xEEEEEEED, 0x6A898A99, 0xACABBCAA,
- 0xEEEEEEDC, 0x8C9AACAA, 0xBDBCCDBB, 0xEEEEEEDD,
- 0xCEBDDECB, 0xEEDDEEDC, 0xEEEEEEEE, 0x9C9B9BAA,
- 0xBDBCBCBB, 0xEEEEEEDD, 0xADBBBCBA, 0xCECCCDBB,
- 0xEEEEEEED, 0xEEDDEEDC, 0xEEDEEEDC, 0xEEEEEEED,
- 0xCEDDBDCB, 0xEEEEDEDC, 0xEEEEEEEE, 0xEEEEDECC,
- 0xEEEEDEDC, 0xEEEEEEED, 0xEEEEEEED, 0xEEEEEEED,
- 0xEEEEEEED, 0x9DACBDBB, 0xCECDDECB, 0xEEEEEEED,
- 0xBEBCCDBB, 0xDEDDDECC, 0xEEEEEEED, 0xDECDEECC,
- 0xEEDEEEDC, 0xEEEEEEED, 0xBECCBDBB, 0xDEDDDECC,
- 0xEEEEEEED, 0xCECDCECC, 0xEEDEEECC, 0xEEEEEEED,
- 0xDEDEEEDC, 0xEEDEEEDC, 0xEEEEEEED, 0xCEDEBECC,
- 0xEEEEDEDC, 0xEEEEEEED, 0xDEEEDECC, 0xEEEEDEDC,
- 0xEEEEEEED, 0xEEEEEEDC, 0xEEEEEEDC, 0xEEEEEECB,
- ]],
- l12_tab: [
- [
- 0xF3624757, 0x82474577, 0x78568678, 0x78824735, 0x86784575, 0x68788678, 0x78888857, 0x86797896,
- 0x79789899, 0x78989999, 0x979989A8, 0x9989989A, 0x99989989, 0x98880000
- ], [
- 0xF3815978, 0xB2594698, 0x9B78A89B, 0xABC14936, 0x979B4695, 0x7A99B79B, 0x89BBBC68, 0xA78B9AC7,
- 0x8B89BABC, 0x9ACABCCC, 0xC9ACABDB, 0xCD9BCABD, 0xBCDABDBC, 0xDCCC0000
- ]],
- l3_tab: [
- [
- 0xF3624757, 0x82474586, 0x78578778, 0x78824735, 0x76784575, 0x68789678, 0x78989847, 0x86797896,
- 0x79789899, 0x79989999, 0x979A89A8, 0x9989A99A, 0x9999AA9A, 0xA9980000
- ], [
- 0xF2915A69, 0xC25A47B8, 0xAD89C9AD, 0xCCE15A36, 0xB79D47B6, 0x8B9AD9AD, 0xABDCDE68, 0xB79CACE8,
- 0x9C9ADBCE, 0xBCEBCEDD, 0xEABDBCED, 0xDEBCECDE, 0xDEEDDEDD, 0xEEEE0000
- ]],
- esc_tab: [ 0x01235566, 0x788899AA, 0xABBBBBCC, 0xBBBCEEEE ],
- },
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF4343444, 0x57676765, 0xBDBBBBA9, 0x47566765,
- 0x79788877, 0xCECCCCB9, 0xAC9AAB98, 0xCEBBCCA9,
- 0xEEDDEECA, 0x47575665, 0x79888877, 0xCECCCCB9,
- 0x79788877, 0x9B9A9A98, 0xEEDDDDBA, 0xBEBBCCA9,
- 0xDECCDDBA, 0xEEEEEECA, 0xACAB9A98, 0xCDBCBBA9,
- 0xEEDDDDCA, 0xBEBCBBA9, 0xDECCCCBA, 0xEEEEEECA,
- 0xEEDDDECA, 0xEEEEEECA, 0xEEEEEECA, 0x37565665,
- 0x79788877, 0xCECCCCB9, 0x69787877, 0x9B999A88,
- 0xDEDDDDBA, 0xAD9BBCA9, 0xCEBCCDB9, 0xEEEEEECA,
- 0x69787877, 0x9B9A9988, 0xDEDDDDBA, 0x8B999988,
- 0xACABAB98, 0xEEDDDDCA, 0xCEBCCCB9, 0xDECCDDBA,
- 0xEEEEEECA, 0xBDBBABA9, 0xCECCBCB9, 0xEEEEEDCA,
- 0xCECCBCA9, 0xDEDDCCBA, 0xEEEEEECA, 0xEEDEEECA,
- 0xEEEEEECA, 0xEEEEEECA, 0x7A8A9A98, 0xADABBBA9,
- 0xEEEEEEDB, 0x9C9BABA9, 0xCEBCCCBA, 0xEEEEEEDB,
- 0xCEBCDDBA, 0xEECDEECB, 0xEEEEEEDB, 0x9CABABA9,
- 0xCECCBCBA, 0xEEEEEEDB, 0xBDBCBCAA, 0xCECDCDBA,
- 0xEEEEEEDB, 0xDECDDECB, 0xEEDDEECB, 0xEEEEEEDB,
- 0xCECDBCBA, 0xEEDECDCA, 0xEEEEEEDB, 0xDEDECDCA,
- 0xEEEEDDCB, 0xEEEEEEDB, 0xEEEEEECB, 0xEEEEEECB,
- 0xEEEEEECA, 0xACACBCAA, 0xCECDCDBB, 0xEEEEEEDB,
- 0xBEBCCDBA, 0xDEDDDDCB, 0xEEEEEEDB, 0xCEBCDDBA,
- 0xEECDEECA, 0xEEEEEECA, 0xBECDBCBA, 0xDEDEDDCB,
- 0xEEEEEEDB, 0xCECDCDBB, 0xEEDEDECB, 0xEEEEEEDB,
- 0xDECDDEBA, 0xEEDDEECA, 0xEEEEEECA, 0xCEDDBCBA,
- 0xEEEECDBA, 0xEEEEEECA, 0xDEDECDBA, 0xEEEECDCA,
- 0xEEEEEECA, 0xEEDDDDB9, 0xEEDDDDB9, 0xEECDDDA8,
- ], [
- 0xF4263657, 0x48687989, 0xCECDDEDD, 0x38586978,
- 0x7A8A9B9A, 0xEEDEEEEE, 0xADACCECC, 0xDECEEEDD,
- 0xEEEEEEEE, 0x38686878, 0x7A8A8A9A, 0xEEDEEEDE,
- 0x7A8A9B9A, 0x9CACACBB, 0xEEEEEEEE, 0xDECEDEDD,
- 0xEEDEEEEE, 0xEEEEEEEE, 0xBEBDADBC, 0xDEDECEDD,
- 0xEEEEEEEE, 0xDEDECEDD, 0xEEEEDEDE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x17475868,
- 0x69798A9A, 0xDEDEEEDD, 0x59698A89, 0x8B9BACAB,
- 0xEEEEEEEE, 0xBEADDECC, 0xDECEEEDD, 0xEEEEEEEE,
- 0x59797A89, 0x8B9B9BAB, 0xEEEEEEEE, 0x8B9B9BAB,
- 0xADACBDBC, 0xEEEEEEEE, 0xDECEEEDE, 0xEEDEEEEE,
- 0xEEEEEEEE, 0xBECEADCC, 0xDEEECEDD, 0xEEEEEEEE,
- 0xDEDECEDD, 0xEEEEDEDE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0x6A8A8B9A, 0x9CACBCBC,
- 0xEEEEEEEE, 0x8C9BACAB, 0xBEBDCECD, 0xEEEEEEEE,
- 0xCEBEDEDD, 0xEEDEEEEE, 0xEEEEEEEE, 0x8C9C9CAB,
- 0xBECDBDCD, 0xEEEEEEEE, 0xAEBDBDCC, 0xBECECECD,
- 0xEEEEEEEE, 0xEEDEEEEE, 0xEEDEEEEE, 0xEEEEEEEE,
- 0xCEDEBECD, 0xEEEEDEDE, 0xEEEEEEEE, 0xDEEEDEDE,
- 0xEEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0x9DBDBDCC, 0xCECEDEDD, 0xEEEEEEEE,
- 0xAEBECECD, 0xDEDEDEDD, 0xEEEEEEEE, 0xCECEDEDD,
- 0xEEDEEEEE, 0xEEEEEEEE, 0xAECEBECD, 0xDEDEDEDD,
- 0xEEEEEEEE, 0xBECECEDD, 0xDEDEDEDE, 0xEEEEEEEE,
- 0xDEDEEEDD, 0xEEDEEEDE, 0xEEEEEEEE, 0xBEDEBECD,
- 0xEEEEDEDD, 0xEEEEEEEE, 0xCEEECEDD, 0xDEEECEDD,
- 0xEEEEEEEE, 0xEEEEEEED, 0xDEEEDEDD, 0xEEEEDEDC,
- ]],
- l12_tab: [
- [
- 0xF2724868, 0x92484688, 0x8A679789, 0x9AA14846, 0x978A4585, 0x6989A789, 0x88A9AA67, 0xA78A89B7,
- 0x8A89A9AB, 0x89A9AAAA, 0xA8AB9AB9, 0xAA9AB9AB, 0xAAA9AA9A, 0xAA990000
- ], [
- 0xF2915A89, 0xD25A57B9, 0xBD79C9AD, 0xCDE14A46, 0xB8AD36B6, 0x7BABD8AC, 0xAADCDE68, 0xC8ADACE7,
- 0x9D9ADBCE, 0x9BDBCDDD, 0xDABDBCDC, 0xDDACDBCD, 0xCDEBDECD, 0xDDDD0000
- ]],
- l3_tab: [
- [
- 0xF2724868, 0x92484698, 0x9A68989A, 0x9AA14836, 0x978A4695, 0x7989A78A, 0x89AAAA58, 0xA78A9AB7,
- 0x9A89BAAB, 0x9ABAABBB, 0xB9ABAABA, 0xBBABCABC, 0xBBBBBBBB, 0xBBBA0000
- ], [
- 0xF4B16C9B, 0xF27C69DB, 0xCFABFBDF, 0xEFF06C48, 0xDACF58D7, 0xAECDFBCF, 0xCDFEEF8A, 0xDABFDEFA,
- 0xCFBCFEFF, 0xDEFEEFFF, 0xFDEFEEFF, 0xFFEFFEFF, 0xFFFFFFFF, 0xFFFE0000
- ]],
- esc_tab: [ 0x01235566, 0x788899AA, 0xABBBBCCC, 0xBBBCDDDD ],
- },
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF4243444, 0x47576766, 0xCDBCCCBA, 0x47566766,
- 0x79798988, 0xDECDDDBA, 0xAD9BBCA9, 0xCEBCCDBA,
- 0xEEDEEECB, 0x47575666, 0x79898888, 0xDECCCCBA,
- 0x79798988, 0x9B9A9A99, 0xEEDDDDCB, 0xBEBCCDBA,
- 0xDECDDEBB, 0xEEEEEECB, 0xACAB9A99, 0xBECCBBAA,
- 0xEEDEDDCB, 0xBECCBCBA, 0xDECDCDBA, 0xEEEEEECB,
- 0xEEDEDECB, 0xEEEEEECB, 0xEEEEEECB, 0x36565766,
- 0x79798988, 0xDECDDDCA, 0x69687977, 0x9B9A9A99,
- 0xEEDDDDCB, 0xAD9BBCAA, 0xCEBCDDBA, 0xEEEEEECB,
- 0x69797877, 0x9B9A9A99, 0xEEDDDDCB, 0x8B9A9A99,
- 0xACABABA9, 0xEEDEDECB, 0xCEBCCDBA, 0xDECDDECB,
- 0xEEEEEECB, 0xADBC9BAA, 0xCECDBCBA, 0xEEEEEECB,
- 0xCECDBCBA, 0xDEDECDBB, 0xEEEEEECB, 0xEEDEDECB,
- 0xEEEEEECB, 0xEEEEEECA, 0x7B8A9A99, 0xADBCBCBA,
- 0xEEEEEEDC, 0x9C9BABAA, 0xBEBCCDBB, 0xEEEEEEDC,
- 0xBEACCEBB, 0xDECDEECB, 0xEEEEEEDC, 0x9CAB9BAA,
- 0xBECDBCBB, 0xEEEEEEDC, 0xADBCBCBA, 0xCECDCDCB,
- 0xEEEEEEDC, 0xDECDDECB, 0xDECEEECB, 0xEEEEEEDC,
- 0xBECDACBA, 0xDEDECDCB, 0xEEEEEEDC, 0xDEDECDCB,
- 0xDEEECDCB, 0xEEEEEEDB, 0xEEEEEEDB, 0xEEEEEECB,
- 0xEEDEEECA, 0x9CACACBB, 0xCECDCDCB, 0xEEEEEEDC,
- 0xAEBDBDBB, 0xDECEDECB, 0xEEEEEEDC, 0xBEBDCEBA,
- 0xEECDDECB, 0xEEEEEECB, 0xAEBDBCBB, 0xDEDECDCB,
- 0xEEEEEEDC, 0xBECDCDCB, 0xDEDEDECC, 0xEEEEEEDC,
- 0xCECDDEBB, 0xDECDDECB, 0xEEDEEECA, 0xBECEACBA,
- 0xDEDECDBB, 0xEEEEEECA, 0xCEDEBDBA, 0xDEDECDBB,
- 0xEEEEDECA, 0xDECDCDBA, 0xDECDCDBA, 0xEECDCCA8,
- ], [
- 0xF5262668, 0x4869799A, 0xEEEEEEEE, 0x38597A8A,
- 0x7B9B9CAC, 0xEEEEEEEE, 0xBEBEDEDE, 0xDEDEEEEE,
- 0xEEEEEEEE, 0x3869598A, 0x7B9C9BAC, 0xEEEEEEEE,
- 0x7B9C9CAC, 0x9DBDBDCD, 0xEEEEEEEE, 0xDEDEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xBEDEAECE, 0xDEEECEEE,
- 0xEEEEEEEE, 0xDEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x17485879,
- 0x6A8B8BAB, 0xEEEEEEEE, 0x5A6A8B9B, 0x8CACADBD,
- 0xEEEEEEEE, 0xBEBEDEDE, 0xDEDEEEEE, 0xEEEEEEEE,
- 0x5A7B7A9B, 0x8CAD9CBC, 0xEEEEEEEE, 0x8CAC9CBC,
- 0x9EBEBDCD, 0xEEEEEEEE, 0xDEDEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xBEDEAECE, 0xDEEECEEE, 0xEEEEEEEE,
- 0xDEEEDEEE, 0xEEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0x5B8C8CAC, 0xADBDBDCD,
- 0xEEEEEEEE, 0x8D9DADBD, 0xBECECEDE, 0xEEEEEEEE,
- 0xCEBEEEDE, 0xEEDEEEEE, 0xEEEEEEEE, 0x8DAD9DBC,
- 0xBECEBEDE, 0xEEEEEEEE, 0x9EBEBECD, 0xBECECEDE,
- 0xEEEEEEEE, 0xDEEEEEEE, 0xDEDEEEEE, 0xEEEEEEEE,
- 0xBEDEAEDE, 0xEEEEDEEE, 0xEEEEEEEE, 0xDEEEDEEE,
- 0xDEEECEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0x8EBEBECD, 0xCEDECEEE, 0xEEEEEEEE,
- 0xAEBECECD, 0xDEDEDEEE, 0xEEEEEEEE, 0xBEBEDEDE,
- 0xEEDEEEEE, 0xEEEEEEEE, 0x9ECEBECD, 0xCEEEDEEE,
- 0xEEEEEEEE, 0xAECECEDE, 0xDEDEDEEE, 0xEEEEEEEE,
- 0xCEDEEEEE, 0xDEDEEEEE, 0xEEEEEEEE, 0xAEDEAECD,
- 0xEEEEDEEE, 0xEEEEEEEE, 0xBEEECEDE, 0xDEEECEDE,
- 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEDEEE, 0xEEDEDEDD,
- ]],
- l12_tab: [
- [
- 0xF2724878, 0xA2484698, 0x9A67989A, 0xAAA14846, 0x978A3695, 0x7A89A78A, 0x89AAAA68, 0xA78B9AB7,
- 0x8B89B9AB, 0x89B9ABAA, 0xA8AB9AB9, 0xAB9AB9AB, 0xAAA9AB9A, 0xBAA90000
- ], [
- 0xF3B26C9B, 0xE25C58DB, 0xCE8ADABE, 0xEEE05B47, 0xD9BE37D7, 0x9DBCE8BE, 0xBCEEEE79, 0xD8BEBCE8,
- 0xAEABECCE, 0xACECDEEE, 0xEACECDED, 0xEEBDECDE, 0xDEECEEDE, 0xEEEE0000
- ]],
- l3_tab: [
- [
- 0xF2815979, 0xB24946A8, 0x9B79B99B, 0xABC15946, 0xA89B46A6, 0x8A9AB89B, 0x9ABBBC68, 0xB89BABC8,
- 0x9B9ACABC, 0xABCBBCCC, 0xCABCABCB, 0xCCABCBCC, 0xBCCBCCBC, 0xCCCC0000
- ], [
- 0xF3D17EBD, 0xF27E6AFC, 0xEFBDFCEF, 0xFFF06D5A, 0xECEF59E9, 0xBEDFFCEF, 0xDFFFFF9B, 0xEBDFEFFB,
- 0xDFCEFFFF, 0xEFFFFFFF, 0xFEEFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000
- ]],
- esc_tab: [ 0x01235566, 0x788899AA, 0xAABBBCCC, 0xCBBCEEEE ],
- },
- CoeffsCBDesc {
- l0_tab:[
- [
- 0xF4252545, 0x47676777, 0xCECCCCBB, 0x47576877,
- 0x7A898A99, 0xDEDDCDCB, 0xAD9BBDAA, 0xBEBCCDBB,
- 0xEEDEDECB, 0x47675777, 0x7A898989, 0xDECDCDCB,
- 0x7A898A89, 0x9C9BABAA, 0xEEDEDECB, 0xBEBDCDBB,
- 0xDECDDECB, 0xEEEEEECC, 0x9DBC9BAA, 0xBECDACBB,
- 0xEEDEDECB, 0xBECDBCBB, 0xCECECDBB, 0xEEEEDECB,
- 0xDEDEDECB, 0xEEDEDECC, 0xEEEEEECB, 0x27575767,
- 0x7A898999, 0xDEDDDDCB, 0x59697988, 0x9C9BABAA,
- 0xEEDEDECC, 0xAE9CBDAA, 0xCEBDCEBB, 0xEEEEEEDC,
- 0x59797988, 0x9B9B9AAA, 0xEEDEDECB, 0x8B9B9B9A,
- 0x9DACACAA, 0xEEDEDECC, 0xCEBDCEBB, 0xCEBDDECB,
- 0xEEDEEECC, 0xADBD9BAA, 0xCECDBCBB, 0xEEEEDECB,
- 0xCECDBDBB, 0xCEDEBDBB, 0xEEEEDECB, 0xEEDEDECB,
- 0xEEDEDECB, 0xEEEEDECB, 0x6B8B8B9A, 0xADBCACBB,
- 0xEEEEEEDC, 0x8C9CACAA, 0xBEBDCDBB, 0xEEEEEEDC,
- 0xBEADCEBB, 0xDECEDECC, 0xEEEEEEDC, 0x8CAC9BAA,
- 0xBEBDBDBB, 0xEEEEEEDC, 0xAEBDBDBB, 0xBECDCDCB,
- 0xEEEEEEDC, 0xCECEDECC, 0xDECEDECC, 0xEEDEEEDC,
- 0xBECEACBB, 0xDEDECDCB, 0xEEEEEEDC, 0xCEDECDCB,
- 0xDEDECDCC, 0xEEEEDEDC, 0xEEEEEECC, 0xDEDEDECC,
- 0xEEDEDECB, 0x8DADACBB, 0xCECECDCB, 0xEEEEEEDC,
- 0xAEBDBDBB, 0xCECECECC, 0xEEEEEEDC, 0xBEADCEBB,
- 0xDECDDEBB, 0xEEEEEECB, 0xAEBDADBB, 0xCEDECDCC,
- 0xEEEEEEDC, 0xAECEBDCB, 0xCEDECECC, 0xEEEEEEDC,
- 0xBEBDCEBB, 0xCEBEDEBB, 0xEEDEEECB, 0xBECEACBA,
- 0xDEDEBDBB, 0xEEEEDECB, 0xBECEBDBB, 0xCEDEBDBB,
- 0xEEEEDECB, 0xCECDCDBA, 0xCEBDBDBA, 0xDEBCBCA9,
- ], [
- 0xF5383879, 0x498B7BAC, 0xEEEEEEEE, 0x3A6A7BAC,
- 0x8CADAECE, 0xEEEEEEEE, 0xCECEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0x3A7B6A9C, 0x8CAD9DCE, 0xEEEEEEEE,
- 0x7DAEADCD, 0xAECECEDE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xBEEEBEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x085A5A9B,
- 0x6A9C9CBD, 0xEEEEEEEE, 0x5B7C9CBC, 0x9EBEBECE,
- 0xEEEEEEEE, 0xCECEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0x5B9C7CAC, 0x9EBEAEDE, 0xEEEEEEEE, 0x8EBEAECE,
- 0xAECEBEDE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xBEEEBEEE, 0xEEEEDEEE, 0xEEEEEEEE,
- 0xEEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0x6D9D9DCD, 0xAECECEEE,
- 0xEEEEEEEE, 0x8EAEBECE, 0xBEDEDEEE, 0xEEEEEEEE,
- 0xCECEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x8EBEAECE,
- 0xBEDECEEE, 0xEEEEEEEE, 0xAECECEDE, 0xBEDECEEE,
- 0xEEEEEEEE, 0xDEEEEEEE, 0xDEDEEEEE, 0xEEEEEEEE,
- 0xBEEEBEDE, 0xEEEEDEEE, 0xEEEEEEEE, 0xDEEEDEEE,
- 0xDEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0x8ECEBEDE, 0xCEDEDEEE, 0xEEEEEEEE,
- 0xAECECEDE, 0xDEEEEEEE, 0xEEEEEEEE, 0xBECEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0x9ECEBEDE, 0xDEEEDEEE,
- 0xEEEEEEEE, 0xAEDEDEEE, 0xDEEEEEEE, 0xEEEEEEEE,
- 0xCEDEEEEE, 0xDEDEEEEE, 0xEEEEEEEE, 0xAEDEBEDE,
- 0xEEEEDEEE, 0xEEEEEEEE, 0xBEEECEEE, 0xDEEEDEEE,
- 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEEEEE, 0xEEEEEEEE,
- ]],
- l12_tab: [
- [
- 0xF2825978, 0xB15956A9, 0x9B68A89B, 0xABB15946, 0xA79B46A6, 0x7A99B79B, 0x99BABB68, 0xB79B9AC7,
- 0x9B89CAAC, 0x8ACAACBB, 0xB8AB9AC9, 0xAB9ACAAC, 0xAAB9ABAA, 0xBAAA0000
- ], [
- 0xF4D27EAC, 0xE16E69EC, 0xDE9BECDE, 0xEEE06D59, 0xEBDE49E8, 0xAECDE9CE, 0xCDEEEE7A, 0xE9CECEE9,
- 0xCEACEDEE, 0xBDEDEEEE, 0xEBEECEEE, 0xEECEEDEE, 0xEEEDEEEE, 0xEEEE0000
- ]],
- l3_tab: [
- [
- 0xF2815979, 0xB25946A8, 0x9B79B9AB, 0xBBC14946, 0xA89B46A6, 0x8A9AC89B, 0x9ACBBC68, 0xB79BABD8,
- 0x9B9ACBBD, 0xABCBBCCC, 0xDABCABCB, 0xCDABCBCD, 0xCCDBCDCC, 0xDCCC0000
- ], [
- 0xF3D17FCF, 0xF27F6AFD, 0xFFBDFCEF, 0xFFF06D59, 0xFCFF59E9, 0xBFEFFDFF, 0xDFFFFF9B, 0xEBDFFFFB,
- 0xDFCEFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000
- ]],
- esc_tab: [ 0x01235566, 0x788899AA, 0xABBBBCCC, 0xBBBCDDDD ],
- },
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF4352556, 0x47686878, 0xCECDCDBB, 0x38586878,
- 0x7A8A8A99, 0xDEDDCDCB, 0x9E9CBDAB, 0xBEBCCDBB,
- 0xEEDEDECC, 0x37685777, 0x7A8A7999, 0xDECDCDCB,
- 0x6A8A8A99, 0x8C9B9BAA, 0xDEDEDDCC, 0xBEBDCDBB,
- 0xCEBDCECB, 0xEEDEDECC, 0x9DAC8BAA, 0xBEBDACBB,
- 0xEEDECECB, 0xBECDACBB, 0xCECEBDBB, 0xEEDEDECC,
- 0xDEDEDECC, 0xEEDEDECC, 0xEEEEEECB, 0x27575777,
- 0x6A8A8999, 0xDEDDCDCB, 0x5A697989, 0x8B9B9B9A,
- 0xEEDEDECC, 0x9E9CBDAB, 0xCEBDCEBB, 0xEEDEEECC,
- 0x59796989, 0x8B9B9A9A, 0xEEDEDDCC, 0x7B9B8B9A,
- 0x9C9C9BAA, 0xEEDEDECC, 0xBEBDCDBB, 0xCEBDCEBB,
- 0xEEDEEECC, 0x9EBD8BAA, 0xBECDACBB, 0xEEEEDECB,
- 0xBECEACBB, 0xBECEBDBB, 0xEEEEDECB, 0xDEDEDECC,
- 0xDEDEDECB, 0xEEDEDECB, 0x6B8B8B9A, 0x9DACACBB,
- 0xEEEEEEDC, 0x7C9C9CAA, 0xAEBDBDBB, 0xEEEEEEDC,
- 0xAEADBEBB, 0xCEBEDECC, 0xEEEEEEDC, 0x7C9C9BAA,
- 0xAEBDACBB, 0xEEEEEEDC, 0x9DACACBB, 0xAEBDBDBB,
- 0xEEEEEEDC, 0xBEBDCEBC, 0xCEBEDECC, 0xEEDEEEDC,
- 0xAEBD9CAB, 0xCEDEBDBB, 0xEEEEEEDC, 0xBECEBDBB,
- 0xCEDEBDCB, 0xEEEEDECC, 0xDEDEDECC, 0xDEDEDECC,
- 0xEECECEBB, 0x8DAC9CAB, 0xBEBDBDBB, 0xEEEEEEDC,
- 0x9DADADBB, 0xCECECDCB, 0xEEEEEEDC, 0xAEADBDAB,
- 0xCEBDCEBB, 0xEEDEEECB, 0x9DBDACBB, 0xCECEBDCB,
- 0xEEEEEEDC, 0xAEBDBDBB, 0xCECECECC, 0xEEEEEEDC,
- 0xAEBDBEBB, 0xCEBDCEBB, 0xEEDEEECB, 0xAEBD9CAA,
- 0xCECEBDBB, 0xEEEEDECB, 0xAECDADBB, 0xCECEBDBB,
- 0xEEEEDDCB, 0xBEBEBDAA, 0xBEBDBDAA, 0xCEBCBCA9,
- ], [
- 0xF638388A, 0x498B8BBD, 0xEEEEEEEE, 0x3A6B8CAC,
- 0x8DADBEDE, 0xEEEEEEEE, 0xCECEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0x3A8C6BAC, 0x8DBEADDE, 0xEEEEEEEE,
- 0x8DAEAECE, 0xAECECEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xBEEECEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x095A5A9B,
- 0x7B9D9DCE, 0xEEEEEEEE, 0x5C7D9DBD, 0x9EBECEDE,
- 0xEEEEEEEE, 0xCECEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0x4C9D7CBD, 0x9ECEBEDE, 0xEEEEEEEE, 0x8EBEBEDE,
- 0x9ECEBEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xBEEEBEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0x5D9E9DCD, 0xAECECEEE,
- 0xEEEEEEEE, 0x8EAEBEDE, 0xBEDEDEEE, 0xEEEEEEEE,
- 0xCECEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x7EBEAEDE,
- 0xBEEECEEE, 0xEEEEEEEE, 0x9ECECEEE, 0xBEDEDEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xBEEEBEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xDEEEEEEE,
- 0xDEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE,
- 0xEEEEEEEE, 0x7EBEBEDE, 0xCEEEDEEE, 0xEEEEEEEE,
- 0x9ECECEEE, 0xDEEEEEEE, 0xEEEEEEEE, 0xBECEEEEE,
- 0xEEEEEEEE, 0xEEEEEEEE, 0x9ECEBEEE, 0xDEEEDEEE,
- 0xEEEEEEEE, 0xAEDECEEE, 0xDEEEEEEE, 0xEEEEEEEE,
- 0xCEDEEEEE, 0xEEDEEEEE, 0xEEEEEEEE, 0xAEDEBEEE,
- 0xEEEEDEEE, 0xEEEEEEEE, 0xCEEEDEEE, 0xDEEEDEEE,
- 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEEEEE, 0xEEEEEEEE,
- ]],
- l12_tab: [
- [
- 0xF2825978, 0xB24956A8, 0x9B68A89B, 0xABB14936, 0xA79B36A5, 0x7A99B78B, 0x99BAAB58, 0xB68B8AC6,
- 0x8B89B9AC, 0x8AC9ACBB, 0xB8AB9AC9, 0xAB8AB9AC, 0xAAB9ABAA, 0xBAAA0000
- ], [
- 0xF4D27EAD, 0xE16E69EC, 0xEE9CECEE, 0xEEE06E59, 0xEBEE49E8, 0xAEDDE9DE, 0xDEEEEE7A, 0xE9CECEE8,
- 0xCEBCEEEE, 0xBEEEEEEE, 0xEBEEDEEE, 0xEECEEEEE, 0xEEEEEEEE, 0xEEEE0000
- ]],
- l3_tab: [
- [
- 0xF2815979, 0xB25A46A9, 0xAC79B9AC, 0xBBC14946, 0xA8AC46A6, 0x8B9AC89C, 0x9ACBCC68, 0xB79CABD7,
- 0x9C8ACBBD, 0xABDBBDCC, 0xD9ACABCB, 0xCDABCBCD, 0xCCDBCDCC, 0xDCCC0000
- ], [
- 0xF3D17FCF, 0xF27F6AFE, 0xEFBEFCEF, 0xEFF05F69, 0xFEFF59F9, 0xCFFFFDFF, 0xDFFFFF9A, 0xEBEFFFFB,
- 0xCFCEFFFF, 0xFFFEFFFF, 0xFFEFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFE0000
- ]],
- esc_tab: [ 0x01235566, 0x7888999A, 0xABBBCCCC, 0xCBCDDEED ],
- },
- CoeffsCBDesc {
- l0_tab: [
- [
- 0xF5373667, 0x58796989, 0xDEDECECD, 0x39596989,
- 0x6B8B8B9A, 0xDEDEDEDD, 0x9E9DBDBC, 0xBEBDCECD,
- 0xEEEEEEDD, 0x38695889, 0x6A8B8A9A, 0xDEDEDEDD,
- 0x6B8B8B9A, 0x8C9C9CAB, 0xEEDEDEDD, 0xBEBECEBC,
- 0xCECEDECD, 0xEEEEEEDE, 0x9EBD9CAB, 0xAECEADCC,
- 0xEEEEDEDD, 0xAECEBDBC, 0xCEDEBDCC, 0xEEEEEEDD,
- 0xDEDEDEDD, 0xEEEEEEDD, 0xEEEEEEDD, 0x18585878,
- 0x6A8A8A9A, 0xDEDEDEDD, 0x4A6A7A8A, 0x8C9B9CAB,
- 0xEEEEDEDD, 0x9E9DBEBC, 0xBEBECECD, 0xEEEEEEED,
- 0x4A7A6A8A, 0x7C9C8BAB, 0xEEEEDEDD, 0x6B8C8BAB,
- 0x8C9C9CAB, 0xDEDEDEDD, 0xBEBECECD, 0xBEAECECD,
- 0xEEDEEEDD, 0x9EBD8CAB, 0xBECEADBC, 0xEEEEDEDD,
- 0xAECEADBC, 0xBECEADCC, 0xEEEEDEDD, 0xDEDEDEDD,
- 0xDEDEDECD, 0xEEEEDEDD, 0x5B8B7B9A, 0x9DACACBC,
- 0xEEEEEEEE, 0x7D8C9CAB, 0xAEBDBDBC, 0xEEEEEEEE,
- 0x9E9DBEBC, 0xCEBEDECD, 0xEEEEEEEE, 0x7C9C8CAB,
- 0xAEBDADBC, 0xEEEEEEEE, 0x8DADADBC, 0xAEBDBDBC,
- 0xEEEEEEEE, 0xBEBECECD, 0xBEAECECD, 0xEECEEEDE,
- 0x9EBE9DBC, 0xCECEBDCD, 0xEEEEEEEE, 0xAECEBECC,
- 0xBECEADCD, 0xEEEEDEDD, 0xDEEEDEDD, 0xCEDEDECD,
- 0xDECEDECD, 0x7DAD9DBC, 0xBEBEBDCC, 0xEEEEEEED,
- 0x8EADADBC, 0xCECECECC, 0xEEEEEEDD, 0x9E9DBEBC,
- 0xCEBEDECC, 0xEEEEEEDD, 0x8EBDADBC, 0xBECEBECC,
- 0xEEEEEEDD, 0x9EBEAEBC, 0xBECECECC, 0xEEEEEEED,
- 0xAEAEBEBC, 0xBEAECECC, 0xEEDEEEDC, 0x9EBE9DAB,
- 0xCEDEBDBC, 0xEEEEEEDD, 0xAEBEADBC, 0xBECEBEBC,
- 0xEEEEDEDC, 0xBEBECEBC, 0xBEBEBEBB, 0xCEBCCDBB,
- ], [
- 0xF649398B, 0x5A9C9CDD, 0xDDDDDDDD, 0x3B6C9DBD,
- 0x8DBDCDDD, 0xDDDDDDDD, 0xCDDDDDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0x3B9D6CBD, 0x8DCDBDDD, 0xDDDDDDDD,
- 0x8DBDBDDD, 0xADDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0xBDDDCDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0x0A6B5BAC,
- 0x6BADADDD, 0xDDDDDDDD, 0x4C8D9DCD, 0x9DBDCDDD,
- 0xDDDDDDDD, 0xCDCDDDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0x4DAD7DCD, 0x9DDDCDDD, 0xDDDDDDDD, 0x8DBDCDDD,
- 0x9DDDCDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0xBDDDBDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0x4D9D8DCD, 0x9DCDBDDD,
- 0xDDDDDDDD, 0x7DADBDDD, 0xBDDDDDDD, 0xDDDDDDDD,
- 0xBDBDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0x6DBD9DDD,
- 0xBDDDDDDD, 0xDDDDDDDD, 0x9DDDCDDD, 0xADDDDDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0xADDDADDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0x6DBDADDD, 0xBDDDCDDD, 0xDDDDDDDD,
- 0x9DBDCDDD, 0xCDDDDDDD, 0xDDDDDDDD, 0xBDBDDDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0x8DDDBDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0xADDDCDDD, 0xDDDDDDDD, 0xDDDDDDDD,
- 0xCDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xADDDBDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0xBDDDDDDD, 0xDDDDDDDD,
- 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDEED,
- ]],
- l12_tab: [
- [
- 0xF3A26B8A, 0xD26B57CA, 0xBD89CABD, 0xCDE05B47, 0xC8AD47C6, 0x8DABD8AD, 0xABDCDE58, 0xC79D9BE7,
- 0x9D8AEABE, 0x9BEBBEDC, 0xE9ADABDA, 0xCE9BDABE, 0xBCEACEBC, 0xDCCD0000
- ], [
- 0xF4D26EAC, 0xE17E69EE, 0xEEACEDEE, 0xEEE06C58, 0xEBDE49E8, 0xAEDDEADE, 0xEEEEEE79, 0xEACEEEE8,
- 0xAECCEDDE, 0xBEEEEEEE, 0xEDDEDEEE, 0xEEDEEEEE, 0xEEEEEEEE, 0xEEEE0000
- ]],
- l3_tab: [
- [
- 0xF3B25B9B, 0xE25B57CA, 0xCE8AD9BE, 0xDDE04A47, 0xCACE47C7, 0x8DBCE9BD, 0xABEDDE68, 0xB8ADCDE8,
- 0xADABECDE, 0xBDECDEEE, 0xEBCDCDEE, 0xEEBCECDE, 0xEEEDDEEE, 0xEEEE0000
- ], [
- 0xF3D27DEE, 0xE18E69EE, 0xEEAEEEBE, 0xEEE05E6A, 0xEEEE59E8, 0xBEEEEBEE, 0xEEEEEEAA, 0xEEEEEEEB,
- 0xEEEEEEEE, 0xEBEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEED0000
- ]],
- esc_tab: [ 0x01234577, 0x8899AABD, 0xDEEEEEEE, 0xEDDDDEED ],
- },
-];
diff --git a/src/codecs/real/rv60dsp.rs b/src/codecs/real/rv60dsp.rs
deleted file mode 100644
index 3850acc..0000000
--- a/src/codecs/real/rv60dsp.rs
+++ /dev/null
@@ -1,928 +0,0 @@
-use crate::frame::NAVideoBuffer;
-use crate::codecs::MV;
-use crate::codecs::blockdsp::edge_emu;
-
-fn clip8(val: i16) -> u8 { val.min(255).max(0) as u8 }
-
-macro_rules! el {
- ($s: ident, $o: expr) => ( $s[$o] as i16 )
-}
-
-macro_rules! filter {
- (01; $s: ident, $o: expr, $step: expr) => (
- clip8((( el!($s, $o - 2 * $step)
- -5 * el!($s, $o - 1 * $step)
- +52 * el!($s, $o - 0 * $step)
- +20 * el!($s, $o + 1 * $step)
- -5 * el!($s, $o + 2 * $step)
- + el!($s, $o + 3 * $step) + 32) >> 6) as i16)
- );
- (02; $s: ident, $o: expr, $step: expr) => (
- clip8((( el!($s, $o - 2 * $step)
- -5 * el!($s, $o - 1 * $step)
- +20 * el!($s, $o - 0 * $step)
- +20 * el!($s, $o + 1 * $step)
- -5 * el!($s, $o + 2 * $step)
- + el!($s, $o + 3 * $step) + 16) >> 5) as i16)
- );
- (03; $s: ident, $o: expr, $step: expr) => (
- clip8((( el!($s, $o - 2 * $step)
- -5 * el!($s, $o - 1 * $step)
- +20 * el!($s, $o - 0 * $step)
- +52 * el!($s, $o + 1 * $step)
- -5 * el!($s, $o + 2 * $step)
- + el!($s, $o + 3 * $step) + 32) >> 6) as i16)
- );
-}
-
-macro_rules! filter_row {
- ($d: ident, $do: expr, $s: ident, $so: expr, $step: expr, $size: expr, $mode: expr) => ({
- match $mode {
- 1 => {
- for x in 0..$size {
- $d[$do + x] = filter!(01; $s, $so + x, $step);
- }
- },
- 2 => {
- for x in 0..$size {
- $d[$do + x] = filter!(02; $s, $so + x, $step);
- }
- },
- 3 => {
- for x in 0..$size {
- $d[$do + x] = filter!(03; $s, $so + x, $step);
- }
- },
- _ => {},
- };
- });
-}
-
-fn luma_mc(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, w: usize, h: usize, cx: usize, cy: usize) {
- if (cx == 0) && (cy == 0) {
- for _ in 0..h {
- for x in 0..w { dst[didx + x] = src[sidx + x]; }
- didx += dstride;
- sidx += sstride;
- }
- } else if cy == 0 {
- for _ in 0..h {
- filter_row!(dst, didx, src, sidx, 1, w, cx);
- didx += dstride;
- sidx += sstride;
- }
- } else if cx == 0 {
- for _ in 0..h {
- filter_row!(dst, didx, src, sidx, sstride, w, cy);
- didx += dstride;
- sidx += sstride;
- }
- } else if (cx != 3) || (cy != 3) {
- let mut tmp: [u8; 70 * 64] = [0; 70 * 64];
- for y in 0..h+5 {
- filter_row!(tmp, y * 64, src, sidx - sstride * 2, 1, w, cx);
- sidx += sstride;
- }
- for y in 0..h {
- filter_row!(dst, didx, tmp, (y + 2) * 64, 64, w, cy);
- didx += dstride;
- }
- } else {
- for _ in 0..h {
- for x in 0..w {
- dst[didx + x] = ((el!(src, sidx + x) + el!(src, sidx + x + 1) +
- el!(src, sidx + x + sstride) + el!(src, sidx + x + 1 + sstride) + 2) >> 2) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
- }
-}
-
-fn chroma_mc(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, w: usize, h: usize, x: usize, y: usize) {
- if (x == 0) && (y == 0) {
- for _ in 0..h {
- for x in 0..w { dst[didx + x] = src[sidx + x]; }
- didx += dstride;
- sidx += sstride;
- }
- return;
- }
- if (x > 0) && (y > 0) {
- let a = ((4 - x) * (4 - y)) as u16;
- let b = (( x) * (4 - y)) as u16;
- let c = ((4 - x) * ( y)) as u16;
- let d = (( x) * ( y)) as u16;
- for _ in 0..h {
- for x in 0..w {
- dst[didx + x] = ((a * (src[sidx + x] as u16)
- + b * (src[sidx + x + 1] as u16)
- + c * (src[sidx + x + sstride] as u16)
- + d * (src[sidx + x + 1 + sstride] as u16) + 8) >> 4) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
- } else {
- let a = ((4 - x) * (4 - y)) as u16;
- let e = (( x) * (4 - y) + (4 - x) * ( y)) as u16;
- let step = if y > 0 { sstride } else { 1 };
- for _ in 0..h {
- for x in 0..w {
- dst[didx + x] = ((a * (src[sidx + x] as u16)
- + e * (src[sidx + x + step] as u16) + 8) >> 4) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
- }
-}
-
-fn check_pos(x: usize, y: usize, cw: usize, ch: usize, w: usize, h: usize, dx: i16, dy: i16, e0: isize, e1: isize, e2: isize, e3: isize) -> bool {
- let xn = (x as isize) + (dx as isize);
- let yn = (y as isize) + (dy as isize);
-
- (xn - e0 >= 0) && (xn + (cw as isize) + e1 <= (w as isize)) && (yn - e2 >= 0) && (yn + (ch as isize) + e3 <= (h as isize))
-}
-
-macro_rules! diff{
- ($src: ident, $e1: expr, $e2: expr) => (
- ($src[$e1] as i16) - ($src[$e2] as i16)
- )
-}
-macro_rules! strength{
- ($el: expr, $lim: expr) => (if $el < $lim { 3 } else { 1 })
-}
-fn clip_symm(val: i16, lim: i16) -> i16 { val.max(-lim).min(lim) }
-
-fn filter_luma_edge(dst: &mut [u8], mut offset: usize, step: usize, stride: usize, mode1: u8, mode2: u8, lim1: i16, lim2: i16) {
- let mut diff_q1q0: [i16; 4] = [0; 4];
- let mut diff_p1p0: [i16; 4] = [0; 4];
- for i in 0..4 {
- let off = offset + i * stride;
- diff_q1q0[i] = diff!(dst, off - 2 * step, off - step);
- diff_p1p0[i] = diff!(dst, off + step, off);
- }
- let str_p = strength!(diff_q1q0[0] + diff_q1q0[1] + diff_q1q0[2] + diff_q1q0[3], lim2);
- let str_q = strength!(diff_p1p0[0] + diff_p1p0[1] + diff_p1p0[2] + diff_p1p0[3], lim2);
- if str_p + str_q > 2 {
- let msum = ((mode1 + mode2 + str_q + str_p) >> 1) as i16;
- let (maxprod, weak) = if (str_q == 1) || (str_p == 1) { (512, true) } else { (384, false) };
- for y in 0..4 {
- let diff_p0q0 = diff!(dst, offset, offset - step);
- if (diff_p0q0 != 0) && (lim1 * diff_p0q0.abs() < maxprod) {
- let diff_q1q2 = diff!(dst, offset - 2 * step, offset - 3 * step);
- let diff_p1p2 = diff!(dst, offset + step, offset + 2 * step);
- let delta = if weak {
- clip_symm((diff_p0q0 + 1) >> 1, msum >> 1)
- } else {
- let diff_strg = (diff!(dst, offset - 2 * step, offset + step) + 4 * diff_p0q0 + 4) >> 3;
- clip_symm(diff_strg, msum)
- };
- dst[offset - step] = clip8((dst[offset - step] as i16) + delta);
- dst[offset] = clip8((dst[offset] as i16) - delta);
- if (str_q != 1) && (diff_q1q2.abs() <= (lim1 >> 2)) {
- let diff = (diff_q1q0[y] + diff_q1q2 - delta) >> 1;
- let delta_q1 = if weak {
- clip_symm(diff, (mode1 >> 1) as i16)
- } else {
- clip_symm(diff, mode1 as i16)
- };
- dst[offset - 2 * step] = clip8((dst[offset - 2 * step] as i16) - delta_q1);
- }
- if (str_p != 1) && (diff_p1p2.abs() <= (lim1 >> 2)) {
- let diff = (diff_p1p0[y] + diff_p1p2 + delta) >> 1;
- let delta_p1 = if weak {
- clip_symm(diff, (mode2 >> 1) as i16)
- } else {
- clip_symm(diff, mode2 as i16)
- };
- dst[offset + step] = clip8((dst[offset + step] as i16) - delta_p1);
- }
- }
- offset += stride;
- }
- }
-}
-fn filter_chroma_edge(dst: &mut [u8], mut offset: usize, step: usize, stride: usize, mode1: u8, mode2: u8, lim1: i16, lim2: i16) {
- let diff_q = 4 * diff!(dst, offset - 2 * step, offset - step).abs();
- let diff_p = 4 * diff!(dst, offset + step, offset ).abs();
- let str_q = strength!(diff_q, lim2);
- let str_p = strength!(diff_p, lim2);
- if str_p + str_q > 2 {
- let msum = ((mode1 + mode2 + str_q + str_p) >> 1) as i16;
- let (maxprod, weak) = if (str_q == 1) || (str_p == 1) { (512, true) } else { (384, false) };
- for _ in 0..2 {
- let diff_pq = diff!(dst, offset, offset - step);
- if (diff_pq != 0) && (lim1 * diff_pq.abs() < maxprod) {
- let delta = if weak {
- clip_symm((diff_pq + 1) >> 1, msum >> 1)
- } else {
- let diff_strg = (diff!(dst, offset - 2 * step, offset + step) + 4 * diff_pq + 4) >> 3;
- clip_symm(diff_strg, msum)
- };
- dst[offset - step] = clip8((dst[offset - step] as i16) + delta);
- dst[offset] = clip8((dst[offset] as i16) - delta);
- }
- offset += stride;
- }
- }
-}
-
-pub struct RV60DeblockParams {
- pub deblock_chroma: bool,
- pub width: usize,
- pub height: usize,
- pub dblkstride: usize,
-}
-
-pub struct RV60DSP {}
-/*pub fn rv6_transform4x4_dc(coeffs: &mut [i16]) {
- let dc = (((coeffs[0] * 13 + 0x10) >> 5) * 13 + 0x10) >> 5;
- for el in coeffs.iter_mut().take(16) {
- *el = dc;
- }
-}*/
-
-impl RV60DSP {
- pub fn new() -> Self { Self{} }
- pub fn transform4x4(&self, blk: &mut [i16]) {
- let mut tmp: [i32; 4 * 4] = [0; 4 * 4];
-
- for i in 0..4 {
- let a = blk[i + 0 * 4] as i32;
- let b = blk[i + 1 * 4] as i32;
- let c = blk[i + 2 * 4] as i32;
- let d = blk[i + 3 * 4] as i32;
-
- let t0 = 13 * (a + c);
- let t1 = 13 * (a - c);
- let t2 = 7 * b - 17 * d;
- let t3 = 7 * d + 17 * b;
- tmp[i + 0 * 4] = (t0 + t3 + 0x10) >> 5;
- tmp[i + 1 * 4] = (t1 + t2 + 0x10) >> 5;
- tmp[i + 2 * 4] = (t1 - t2 + 0x10) >> 5;
- tmp[i + 3 * 4] = (t0 - t3 + 0x10) >> 5;
- }
- for (dst, src) in blk.chunks_mut(4).zip(tmp.chunks(4)) {
- let a = src[0];
- let b = src[1];
- let c = src[2];
- let d = src[3];
-
- let t0 = 13 * (a + c);
- let t1 = 13 * (a - c);
- let t2 = 7 * b - 17 * d;
- let t3 = 7 * d + 17 * b;
- dst[0] = ((t0 + t3 + 0x10) >> 5) as i16;
- dst[1] = ((t1 + t2 + 0x10) >> 5) as i16;
- dst[2] = ((t1 - t2 + 0x10) >> 5) as i16;
- dst[3] = ((t0 - t3 + 0x10) >> 5) as i16;
- }
- }
- /*pub fn transform8x8_dc(&self, blk: &mut [i16]) {
- assert!(blk.len() >= 8 * 8);
- let dc = (((coeffs[0] * 37 + 0x40) >> 7) * 37 + 0x40) >> 7;
- for el in coeffs.iter_mut().take(8 * 8) {
- *el = dc;
- }
- }*/
- pub fn transform8x8(&self, blk: &mut [i16]) {
- assert!(blk.len() >= 8 * 8);
- let mut tmp: [i32; 8 * 8] = [0; 8 * 8];
- for i in 0..8 {
- let s0 = blk[i + 0 * 8] as i32;
- let s1 = blk[i + 1 * 8] as i32;
- let s2 = blk[i + 2 * 8] as i32;
- let s3 = blk[i + 3 * 8] as i32;
- let s4 = blk[i + 4 * 8] as i32;
- let s5 = blk[i + 5 * 8] as i32;
- let s6 = blk[i + 6 * 8] as i32;
- let s7 = blk[i + 7 * 8] as i32;
-
- let t0 = 37 * (s0 + s4);
- let t1 = 37 * (s0 - s4);
- let t2 = 48 * s2 + 20 * s6;
- let t3 = 20 * s2 - 48 * s6;
- let t4 = t0 + t2;
- let t5 = t0 - t2;
- let t6 = t1 + t3;
- let t7 = t1 - t3;
- let t8 = 51 * s1 + 43 * s3 + 29 * s5 + 10 * s7;
- let t9 = 43 * s1 - 10 * s3 - 51 * s5 - 29 * s7;
- let ta = 29 * s1 - 51 * s3 + 10 * s5 + 43 * s7;
- let tb = 10 * s1 - 29 * s3 + 43 * s5 - 51 * s7;
- tmp[i + 0 * 8] = (t4 + t8 + 0x40) >> 7;
- tmp[i + 1 * 8] = (t6 + t9 + 0x40) >> 7;
- tmp[i + 2 * 8] = (t7 + ta + 0x40) >> 7;
- tmp[i + 3 * 8] = (t5 + tb + 0x40) >> 7;
- tmp[i + 4 * 8] = (t5 - tb + 0x40) >> 7;
- tmp[i + 5 * 8] = (t7 - ta + 0x40) >> 7;
- tmp[i + 6 * 8] = (t6 - t9 + 0x40) >> 7;
- tmp[i + 7 * 8] = (t4 - t8 + 0x40) >> 7;
- }
- for (dst, src) in blk.chunks_mut(8).zip(tmp.chunks(8)) {
- let s0 = src[0];
- let s1 = src[1];
- let s2 = src[2];
- let s3 = src[3];
- let s4 = src[4];
- let s5 = src[5];
- let s6 = src[6];
- let s7 = src[7];
-
- let t0 = 37 * (s0 + s4);
- let t1 = 37 * (s0 - s4);
- let t2 = 48 * s2 + 20 * s6;
- let t3 = 20 * s2 - 48 * s6;
- let t4 = t0 + t2;
- let t5 = t0 - t2;
- let t6 = t1 + t3;
- let t7 = t1 - t3;
- let t8 = 51 * s1 + 43 * s3 + 29 * s5 + 10 * s7;
- let t9 = 43 * s1 - 10 * s3 - 51 * s5 - 29 * s7;
- let ta = 29 * s1 - 51 * s3 + 10 * s5 + 43 * s7;
- let tb = 10 * s1 - 29 * s3 + 43 * s5 - 51 * s7;
- dst[0] = ((t4 + t8 + 0x40) >> 7) as i16;
- dst[1] = ((t6 + t9 + 0x40) >> 7) as i16;
- dst[2] = ((t7 + ta + 0x40) >> 7) as i16;
- dst[3] = ((t5 + tb + 0x40) >> 7) as i16;
- dst[4] = ((t5 - tb + 0x40) >> 7) as i16;
- dst[5] = ((t7 - ta + 0x40) >> 7) as i16;
- dst[6] = ((t6 - t9 + 0x40) >> 7) as i16;
- dst[7] = ((t4 - t8 + 0x40) >> 7) as i16;
- }
- }
- /*pub fn transform16x16_dc(&self, blk: &mut [i16; 16 * 16]) {
- let dc = (((coeffs[0] * 26 + 0x40) >> 7) * 26 + 0x40) >> 7;
- for el in coeffs.iter_mut() {
- *el = dc;
- }
- }*/
- #[allow(non_snake_case)]
- fn transform16(blk: &mut [i16; 16 * 16], off: usize, step: usize) {
- let src0 = blk[off + 0 * step] as i32;
- let src1 = blk[off + 1 * step] as i32;
- let src2 = blk[off + 2 * step] as i32;
- let src3 = blk[off + 3 * step] as i32;
- let src4 = blk[off + 4 * step] as i32;
- let src5 = blk[off + 5 * step] as i32;
- let src6 = blk[off + 6 * step] as i32;
- let src7 = blk[off + 7 * step] as i32;
- let src8 = blk[off + 8 * step] as i32;
- let src9 = blk[off + 9 * step] as i32;
- let srcA = blk[off + 10 * step] as i32;
- let srcB = blk[off + 11 * step] as i32;
- let srcC = blk[off + 12 * step] as i32;
- let srcD = blk[off + 13 * step] as i32;
- let srcE = blk[off + 14 * step] as i32;
- let srcF = blk[off + 15 * step] as i32;
- let t0 = 26 * (src0 + src8);
- let t1 = 26 * (src0 - src8);
- let t2 = 14 * src4 - 34 * srcC;
- let t3 = 34 * src4 + 14 * srcC;
- let t4 = t0 + t3;
- let t5 = t0 - t3;
- let t6 = t1 + t2;
- let t7 = t1 - t2;
- let tmp00 = 31 * src2 + -7 * src6 + -36 * srcA + -20 * srcE;
- let tmp01 = 36 * src2 + 31 * src6 + 20 * srcA + 7 * srcE;
- let tmp02 = 20 * src2 + -36 * src6 + 7 * srcA + 31 * srcE;
- let tmp03 = 7 * src2 + -20 * src6 + 31 * srcA + -36 * srcE;
- let tm0 = t4 + tmp01;
- let tm1 = t4 - tmp01;
- let tm2 = t5 + tmp03;
- let tm3 = t5 - tmp03;
- let tm4 = t6 + tmp00;
- let tm5 = t6 - tmp00;
- let tm6 = t7 + tmp02;
- let tm7 = t7 - tmp02;
- let tt0 = 37 * src1 + 35 * src3 + 32 * src5 + 28 * src7 + 23 * src9 + 17 * srcB + 11 * srcD + 4 * srcF;
- let tt1 = 35 * src1 + 23 * src3 + 4 * src5 + -17 * src7 + -32 * src9 + -37 * srcB + -28 * srcD + -11 * srcF;
- let tt2 = 32 * src1 + 4 * src3 + -28 * src5 + -35 * src7 + -11 * src9 + 23 * srcB + 37 * srcD + 17 * srcF;
- let tt3 = 28 * src1 + -17 * src3 + -35 * src5 + 4 * src7 + 37 * src9 + 11 * srcB + -32 * srcD + -23 * srcF;
- let tt4 = 23 * src1 + -32 * src3 + -11 * src5 + 37 * src7 + -4 * src9 + -35 * srcB + 17 * srcD + 28 * srcF;
- let tt5 = 17 * src1 + -37 * src3 + 23 * src5 + 11 * src7 + -35 * src9 + 28 * srcB + 4 * srcD + -32 * srcF;
- let tt6 = 11 * src1 + -28 * src3 + 37 * src5 + -32 * src7 + 17 * src9 + 4 * srcB + -23 * srcD + 35 * srcF;
- let tt7 = 4 * src1 + -11 * src3 + 17 * src5 + -23 * src7 + 28 * src9 + -32 * srcB + 35 * srcD + -37 * srcF;
- blk[off + 0 * step] = ((tm0 + tt0 + 64) >> 7) as i16;
- blk[off + 1 * step] = ((tm4 + tt1 + 64) >> 7) as i16;
- blk[off + 2 * step] = ((tm6 + tt2 + 64) >> 7) as i16;
- blk[off + 3 * step] = ((tm4 + tt3 + 64) >> 7) as i16;
- blk[off + 4 * step] = ((tm3 + tt4 + 64) >> 7) as i16;
- blk[off + 5 * step] = ((tm7 + tt5 + 64) >> 7) as i16;
- blk[off + 6 * step] = ((tm5 + tt6 + 64) >> 7) as i16;
- blk[off + 7 * step] = ((tm1 + tt7 + 64) >> 7) as i16;
- blk[off + 8 * step] = ((tm1 - tt7 + 64) >> 7) as i16;
- blk[off + 9 * step] = ((tm5 - tt6 + 64) >> 7) as i16;
- blk[off + 10 * step] = ((tm7 - tt5 + 64) >> 7) as i16;
- blk[off + 11 * step] = ((tm3 - tt4 + 64) >> 7) as i16;
- blk[off + 12 * step] = ((tm2 - tt3 + 64) >> 7) as i16;
- blk[off + 13 * step] = ((tm6 - tt2 + 64) >> 7) as i16;
- blk[off + 14 * step] = ((tm4 - tt1 + 64) >> 7) as i16;
- blk[off + 15 * step] = ((tm0 - tt0 + 64) >> 7) as i16;
- }
- pub fn transform16x16(&self, blk: &mut [i16; 16 * 16]) {
- for i in 0..16 {
- Self::transform16(blk, i, 16);
- }
- for i in 0..16 {
- Self::transform16(blk, i * 16, 1);
- }
- }
-
- pub fn add_block(&self, dst: &mut [u8], mut doff: usize, dstride: usize, blk: &[i16], size: usize) {
- for y in 0..size {
- for x in 0..size {
- dst[doff + x] = clip8((dst[doff + x] as i16) + blk[x + y * size]);
- }
- doff += dstride;
- }
- }
- fn avg(&self, dst: &mut [u8], mut didx: usize, dstride: usize,
- src: &[u8], mut sidx: usize, sstride: usize,
- w: usize, h: usize) {
- for _ in 0..h {
- for x in 0..w {
- dst[didx + x] = (((dst[didx + x] as u16) + (src[sidx + x] as u16)) >> 1) as u8;
- }
- didx += dstride;
- sidx += sstride;
- }
- }
- pub fn do_avg(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, w: usize, h: usize) {
- for comp in 0..3 {
- let dstride = frame.get_stride(comp);
- let sstride = prev_frame.get_stride(comp);
- let doff = if comp == 0 { x + y * dstride } else { frame.get_offset(comp) + (x >> 1) + (y >> 1) * dstride };
- let soff = prev_frame.get_offset(comp);
- let mut ddata = frame.get_data_mut();
- let dst: &mut [u8] = ddata.as_mut_slice();
- let sdata = prev_frame.get_data();
- let src: &[u8] = sdata.as_slice();
-
- if comp == 0 {
- self.avg(dst, doff, dstride, src, soff, sstride, w, h);
- } else {
- self.avg(dst, doff, dstride, src, soff, sstride, w >> 1, h >> 1);
- }
- }
- }
- pub fn do_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, w: usize, h: usize, mv: MV, avg: bool) {
- { // luma
- let dstride = frame.get_stride(0);
- let doffset = frame.get_offset(0) + (if !avg { x + y * dstride } else { 0 });
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
-
- let (w_, h_) = prev_frame.get_dimensions(0);
- let fw = (w_ + 15) & !15;
- let fh = (h_ + 15) & !15;
-
- let dx = mv.x >> 2;
- let cx = (mv.x & 3) as usize;
- let dy = mv.y >> 2;
- let cy = (mv.y & 3) as usize;
-
- if check_pos(x, y, w, h, fw, fh, dx, dy, RV60_EDGE1[cx], RV60_EDGE2[cx], RV60_EDGE1[cy], RV60_EDGE2[cy]) {
- let sstride = prev_frame.get_stride(0);
- let mut soffset = prev_frame.get_offset(0) + x + y * sstride;
- let data = prev_frame.get_data();
- let src: &[u8] = data.as_slice();
- soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize;
- luma_mc(dst, doffset, dstride, src, soffset, sstride, w, h, cx, cy);
- } else {
- let mut ebuf: [u8; 70*70] = [0; 70*70];
- edge_emu(prev_frame, (x as isize) + (dx as isize) - 2, (y as isize) + (dy as isize) - 2, w+5, h+5, &mut ebuf, 70, 0);
- luma_mc(dst, doffset, dstride, &ebuf, 70*2 + 2, 70, w, h, cx, cy);
- }
- }
- let (w_, h_) = prev_frame.get_dimensions(1);
- let fw = (w_ + 7) & !7;
- let fh = (h_ + 7) & !7;
- let mvx = mv.x / 2;
- let mvy = mv.y / 2;
- let dx = mvx >> 2;
- let cx = (mvx & 3) as usize;
- let dy = mvy >> 2;
- let cy = (mvy & 3) as usize;
- let cw = w >> 1;
- let ch = h >> 1;
-
- for comp in 1..3 { // chroma
- let dstride = frame.get_stride(comp);
- let doffset = frame.get_offset(comp) + (if !avg { (x >> 1) + (y >> 1) * dstride } else { 0 });
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
- if check_pos(x >> 1, y >> 1, cw, ch, fw, fh, dx, dy, 0, 1, 0, 1) {
- let sstride = prev_frame.get_stride(comp);
- let mut soffset = prev_frame.get_offset(comp) + (x >> 1) + (y >> 1) * sstride;
- let data = prev_frame.get_data();
- let src: &[u8] = data.as_slice();
- soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize;
- chroma_mc(dst, doffset, dstride, src, soffset, sstride, cw, ch, cx, cy);
- } else {
- let mut ebuf: [u8; 40*40] = [0; 40*40];
- edge_emu(prev_frame, ((x >> 1) as isize) + (dx as isize), ((y >> 1) as isize) + (dy as isize), cw+1, ch+1, &mut ebuf, 40, comp);
- chroma_mc(dst, doffset, dstride, &ebuf, 0, 40, cw, ch, cx, cy);
- }
- }
- }
- fn deblock_edge4_ver(&self, frame: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize,
- dblk_l: u8, dblk_r: u8, deblock_chroma: bool) {
- let qp_l = dblk_l >> 2;
- let str_l = dblk_l & 3;
- let qp_r = dblk_r >> 2;
- let str_r = dblk_r & 3;
- let dl_l = &RV60_DEB_LIMITS[qp_l as usize];
- let dl_r = &RV60_DEB_LIMITS[qp_r as usize];
- let mode_l = if str_l != 0 { dl_l[(str_l - 1) as usize] } else { 0 };
- let mode_r = if str_r != 0 { dl_r[(str_r - 1) as usize] } else { 0 };
- let lim1 = dl_r[2] as i16;
- let lim2 = (dl_r[3] * 4) as i16;
- {
- let stride = frame.get_stride(0);
- let offset = frame.get_offset(0) + xpos + ypos * stride;
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
- filter_luma_edge(dst, offset, 1, stride, mode_l, mode_r, lim1, lim2);
- }
- if ((str_l | str_r) >= 2) && deblock_chroma {
- for comp in 1..2 {
- let stride = frame.get_stride(comp);
- let offset = frame.get_offset(comp) + (xpos >> 1) + (ypos >> 1) * stride;
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
- filter_chroma_edge(dst, offset, 1, stride, mode_l, mode_r, lim1, lim2);
- }
- }
- }
- fn deblock_edge4_hor(&self, frame: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize,
- dblk_t: u8, dblk_d: u8, deblock_chroma: bool) {
- let qp_t = dblk_t >> 2;
- let str_t = dblk_t & 3;
- let qp_d = dblk_d >> 2;
- let str_d = dblk_d & 3;
- let dl_t = &RV60_DEB_LIMITS[qp_t as usize];
- let dl_d = &RV60_DEB_LIMITS[qp_d as usize];
- let mode_t = if str_t != 0 { dl_t[(str_t - 1) as usize] } else { 0 };
- let mode_d = if str_d != 0 { dl_d[(str_d - 1) as usize] } else { 0 };
- let lim1 = dl_d[2] as i16;
- let lim2 = (dl_d[3] * 4) as i16;
- {
- let stride = frame.get_stride(0);
- let offset = frame.get_offset(0) + xpos + ypos * stride;
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
- filter_luma_edge(dst, offset, stride, 1, mode_t, mode_d, lim1, lim2);
- }
- if ((str_t | str_d) >= 2) && deblock_chroma {
- for comp in 1..2 {
- let stride = frame.get_stride(comp);
- let offset = frame.get_offset(comp) + (xpos >> 1) + (ypos >> 1) * stride;
- let mut data = frame.get_data_mut();
- let dst: &mut [u8] = data.as_mut_slice();
- filter_chroma_edge(dst, offset, stride, 1, mode_t, mode_d, lim1, lim2);
- }
- }
- }
- fn deblock8x8(&self, dparams: &RV60DeblockParams, frame: &mut NAVideoBuffer<u8>,
- xpos: usize, ypos: usize, top_str: &[u8], left_str: &[u8], dblkpos: usize) {
- if xpos > 0 {
- if ypos > 0 {
- let str_l = left_str[dblkpos - dparams.dblkstride];
- let str_r = left_str[dblkpos];
- if (str_l | str_r) != 0 {
- self.deblock_edge4_ver(frame, xpos, ypos - 4, str_l, str_r, dparams.deblock_chroma);
- }
- }
- {
- let str_l = left_str[dblkpos];
- let str_r = left_str[dblkpos + dparams.dblkstride];
- if (str_l | str_r) != 0 {
- self.deblock_edge4_ver(frame, xpos, ypos + 0, str_l, str_r, dparams.deblock_chroma);
- }
- }
- if ypos + 4 >= dparams.height {
- let str_l = left_str[dblkpos + dparams.dblkstride];
- let str_r = left_str[dblkpos + dparams.dblkstride * 2];
- if (str_l | str_r) != 0 {
- self.deblock_edge4_ver(frame, xpos, ypos + 4, str_l, str_r, dparams.deblock_chroma);
- }
- }
- }
- if ypos > 0 {
- if xpos > 0 {
- let str_t = top_str[dblkpos - 1];
- let str_d = top_str[dblkpos];
- if (str_t | str_d) != 0 {
- self.deblock_edge4_hor(frame, xpos - 4, ypos, str_t, str_d, dparams.deblock_chroma);
- }
- }
- {
- let str_t = top_str[dblkpos];
- let str_d = top_str[dblkpos + 1];
- if (str_t | str_d) != 0 {
- self.deblock_edge4_hor(frame, xpos + 0, ypos, str_t, str_d, dparams.deblock_chroma);
- }
- }
- if xpos + 4 >= dparams.width {
- let str_t = top_str[dblkpos + 1];
- let str_d = top_str[dblkpos + 2];
- if (str_t | str_d) != 0 {
- self.deblock_edge4_hor(frame, xpos + 4, ypos, str_t, str_d, dparams.deblock_chroma);
- }
- }
- }
- }
- pub fn do_deblock(&self, dparams: &RV60DeblockParams, frame: &mut NAVideoBuffer<u8>,
- xpos: usize, ypos: usize, size: usize, top_str: &[u8], left_str: &[u8], dpos: usize) {
- for x in 0..(size >> 3) {
- self.deblock8x8(dparams, frame, xpos + x * 8, ypos,
- top_str, left_str, dpos + x * 2);
- }
- for y in 1..(size >> 3) {
- self.deblock8x8(dparams, frame, xpos, ypos + y * 8,
- top_str, left_str, dpos + y * 2 * dparams.dblkstride);
- }
- }
-}
-
-const RV60_DEB_LIMITS: [[u8; 4]; 32] = [
- [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ],
- [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ],
- [ 0, 0, 128, 3 ], [ 0, 1, 128, 3 ], [ 0, 1, 122, 3 ], [ 1, 1, 96, 4 ],
- [ 1, 1, 75, 4 ], [ 1, 1, 59, 4 ], [ 1, 1, 47, 6 ], [ 1, 1, 37, 6 ],
- [ 1, 1, 29, 6 ], [ 1, 2, 23, 7 ], [ 1, 2, 18, 8 ], [ 1, 2, 15, 8 ],
- [ 1, 2, 13, 9 ], [ 2, 3, 11, 9 ], [ 2, 3, 10, 10 ], [ 2, 3, 9, 10 ],
- [ 2, 4, 8, 11 ], [ 3, 4, 7, 11 ], [ 3, 5, 6, 12 ], [ 3, 5, 5, 13 ],
- [ 3, 5, 4, 14 ], [ 4, 7, 3, 15 ], [ 5, 8, 2, 16 ], [ 5, 9, 1, 17 ]
-];
-
-#[derive(Clone)]
-pub struct IntraPredContext {
- pub t: [u8; 129], // 0 - TL or 0x80, two block sizes or replicated last val from block0
- pub l: [u8; 129],
- pub has_t: bool,
- pub has_tr: bool,
- pub has_l: bool,
- pub has_ld: bool,
-}
-
-impl IntraPredContext {
- pub fn new() -> Self {
- Self {
- t: [0x80; 129], l: [0x80; 129], has_t: false, has_tr: false, has_l: false, has_ld: false,
- }
- }
- pub fn pred_dc(&self, dst: &mut [u8], mut doff: usize, dstride: usize, size: usize, filter: bool) {
- let dc;
- if !self.has_t && !self.has_l {
- dc = 0x80;
- } else {
- let mut sum = 0;
- if self.has_t {
- for x in 0..size { sum += self.t[x + 1] as u16; }
- }
- if self.has_l {
- for y in 0..size { sum += self.l[y + 1] as u16; }
- }
- if self.has_t && self.has_l {
- dc = ((sum + (size as u16)) / ((size as u16) * 2)) as u8;
- } else {
- dc = ((sum + ((size >> 1) as u16)) / (size as u16)) as u8;
- }
- }
- for _ in 0..size {
- for x in 0..size { dst[doff + x] = dc; }
- doff += dstride;
- }
- if filter && self.has_t && self.has_l {
- doff -= dstride * size;
- dst[doff] = (((self.t[1] as u16) + (self.l[1] as u16) + 2 * (dst[doff] as u16) + 2) >> 2) as u8;
- for x in 1..size {
- dst[doff + x] = (((self.t[x + 1] as u16) + 3 * (dst[doff + x] as u16) + 2) >> 2) as u8;
- }
- for y in 1..size {
- doff += dstride;
- dst[doff] = (((self.l[y + 1] as u16) + 3 * (dst[doff] as u16) + 2) >> 2) as u8;
- }
- }
- }
- pub fn pred_plane(&self, dst: &mut [u8], mut doff: usize, dstride: usize, size: usize) {
- let lastl = self.l[size + 1] as i32;
- let lastt = self.t[size + 1] as i32;
- let mut tmp1: [i32; 64] = [0; 64];
- let mut tmp2: [i32; 64] = [0; 64];
- for i in 0..size {
- tmp1[i] = lastl - (self.t[i + 1] as i32);
- tmp2[i] = lastt - (self.l[i + 1] as i32);
- }
- let shift = match size {
- 4 => 3,
- 8 => 4,
- 16 => 5,
- 32 => 6,
- _ => 7,
- };
- let mut top_ref: [i32; 64] = [0; 64];
- let mut left_ref:[i32; 64] = [0; 64];
- for i in 0..size {
- top_ref [i] = (self.t[i + 1] as i32) << (shift - 1);
- left_ref[i] = (self.l[i + 1] as i32) << (shift - 1);
- }
- for y in 0..size {
- let add = tmp2[y];
- let mut sum = left_ref[y] + (size as i32);
- for x in 0..size {
- let v = tmp1[x] + top_ref[x];
- sum += add;
- top_ref[x] = v;
- dst[doff + x] = ((sum + v) >> shift) as u8;
- }
- doff += dstride;
- }
- }
- fn pred_hor_angle(dst: &mut [u8], doff: usize, dstride: usize, size: usize, weight: i16, src: &[u8]) {
- let mut sum = 0;
- for x in 0..size {
- sum += weight;
- let off = ((sum >> 5) + 32) as usize;
- let frac = (sum & 0x1F) as u16;
- if frac == 0 {
- for y in 0..size {
- dst[doff + x + y * dstride] = src[off + y];
- }
- } else {
- for y in 0..size {
- let a = src[off + y + 0] as u16;
- let b = src[off + y + 1] as u16;
- dst[doff + x + y * dstride] = (((32 - frac) * a + frac * b + 0x10) >> 5) as u8;
- }
- }
- }
- }
- fn pred_ver_angle(dst: &mut [u8], mut doff: usize, dstride: usize, size: usize, weight: i16, src: &[u8]) {
- let mut sum = 0;
- for _ in 0..size {
- sum += weight;
- let off = ((sum >> 5) + 32) as usize;
- let frac = (sum & 0x1F) as u16;
- if frac == 0 {
- for x in 0..size {
- dst[doff + x] = src[off + x];
- }
- } else {
- for x in 0..size {
- let a = src[off + x + 0] as u16;
- let b = src[off + x + 1] as u16;
- dst[doff + x] = (((32 - frac) * a + frac * b + 0x10) >> 5) as u8;
- }
- }
- doff += dstride;
- }
- }
- fn filter_weak(dst: &mut [u8], src: &[u8], size: usize) {
- dst[0] = src[0];
- for i in 1..size-1 {
- dst[i] = (((src[i - 1] as u16) + 2 * (src[i] as u16) + (src[i + 1] as u16) + 2) >> 2) as u8;
- }
- dst[size - 1] = src[size - 1];
- }
- fn filter_bilin32(dst: &mut [u8], v0: u8, v1: u8, size: usize) {
- let diff = (v1 as i16) - (v0 as i16);
- let mut sum = ((v0 as i16) << 5) + (1 << (5 - 1));
- for i in 0..size {
- dst[i] = (sum >> 5) as u8;
- sum += diff;
- }
- }
- pub fn pred_angle(&self, dst: &mut [u8], mut doff: usize, dstride: usize, size: usize, angle: usize, filter: bool) {
- let mut filtered1: [u8; 96] = [0; 96];
- let mut filtered2: [u8; 96] = [0; 96];
- if angle == 0 {
- self.pred_plane(dst, doff, dstride, size);
- } else if angle == 1 {
- self.pred_dc(dst, doff, dstride, size, filter);
- } else if angle <= 9 {
- let ang_weight = RV60_IPRED_ANGLE[10 - angle];
- let add_size = (size * (ang_weight as usize) + 31) >> 5;
- if size <= 16 {
- Self::filter_weak(&mut filtered1[32..], &self.l[1..], size + add_size);
- } else {
- Self::filter_bilin32(&mut filtered1[32..], self.l[1], self.l[33], 32);
- Self::filter_bilin32(&mut filtered1[64..], self.l[32], self.l[64], add_size);
- }
- Self::pred_hor_angle(dst, doff, dstride, size, ang_weight as i16, &filtered1);
- } else if angle == 10 {
- if size <= 16 {
- Self::filter_weak(&mut filtered1[32..], &self.l[1..], size);
- } else {
- Self::filter_bilin32(&mut filtered1[32..], self.l[1], self.l[33], 32);
- }
- for y in 0..size {
- for x in 0..size {
- dst[doff + x] = filtered1[32 + y];
- }
- doff += dstride;
- }
- if filter {
- doff -= dstride * size;
- let tl = self.t[0] as i16;
- for x in 0..size {
- dst[doff + x] = clip8((dst[doff + x] as i16) + (((self.t[x + 1] as i16) - tl) >> 1));
- }
- }
- } else if angle <= 17 {
- let ang_weight = RV60_IPRED_ANGLE [angle - 10];
- let inv_angle = RV60_IPRED_INV_ANGLE[angle - 10];
- let add_size = (size * (ang_weight as usize) + 31) >> 5;
- if size <= 16 {
- for i in 0..size+1 {
- filtered1[32-1 + i] = self.l[i];
- }
- for i in 0..size+1 {
- filtered2[32-1 + i] = self.t[i];
- }
- } else {
- filtered1[32-1] = self.l[0];
- Self::filter_bilin32(&mut filtered1[32..], self.l[0], self.l[32], 32);
- filtered2[32-1] = self.t[0];
- Self::filter_bilin32(&mut filtered2[32..], self.t[0], self.t[32], 32);
- }
- if add_size > 1 {
- let mut sum = 0x80;
- for i in 1..add_size {
- sum += inv_angle;
- let pos = ((sum >> 8) + 32 - 1) as usize;
- filtered1[32 - 1 - i] = filtered2[pos];
- }
- }
- Self::pred_hor_angle(dst, doff, dstride, size, -(ang_weight as i16), &filtered1);
- } else if angle <= 25 {
- let ang_weight = RV60_IPRED_ANGLE[26 - angle];
- let inv_angle = RV60_IPRED_INV_ANGLE[26 - angle];
- let add_size = (size * (ang_weight as usize) + 31) >> 5;
- if size <= 16 {
- for i in 0..size+1 {
- filtered1[32-1 + i] = self.t[i];
- }
- for i in 0..size+1 {
- filtered2[32-1 + i] = self.l[i];
- }
- } else {
- filtered1[32-1] = self.t[0];
- Self::filter_bilin32(&mut filtered1[32..], self.t[0], self.t[32], 32);
- filtered2[32-1] = self.l[0];
- Self::filter_bilin32(&mut filtered2[32..], self.l[0], self.l[32], 32);
- }
- if add_size > 1 {
- let mut sum = 0x80;
- for i in 1..add_size {
- sum += inv_angle;
- let pos = ((sum >> 8) + 32 - 1) as usize;
- filtered1[32 - 1 - i] = filtered2[pos];
- }
- }
- Self::pred_ver_angle(dst, doff, dstride, size, -(ang_weight as i16), &filtered1);
- } else if angle == 26 {
- if size <= 16 {
- Self::filter_weak(&mut filtered1[32..], &self.t[1..], size);
- } else {
- Self::filter_bilin32(&mut filtered1[32..], self.t[1], self.t[33], 32);
- }
- for _ in 0..size {
- for x in 0..size {
- dst[doff + x] = filtered1[32 + x];
- }
- doff += dstride;
- }
- if filter {
- doff -= dstride * size;
- let tl = self.l[0] as i16;
- for y in 0..size {
- dst[doff] = clip8((dst[doff] as i16) + (((self.l[y + 1] as i16) - tl) >> 1));
- doff += dstride;
- }
- }
- } else if angle <= 34 {
- let ang_weight = RV60_IPRED_ANGLE[angle - 26];
- let add_size = (size * (ang_weight as usize) + 31) >> 5;
- if size <= 16 {
- Self::filter_weak(&mut filtered1[32..], &self.t[1..], size + add_size);
- } else {
- Self::filter_bilin32(&mut filtered1[32..], self.t[1], self.t[33], 32);
- Self::filter_bilin32(&mut filtered1[64..], self.t[32], self.t[64], add_size);
- }
- Self::pred_ver_angle(dst, doff, dstride, size, ang_weight as i16, &filtered1);
- } else {
- unreachable!();
- }
- }
-}
-
-const RV60_IPRED_ANGLE: [u8; 9] = [ 0, 2, 5, 9, 13, 17, 21, 26, 32 ];
-const RV60_IPRED_INV_ANGLE: [i16; 9] = [ 0, 4096, 1638, 910, 630, 482, 390, 315, 256 ];
-const RV60_EDGE1: [isize; 4] = [ 0, 2, 2, 2 ];
-const RV60_EDGE2: [isize; 4] = [ 0, 3, 3, 3 ];
-
diff --git a/src/codecs/sipro.rs b/src/codecs/sipro.rs
deleted file mode 100644
index 882d90c..0000000
--- a/src/codecs/sipro.rs
+++ /dev/null
@@ -1,1584 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use super::*;
-use crate::io::bitreader::*;
-
-use std::f32::consts::PI;
-
-#[derive(Clone,Copy,PartialEq)]
-enum SiproMode {
- Mode16k,
- Mode8_5k,
- Mode6_5k,
- Mode5k,
-}
-
-impl SiproMode {
- fn is16k(&self) -> bool { *self == SiproMode::Mode16k }
-}
-
-const SIPRO_MODE_FROM_IDX: [SiproMode; 4] = [
- SiproMode::Mode16k, SiproMode::Mode8_5k, SiproMode::Mode6_5k, SiproMode::Mode5k
-];
-
-const EXCITATION_OFFSET: usize = 281 + 10 + 1;
-
-struct SiproDecoder {
- chmap: NAChannelMap,
- ainfo: NAAudioInfo,
- info: Rc<NACodecInfo>,
- mode: &'static SiproModeInfo,
- mode_type: SiproMode,
-
- pred_switch: bool,
- vq_idx: [usize; 5],
- pitch_delay: [usize; 5],
- gp_index: [usize; 5],
- fc_index: [[i16; 10]; 5],
- gc_index: [usize; 5],
- npulses: usize,
- pulse_data: [i16; 20],
-
- pitch_lag_prev: usize,
- prev_pitch_gain: f32,
- avg_energy: f32,
- gain_mem: f32,
-
- lsf_hist: [f32; 16],
- lsp_hist: [f32; 16],
- energy_hist: [f32; 4],
- sf_filter: [[f32; 16]; 5],
- excitation: [f32; 512+64],
- synth: [f32; 256],
- synth_hist: [f32; 16],
- ir: [f32; 80],
- fix_vec: [f32; 80],
-
- postfilt_5k: [f32; 256],
- postfilt_5k_mem1: [f32; 10],
- postfilt_5k_mem2: [f32; 10],
- postfilt_5k_tilt: f32,
- postfilt_5k_gain: f32,
-
- postfilt_16k_preemph: [f32; 16],
- postfilt_16k_filt: [f32; 16],
- postfilt_16k_filt_prev: [f32; 16],
- postfilt_16k_buf: [f32; 256],
-
- iir_state: [f32; 2],
-
- pitch_int: usize,
- prev_pitch: usize,
-}
-
-impl SiproDecoder {
- fn new() -> Self {
- SiproDecoder {
- chmap: NAChannelMap::new(),
- ainfo: NAAudioInfo::new(0, 1, SND_F32P_FORMAT, 0),
- info: NACodecInfo::new_dummy(),
- mode: &SIPRO_MODES[0],
- mode_type: SiproMode::Mode5k,
-
- pred_switch: false,
- vq_idx: [0; 5],
- pitch_delay: [0; 5],
- gp_index: [0; 5],
- fc_index: [[0; 10]; 5],
- gc_index: [0; 5],
- npulses: 0,
- pulse_data: [0; 20],
-
- pitch_lag_prev: 0,
- prev_pitch_gain: 0.0,
- avg_energy: 0.0,
- gain_mem: 0.0,
- pitch_int: 0,
- prev_pitch: 0,
-
- lsf_hist: [0.0; 16],
- lsp_hist: [0.0; 16],
- energy_hist: [0.0; 4],
- sf_filter: [[0.0; 16]; 5],
- excitation: [0.0; 512+64],
- synth: [0.0; 256],
- synth_hist: [0.0; 16],
- ir: [0.0; 80],
- fix_vec: [0.0; 80],
-
- postfilt_5k: [0.0; 256],
- postfilt_5k_mem1: [0.0; 10],
- postfilt_5k_mem2: [0.0; 10],
- postfilt_5k_tilt: 0.0,
- postfilt_5k_gain: 0.0,
-
- postfilt_16k_preemph: [0.0; 16],
- postfilt_16k_filt: [0.0; 16],
- postfilt_16k_filt_prev: [0.0; 16],
- postfilt_16k_buf: [0.0; 256],
-
- iir_state: [0.0; 2],
- }
- }
-
- fn unpack_frame(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- if self.mode.pred {
- self.pred_switch = br.read_bool()?;
- } else {
- self.pred_switch = false;
- }
- for i in 0..5 {
- self.vq_idx[i] = br.read(self.mode.vq_idx_bits[i])? as usize;
- }
- for sf in 0..self.mode.subframes {
- self.pitch_delay[sf] = br.read(self.mode.pitch_delay_bits[sf])? as usize;
- self.gp_index[sf] = br.read(self.mode.gp_idx_bits)? as usize;
- for i in 0..self.mode.fc_indices {
- self.fc_index[sf][i] = br.read(self.mode.fc_idx_bits[i])? as i16;
- }
- self.gc_index[sf] = br.read(self.mode.gc_idx_bits)? as usize;
- }
- Ok(())
- }
- fn decode_lsf_16k(&mut self) {
- let mut filter: [f32; 16] = [0.0; 16];
- let mut newfilt: [f32; 16] = [0.0; 16];
- let mut lsp: [f32; 16] = [0.0; 16];
-
- for cb in 0..4 {
- for i in 0..3 {
- filter[cb * 3 + i] = SIPRO_LSF_CODEBOOK_16K[cb][self.vq_idx[cb]][i];
- }
- }
- for i in 0..4 {
- filter[4 * 3 + i] = SIPRO_LSF_CB4_16K[self.vq_idx[4]][i];
- }
-
- if self.pred_switch {
- for i in 0..newfilt.len() {
- newfilt[i] = (filter[i] + self.lsf_hist[i]) * 0.5 + SIPRO_MEAN_LSF_16K[i];
- }
- } else {
- for i in 0..newfilt.len() {
- newfilt[i] = 0.88 * filter[i] + 0.12 * self.lsf_hist[i] + SIPRO_MEAN_LSF_16K[i];
- }
- }
- for i in 0..filter.len() {
- self.lsf_hist[i] = filter[i];
- }
-
- let mut prev: f32 = 0.0;
- for i in 0..newfilt.len() {
- newfilt[i] = newfilt[i].max(prev + SIPRO_LSF_MIN_DIST/2.0);
- prev = newfilt[i];
- filter[i] = newfilt[i].cos();
- }
-
- for i in 0..lsp.len() {
- lsp[i] = (filter[i] + self.lsp_hist[i]) * 0.5;
- }
-
- lsp2lpc_16k(&mut self.sf_filter[0], &lsp);
- lsp2lpc_16k(&mut self.sf_filter[1], &filter);
- for i in 0..filter.len() {
- self.lsp_hist[i] = filter[i];
- }
-
- for i in 0..16 {
- self.synth[i] = self.synth_hist[i];
- }
- }
- fn decode_lsf_lbr(&mut self) {
- let mut filter: [f32; 10] = [0.0; 10];
- let mut newfilt: [f32; 10] = [0.0; 10];
-
- for cb in 0..5 {
- for i in 0..2 {
- filter[cb * 2 + i] = SIPRO_LSF_CODEBOOK_LBR[cb][self.vq_idx[cb]][i];
- }
- }
- for i in 0..newfilt.len() {
- newfilt[i] = filter[i] + 0.33 * self.lsf_hist[i] + SIPRO_MEAN_LSF_LBR[i];
- }
- for i in 0..8 { // maybe it's just bubble sort?
- for j in (0..i+1).rev() {
- if newfilt[j] <= newfilt[j + 1] { break; }
- let tmp = newfilt[j];
- newfilt[j] = newfilt[j + 1];
- newfilt[j + 1] = tmp;
- }
- }
-
- let mut prev: f32 = 0.0;
- for i in 0..9 {
- newfilt[i] = newfilt[i].max(prev + SIPRO_LSF_MIN_DIST);
- prev = newfilt[i];
- }
- newfilt[9] = newfilt[9].min(prev + SIPRO_LSF_MIN_DIST_LAST);
- for i in 0..filter.len() {
- self.lsf_hist[i] = filter[i];
- }
-
- for i in 0..9 {
- newfilt[i] = newfilt[i].cos();
- }
- newfilt[9] *= 6.153848 / PI;
-
- let mut interp: f32 = 0.5 / (self.mode.subframes as f32);
- for sf in 0..self.mode.subframes {
- for i in 0..newfilt.len() {
- filter[i] = newfilt[i] * interp + self.lsp_hist[i] * (1.0 - interp);
- }
- lsp2lpc_lbr(&mut self.sf_filter[sf], &filter);
- interp += 1.0 / (self.mode.subframes as f32);
- }
- for i in 0..newfilt.len() {
- self.lsp_hist[i] = newfilt[i];
- }
-
- for i in 0..10 {
- self.synth[i] = self.synth_hist[i];
- }
- }
- fn calc_pitch_16k(&mut self, sf: usize) {
- let idx = self.pitch_delay[sf];
- let pitch_idx = if sf == 0 {
- if idx < 390 {
- idx + 88
- } else {
- idx * 3 - 690
- }
- } else {
- if idx < 62 {
- (self.prev_pitch - 10).max(30).min(281 - 19) * 3 + idx - 2
- } else {
- self.prev_pitch * 3
- }
- };
- self.pitch_int = ((pitch_idx + 2) * 10923) >> 15;
- self.prev_pitch = ((pitch_idx + 1) * 10923) >> 15;
- let pitch_frac = pitch_idx + 2 - 3 * self.pitch_int;
-
- for i in 0..80 {
- let mut sum: f32 = 0.0;
- let estart = EXCITATION_OFFSET + sf * 80 - self.pitch_int + i + 1;
- for j in 0..10 {
- sum += self.excitation[estart + j] * SIPRO_SINC_16K[j * 3 + pitch_frac + 1];
- sum += self.excitation[estart - j - 1] * SIPRO_SINC_16K[j * 3 + 3 - pitch_frac - 1];
- }
- self.excitation[EXCITATION_OFFSET + sf * 80 + i] = sum;
- }
- }
- fn calc_pitch_lbr(&mut self, sf: usize) {
- let new_sf = (sf == 0) || (self.mode_type == SiproMode::Mode5k && sf == 2);
- let idx = self.pitch_delay[sf];
- let pitch_idx = if new_sf {
- if idx < 197 {
- idx + 59
- } else {
- idx * 3 - 335
- }
- } else {
- idx + (self.prev_pitch - 5).max(20).min(134) * 3 - 1
- };
- self.pitch_int = (pitch_idx * 10923) >> 15;
- let pitch_frac = (pitch_idx as i32) - (self.pitch_int as i32) * 3 - 1;
- if new_sf {
- self.prev_pitch = self.pitch_int;
- }
- let ffrac = 2 * ((pitch_frac + 2) % 3) + 2;
- let off = EXCITATION_OFFSET + sf * 48 + (if pitch_frac <= 0 { 1 } else { 0 });
- for i in 0..48 {
- let mut sum: f32 = 0.0;
- let estart = off + i - self.pitch_int;
- for j in 0..10 {
- let idx0 = ((j * 6) as i32) + ffrac;
- let idx1 = ((j * 6) as i32) + 6 - ffrac;
- sum += self.excitation[estart + j] * SIPRO_SINC_LBR[idx0 as usize];
- sum += self.excitation[estart - j - 1] * SIPRO_SINC_LBR[idx1 as usize];
- }
- self.excitation[EXCITATION_OFFSET + sf * 48 + i] = sum;
- }
- }
- fn unpack_pulses_16k(&mut self, sf: usize) {
- self.npulses = 10;
- for i in 0..5 {
- let off1 = (self.fc_index[sf][i * 2 + 0] & 0xF) * 5 + (i as i16);
- let off2 = (self.fc_index[sf][i * 2 + 1] & 0xF) * 5 + (i as i16);
- let sign = if (self.fc_index[sf][i * 2 + 1] & 0x10) != 0 { -1 } else { 1 };
- self.pulse_data[i * 4 + 0] = off1;
- self.pulse_data[i * 4 + 1] = if off1 < off2 { -sign } else { sign };
- self.pulse_data[i * 4 + 2] = off2;
- self.pulse_data[i * 4 + 3] = sign;
- }
- self.fix_vec = [0.0; 80];
- let pitch_frac = SIPRO_GAIN_PITCH_CB_16K[self.gp_index[sf]].min(1.0);
- for i in 0..10 {
- let mut scale = self.pulse_data[i * 2 + 1] as f32;
- let off = self.pulse_data[i * 2 + 0] as usize;
- for j in (off..80).step_by(self.prev_pitch) {
- self.fix_vec[j] += scale;
- scale *= pitch_frac;
- }
- }
- }
- fn unpack_pulses_8_5k(&mut self, sf: usize) {
- self.npulses = 6;
- for i in 0..3 {
- self.pulse_data[i * 4 + 0] = 3 * ((self.fc_index[sf][i] >> 4) & 0xF) + (i as i16);
- self.pulse_data[i * 4 + 2] = 3 * ((self.fc_index[sf][i] >> 0) & 0xF) + (i as i16);
- self.pulse_data[i * 4 + 1] = if (self.fc_index[sf][i] & 0x100) != 0 { -1 } else { 1 };
- self.pulse_data[i * 4 + 3] = if (self.fc_index[sf][i] & 0x100) != 0 { -1 } else { 1 };
- if self.pulse_data[i * 4 + 2] < self.pulse_data[i * 4 + 0] {
- self.pulse_data[i * 4 + 3] = -self.pulse_data[i * 4 + 3];
- }
- }
- self.unpack_pulses_common();
- }
- fn unpack_pulses_6_5k(&mut self, sf: usize) {
- self.npulses = 3;
- for i in 0..3 {
- self.pulse_data[i * 2 + 0] = 3 * (self.fc_index[sf][i] & 0xF) + (i as i16);
- self.pulse_data[i * 2 + 1] = if (self.fc_index[sf][i] & 0x10) != 0 { -1 } else { 1 };
- }
- self.unpack_pulses_common();
- }
- fn unpack_pulses_5k(&mut self, sf: usize) {
- if self.prev_pitch_gain < 0.8 {
- self.npulses = 3;
- let mut cw = self.fc_index[sf][0];
- let off = if (cw & 0x200) != 0 { 2 } else { 0 };
- for i in 0..3 {
- self.pulse_data[i * 2 + 0] = (cw & 7) * 6 + 4 - (i as i16) * 2;
- self.pulse_data[i * 2 + 1] = if ((self.pulse_data[i * 2 + 0] + off) & 3) != 0 { -1 } else { 1 };
- cw >>= 3;
- }
- } else {
- self.npulses = 2;
- let off = (self.fc_index[sf][0] >> 8) & 1;
- self.pulse_data[0] = 3 * ((self.fc_index[sf][0] >> 4) & 0xF) + off;
- self.pulse_data[1] = if (self.fc_index[sf][0] & 0x200) != 0 { -1 } else { 1 };
- self.pulse_data[2] = 3 * ((self.fc_index[sf][0] >> 0) & 0xF) + off + 1;
- self.pulse_data[3] = -self.pulse_data[1];
- }
- self.unpack_pulses_common();
- }
- fn unpack_pulses_common(&mut self) {
- for i in 0..48 {
- self.fix_vec[i] = 0.0;
- }
- for i in 0..self.npulses {
- let off = self.pulse_data[i * 2] as usize;
- let scale = self.pulse_data[i * 2 + 1] as f32;
- for j in off..48 {
- self.fix_vec[j] += scale * self.ir[10 + j - off];
- }
- }
- }
- fn eval_ir(&mut self, sf: usize) {
- let mut tmp: [f32; 48 + 1] = [0.0; 48 + 1];
- let mut filt: [f32; 16] = [0.0; 16];
- tmp[0] = 1.0;
- for i in 0..10 {
- tmp[i + 1] = self.sf_filter[sf][i] * SIPRO_POW_0_55[i];
- filt[i] = self.sf_filter[sf][i] * SIPRO_POW_0_7[i];
- }
- synth_filter(&mut self.ir, 10, &filt, &tmp, 48, 10);
- for i in self.pitch_int..48 {
- self.ir[10 + i] += self.mode.pitch_sharp_factor * self.ir[10 + i - self.pitch_int];
- }
- }
- fn update_gain_16k(&mut self, sf: usize) {
- let mut energy: f64 = 0.0;
- for i in 0..80 {
- energy += (self.fix_vec[i] as f64) * (self.fix_vec[i] as f64);
- }
- let ehist = ((0.8 * self.energy_hist[0] + 0.6 * self.energy_hist[1]) as f64) - 71.30899869919435856603;
- let rms = 8.94427190999915878559 * (10.0f64.ln() / 20.0 * ehist).exp() / (0.01 + energy).sqrt();
- let gain = SIPRO_GAIN_CB_16K[self.gc_index[sf]] * (rms as f32);
-
- self.energy_hist[1] = self.energy_hist[0];
- self.energy_hist[0] = SIPRO_GAIN_DB_CB_16K[self.gc_index[sf]];
-
- let exc = &mut self.excitation[EXCITATION_OFFSET + sf * 80..][..80];
- for i in 0..80 {
- exc[i] = exc[i] * SIPRO_GAIN_PITCH_CB_16K[self.gp_index[sf]] + self.fix_vec[i] * gain;
- }
- }
- fn update_gain_lbr(&mut self, sf: usize) {
- let gain0 = SIPRO_GAIN_CB_LBR[self.gc_index[sf]][0];
- let gain1 = SIPRO_GAIN_CB_LBR[self.gc_index[sf]][1];
- self.prev_pitch_gain = gain0;
-
- self.avg_energy = 0.01;
- for el in self.fix_vec.iter().take(48) {
- self.avg_energy += *el * *el;
- }
- self.avg_energy /= 48.0;
-
- let mut sum: f32 = -56.30899869919435856603;
- for i in 0..4 {
- sum += self.energy_hist[i] * SIPRO_GAIN_PRED[i];
- }
- for i in 0..3 {
- self.energy_hist[i] = self.energy_hist[i + 1];
- }
- self.energy_hist[3] = 20.0 * gain1.log10();
-
- let gain = ((gain1 as f64) * ((sum as f64) * (10.0f64).ln() * 0.05).exp() / (self.avg_energy as f64).sqrt()) as f32;
- let exc = &mut self.excitation[EXCITATION_OFFSET + sf * 48..][..48];
- for i in 0..48 {
- exc[i] = exc[i] * gain0 + self.fix_vec[i] * gain;
- }
-
- let pitch_gain = (0.5 * gain0 * gain0).min(0.4);
- self.gain_mem = (0.7 * self.gain_mem + 0.3 * pitch_gain).min(pitch_gain);
-
- let gain = gain * self.gain_mem;
-
- for i in 0..48 {
- self.fix_vec[i] = exc[i] - gain * self.fix_vec[i];
- }
- }
- fn synth_subframe_16k(&mut self, sf: usize) {
- synth_filter(&mut self.synth, 16 + sf * 80, &self.sf_filter[sf], &self.excitation[EXCITATION_OFFSET + sf * 80..], 80, 16);
- }
- fn synth_subframe_lbr(&mut self, sf: usize) {
- if self.mode_type == SiproMode::Mode5k {
- self.postfilter_5k_sf(sf);
- }
- synth_filter(&mut self.synth, 10 + sf * 48, &self.sf_filter[sf], &self.fix_vec, 48, 10);
- }
- fn postfilter_16k(&mut self) {
- let mut filt: [f32; 16] = [0.0; 16];
-
- for i in 0..filt.len() {
- filt[i] = self.postfilt_16k_filt_prev[i] * SIPRO_POW_0_5[i];
- }
-
- let mut tmp: [f32; 64] = [0.0; 64];
- for i in 0..16 {
- tmp[i] = self.postfilt_16k_preemph[i];
- }
- synth_filter(&mut tmp, 16, &self.postfilt_16k_filt, &self.synth[16..], 30, 16);
- for i in 0..16 {
- self.synth[i] = self.postfilt_16k_preemph[i];
- }
- let mut tsrc: [f32; 30] = [0.0; 30];
- tsrc.copy_from_slice(&self.synth[16..][..30]);
- synth_filter(&mut self.synth, 16, &filt, &tsrc, 30, 16);
- for i in 0..16 {
- self.postfilt_16k_buf[30 - 16 + i] = self.synth[30 + i];
- }
- synth_filter(&mut self.postfilt_16k_buf, 30, &filt, &self.synth[30 + 16..], 2 * 80 - 30, 16);
- self.postfilt_16k_filt = filt;
- for i in 0..16 {
- self.postfilt_16k_preemph[i] = self.postfilt_16k_buf[2 * 80 - 16 + i];
- self.postfilt_16k_filt_prev[i] = self.sf_filter[1][i];
- }
-
- for i in 0..30 {
- self.postfilt_16k_buf[i] = tmp[i + 16] + (i as f32) * (self.synth[i + 16] - tmp[i + 16]) / 30.0;
- }
- }
- fn postfilter_5k_sf(&mut self, sf: usize) {
- let mut d: [f32; 10] = [0.0; 10];
- let mut n: [f32; 10] = [0.0; 10];
-
- for i in 0..10 {
- d[i] = self.sf_filter[sf][i] * SIPRO_POW_0_75[i];
- n[i] = self.sf_filter[sf][i] * SIPRO_POW_0_5[i];
- }
-
- let mut tmp: [f32; 48 + 10] = [0.0; 48 + 10];
- for i in 0..10 {
- tmp[i] = self.postfilt_5k_mem1[i];
- }
- synth_filter(&mut tmp, 10, &d, &self.fix_vec, 48, 10);
- for i in 0..10 {
- self.postfilt_5k_mem1[i] = tmp[i + 48];
- }
-
- let tilt = tmp[48 + 10 - 1];
- for i in (10+1..48+10).rev() {
- tmp[i] -= 0.4 * tmp[i - 1];
- }
- tmp[10] -= 0.4 * self.postfilt_5k_tilt;
- self.postfilt_5k_tilt = tilt;
-
- for i in 0..10 {
- tmp[i] = self.postfilt_5k_mem2[i];
- }
- for i in 0..10 {
- self.postfilt_5k_mem2[i] = tmp[i + 48];
- }
-
- for i in 0..48 { // almost but not exactly like synth_filter(fix_vec, 0, -n, tmp, 48, 10)
- self.fix_vec[i] = tmp[i + 10];
- for j in 0..10 {
- self.fix_vec[i] += n[j] * tmp[i + 10 - j - 1];
- }
- }
-
- synth_filter(&mut self.postfilt_5k, 10 + sf * 48, &self.sf_filter[sf],
- &self.excitation[EXCITATION_OFFSET + sf * 48..], 48, 10);
- }
- fn postfilter_5k(&mut self) {
- for sf in 0..self.mode.subframes {
- let src = &self.postfilt_5k[10 + sf * 48..][..48];
- let mut fenergy: f32 = 0.0;
- for el in src.iter() {
- fenergy += *el * *el;
- }
- let mut senergy: f32 = 0.0;
- {
- let src = &self.synth[10 + sf * 48..][..48];
- for el in src.iter() {
- senergy += *el * *el;
- }
- }
-
- let gain = if senergy != 0.0 { 0.1 * (fenergy / senergy).sqrt() } else { 0.1 };
-
- let dst = &mut self.synth[10 + sf * 48..][..48];
- for el in dst.iter_mut() {
- self.postfilt_5k_gain *= 0.9;
- self.postfilt_5k_gain += gain;
- *el *= self.postfilt_5k_gain;
- }
- }
- for i in 0..10 {
- self.postfilt_5k[i] = self.postfilt_5k[i + self.mode.subframes * 48];
- }
- }
- fn output_16k(&mut self, dst: &mut [f32]) {
- for i in 0..16 {
- self.synth_hist[i] = self.synth[80 * 2 + i];
- }
- for i in 0..EXCITATION_OFFSET {
- self.excitation[i] = self.excitation[80 * 2 + i];
- }
- self.postfilter_16k();
- for i in 0..80 * 2 {
- dst[i] = self.postfilt_16k_buf[i];
- }
- }
- fn output_lbr(&mut self, dst: &mut [f32]) {
- let out_size = self.mode.subframe_len * self.mode.subframes;
- for i in 0..10 {
- self.synth_hist[i] = self.synth[i + out_size];
- }
- if self.mode_type == SiproMode::Mode5k {
- self.postfilter_5k();
- }
- for i in 0..EXCITATION_OFFSET {
- self.excitation[i] = self.excitation[i + out_size];
- }
- for i in 0..out_size {
- let x = 0.939805806 * self.synth[i + 10] + 1.93307352 * self.iir_state[0] - 0.935891986 * self.iir_state[1];
- let y = x - 1.99997 * self.iir_state[0] + self.iir_state[1];
- self.iir_state[1] = self.iir_state[0];
- self.iir_state[0] = x;
- dst[i] = y;
- }
- }
-}
-
-fn lsp2poly(lsp: &[f32], poly: &mut [f64], order: usize) {
- poly[0] = 1.0;
- poly[1] = -2.0 * (lsp[0] as f64);
- for i in 1..order {
- poly[i + 1] = -2.0 * (lsp[2 * i] as f64) * poly[i] + 2.0 * poly[i - 1];
- for j in (2..i+1).rev() {
- poly[j] += -2.0 * (lsp[2 * i] as f64) * poly[j - 1] + poly[j - 2];
- }
- poly[1] += -2.0 * (lsp[2 * i] as f64);
- }
-}
-
-fn lsp2lpc_16k(lpc: &mut [f32], lsp: &[f32]) {
- let mut a: [f64; 10] = [0.0; 10];
- let mut b: [f64; 10] = [0.0; 10];
- lsp2poly(&lsp[0..], &mut a, 8);
- lsp2poly(&lsp[1..], &mut b, 8);
- for i in 0..8 {
- let ta = a[8 - i] + a[7 - i];
- let tb = b[8 - i] - b[7 - i];
- lpc[7 - i] = ((ta + tb) * 0.5) as f32;
- lpc[8 + i] = ((ta - tb) * 0.5) as f32;
- }
-}
-fn lsp2lpc_lbr(lpc: &mut [f32], lsp: &[f32]) {
- let mut a: [f64; 6] = [0.0; 6];
- let mut b: [f64; 6] = [0.0; 6];
- lsp2poly(&lsp[0..], &mut a[0..], 5);
- lsp2poly(&lsp[1..], &mut b[1..], 4);
-
- let ascale = (1.0 + lsp[9]) as f64;
- let bscale = (1.0 - lsp[9]) as f64;
- for i in 1..5 {
- let ta = ascale * a[i];
- let tb = bscale * (b[i + 1] - b[i - 1]);
- lpc[i - 1] = ((ta + tb) * 0.5) as f32;
- lpc[9 - i] = ((ta - tb) * 0.5) as f32;
- }
- lpc[4] = (ascale * a[5] * 0.5) as f32;
- lpc[9] = lsp[9];
-}
-
-fn synth_filter(dst: &mut [f32], doff: usize, filt: &[f32], src: &[f32], len: usize, order: usize) {
- for i in 0..len {
- dst[doff + i] = src[i];
- for j in 0..order {
- dst[doff + i] -= filt[j] * dst[doff + i - j - 1];
- }
- }
-}
-
-const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
-
-impl NADecoder for SiproDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
- let mut found = false;
- for i in 0..SIPRO_MODES.len() {
- if SIPRO_MODES[i].block_align == ainfo.get_block_len() {
- self.mode = &SIPRO_MODES[i];
- self.mode_type = SIPRO_MODE_FROM_IDX[i];
- found = true;
- break;
- }
- }
- validate!(found);
-
- let order = if self.mode_type.is16k() { 16 } else { 10 };
- for i in 0..order {
- self.lsp_hist[i] = (((i + 1) as f32) * PI / ((order + 1) as f32)).cos();
- }
- self.energy_hist = [-14.0; 4];
- self.pitch_lag_prev = 180;
-
- self.chmap.add_channels(&CHMAP_MONO);
- self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(),
- 1,
- SND_F32P_FORMAT, 0);
- self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone()));
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- let frm_size = self.mode.block_align;
- let out_frm_size = self.mode.frames * self.mode.subframes * self.mode.subframe_len;
- let nframes = pktbuf.len() / frm_size;
-
- let duration = out_frm_size * nframes;
-
- let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?;
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut dst = adata.get_data_mut();
-
- let frame_len = self.mode.subframe_len * self.mode.subframes;
- for (input, output) in pktbuf.chunks(frm_size).zip(dst.chunks_mut(out_frm_size)) {
- let mut br = BitReader::new(input, input.len(), BitReaderMode::LE);
- for dst in output.chunks_mut(frame_len) {
- self.unpack_frame(&mut br)?;
- if self.mode_type.is16k() {
- self.decode_lsf_16k();
- } else {
- self.decode_lsf_lbr();
- }
- for i in 0..64 {
- self.ir[i] = 0.0;
- }
- for sf in 0..self.mode.subframes {
- if self.mode_type.is16k() {
- self.calc_pitch_16k(sf);
- } else {
- self.calc_pitch_lbr(sf);
- self.eval_ir(sf);
- }
- match self.mode_type {
- SiproMode::Mode16k => { self.unpack_pulses_16k(sf); },
- SiproMode::Mode8_5k => { self.unpack_pulses_8_5k(sf); },
- SiproMode::Mode6_5k => { self.unpack_pulses_6_5k(sf); },
- SiproMode::Mode5k => { self.unpack_pulses_5k(sf); },
- }
- if self.mode_type.is16k() {
- self.update_gain_16k(sf);
- } else {
- self.update_gain_lbr(sf);
- }
- if self.mode_type.is16k() {
- self.synth_subframe_16k(sf);
- } else {
- self.synth_subframe_lbr(sf);
- }
- }
- if self.mode_type.is16k() {
- self.output_16k(dst);
- } else {
- self.output_lbr(dst);
- }
- }
- }
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(SiproDecoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_sipro() {
- let file = "assets/RV/autahi-vox.rm";
- test_decode_audio("realmedia", file, Some(5000), "sipro");
- }
-}
-
-struct SiproModeInfo {
- block_align: usize,
- frames: usize,
- subframes: usize,
- subframe_len: usize,
-
- pred: bool,
- vq_idx_bits: [u8; 5],
- pitch_delay_bits: [u8; 5],
- gp_idx_bits: u8,
- fc_indices: usize,
- fc_idx_bits: [u8; 10],
- gc_idx_bits: u8,
-
- pitch_sharp_factor: f32,
-}
-
-static SIPRO_MODES: [SiproModeInfo; 4] = [
- SiproModeInfo {
- block_align: 160/8, frames: 1, subframes: 2, subframe_len: 80,
- pred: true, vq_idx_bits: [ 7, 8, 7, 7, 7 ],
- pitch_delay_bits: [ 9, 6, 0, 0, 0 ], gp_idx_bits: 4,
- fc_indices: 10, fc_idx_bits: [ 4, 5, 4, 5, 4, 5, 4, 5, 4, 5 ],
- gc_idx_bits: 5, pitch_sharp_factor: 0.0
- },
- SiproModeInfo {
- block_align: 152/8, frames: 1, subframes: 3, subframe_len: 48,
- pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ],
- pitch_delay_bits: [ 8, 5, 5, 0, 0 ], gp_idx_bits: 0,
- fc_indices: 3, fc_idx_bits: [ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0 ],
- gc_idx_bits: 7, pitch_sharp_factor: 0.8
- },
- SiproModeInfo {
- block_align: 232/8, frames: 2, subframes: 3, subframe_len: 48,
- pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ],
- pitch_delay_bits: [ 8, 5, 5, 0, 0 ], gp_idx_bits: 0,
- fc_indices: 3, fc_idx_bits: [ 5, 5, 5, 0, 0, 0, 0, 0, 0, 0 ],
- gc_idx_bits: 7, pitch_sharp_factor: 0.8
- },
- SiproModeInfo {
- block_align: 296/8, frames: 2, subframes: 5, subframe_len: 48,
- pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ],
- pitch_delay_bits: [ 8, 5, 8, 5, 5 ], gp_idx_bits: 0,
- fc_indices: 1, fc_idx_bits: [ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
- gc_idx_bits: 7, pitch_sharp_factor: 0.85
- },
-];
-
-const SIPRO_LSF_MIN_DIST: f32 = 0.0125 * PI;
-const SIPRO_LSF_MIN_DIST_LAST: f32 = 1.3 * PI;
-
-const SIPRO_LSF_CODEBOOK_LBR: [&[[f32; 2]]; 5] = [
- SIPRO_LSF_CB0_LBR, SIPRO_LSF_CB1_LBR, SIPRO_LSF_CB2_LBR, SIPRO_LSF_CB3_LBR, SIPRO_LSF_CB4_LBR
-];
-
-const SIPRO_LSF_CB0_LBR: &[[f32; 2]] = &[
- [ 0.007587, -0.005843 ], [ 0.042163, -0.028048 ], [ -0.017147, -0.060705 ],
- [ 0.013773, -0.038108 ], [ -0.041563, -0.078571 ], [ -0.076928, -0.119343 ],
- [ 0.012654, 0.176005 ], [ 0.059737, 0.156869 ], [ 0.171767, 0.231837 ],
- [ 0.114030, 0.242047 ], [ 0.168977, 0.283101 ], [ 0.146210, 0.397961 ],
- [ 0.249446, 0.268421 ], [ 0.137074, 0.186724 ], [ -0.057736, -0.135638 ],
- [ -0.109664, -0.124611 ], [ -0.021234, -0.031174 ], [ -0.013990, -0.091819 ],
- [ -0.040046, -0.111426 ], [ -0.016830, 0.055361 ], [ 0.057815, 0.071606 ],
- [ 0.060670, 0.114436 ], [ 0.106695, 0.140838 ], [ 0.093601, 0.092793 ],
- [ 0.039593, 0.006142 ], [ -0.066589, -0.092463 ], [ -0.102589, -0.171380 ],
- [ -0.059621, -0.050671 ], [ 0.166131, 0.139773 ], [ 0.213069, 0.190761 ],
- [ 0.061820, 0.037661 ], [ 0.136471, 0.090823 ], [ -0.019789, 0.013515 ],
- [ 0.022280, 0.079473 ], [ 0.215281, 0.461959 ], [ 0.206497, 0.340077 ],
- [ 0.012249, -0.065596 ], [ 0.091345, 0.190871 ], [ 0.019506, 0.037266 ],
- [ -0.050702, -0.013223 ], [ -0.057334, 0.028943 ], [ 0.291512, 0.371415 ],
- [ -0.053467, 0.084160 ], [ 0.025372, 0.375310 ], [ 0.269995, 0.566520 ],
- [ -0.095259, -0.012353 ], [ 0.050479, 0.212893 ], [ 0.101219, 0.049320 ],
- [ 0.072426, 0.283362 ], [ -0.084116, -0.150542 ], [ -0.031485, 0.144922 ],
- [ 0.012714, 0.256910 ], [ -0.009528, 0.102768 ], [ -0.039572, 0.204967 ],
- [ -0.098800, 0.055038 ], [ 0.020719, 0.128387 ], [ -0.045559, -0.178373 ],
- [ -0.082338, 0.136933 ], [ -0.058270, 0.292806 ], [ 0.084242, 0.505112 ],
- [ 0.121825, 0.326386 ], [ -0.102658, -0.069341 ], [ 0.071675, 0.004744 ],
- [ -0.117763, -0.202608 ]
-];
-
-const SIPRO_LSF_CB1_LBR: &[[f32; 2]] = &[
- [ 0.025412, 0.006095 ], [ -0.069803, 0.010650 ], [ -0.175957, -0.185800 ],
- [ -0.139298, -0.048013 ], [ -0.156150, -0.129688 ], [ -0.160523, 0.068022 ],
- [ 0.199683, 0.259982 ], [ 0.258038, 0.236147 ], [ 0.367089, 0.304716 ],
- [ 0.251764, 0.305853 ], [ 0.394314, 0.382153 ], [ 0.448579, 0.337438 ],
- [ 0.323286, 0.425563 ], [ 0.015369, 0.123820 ], [ -0.026770, 0.083881 ],
- [ -0.112161, -0.097993 ], [ -0.221847, -0.161311 ], [ -0.050014, -0.092862 ],
- [ -0.214960, -0.398498 ], [ -0.114062, -0.241381 ], [ 0.137950, 0.138852 ],
- [ 0.031529, 0.065719 ], [ 0.208734, 0.084760 ], [ 0.157862, 0.057535 ],
- [ 0.124750, 0.011922 ], [ -0.035227, -0.154397 ], [ -0.105523, -0.291427 ],
- [ -0.073488, -0.201948 ], [ -0.224184, -0.273290 ], [ -0.168019, -0.240297 ],
- [ -0.271591, -0.384682 ], [ -0.124784, 0.014253 ], [ 0.004210, -0.110418 ],
- [ 0.074270, -0.014272 ], [ 0.053058, -0.068672 ], [ -0.090098, -0.145019 ],
- [ 0.303214, 0.210323 ], [ 0.413443, 0.272002 ], [ 0.356904, 0.230646 ],
- [ -0.035186, -0.028579 ], [ -0.117558, 0.115105 ], [ -0.159225, 0.218385 ],
- [ -0.230178, 0.172901 ], [ -0.216148, -0.110195 ], [ 0.309444, 0.101508 ],
- [ 0.250489, 0.118338 ], [ 0.293324, 0.151205 ], [ -0.023634, 0.033084 ],
- [ 0.076708, 0.114024 ], [ 0.123119, 0.087704 ], [ -0.060265, 0.126543 ],
- [ -0.223766, -0.021903 ], [ -0.241987, -0.328089 ], [ 0.205598, 0.147925 ],
- [ -0.087010, 0.064601 ], [ -0.287892, -0.286099 ], [ -0.179451, -0.350781 ],
- [ -0.219572, 0.043816 ], [ -0.217263, 0.245550 ], [ -0.286743, -0.180981 ],
- [ 0.172659, 0.112620 ], [ -0.105422, 0.176856 ], [ 0.006176, -0.051491 ],
- [ 0.099802, 0.176322 ], [ -0.186620, -0.068980 ], [ 0.164689, 0.185018 ],
- [ 0.519877, 0.376111 ], [ 0.521941, 0.533731 ], [ 0.473375, 0.439534 ],
- [ 0.214235, 0.202476 ], [ 0.579215, 0.466969 ], [ 0.310414, 0.271057 ],
- [ 0.257450, 0.058939 ], [ 0.023936, -0.169464 ], [ -0.268817, -0.064531 ],
- [ -0.174182, -0.000198 ], [ -0.268405, -0.234529 ], [ -0.296522, 0.247140 ],
- [ 0.115950, -0.072194 ], [ -0.303666, 0.149084 ], [ -0.347762, -0.011002 ],
- [ -0.223829, -0.214137 ], [ -0.278958, -0.457975 ], [ 0.135500, 0.238466 ],
- [ 0.312730, 0.342760 ], [ 0.071754, -0.125912 ], [ 0.485938, 0.260429 ],
- [ 0.037536, 0.179771 ], [ 0.391493, 0.156938 ], [ 0.397320, 0.484446 ],
- [ -0.308630, -0.342418 ], [ -0.269599, -0.128453 ], [ -0.086683, -0.043863 ],
- [ 0.421115, 0.213521 ], [ 0.082417, 0.049006 ], [ -0.087873, 0.238126 ],
- [ 0.338899, 0.166131 ], [ -0.166988, 0.147105 ], [ -0.167214, -0.294075 ],
- [ 0.588706, 0.328303 ], [ 0.207270, 0.017671 ], [ -0.141658, 0.291147 ],
- [ -0.140850, 0.374321 ], [ 0.028180, 0.322510 ], [ -0.229858, 0.328036 ],
- [ -0.060743, -0.260916 ], [ -0.011131, 0.246442 ], [ -0.058151, 0.310760 ],
- [ -0.127536, -0.186432 ], [ -0.128523, -0.334884 ], [ -0.283899, 0.077729 ],
- [ -0.031595, 0.181015 ], [ -0.329330, -0.108630 ], [ -0.215739, 0.107458 ],
- [ 0.175734, 0.327134 ], [ 0.255801, 0.176077 ], [ 0.228265, 0.396859 ],
- [ -0.370909, -0.185081 ], [ -0.355138, -0.300405 ], [ 0.061669, 0.242616 ],
- [ 0.104489, 0.307995 ], [ -0.320021, -0.234002 ], [ 0.077349, 0.416286 ],
- [ -0.339471, -0.407609 ], [ -0.019384, -0.215111 ], [ 0.168229, -0.032453 ],
- [ -0.040140, 0.399658 ], [ -0.275141, 0.008218 ]
-];
-
-const SIPRO_LSF_CB2_LBR: &[[f32; 2]] = &[
- [ 0.024608, 0.006198 ], [ -0.216616, -0.398169 ], [ -0.089601, -0.201370 ],
- [ -0.121878, -0.305281 ], [ 0.037913, 0.059320 ], [ 0.245126, 0.244089 ],
- [ 0.266853, 0.182476 ], [ 0.319362, 0.203481 ], [ 0.349945, 0.252644 ],
- [ 0.393849, 0.279272 ], [ 0.445707, 0.258063 ], [ 0.387321, 0.200855 ],
- [ -0.038818, 0.129603 ], [ -0.009510, 0.076441 ], [ -0.023892, -0.028199 ],
- [ -0.117134, -0.145990 ], [ -0.186585, -0.052886 ], [ -0.034250, -0.084547 ],
- [ -0.087443, -0.095426 ], [ -0.453322, -0.174493 ], [ -0.363975, -0.148186 ],
- [ -0.334413, -0.202479 ], [ -0.221313, -0.181320 ], [ -0.131146, -0.050611 ],
- [ -0.104706, 0.115139 ], [ 0.192765, 0.275417 ], [ 0.014184, 0.194251 ],
- [ 0.154215, 0.226949 ], [ 0.084031, 0.221759 ], [ 0.189438, 0.164566 ],
- [ 0.130737, 0.170962 ], [ -0.066815, 0.062954 ], [ -0.177176, -0.145167 ],
- [ -0.247608, -0.129767 ], [ -0.187886, -0.293720 ], [ -0.244036, -0.344655 ],
- [ -0.203063, -0.234947 ], [ -0.292715, -0.158421 ], [ 0.064990, -0.028164 ],
- [ 0.147664, 0.085995 ], [ 0.107977, 0.002253 ], [ 0.071286, 0.027533 ],
- [ 0.021017, -0.049807 ], [ -0.272056, -0.217857 ], [ -0.065596, 0.008375 ],
- [ -0.150818, -0.195514 ], [ -0.012767, -0.150787 ], [ 0.238541, 0.136606 ],
- [ 0.291741, 0.114024 ], [ 0.202677, 0.103701 ], [ 0.140985, 0.037759 ],
- [ -0.257347, -0.442383 ], [ -0.320666, -0.319742 ], [ -0.488725, -0.603660 ],
- [ -0.319170, -0.469806 ], [ 0.014970, -0.101074 ], [ 0.102209, 0.066790 ],
- [ -0.076202, -0.044884 ], [ 0.073868, 0.152565 ], [ 0.070755, -0.091358 ],
- [ -0.016751, 0.027216 ], [ 0.071201, 0.096981 ], [ -0.060975, -0.145638 ],
- [ 0.114156, 0.117587 ], [ -0.284757, -0.029101 ], [ -0.253005, -0.073645 ],
- [ -0.204028, -0.098492 ], [ -0.114508, 0.001219 ], [ -0.225284, -0.011998 ],
- [ -0.235670, 0.084330 ], [ 0.161921, 0.128334 ], [ 0.025717, 0.119456 ],
- [ -0.255292, -0.281471 ], [ -0.392803, -0.095809 ], [ 0.039229, -0.152110 ],
- [ -0.310905, -0.099233 ], [ -0.268773, 0.032308 ], [ -0.340150, 0.013129 ],
- [ -0.344890, -0.045157 ], [ -0.188423, 0.265603 ], [ -0.168235, -0.000936 ],
- [ 0.000462, 0.297000 ], [ 0.263674, 0.371214 ], [ -0.146797, -0.098225 ],
- [ -0.386557, -0.282426 ], [ -0.070940, -0.255550 ], [ 0.293258, 0.252785 ],
- [ 0.408332, 0.387751 ], [ -0.381914, -0.358918 ], [ -0.463621, -0.315560 ],
- [ -0.323681, -0.258465 ], [ 0.250055, 0.071195 ], [ -0.405256, -0.429754 ],
- [ -0.135748, -0.251274 ], [ 0.186827, 0.060177 ], [ 0.116742, -0.053526 ],
- [ -0.403321, -0.220339 ], [ -0.414144, -0.021108 ], [ -0.416877, 0.050184 ],
- [ -0.470083, -0.079564 ], [ -0.315554, 0.219217 ], [ -0.273183, 0.138437 ],
- [ 0.253231, 0.306374 ], [ 0.177802, 0.346298 ], [ 0.210358, 0.207697 ],
- [ -0.323480, 0.077519 ], [ -0.193136, 0.048170 ], [ 0.114492, 0.292778 ],
- [ -0.130766, 0.056677 ], [ -0.171572, -0.349267 ], [ -0.370076, -0.536392 ],
- [ -0.311109, -0.389953 ], [ 0.334928, 0.367664 ], [ 0.351246, 0.438664 ],
- [ 0.518803, 0.331253 ], [ 0.437061, 0.327257 ], [ 0.318906, 0.307389 ],
- [ -0.025972, -0.206758 ], [ 0.373278, 0.325438 ], [ 0.473488, 0.389441 ],
- [ 0.478553, 0.477990 ], [ 0.332783, 0.153825 ], [ 0.212098, 0.452336 ],
- [ 0.161522, -0.011212 ], [ 0.209368, 0.020687 ], [ -0.086262, 0.204493 ],
- [ -0.388643, 0.133640 ], [ -0.177016, 0.134404 ]
-];
-
-const SIPRO_LSF_CB3_LBR: &[[f32; 2]] = &[
- [ -0.003594, -0.022447 ], [ 0.070651, 0.028334 ], [ -0.290374, -0.018347 ],
- [ -0.224495, -0.370312 ], [ -0.269555, -0.131227 ], [ -0.122714, -0.267733 ],
- [ 0.173325, 0.138698 ], [ 0.161946, 0.020687 ], [ 0.111706, 0.022510 ],
- [ 0.097638, 0.056049 ], [ 0.139754, 0.059920 ], [ 0.056549, -0.050586 ],
- [ 0.036301, 0.021501 ], [ -0.066347, 0.012324 ], [ -0.066972, 0.096136 ],
- [ -0.120062, -0.084201 ], [ 0.011225, 0.047425 ], [ -0.012846, -0.067390 ],
- [ -0.116201, 0.122874 ], [ -0.027819, 0.035453 ], [ -0.024743, 0.072835 ],
- [ -0.034061, -0.001310 ], [ 0.077469, 0.081609 ], [ 0.128347, 0.139584 ],
- [ 0.183416, 0.086563 ], [ -0.155839, -0.053775 ], [ -0.190403, -0.018639 ],
- [ -0.202548, -0.062841 ], [ -0.373733, -0.275094 ], [ -0.394260, -0.186513 ],
- [ -0.465700, -0.220031 ], [ 0.064400, -0.095825 ], [ -0.262053, -0.199837 ],
- [ -0.167233, -0.094402 ], [ 0.048600, 0.057567 ], [ -0.007122, 0.168506 ],
- [ 0.050938, 0.156451 ], [ -0.060828, 0.147083 ], [ -0.171889, 0.195822 ],
- [ -0.218934, 0.138431 ], [ -0.270532, 0.195775 ], [ -0.405818, 0.075643 ],
- [ -0.440187, 0.193387 ], [ -0.484968, 0.157607 ], [ -0.480560, 0.067230 ],
- [ -0.436757, -0.111847 ], [ -0.040731, -0.040363 ], [ -0.202319, -0.170457 ],
- [ -0.158515, -0.134551 ], [ -0.356709, -0.378549 ], [ -0.268820, -0.289831 ],
- [ -0.188486, -0.289306 ], [ -0.148139, -0.177616 ], [ -0.071591, -0.191128 ],
- [ -0.052270, -0.150589 ], [ -0.020543, -0.116220 ], [ 0.039584, -0.012592 ],
- [ -0.268226, 0.042704 ], [ -0.209755, 0.069423 ], [ -0.168964, 0.124504 ],
- [ -0.363240, 0.188266 ], [ -0.524935, -0.025010 ], [ -0.105894, -0.002699 ],
- [ -0.251830, -0.062018 ], [ -0.310480, -0.082325 ], [ 0.014652, 0.083127 ],
- [ -0.136512, 0.033116 ], [ -0.073755, -0.025236 ], [ 0.110766, 0.095954 ],
- [ 0.002878, 0.011838 ], [ -0.074977, -0.244586 ], [ -0.047023, -0.081339 ],
- [ -0.183249, 0.029525 ], [ 0.263435, 0.206934 ], [ -0.156721, -0.229993 ],
- [ -0.112224, -0.208941 ], [ -0.116534, -0.123191 ], [ -0.073988, -0.111668 ],
- [ 0.029484, -0.137573 ], [ -0.009802, -0.161685 ], [ -0.023273, 0.114043 ],
- [ -0.332651, 0.049072 ], [ -0.394009, 0.018608 ], [ -0.433543, -0.035318 ],
- [ -0.368459, -0.108024 ], [ -0.350215, -0.037617 ], [ -0.321140, -0.178537 ],
- [ 0.020307, -0.048487 ], [ -0.210512, -0.232274 ], [ -0.082140, -0.065443 ],
- [ 0.081961, -0.009340 ], [ 0.146794, 0.101973 ], [ 0.213999, 0.124687 ],
- [ 0.100217, -0.054095 ], [ -0.114411, -0.041403 ], [ -0.097631, 0.037061 ],
- [ -0.099651, -0.157978 ], [ -0.215790, -0.116550 ], [ -0.107100, 0.076300 ],
- [ 0.084653, 0.126088 ], [ 0.246439, 0.091442 ], [ 0.160077, 0.188536 ],
- [ 0.273900, 0.279190 ], [ 0.320417, 0.232550 ], [ 0.132710, -0.018988 ],
- [ 0.018950, -0.091681 ], [ -0.032073, -0.202906 ], [ 0.212789, 0.178188 ],
- [ 0.208580, 0.239726 ], [ 0.049420, 0.099840 ], [ -0.145695, -0.010619 ],
- [ -0.132525, -0.322660 ], [ 0.019666, 0.126603 ], [ 0.260809, 0.147727 ],
- [ -0.232795, -0.001090 ], [ -0.049826, 0.225987 ], [ -0.154774, 0.076614 ],
- [ 0.045032, 0.221397 ], [ 0.321014, 0.161632 ], [ -0.062379, 0.053586 ],
- [ 0.132252, 0.246675 ], [ 0.392627, 0.271905 ], [ -0.264585, 0.102344 ],
- [ -0.327200, 0.121624 ], [ -0.399642, 0.124445 ], [ -0.108335, 0.179171 ],
- [ 0.100374, 0.182731 ], [ 0.203852, 0.049505 ]
-];
-
-const SIPRO_LSF_CB4_LBR: &[[f32; 2]] = &[
- [ -0.047705, 0.008002 ], [ 0.011332, 0.065028 ], [ -0.021796, -0.034777 ],
- [ -0.147394, -0.001241 ], [ -0.001577, 0.020599 ], [ -0.083827, -0.028975 ],
- [ -0.177707, 0.066046 ], [ -0.043241, -0.165144 ], [ 0.053322, 0.096519 ],
- [ -0.097688, 0.106484 ], [ -0.023392, 0.111234 ], [ -0.146747, -0.159360 ],
- [ 0.027241, -0.011806 ], [ -0.043156, 0.057667 ], [ 0.019516, -0.062116 ],
- [ 0.025990, 0.162533 ], [ 0.091888, 0.009720 ], [ -0.098511, 0.036414 ],
- [ 0.013722, -0.116512 ], [ 0.054833, -0.180975 ], [ 0.119497, 0.128774 ],
- [ 0.118378, -0.125997 ], [ 0.065882, -0.030932 ], [ 0.120581, -0.039964 ],
- [ -0.050561, -0.088577 ], [ 0.050134, 0.033194 ], [ -0.129654, -0.075112 ],
- [ -0.225334, -0.040234 ], [ 0.070629, -0.084455 ], [ 0.095508, 0.063548 ],
- [ 0.150514, 0.034366 ], [ 0.186092, -0.069272 ]
-];
-
-const SIPRO_MEAN_LSF_LBR: [f32; 10] = [
- 0.297151, 0.452308, 0.765443, 1.134803, 1.421125,
- 1.773822, 2.049173, 2.375914, 2.585097, 0.075756
-];
-
-const SIPRO_LSF_CODEBOOK_16K: [&[[f32; 3]]; 4] = [
- SIPRO_LSF_CB0_16K, SIPRO_LSF_CB1_16K, SIPRO_LSF_CB2_16K, SIPRO_LSF_CB3_16K
-];
-
-const SIPRO_LSF_CB0_16K: &[[f32; 3]] = &[
- [ -0.089990, -0.172485, -0.203391 ], [ -0.094710, -0.178687, -0.134483 ],
- [ -0.056398, -0.131952, -0.154500 ], [ -0.051362, -0.128138, -0.198549 ],
- [ -0.061700, -0.142830, -0.251623 ], [ -0.041512, -0.115637, -0.229420 ],
- [ -0.036544, -0.107512, -0.173125 ], [ -0.024158, -0.088450, -0.204144 ],
- [ -0.038690, -0.103368, -0.132674 ], [ -0.056954, -0.128472, -0.104669 ],
- [ -0.020963, -0.076785, -0.163199 ], [ -0.012952, -0.077249, -0.128385 ],
- [ -0.032787, -0.097044, -0.093967 ], [ -0.035214, -0.053838, -0.111940 ],
- [ -0.013850, -0.036926, -0.139328 ], [ -0.004956, -0.065092, -0.087709 ],
- [ -0.065354, -0.065595, -0.079064 ], [ -0.023627, -0.081457, -0.054195 ],
- [ -0.027335, -0.035244, -0.068034 ], [ 0.016555, -0.047075, -0.128286 ],
- [ 0.021066, -0.037252, -0.092041 ], [ 0.014681, -0.043044, -0.057739 ],
- [ -0.008493, -0.008143, -0.102486 ], [ -0.002303, -0.061540, -0.022952 ],
- [ -0.006061, -0.014278, -0.033652 ], [ -0.005276, 0.011246, -0.062762 ],
- [ 0.043411, -0.006303, -0.063730 ], [ 0.035885, -0.010052, -0.115290 ],
- [ 0.030628, -0.031538, -0.017807 ], [ 0.022345, 0.028210, -0.032335 ],
- [ 0.026535, 0.027536, -0.091150 ], [ -0.003365, -0.008077, 0.015687 ],
- [ -0.026013, 0.017493, -0.010355 ], [ 0.059069, 0.010634, -0.007530 ],
- [ 0.044038, -0.019424, 0.030453 ], [ -0.036065, -0.034215, -0.007758 ],
- [ 0.022486, 0.042543, 0.027870 ], [ -0.049985, -0.016085, 0.021768 ],
- [ -0.021715, 0.021168, 0.052076 ], [ -0.004243, -0.061228, 0.027640 ],
- [ -0.033950, -0.017287, 0.064656 ], [ 0.016151, 0.000727, 0.062757 ],
- [ -0.063456, -0.043152, 0.056707 ], [ -0.067715, 0.006126, 0.058178 ],
- [ -0.038931, 0.051673, 0.030636 ], [ -0.073017, -0.074716, 0.026387 ],
- [ -0.039893, -0.104629, 0.039616 ], [ -0.073179, -0.074601, 0.082069 ],
- [ -0.066154, -0.027180, 0.099439 ], [ -0.075167, -0.121149, 0.071938 ],
- [ -0.030382, -0.092582, 0.091067 ], [ -0.084519, -0.137542, 0.023626 ],
- [ -0.060956, -0.121259, -0.015264 ], [ -0.030069, -0.093823, -0.008692 ],
- [ -0.063564, -0.065225, -0.025820 ], [ -0.052074, -0.117595, -0.059689 ],
- [ -0.091652, -0.165173, -0.045573 ], [ -0.070167, -0.121342, 0.131707 ],
- [ -0.061024, -0.005833, -0.051035 ], [ 0.007837, -0.051816, 0.074575 ],
- [ -0.070643, -0.053927, 0.149498 ], [ -0.014358, -0.066681, 0.139708 ],
- [ -0.058186, 0.029576, 0.092923 ], [ -0.023371, 0.007058, 0.112484 ],
- [ -0.057969, 0.022786, 0.148420 ], [ 0.029439, -0.017673, 0.121423 ],
- [ -0.015811, 0.056785, 0.091594 ], [ 0.004347, 0.056680, 0.137848 ],
- [ -0.004464, 0.002342, 0.184013 ], [ 0.029660, 0.046870, 0.082654 ],
- [ 0.059408, 0.001016, 0.086063 ], [ 0.055263, 0.027574, 0.155037 ],
- [ 0.062166, 0.064323, 0.117371 ], [ 0.022967, 0.100050, 0.077227 ],
- [ 0.041795, 0.096343, 0.170421 ], [ 0.053189, 0.122931, 0.118549 ],
- [ 0.094247, 0.094448, 0.078395 ], [ 0.082407, 0.033408, 0.041085 ],
- [ 0.096820, 0.115960, 0.149433 ], [ 0.067804, 0.121849, 0.025336 ],
- [ -0.008421, 0.104316, 0.032314 ], [ 0.031013, 0.073218, -0.004899 ],
- [ 0.085079, 0.060323, -0.009687 ], [ 0.028174, 0.092766, -0.055590 ],
- [ 0.070133, 0.039160, -0.061035 ], [ -0.039211, 0.072517, -0.028756 ],
- [ 0.129686, 0.100233, -0.046998 ], [ 0.154189, 0.107616, 0.022791 ],
- [ -0.049331, 0.094184, 0.087984 ], [ -0.013179, 0.126552, 0.125099 ],
- [ -0.058716, 0.098524, 0.150886 ], [ -0.022753, 0.080011, 0.191127 ],
- [ 0.013451, 0.164593, 0.153768 ], [ 0.074818, 0.181214, 0.108211 ],
- [ 0.091323, 0.169249, 0.168460 ], [ 0.033885, 0.155516, 0.213745 ],
- [ -0.032128, 0.227238, 0.135815 ], [ -0.059176, 0.168980, 0.229110 ],
- [ 0.033917, 0.229753, 0.222264 ], [ 0.082702, 0.116370, 0.224697 ],
- [ 0.127737, 0.186658, 0.212783 ], [ 0.047528, 0.063920, 0.216856 ],
- [ -0.002446, 0.114174, 0.263289 ], [ -0.077783, 0.082523, 0.249697 ],
- [ 0.010023, 0.024267, 0.256874 ], [ 0.053190, 0.111422, 0.310407 ],
- [ -0.078804, 0.004444, 0.224078 ], [ -0.055253, -0.059180, 0.217892 ],
- [ -0.065371, 0.008124, 0.333405 ], [ -0.076188, -0.098767, 0.286983 ],
- [ -0.071911, -0.115804, 0.198031 ], [ -0.062473, 0.183639, 0.370162 ],
- [ -0.042666, 0.255210, 0.262720 ], [ 0.011999, 0.217530, 0.318291 ],
- [ -0.042144, 0.322087, 0.326387 ], [ 0.090663, 0.205835, 0.294784 ],
- [ 0.058218, 0.293649, 0.277927 ], [ 0.157506, 0.282870, 0.294610 ],
- [ 0.118248, 0.261007, 0.148614 ], [ 0.065261, 0.332362, 0.411912 ],
- [ 0.141269, 0.451850, 0.315726 ], [ 0.001706, 0.456301, 0.357590 ],
- [ -0.052947, 0.356559, 0.456944 ], [ 0.247707, 0.263837, 0.152591 ],
- [ 0.306847, 0.417373, 0.258553 ], [ 0.166347, 0.149222, 0.118973 ],
- [ 0.379709, 0.292172, 0.139875 ], [ 0.010171, -0.055170, -0.174523 ]
-];
-
-const SIPRO_LSF_CB1_16K: &[[f32; 3]] = &[
- [ -0.213011, -0.293385, -0.330597 ], [ -0.212582, -0.240992, -0.338239 ],
- [ -0.223373, -0.306214, -0.277192 ], [ -0.231138, -0.287729, -0.229412 ],
- [ -0.238466, -0.228571, -0.260954 ], [ -0.140931, -0.247018, -0.258566 ],
- [ -0.136239, -0.249669, -0.350143 ], [ -0.149738, -0.192970, -0.281475 ],
- [ -0.167058, -0.261052, -0.196301 ], [ -0.177049, -0.201324, -0.207897 ],
- [ -0.116915, -0.200629, -0.212526 ], [ -0.162247, -0.143805, -0.245093 ],
- [ -0.082042, -0.191842, -0.266338 ], [ -0.098846, -0.208511, -0.320481 ],
- [ -0.113510, -0.152470, -0.222474 ], [ -0.066197, -0.179112, -0.207813 ],
- [ -0.129490, -0.169320, -0.155238 ], [ -0.078843, -0.190292, -0.155172 ],
- [ -0.087790, -0.147729, -0.169351 ], [ -0.141037, -0.127207, -0.177910 ],
- [ -0.126525, -0.223961, -0.153639 ], [ -0.101464, -0.189953, -0.114559 ],
- [ -0.102450, -0.106303, -0.151171 ], [ -0.103208, -0.144457, -0.105378 ],
- [ -0.170794, -0.140525, -0.136428 ], [ -0.168641, -0.203064, -0.135368 ],
- [ -0.138193, -0.116042, -0.111905 ], [ -0.145085, -0.168581, -0.092613 ],
- [ -0.126379, -0.220431, -0.091327 ], [ -0.212934, -0.184797, -0.101632 ],
- [ -0.193711, -0.140556, -0.078304 ], [ -0.173674, -0.197276, -0.060140 ],
- [ -0.197897, -0.241907, -0.091997 ], [ -0.156037, -0.258519, -0.111628 ],
- [ -0.241964, -0.191124, -0.063140 ], [ -0.261340, -0.240847, -0.103132 ],
- [ -0.221621, -0.242972, -0.041255 ], [ -0.224166, -0.232742, -0.161568 ],
- [ -0.203591, -0.294470, -0.126035 ], [ -0.209540, -0.303149, -0.053170 ],
- [ -0.253859, -0.295066, -0.156050 ], [ -0.278143, -0.331105, -0.085237 ],
- [ -0.300273, -0.198750, -0.094834 ], [ -0.260477, -0.169713, -0.132476 ],
- [ -0.211889, -0.172454, -0.164281 ], [ -0.228370, -0.122149, -0.124178 ],
- [ -0.254629, -0.135668, -0.081692 ], [ -0.263813, -0.154928, -0.213596 ],
- [ -0.308224, -0.106877, -0.084404 ], [ -0.242644, -0.082862, -0.085835 ],
- [ -0.252084, -0.064888, -0.146498 ], [ -0.198162, -0.105721, -0.188887 ],
- [ -0.189238, -0.088028, -0.109736 ], [ -0.197598, -0.099831, -0.044030 ],
- [ -0.269017, -0.105991, -0.021513 ], [ -0.231349, -0.058825, -0.041407 ],
- [ -0.225589, -0.027501, -0.087160 ], [ -0.160347, -0.058341, -0.079789 ],
- [ -0.158729, -0.108951, -0.067262 ], [ -0.170483, -0.053023, -0.017561 ],
- [ -0.175207, -0.013649, -0.049513 ], [ -0.156004, -0.108378, -0.004052 ],
- [ -0.219958, -0.082362, 0.014950 ], [ -0.217785, -0.012981, -0.009410 ],
- [ -0.123290, -0.040849, -0.040910 ], [ -0.119861, -0.095078, -0.060246 ],
- [ -0.117537, -0.065479, 0.002968 ], [ -0.103231, -0.113298, -0.023282 ],
- [ -0.136365, -0.149524, -0.051387 ], [ -0.119332, -0.164400, -0.009103 ],
- [ -0.104522, -0.060948, -0.083056 ], [ -0.071461, -0.070787, -0.037347 ],
- [ -0.081116, -0.149015, -0.056740 ], [ -0.069561, -0.108099, -0.069167 ],
- [ -0.055624, -0.117369, -0.025091 ], [ -0.091941, -0.190091, -0.060020 ],
- [ -0.072003, -0.168433, -0.006540 ], [ -0.033305, -0.154427, -0.054608 ],
- [ -0.062988, -0.127093, -0.108307 ], [ -0.056690, -0.170813, -0.102834 ],
- [ -0.018273, -0.127863, -0.094998 ], [ -0.056239, -0.123678, -0.146262 ],
- [ -0.023442, -0.154617, -0.137417 ], [ -0.051903, -0.078379, -0.093395 ],
- [ -0.014599, -0.104412, -0.135959 ], [ -0.051582, -0.081280, -0.140643 ],
- [ -0.092727, -0.091930, -0.107816 ], [ -0.024814, -0.140993, -0.183243 ],
- [ -0.064307, -0.113024, -0.194788 ], [ -0.000118, -0.098858, -0.195336 ],
- [ -0.028090, -0.048258, -0.164101 ], [ -0.093414, -0.055969, -0.172743 ],
- [ -0.114445, -0.104336, -0.215204 ], [ -0.048518, -0.132063, -0.242991 ],
- [ -0.159620, -0.060240, -0.178592 ], [ -0.135728, -0.067473, -0.131876 ],
- [ -0.078464, -0.038040, -0.125105 ], [ -0.011061, -0.064011, -0.102496 ],
- [ -0.033887, -0.026485, -0.109493 ], [ -0.129128, -0.014216, -0.111329 ],
- [ -0.190687, -0.030660, -0.135825 ], [ -0.082037, 0.010997, -0.100167 ],
- [ -0.183403, 0.001651, -0.098962 ], [ -0.074775, -0.030335, -0.062217 ],
- [ -0.031759, -0.050551, -0.059420 ], [ -0.051439, 0.010827, -0.052148 ],
- [ -0.126744, 0.008689, -0.047785 ], [ -0.145916, 0.042019, -0.077431 ],
- [ -0.093552, 0.054143, -0.060473 ], [ -0.090660, 0.012868, -0.018195 ],
- [ -0.079783, -0.033071, 0.001482 ], [ -0.033010, -0.022331, -0.014506 ],
- [ -0.004798, -0.017339, -0.060120 ], [ -0.025021, 0.026390, -0.003263 ],
- [ -0.001437, 0.025994, -0.040892 ], [ -0.074821, 0.019005, 0.027549 ],
- [ -0.030811, -0.012114, 0.034284 ], [ 0.006785, 0.004618, 0.018717 ],
- [ 0.013392, -0.032597, -0.023731 ], [ 0.035994, 0.005963, -0.011757 ],
- [ 0.008071, -0.045750, 0.024889 ], [ 0.013055, 0.017040, 0.054121 ],
- [ -0.012989, 0.044864, 0.036327 ], [ 0.025054, 0.047137, 0.009974 ],
- [ 0.053801, 0.024178, 0.031774 ], [ 0.056442, -0.030647, 0.021291 ],
- [ 0.032247, 0.052680, 0.049886 ], [ 0.035369, 0.090207, 0.031394 ],
- [ 0.064720, 0.070390, 0.040938 ], [ 0.022112, 0.054834, 0.091059 ],
- [ 0.041765, 0.086248, 0.070196 ], [ 0.070645, 0.060852, 0.078825 ],
- [ 0.058506, 0.016920, 0.081612 ], [ 0.000009, 0.086500, 0.059849 ],
- [ 0.071253, 0.107392, 0.059046 ], [ 0.094702, 0.096160, 0.090982 ],
- [ 0.047639, 0.110877, 0.111227 ], [ 0.122444, 0.090909, 0.057396 ],
- [ 0.101916, 0.052299, 0.029909 ], [ 0.076560, 0.086094, -0.007252 ],
- [ 0.123411, 0.030769, 0.082749 ], [ 0.135579, 0.103022, 0.009540 ],
- [ 0.120576, 0.065284, -0.024095 ], [ 0.077483, 0.028526, -0.012369 ],
- [ 0.128747, 0.017901, -0.003874 ], [ 0.158254, 0.046962, 0.029577 ],
- [ 0.102287, -0.002211, 0.037329 ], [ 0.089654, -0.021372, -0.006857 ],
- [ 0.137917, 0.027228, -0.053223 ], [ 0.098728, -0.012192, -0.048518 ],
- [ 0.083974, 0.036153, -0.062266 ], [ 0.048230, -0.010241, -0.052293 ],
- [ 0.110135, 0.007715, -0.095233 ], [ 0.068294, -0.014317, -0.104029 ],
- [ 0.063909, -0.056416, -0.063023 ], [ 0.059133, -0.044675, -0.023780 ],
- [ 0.030748, 0.021845, -0.086332 ], [ 0.023994, -0.045574, -0.076232 ],
- [ 0.052147, -0.059825, -0.109667 ], [ 0.013087, -0.020420, -0.121945 ],
- [ 0.018163, -0.096765, -0.088758 ], [ 0.020196, -0.076470, -0.048112 ],
- [ 0.020282, -0.084204, -0.135535 ], [ 0.040076, -0.053464, -0.161949 ],
- [ -0.017796, -0.103070, -0.059559 ], [ -0.016484, -0.070138, -0.016866 ],
- [ 0.004849, -0.112481, -0.017731 ], [ 0.040160, -0.073873, -0.005327 ],
- [ 0.002202, -0.094723, 0.045366 ], [ -0.056918, -0.081578, 0.017875 ],
- [ -0.031099, -0.141708, 0.009186 ], [ -0.102802, -0.122675, 0.030060 ],
- [ -0.061717, -0.145116, 0.076680 ], [ -0.073607, -0.050464, 0.072853 ],
- [ -0.117403, -0.194921, 0.040101 ], [ -0.185236, -0.133620, 0.045939 ],
- [ -0.160174, -0.057226, 0.056641 ], [ -0.178489, -0.173435, -0.007806 ],
- [ -0.199916, -0.204866, 0.047342 ], [ -0.152337, -0.249651, 0.034656 ],
- [ -0.185637, -0.230942, -0.002072 ], [ -0.122548, -0.215209, -0.024552 ],
- [ -0.249578, -0.209714, 0.009470 ], [ -0.160108, -0.257702, -0.040992 ],
- [ -0.216694, -0.289353, 0.027182 ], [ -0.226390, -0.147844, -0.022742 ],
- [ -0.288737, -0.272150, -0.013948 ], [ -0.262554, -0.237035, 0.072473 ],
- [ -0.306267, -0.188335, -0.032894 ], [ -0.259666, -0.345816, 0.024138 ],
- [ -0.271093, -0.137143, 0.040404 ], [ -0.201317, -0.286782, 0.107615 ],
- [ -0.235725, -0.163396, 0.113844 ], [ -0.159988, -0.209788, 0.112140 ],
- [ -0.262985, -0.056741, 0.093506 ], [ -0.277226, -0.037306, 0.016008 ],
- [ -0.293486, -0.040422, -0.062018 ], [ -0.214921, 0.022900, 0.055295 ],
- [ -0.253889, 0.058575, -0.000151 ], [ -0.246689, 0.024242, -0.058488 ],
- [ -0.143790, 0.006767, 0.014061 ], [ -0.187077, 0.048882, -0.035625 ],
- [ -0.196369, 0.112085, 0.031546 ], [ -0.124264, 0.086197, -0.020800 ],
- [ -0.126249, 0.016960, 0.095741 ], [ -0.079816, 0.080398, 0.051038 ],
- [ -0.056269, 0.075380, -0.028262 ], [ -0.120493, 0.148495, 0.028430 ],
- [ -0.161750, 0.101290, 0.117806 ], [ -0.003247, 0.083393, -0.017061 ],
- [ -0.034007, 0.142542, 0.007402 ], [ -0.037618, 0.025871, 0.089496 ],
- [ -0.082819, 0.184435, 0.073224 ], [ 0.006448, 0.167015, 0.080548 ],
- [ 0.035315, 0.144022, 0.003218 ], [ -0.023459, 0.088147, 0.152604 ],
- [ 0.006247, -0.024099, 0.077792 ], [ 0.039894, 0.057586, -0.042455 ],
- [ -0.020417, 0.035400, -0.093971 ], [ 0.075465, 0.052063, 0.145582 ],
- [ 0.078027, 0.184720, 0.092096 ], [ 0.107295, 0.148380, 0.022264 ],
- [ 0.066928, -0.052831, 0.065108 ], [ 0.093295, 0.118157, 0.149815 ],
- [ 0.119373, 0.137114, 0.099536 ], [ 0.138653, 0.075509, 0.121545 ],
- [ 0.174025, 0.077531, 0.077169 ], [ 0.165839, 0.150080, 0.133423 ],
- [ 0.173276, 0.155887, 0.048150 ], [ 0.162910, 0.095898, 0.171896 ],
- [ 0.214577, 0.112888, 0.115579 ], [ 0.204755, 0.106392, 0.032337 ],
- [ 0.178853, 0.205034, 0.114760 ], [ 0.177401, 0.070504, -0.013778 ],
- [ 0.241624, 0.166921, 0.066087 ], [ 0.219595, 0.183553, 0.172332 ],
- [ 0.123671, 0.170842, 0.167216 ], [ 0.177104, 0.240197, 0.186359 ],
- [ 0.272003, 0.220214, 0.126073 ], [ 0.093748, 0.235843, 0.160998 ],
- [ 0.141510, 0.190012, 0.240416 ], [ 0.046878, 0.168984, 0.190412 ],
- [ 0.094898, 0.107038, 0.235003 ], [ 0.108592, 0.269536, 0.262528 ],
- [ -0.027754, 0.234355, 0.134544 ], [ 0.265127, 0.267540, 0.199041 ],
- [ 0.199523, 0.291507, 0.265171 ], [ 0.266177, 0.209339, 0.350369 ],
- [ 0.322159, 0.344794, 0.270823 ], [ 0.399957, 0.264065, 0.110387 ],
- [ 0.277817, 0.127407, -0.035625 ], [ -0.177038, 0.208155, 0.119077 ],
- [ 0.049075, -0.076294, 0.145711 ], [ 0.187246, 0.042865, -0.127097 ],
- [ 0.117885, -0.023489, -0.138658 ], [ -0.284256, 0.068153, 0.124259 ]
-];
-
-const SIPRO_LSF_CB2_16K: &[[f32; 3]] = &[
- [ -0.223412, -0.236300, -0.188067 ], [ -0.202286, -0.218711, -0.102947 ],
- [ -0.251652, -0.161020, -0.125280 ], [ -0.169223, -0.138155, -0.140430 ],
- [ -0.176427, -0.146628, -0.222632 ], [ -0.120584, -0.187276, -0.180164 ],
- [ -0.195559, -0.074225, -0.169109 ], [ -0.144551, -0.142774, -0.073340 ],
- [ -0.111001, -0.111310, -0.130696 ], [ -0.095221, -0.174684, -0.111841 ],
- [ -0.112158, -0.103049, -0.195130 ], [ -0.059989, -0.142170, -0.157850 ],
- [ -0.127598, -0.051759, -0.153109 ], [ -0.063753, -0.067898, -0.164117 ],
- [ -0.141753, -0.068274, -0.091999 ], [ -0.060482, -0.101054, -0.099475 ],
- [ -0.104699, -0.104456, -0.066496 ], [ -0.073649, -0.052614, -0.091612 ],
- [ -0.088268, -0.019072, -0.129956 ], [ -0.018837, -0.104115, -0.127837 ],
- [ -0.021630, -0.033055, -0.129868 ], [ -0.083768, -0.047549, -0.041407 ],
- [ -0.055892, -0.108526, -0.043200 ], [ -0.027816, -0.062499, -0.048190 ],
- [ -0.002248, -0.110428, -0.062868 ], [ 0.001270, -0.033245, -0.072404 ],
- [ -0.042747, -0.013835, -0.033829 ], [ -0.037615, -0.147833, -0.083912 ],
- [ -0.045023, 0.006011, -0.092182 ], [ -0.050411, -0.081832, 0.005787 ],
- [ 0.000357, -0.104282, -0.009428 ], [ -0.003893, -0.047892, -0.001506 ],
- [ -0.040077, -0.147110, -0.009065 ], [ -0.060858, -0.030972, 0.012999 ],
- [ -0.014674, 0.001370, 0.005554 ], [ -0.101362, -0.126061, -0.001898 ],
- [ -0.102519, -0.000390, -0.015721 ], [ -0.132687, -0.069608, -0.019928 ],
- [ -0.102227, -0.076131, 0.043306 ], [ -0.055193, 0.027001, 0.011857 ],
- [ -0.156427, -0.016629, 0.017480 ], [ -0.078736, 0.002809, 0.057979 ],
- [ -0.157789, -0.016693, -0.055073 ], [ -0.179397, -0.095520, 0.022065 ],
- [ -0.110219, 0.010408, -0.081927 ], [ -0.125392, 0.049111, 0.044595 ],
- [ -0.112528, 0.063173, -0.024954 ], [ -0.185525, 0.053093, -0.032102 ],
- [ -0.176887, -0.019379, -0.115125 ], [ -0.249706, -0.017664, -0.059188 ],
- [ -0.200243, -0.103311, -0.066846 ], [ -0.055404, 0.045106, -0.046991 ],
- [ -0.000544, 0.022690, -0.044831 ], [ 0.022298, -0.016367, -0.022509 ],
- [ 0.028278, 0.017585, -0.100612 ], [ 0.061781, -0.020826, -0.068190 ],
- [ 0.029157, -0.074477, -0.098898 ], [ 0.043073, -0.067234, -0.032293 ],
- [ 0.060157, 0.034636, -0.034885 ], [ 0.071153, -0.013881, -0.009036 ],
- [ 0.054196, -0.029989, -0.131139 ], [ 0.030193, 0.024976, 0.009861 ],
- [ 0.055943, -0.045304, 0.031927 ], [ 0.033217, -0.002418, 0.038165 ],
- [ 0.063814, 0.045625, 0.025309 ], [ 0.033689, 0.038819, 0.049700 ],
- [ 0.073582, 0.028527, 0.060200 ], [ -0.007957, 0.022531, 0.043687 ],
- [ -0.000984, 0.054518, 0.018742 ], [ 0.057004, 0.060916, 0.060573 ],
- [ 0.009883, 0.015238, 0.080211 ], [ 0.022742, 0.070832, 0.068855 ],
- [ 0.053001, 0.029790, 0.091446 ], [ -0.042447, 0.060379, 0.061462 ],
- [ 0.076826, 0.062468, 0.089653 ], [ 0.039065, 0.069768, 0.119128 ],
- [ 0.064145, 0.095353, 0.071621 ], [ 0.094411, 0.069527, 0.054197 ],
- [ 0.042812, 0.093060, 0.027980 ], [ 0.094791, 0.099189, 0.101112 ],
- [ 0.117611, 0.048601, 0.093111 ], [ 0.119951, 0.122758, 0.051546 ],
- [ 0.103558, 0.085245, -0.010700 ], [ 0.150126, 0.059766, 0.020280 ],
- [ 0.108066, 0.017170, 0.008606 ], [ 0.108422, 0.023253, -0.063942 ],
- [ 0.019652, 0.072284, -0.030331 ], [ 0.192719, 0.075624, 0.071156 ],
- [ 0.221140, 0.069191, -0.035085 ], [ 0.188367, 0.126200, 0.035225 ],
- [ 0.185760, 0.043537, -0.101714 ], [ -0.042518, 0.099646, 0.003244 ],
- [ -0.015308, -0.027521, 0.046006 ], [ 0.034086, -0.045777, 0.095989 ],
- [ 0.007174, -0.093358, 0.046459 ], [ -0.051248, -0.062095, 0.083161 ],
- [ -0.045626, -0.133301, 0.052997 ], [ -0.037840, 0.024042, 0.131097 ],
- [ -0.020217, -0.115942, 0.126170 ], [ -0.134550, -0.036291, 0.111322 ],
- [ -0.110576, -0.160024, 0.091841 ], [ -0.093308, -0.184958, 0.013939 ],
- [ -0.082735, -0.167417, -0.051725 ], [ -0.169934, -0.173003, -0.007155 ],
- [ -0.128244, -0.213123, -0.053337 ], [ -0.079852, -0.154116, -0.246546 ],
- [ -0.032242, -0.108756, -0.204133 ], [ -0.140117, -0.199495, -0.284505 ],
- [ 0.010842, -0.074979, -0.166333 ], [ -0.093313, 0.145006, 0.034110 ],
- [ -0.039236, 0.113213, 0.111053 ], [ 0.040613, -0.031783, 0.174058 ],
- [ -0.164232, 0.131421, 0.149842 ], [ 0.026893, 0.107281, 0.179297 ],
- [ 0.047086, 0.158606, 0.103267 ], [ -0.070567, 0.210459, 0.134734 ],
- [ 0.094392, 0.137050, 0.166892 ], [ 0.086039, 0.063657, 0.168825 ],
- [ 0.159371, 0.120897, 0.154357 ], [ 0.147101, 0.160684, 0.114882 ],
- [ 0.120158, 0.199650, 0.180948 ], [ 0.191417, 0.174500, 0.170734 ],
- [ 0.159153, 0.142165, 0.233347 ], [ 0.232002, 0.150181, 0.102736 ],
- [ 0.188299, 0.221738, 0.228748 ], [ 0.256786, 0.209685, 0.161534 ],
- [ 0.257861, 0.247793, 0.250516 ], [ -0.164461, -0.000143, 0.232461 ]
-];
-
-const SIPRO_LSF_CB3_16K: &[[f32; 3]] = &[
- [ -0.193369, -0.304643, -0.253777 ], [ -0.164125, -0.277786, -0.153116 ],
- [ -0.135681, -0.209120, -0.211724 ], [ -0.121822, -0.215734, -0.292207 ],
- [ -0.198781, -0.161674, -0.242538 ], [ -0.164147, -0.180570, -0.138070 ],
- [ -0.095915, -0.198695, -0.154309 ], [ -0.248386, -0.234462, -0.136984 ],
- [ -0.164968, -0.108318, -0.175635 ], [ -0.124171, -0.111809, -0.224402 ],
- [ -0.067398, -0.157017, -0.195759 ], [ -0.090132, -0.119174, -0.165253 ],
- [ -0.099460, -0.146895, -0.106799 ], [ -0.141493, -0.108103, -0.108880 ],
- [ -0.085088, -0.098340, -0.109953 ], [ -0.105526, -0.054463, -0.154315 ],
- [ -0.040480, -0.144285, -0.124042 ], [ -0.040969, -0.084039, -0.142880 ],
- [ -0.049082, -0.118553, -0.066686 ], [ -0.096336, -0.087515, -0.055741 ],
- [ -0.058605, -0.059327, -0.089275 ], [ -0.121842, -0.058681, -0.086949 ],
- [ -0.053792, -0.022025, -0.124451 ], [ -0.036744, -0.068891, -0.045865 ],
- [ 0.003900, -0.098237, -0.091158 ], [ -0.001664, -0.045089, -0.081353 ],
- [ -0.072829, -0.034087, -0.038416 ], [ -0.100822, -0.007330, -0.088715 ],
- [ -0.035911, -0.005864, -0.062577 ], [ -0.020205, -0.026547, -0.019634 ],
- [ 0.004291, -0.041290, -0.138181 ], [ 0.023404, -0.010932, -0.044904 ],
- [ 0.013557, 0.014823, -0.092943 ], [ 0.059673, -0.031024, -0.095739 ],
- [ 0.021130, -0.080607, -0.034594 ], [ 0.024655, -0.035564, 0.003243 ],
- [ 0.017106, 0.006952, -0.000308 ], [ 0.075208, -0.030910, -0.031181 ],
- [ 0.024965, 0.048632, -0.039448 ], [ 0.057028, 0.021547, -0.009418 ],
- [ -0.018577, 0.023697, -0.009759 ], [ 0.024077, 0.033053, 0.024324 ],
- [ 0.037052, -0.003436, 0.044530 ], [ -0.012871, -0.007179, 0.031795 ],
- [ 0.077877, 0.021547, 0.023131 ], [ 0.053365, 0.052078, 0.029433 ],
- [ 0.011429, 0.070426, 0.028734 ], [ -0.001827, 0.033115, 0.061505 ],
- [ -0.044870, 0.038568, 0.026239 ], [ 0.061633, 0.034799, 0.059784 ],
- [ 0.034261, 0.060342, 0.065185 ], [ 0.058981, 0.082481, 0.047252 ],
- [ 0.090008, 0.065942, 0.044470 ], [ 0.066961, 0.073728, -0.000428 ],
- [ 0.074763, 0.060293, 0.085632 ], [ 0.066366, 0.103375, 0.079642 ],
- [ 0.122297, 0.036558, 0.058745 ], [ 0.111042, 0.092093, 0.085412 ],
- [ 0.099243, 0.115476, 0.039254 ], [ 0.019973, 0.122844, 0.050255 ],
- [ 0.159571, 0.098965, 0.051740 ], [ 0.137624, 0.072405, -0.006922 ],
- [ 0.130240, 0.146091, 0.089698 ], [ 0.138335, 0.092968, 0.136193 ],
- [ 0.066031, 0.149304, 0.125476 ], [ 0.202749, 0.145751, 0.077122 ],
- [ 0.002224, 0.082811, 0.131200 ], [ 0.124476, 0.178073, 0.162336 ],
- [ 0.174722, 0.190298, 0.127106 ], [ 0.202193, 0.153569, 0.163840 ],
- [ 0.242604, 0.197796, 0.136929 ], [ 0.185809, 0.229348, 0.193353 ],
- [ -0.058814, 0.195178, 0.141821 ], [ 0.253646, 0.247175, 0.205766 ],
- [ 0.061433, -0.025542, 0.119311 ], [ -0.057816, 0.082445, 0.073243 ],
- [ -0.069239, 0.148678, 0.031146 ], [ -0.030217, -0.008503, 0.106194 ],
- [ -0.026708, 0.087469, -0.009589 ], [ -0.090418, 0.000265, 0.056807 ],
- [ -0.050607, -0.019383, 0.010494 ], [ -0.079397, 0.008233, -0.011469 ],
- [ -0.072634, -0.061165, 0.046917 ], [ -0.075741, -0.072343, -0.007557 ],
- [ -0.025162, -0.073363, 0.005173 ], [ -0.123371, -0.041257, -0.008375 ],
- [ -0.139904, 0.018285, 0.009920 ], [ -0.143421, -0.104238, 0.033457 ],
- [ -0.100923, -0.134400, -0.023257 ], [ -0.157791, -0.095042, -0.036959 ],
- [ -0.219890, -0.078637, 0.001815 ], [ -0.183607, -0.023053, -0.043678 ],
- [ -0.145303, -0.158923, -0.059045 ], [ -0.197615, -0.165199, 0.028099 ],
- [ -0.225131, -0.167756, -0.056401 ], [ -0.216572, -0.104751, -0.102964 ],
- [ -0.171336, -0.241967, -0.063404 ], [ -0.134035, -0.205614, 0.011831 ],
- [ -0.297116, -0.211173, -0.015352 ], [ -0.086464, -0.200592, -0.070454 ],
- [ -0.217777, -0.278403, 0.030398 ], [ -0.236248, -0.323694, -0.087588 ],
- [ -0.222074, -0.210785, 0.106210 ], [ -0.283400, -0.097077, 0.041303 ],
- [ -0.078417, -0.154464, 0.062956 ], [ -0.214417, -0.100695, 0.121909 ],
- [ -0.178576, -0.028847, 0.061042 ], [ -0.037999, -0.144233, -0.010546 ],
- [ -0.086695, -0.070996, 0.125282 ], [ 0.010788, -0.085006, 0.058527 ],
- [ -0.154015, 0.066560, 0.071038 ], [ -0.143503, 0.033260, 0.154393 ],
- [ -0.134069, 0.032420, -0.056293 ], [ -0.110851, 0.086908, 0.003920 ],
- [ -0.057254, 0.047674, -0.055571 ], [ -0.214206, 0.068784, -0.004735 ],
- [ -0.257264, 0.050468, 0.081702 ], [ -0.291834, 0.004120, -0.022366 ],
- [ -0.173309, -0.029081, -0.115901 ], [ -0.207622, 0.168664, 0.136030 ],
- [ 0.090541, 0.032754, -0.057330 ], [ 0.140219, -0.000735, -0.015633 ],
- [ 0.136697, -0.017163, -0.100909 ], [ 0.029838, -0.089515, -0.147130 ],
- [ -0.055367, -0.072683, -0.214015 ], [ 0.048680, -0.057633, -0.212429 ],
- [ -0.013134, -0.113898, -0.196403 ], [ -0.071702, -0.159408, -0.254895 ]
-];
-
-const SIPRO_LSF_CB4_16K: [[f32; 4]; 128] = [
- [ -0.201277, -0.278679, -0.173262, -0.198580 ],
- [ -0.214667, -0.151922, -0.117551, -0.192713 ],
- [ -0.160962, -0.207728, -0.124750, -0.129749 ],
- [ -0.131043, -0.137818, -0.155281, -0.166308 ],
- [ -0.179134, -0.169602, -0.165223, -0.066293 ],
- [ -0.136474, -0.177035, -0.250127, -0.134370 ],
- [ -0.066970, -0.146274, -0.170638, -0.134436 ],
- [ -0.083288, -0.165860, -0.103437, -0.140361 ],
- [ -0.130474, -0.119317, -0.124393, -0.086408 ],
- [ -0.127609, -0.134415, -0.073592, -0.116103 ],
- [ -0.113027, -0.091756, -0.107786, -0.131935 ],
- [ -0.125530, -0.182152, -0.093796, -0.045088 ],
- [ -0.077122, -0.138052, -0.166271, -0.038886 ],
- [ -0.073027, -0.106845, -0.067073, -0.113910 ],
- [ -0.049146, -0.107019, -0.112531, -0.063388 ],
- [ -0.101539, -0.119586, -0.050297, -0.040670 ],
- [ -0.107784, -0.066913, -0.080993, -0.052352 ],
- [ -0.152155, -0.103010, -0.090461, -0.015526 ],
- [ -0.153087, -0.087656, -0.029889, -0.037367 ],
- [ -0.215281, -0.138062, -0.089162, -0.050839 ],
- [ -0.053350, -0.060169, -0.063459, -0.024499 ],
- [ -0.051674, -0.076355, -0.033733, -0.077211 ],
- [ -0.045047, -0.107006, -0.020880, -0.024525 ],
- [ -0.083003, -0.063672, -0.013243, -0.028324 ],
- [ -0.104104, -0.075450, -0.032746, 0.024480 ],
- [ -0.085695, -0.019502, -0.045121, -0.025016 ],
- [ -0.123120, -0.030844, -0.003533, -0.016224 ],
- [ -0.025568, -0.049172, -0.003911, -0.027522 ],
- [ -0.039029, -0.019857, -0.043211, -0.058087 ],
- [ -0.040122, -0.023067, -0.001356, 0.008607 ],
- [ -0.063351, -0.001776, 0.016015, -0.027088 ],
- [ -0.068110, -0.038838, 0.042525, 0.001076 ],
- [ -0.043623, -0.020736, -0.047862, 0.037710 ],
- [ -0.041052, 0.021954, -0.025660, 0.000758 ],
- [ -0.013035, 0.002583, -0.008233, -0.037300 ],
- [ -0.005523, -0.014670, 0.019651, -0.012667 ],
- [ -0.004409, -0.014437, -0.059412, -0.019701 ],
- [ 0.024946, -0.011663, -0.014351, -0.028762 ],
- [ 0.012660, 0.018489, -0.010205, 0.012695 ],
- [ -0.004423, 0.017827, 0.040544, 0.003629 ],
- [ 0.020684, 0.026743, 0.007752, -0.025595 ],
- [ 0.032071, 0.000043, 0.026188, -0.006444 ],
- [ 0.058793, 0.015820, -0.001119, -0.017415 ],
- [ 0.020156, -0.047590, 0.004227, 0.008670 ],
- [ 0.054770, 0.032135, 0.029770, -0.009767 ],
- [ 0.030884, 0.047757, 0.033068, 0.006866 ],
- [ 0.062039, 0.011646, 0.056037, 0.016859 ],
- [ 0.013798, -0.028196, 0.060710, 0.014299 ],
- [ 0.100043, 0.041445, 0.023379, -0.014889 ],
- [ 0.062728, -0.042821, 0.002180, -0.055380 ],
- [ 0.061663, 0.018767, -0.015571, -0.074095 ],
- [ 0.062980, 0.080497, 0.011808, -0.031787 ],
- [ 0.084964, 0.043100, -0.025877, 0.020309 ],
- [ 0.014707, 0.035421, -0.041440, -0.053373 ],
- [ 0.081268, 0.005791, -0.066290, -0.039825 ],
- [ 0.017691, -0.020401, -0.040513, -0.083960 ],
- [ 0.120874, 0.055753, -0.025988, -0.059552 ],
- [ 0.079912, 0.007894, -0.085380, -0.114587 ],
- [ 0.036856, -0.039331, -0.104237, -0.069116 ],
- [ 0.008526, -0.064273, -0.048312, -0.038595 ],
- [ 0.033461, -0.028956, -0.066505, 0.038722 ],
- [ -0.042064, -0.043989, -0.100653, -0.071550 ],
- [ -0.015342, -0.064850, -0.065675, -0.122769 ],
- [ -0.006581, -0.004919, -0.113564, -0.145753 ],
- [ 0.008273, -0.070702, -0.164998, -0.095541 ],
- [ -0.001698, -0.063744, -0.129971, -0.011162 ],
- [ -0.048471, -0.087500, -0.111006, -0.161823 ],
- [ -0.032193, -0.091955, -0.080642, 0.012288 ],
- [ -0.095873, -0.015986, -0.072722, -0.101745 ],
- [ -0.079477, -0.082060, -0.203008, -0.100297 ],
- [ -0.023883, -0.064022, -0.168341, -0.211739 ],
- [ -0.070530, -0.103547, -0.123858, 0.055049 ],
- [ -0.033503, -0.076812, -0.016287, 0.044159 ],
- [ -0.088427, -0.161682, -0.058579, 0.013873 ],
- [ -0.083068, -0.168222, -0.016773, -0.080209 ],
- [ -0.080548, -0.139090, 0.030544, 0.007171 ],
- [ -0.117482, -0.083718, 0.027074, -0.003674 ],
- [ -0.163085, -0.156856, -0.012618, -0.022329 ],
- [ -0.176540, -0.113042, -0.020148, 0.051770 ],
- [ -0.153891, -0.199293, -0.043244, 0.028331 ],
- [ -0.107822, -0.150615, 0.016430, 0.092919 ],
- [ -0.137676, -0.183224, 0.066026, 0.029343 ],
- [ -0.191106, -0.099250, 0.045370, 0.004084 ],
- [ -0.237042, -0.130815, -0.022543, -0.029428 ],
- [ -0.201014, -0.053591, -0.007305, -0.033547 ],
- [ -0.249286, -0.228408, 0.005002, 0.007146 ],
- [ -0.206509, -0.211998, -0.061352, -0.047233 ],
- [ -0.255702, -0.135114, 0.076375, 0.036630 ],
- [ -0.296271, -0.073946, -0.007273, -0.019601 ],
- [ -0.302917, -0.175111, -0.070024, -0.043905 ],
- [ -0.239275, -0.043962, -0.084982, -0.067446 ],
- [ -0.254583, -0.294720, -0.088762, -0.070451 ],
- [ -0.205583, -0.238996, -0.124753, 0.033076 ],
- [ -0.205583, -0.215882, -0.028472, 0.118679 ],
- [ -0.153640, -0.204464, -0.039654, -0.134441 ],
- [ -0.145929, -0.191970, -0.175308, 0.021366 ],
- [ -0.149348, -0.212569, -0.118324, 0.103812 ],
- [ -0.166397, -0.220581, -0.265260, -0.029113 ],
- [ -0.164171, -0.231262, -0.258828, 0.061427 ],
- [ -0.200198, -0.263453, -0.212016, 0.115359 ],
- [ -0.130088, -0.212168, -0.202368, 0.118563 ],
- [ -0.206387, -0.078075, -0.227856, -0.111165 ],
- [ -0.129605, -0.176848, -0.241584, -0.259900 ],
- [ -0.176826, -0.045901, -0.141712, -0.209345 ],
- [ -0.351173, -0.031097, -0.133935, -0.182412 ],
- [ -0.164232, 0.027006, -0.014039, -0.053567 ],
- [ -0.171037, -0.025924, 0.030972, 0.017329 ],
- [ -0.080862, -0.021577, 0.007652, 0.063968 ],
- [ -0.061788, 0.042024, -0.018783, -0.057979 ],
- [ -0.110311, 0.054760, 0.031446, -0.006710 ],
- [ -0.136637, 0.022171, 0.084991, 0.028039 ],
- [ -0.254471, -0.004376, 0.078034, 0.033649 ],
- [ -0.234464, 0.088157, 0.040999, 0.002639 ],
- [ -0.037095, 0.059443, 0.072180, 0.015027 ],
- [ -0.046841, -0.004813, 0.088266, 0.038786 ],
- [ -0.086782, 0.120100, 0.082655, 0.020271 ],
- [ -0.118361, -0.069242, 0.094867, 0.039200 ],
- [ -0.023342, -0.084303, 0.052684, 0.017093 ],
- [ -0.014194, 0.001012, 0.011946, 0.074125 ],
- [ -0.015342, 0.076396, 0.022365, -0.028001 ],
- [ 0.027706, 0.037047, 0.107573, 0.060815 ],
- [ 0.030615, 0.040664, 0.010467, 0.074289 ],
- [ 0.038646, 0.115584, 0.069627, 0.007642 ],
- [ 0.096463, 0.069818, 0.062494, 0.015413 ],
- [ 0.054834, 0.065232, 0.054286, 0.110088 ],
- [ 0.152312, 0.092371, 0.026420, -0.013184 ],
- [ 0.144264, 0.123438, 0.080131, 0.023233 ],
- [ 0.124405, 0.009943, -0.148477, -0.205184 ]
-];
-
-const SIPRO_MEAN_LSF_16K: [f32; 16] = [
- 0.131554, 0.246615, 0.435896, 0.644419,
- 0.827810, 1.017876, 1.198910, 1.379159,
- 1.562157, 1.736908, 1.940719, 2.131963,
- 2.347162, 2.521521, 2.717870, 2.847068
-];
-
-const SIPRO_POW_0_5: [f32; 16] = [
- 0.5,
- 0.25,
- 0.125,
- 0.0625,
- 0.03125,
- 0.015625,
- 0.0078125,
- 0.00390625,
- 0.001953125,
- 0.0009765625,
- 0.00048828125,
- 0.000244140625,
- 0.0001220703125,
- 0.00006103515625,
- 0.000030517578125,
- 0.0000152587890625
-];
-const SIPRO_POW_0_55: [f32; 10] = [
- 0.550000, 0.302500, 0.166375, 0.091506, 0.050328,
- 0.027681, 0.015224, 0.008373, 0.004605, 0.002533
-];
-const SIPRO_POW_0_7: [f32; 10] = [
- 0.700000, 0.490000, 0.343000, 0.240100, 0.168070,
- 0.117649, 0.082354, 0.057648, 0.040354, 0.028248
-];
-const SIPRO_POW_0_75: [f32; 10] = [
- 0.750000, 0.562500, 0.421875, 0.316406, 0.237305,
- 0.177979, 0.133484, 0.100113, 0.075085, 0.056314
-];
-
-const SIPRO_GAIN_CB_16K: [f32; 32] = [
- 0.07499, 0.10593, 0.14125, 0.18836,
- 0.23714, 0.28184, 0.32734, 0.37584,
- 0.42170, 0.47315, 0.53088, 0.59566,
- 0.66834, 0.74989, 0.84140, 0.94406,
- 1.05925, 1.18850, 1.33352, 1.49624,
- 1.67880, 1.88365, 2.11349, 2.37137,
- 2.66073, 3.05492, 3.54813, 4.21697,
- 5.30884, 7.07946, 9.44061, 13.33521,
-];
-const SIPRO_GAIN_CB_LBR: [[f32; 2]; 128] = [
- [ 0.035230, 0.161540 ], [ 0.049223, 0.448359 ], [ 0.057443, 0.809043 ],
- [ 0.072434, 1.760306 ], [ 0.111491, 0.566418 ], [ 0.112820, 1.098524 ],
- [ 0.143493, 0.726856 ], [ 0.144840, 0.347800 ], [ 0.180341, 1.050010 ],
- [ 0.188171, 2.197256 ], [ 0.189771, 0.256947 ], [ 0.198260, 0.484678 ],
- [ 0.210622, 0.755825 ], [ 0.220694, 0.590788 ], [ 0.237062, 1.322214 ],
- [ 0.255175, 0.338710 ], [ 0.298980, 0.919051 ], [ 0.314627, 0.520961 ],
- [ 0.337106, 1.469863 ], [ 0.341422, 2.804546 ], [ 0.363257, 0.736222 ],
- [ 0.363881, 0.367640 ], [ 0.369850, 1.937934 ], [ 0.370136, 1.075201 ],
- [ 0.397152, 0.549410 ], [ 0.426557, 0.876015 ], [ 0.450686, 0.215588 ],
- [ 0.468116, 0.671848 ], [ 0.470495, 1.242034 ], [ 0.474180, 1.739845 ],
- [ 0.484875, 0.490564 ], [ 0.498917, 0.971238 ], [ 0.530996, 0.785765 ],
- [ 0.539768, 2.130689 ], [ 0.546021, 0.589544 ], [ 0.546632, 3.050846 ],
- [ 0.552336, 0.389775 ], [ 0.556302, 1.400103 ], [ 0.559688, 1.105421 ],
- [ 0.574140, 0.667513 ], [ 0.595547, 0.828943 ], [ 0.597771, 0.496929 ],
- [ 0.617079, 1.863075 ], [ 0.619657, 1.221713 ], [ 0.621172, 0.950275 ],
- [ 0.628426, 0.630766 ], [ 0.628689, 4.242164 ], [ 0.640899, 1.529846 ],
- [ 0.645813, 0.331127 ], [ 0.653056, 0.748168 ], [ 0.662909, 1.077438 ],
- [ 0.669505, 2.631114 ], [ 0.681570, 1.839298 ], [ 0.687844, 0.903400 ],
- [ 0.688660, 1.270830 ], [ 0.695070, 0.578227 ], [ 0.697926, 0.428440 ],
- [ 0.715454, 0.812355 ], [ 0.729981, 1.539357 ], [ 0.737434, 1.106765 ],
- [ 0.740241, 2.033374 ], [ 0.740871, 0.568460 ], [ 0.752689, 0.698461 ],
- [ 0.756587, 0.893078 ], [ 0.767797, 0.499246 ], [ 0.768516, 3.712434 ],
- [ 0.773153, 1.332360 ], [ 0.786125, 1.042996 ], [ 0.788792, 0.238388 ],
- [ 0.790861, 2.273229 ], [ 0.795338, 1.582767 ], [ 0.809621, 0.595501 ],
- [ 0.821032, 0.756460 ], [ 0.824590, 0.922925 ], [ 0.826019, 1.186793 ],
- [ 0.827426, 1.885076 ], [ 0.830080, 6.088666 ], [ 0.837028, 2.819993 ],
- [ 0.845561, 1.490623 ], [ 0.848323, 0.410436 ], [ 0.856522, 0.729725 ],
- [ 0.862636, 0.966880 ], [ 0.874561, 1.681660 ], [ 0.874751, 1.177630 ],
- [ 0.879289, 2.301300 ], [ 0.886671, 0.613068 ], [ 0.896729, 0.781097 ],
- [ 0.904777, 3.484111 ], [ 0.906098, 1.330892 ], [ 0.919182, 1.877203 ],
- [ 0.919901, 0.569511 ], [ 0.921772, 1.034126 ], [ 0.922439, 0.376000 ],
- [ 0.934221, 1.485214 ], [ 0.938842, 0.869135 ], [ 0.939166, 2.378294 ],
- [ 0.958933, 1.122722 ], [ 0.959042, 0.694098 ], [ 0.960995, 1.743430 ],
- [ 0.970763, 2.884897 ], [ 0.982881, 0.814506 ], [ 0.990141, 1.330022 ],
- [ 0.996447, 1.823381 ], [ 1.000013, 0.967498 ], [ 1.000743, 0.480597 ],
- [ 1.008020, 5.095226 ], [ 1.013883, 2.105435 ], [ 1.026438, 0.691312 ],
- [ 1.027361, 1.558169 ], [ 1.030123, 3.586526 ], [ 1.033916, 1.118036 ],
- [ 1.039315, 2.543360 ], [ 1.068596, 0.836380 ], [ 1.081023, 1.318768 ],
- [ 1.093150, 2.267843 ], [ 1.095607, 1.712383 ], [ 1.102816, 1.037334 ],
- [ 1.103231, 3.536292 ], [ 1.107320, 0.508615 ], [ 1.150000, 7.999000 ],
- [ 1.156731, 1.236772 ], [ 1.168428, 2.268084 ], [ 1.184130, 0.775839 ],
- [ 1.210609, 1.511840 ], [ 1.220663, 4.365683 ], [ 1.224016, 0.983179 ],
- [ 1.252236, 2.778535 ], [ 1.301176, 1.923126 ]
-];
-const SIPRO_GAIN_PRED: [f32; 4] = [ 0.200, 0.334, 0.504, 0.691 ];
-
-const SIPRO_GAIN_PITCH_CB_16K: [f32; 16] = [
- 0.00, 0.2, 0.40, 0.5, 0.60, 0.7, 0.75, 0.8,
- 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2,
-];
-const SIPRO_GAIN_DB_CB_16K: [f32; 32] = [
- -22.5, -19.5, -17.0, -14.5,
- -12.5, -11.0, -9.7, -8.5,
- -7.5, -6.5, -5.5, -4.5,
- -3.5, -2.5, -1.5, -0.5,
- 0.5, 1.5, 2.5, 3.5,
- 4.5, 5.5, 6.5, 7.5,
- 8.5, 9.7, 11.0, 12.5,
- 14.5, 17.0, 19.5, 22.5,
-];
-
-const SIPRO_SINC_16K: [f32; 31] = [
- 0.874475, 0.755101, 0.455962, 0.118807, -0.114223, -0.176778,
- -0.101923, 0.015553, 0.086555, 0.078193, 0.018660, -0.037513,
- -0.052733, -0.027459, 0.009967, 0.030278, 0.024050, 0.003055,
- -0.013862, -0.016162, -0.006725, 0.004212, 0.008634, 0.005721,
- -0.000000, -0.003710, -0.003690, -0.001228, 0.001409, 0.002610,
- 0.0
-];
-const SIPRO_SINC_LBR: [f32; 61] = [
- 0.89852900, 0.86505100, 0.76925700, 0.62405400, 0.44863900, 0.265289000,
- 0.09591670, -0.04125980, -0.13433800, -0.17898600, -0.17852800, -0.142609000,
- -0.08493040, -0.02050780, 0.03695680, 0.07739260, 0.09552000, 0.091278100,
- 0.06893920, 0.03570560, 0.0 , -0.03054810, -0.05041500, -0.057006800,
- -0.05084230, -0.03500370, -0.01416020, 0.00665283, 0.02307130, 0.032348600,
- 0.03353880, 0.02758790, 0.01678470, 0.00411987, -0.00747681, -0.015686000,
- -0.01934810, -0.01837160, -0.01376340, -0.00704956, 0.0 , 0.005828860,
- 0.00939941, 0.01037600, 0.00903320, 0.00604248, 0.00238037, -0.001098630,
- -0.00366211, -0.00497437, -0.00503540, -0.00402832, -0.00241089, -0.000579834,
- 0.00103760, 0.00222778, 0.00277710, 0.00271606, 0.00213623, 0.001159670,
- 0.0
-];
diff --git a/src/codecs/ts102366.rs b/src/codecs/ts102366.rs
deleted file mode 100644
index fb452c5..0000000
--- a/src/codecs/ts102366.rs
+++ /dev/null
@@ -1,1534 +0,0 @@
-use crate::formats::*;
-use crate::frame::*;
-use super::*;
-use crate::io::bitreader::*;
-use crate::dsp::fft::*;
-use std::str::FromStr;
-use std::f32::consts;
-
-const BLOCK_LEN: usize = 256;
-const NBLOCKS: usize = 6;
-const MAX_CHANNELS: usize = 5;
-const MAX_CPLBANDS: usize = 18;
-const MAX_BANDS: usize = 50;
-
-const MAGIC_BYTE0: u8 = 0x0B;
-const MAGIC_BYTE1: u8 = 0x77;
-
-const STRATEGY_REUSE: u8 = 0;
-
-const LFE_CHANNEL: usize = MAX_CHANNELS;
-const CPL_CHANNEL: usize = MAX_CHANNELS + 1;
-
-struct IMDCTContext {
- xsincos: [FFTComplex; BLOCK_LEN/2],
- fft: FFT,
- size: usize,
-}
-
-struct IMDCTWorkspace {
- z: [FFTComplex; BLOCK_LEN / 2],
- y: [FFTComplex; BLOCK_LEN / 2],
- out: [f32; BLOCK_LEN * 2],
-}
-
-impl IMDCTContext {
- fn new(bits: usize) -> Self {
- let size = 1 << bits;
- let size4 = 1 << (bits - 2);
- let mut xsincos: [FFTComplex; 512/4] = [FFTC_ZERO; 512/4];
- for k in 0..size4 {
- let factor = 2.0 * consts::PI * ((8 * k + 1) as f32) / ((8 * size) as f32);
- xsincos[k].re = -factor.cos();
- xsincos[k].im = -factor.sin();
- }
- let fft = FFTBuilder::new_fft(FFTMode::SplitRadix, size/4);
- IMDCTContext { xsincos: xsincos, size: size, fft: fft }
- }
- #[allow(non_snake_case)]
- fn do_imdct(&mut self, coeffs: &[i32; BLOCK_LEN], tmp: &mut IMDCTWorkspace) {
- do_imdct_core(&mut self.fft, &self.xsincos, self.size, false, coeffs, &mut tmp.z, &mut tmp.y);
- let w = &TS102366_WINDOW;
- let N2 = self.size / 2;
- let N4 = self.size / 4;
- let N8 = self.size / 8;
- for n in 0..N8 {
- tmp.out[ 2 * n] = -tmp.y[N8 + n] .im * w[ 2 * n];
- tmp.out[ 2 * n + 1] = tmp.y[N8 - n - 1].re * w[ 2 * n + 1];
- tmp.out[ N4 + 2 * n] = -tmp.y[ n] .re * w[N4 + 2 * n];
- tmp.out[ N4 + 2 * n + 1] = tmp.y[N4 - n - 1].im * w[N4 + 2 * n + 1];
- tmp.out[ N2 + 2 * n] = -tmp.y[N8 + n] .re * w[N2 - 2 * n - 1];
- tmp.out[ N2 + 2 * n + 1] = tmp.y[N8 - n - 1].im * w[N2 - 2 * n - 2];
- tmp.out[3 * N4 + 2 * n] = tmp.y[ n] .im * w[N4 - 2 * n - 1];
- tmp.out[3 * N4 + 2 * n + 1] = -tmp.y[N4 - n - 1].re * w[N4 - 2 * n - 2];
- }
- }
- #[allow(non_snake_case)]
- fn do_imdct_ileave(&mut self, coeffs: &[i32; BLOCK_LEN], tmp: &mut IMDCTWorkspace) {
- let mut ziter = tmp.z.chunks_mut(self.size / 4);
- let z1 = ziter.next().unwrap();
- let z2 = ziter.next().unwrap();
- let mut yiter = tmp.y.chunks_mut(self.size / 4);
- let y1 = yiter.next().unwrap();
- let y2 = yiter.next().unwrap();
- do_imdct_core(&mut self.fft, &self.xsincos, self.size, true, coeffs, z1, y1);
- do_imdct_core(&mut self.fft, &self.xsincos, self.size, true, &coeffs[1..], z2, y2);
- let w = &TS102366_WINDOW;
- let N2 = self.size / 2;
- let N4 = self.size / 4;
- let N8 = self.size / 8;
- for n in 0..N8 {
- tmp.out[ 2 * n] = -y1[ n] .im * w[ 2 * n];
- tmp.out[ 2 * n + 1] = y1[N8 - n - 1].re * w[ 2 * n + 1];
- tmp.out[ N4 + 2 * n] = -y1[ n] .re * w[N4 + 2 * n];
- tmp.out[ N4 + 2 * n + 1] = y1[N8 - n - 1].im * w[N4 + 2 * n + 1];
- tmp.out[ N2 + 2 * n] = -y2[ n] .re * w[N2 - 2 * n - 1];
- tmp.out[ N2 + 2 * n + 1] = y2[N8 - n - 1].im * w[N2 - 2 * n - 2];
- tmp.out[3 * N4 + 2 * n] = y2[ n] .im * w[N4 - 2 * n - 1];
- tmp.out[3 * N4 + 2 * n + 1] = -y2[N8 - n - 1].re * w[N4 - 2 * n - 2];
- }
- }
-}
-
-#[allow(non_snake_case)]
-fn do_imdct_core(fft: &mut FFT, xsc: &[FFTComplex; BLOCK_LEN/2], size: usize, ilace: bool, coeffs: &[i32], z: &mut [FFTComplex], y: &mut [FFTComplex]) {
- let N = size;
- let N2 = size / 2;
- let N4 = size / 4;
- let scale = 1.0 / ((1 << 24) as f32);
- for k in 0..N4 {
- let (c0, c1) = if !ilace {
- ((coeffs[N2 - 2 * k - 1] as f32) * scale,
- (coeffs[ 2 * k] as f32) * scale)
- } else {
- ((coeffs[N - 4 * k - 2] as f32) * scale,
- (coeffs[ 4 * k] as f32) * scale)
- };
- let c = FFTComplex { re: c0, im: c1 };
- z[k] = c * xsc[k];
- }
- fft.do_fft_inplace(z, false);
- for k in 0..N4 {
- y[k] = z[k] * xsc[k];
- }
-}
-
-struct AudioDecoder {
- info: Rc<NACodecInfo>,
- ablk: AudioBlock,
- imdct512: IMDCTContext,
- imdct256: IMDCTContext,
- tmp: IMDCTWorkspace,
- delay: [[f32; BLOCK_LEN]; MAX_CHANNELS + 1],
-}
-
-impl AudioDecoder {
- fn new() -> Self {
- AudioDecoder {
- info: NACodecInfo::new_dummy(),
- ablk: AudioBlock::new(),
- imdct512: IMDCTContext::new(9),
- imdct256: IMDCTContext::new(8),
- tmp: IMDCTWorkspace {
- z: [FFTC_ZERO; BLOCK_LEN / 2],
- y: [FFTC_ZERO; BLOCK_LEN / 2],
- out: [0.0; BLOCK_LEN * 2],
- },
- delay: [[0.0; BLOCK_LEN]; MAX_CHANNELS + 1],
- }
- }
-}
-
-const SAMPLE_RATES: [u32; 4] = [ 48000, 44100, 32000, 0 ];
-
-const FRAME_SIZES: [[usize; 64]; 4] = [
- [
- 64, 64, 80, 80, 96, 96, 112, 112,
- 128, 128, 160, 160, 192, 192, 224, 224,
- 256, 256, 320, 320, 384, 384, 448, 448,
- 512, 512, 640, 640, 768, 768, 896, 896,
- 1024, 1024, 1152, 1152, 1280, 1280,
- 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,
- ], [
- 69, 70, 87, 88, 104, 105, 121, 122,
- 139, 140, 174, 175, 208, 209, 243, 244,
- 278, 279, 348, 349, 417, 418, 487, 488,
- 557, 558, 696, 697, 835, 836, 975, 976,
- 1114, 1115, 1253, 1254, 1393, 1394,
- 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,
- ], [
- 96, 96, 120, 120, 144, 144, 168, 168,
- 192, 192, 240, 240, 288, 288, 336, 336,
- 384, 384, 480, 480, 576, 576, 672, 672,
- 768, 768, 960, 960, 1152, 1152, 1344, 1344,
- 1536, 1536, 1728, 1728, 1920, 1920,
- 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; 64 ],
-];
-
-#[derive(Debug,Clone,Copy)]
-struct Syncinfo {
- crc1: u16,
- fscod: u8,
- frmsizecod: u8,
- samplerate: u32,
- frame_size: usize,
-}
-
-impl Syncinfo {
- fn read(br: &mut BitReader) -> DecoderResult<Self> {
- let syncword = br.read(16)?;
- validate!(syncword == ((MAGIC_BYTE0 as u32) * 256) + (MAGIC_BYTE1 as u32));
- let crc1 = br.read(16)? as u16;
- let fscod = br.read(2)? as usize;
- let frmsizecod = br.read(6)? as usize;
- Ok(Syncinfo { crc1: crc1, fscod: fscod as u8, frmsizecod: frmsizecod as u8,
- samplerate: SAMPLE_RATES[fscod], frame_size: FRAME_SIZES[fscod][frmsizecod] * 2 })
- }
- fn is_valid(&self) -> bool {
- (self.samplerate != 0) && (self.frame_size != 0)
- }
-}
-
-trait ReadOptional {
- fn read_optional8(&mut self) -> BitReaderResult<Option<u8>>;
- fn read_optional16(&mut self, bits: u8) -> BitReaderResult<Option<u16>>;
-}
-
-impl<'a> ReadOptional for BitReader<'a> {
- fn read_optional8(&mut self) -> BitReaderResult<Option<u8>> {
- if self.read_bool()? {
- Ok(Some(self.read(8)? as u8))
- } else {
- Ok(None)
- }
- }
- fn read_optional16(&mut self, bits: u8) -> BitReaderResult<Option<u16>> {
- if self.read_bool()? {
- Ok(Some(self.read(bits)? as u16))
- } else {
- Ok(None)
- }
- }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-enum ACMode {
- DualMono,
- Mono,
- Stereo,
- Mode3_0,
- Mode2_1,
- Mode3_1,
- Mode2_2,
- Mode3_2,
-}
-
-impl ACMode {
- fn get_num_channels(&self) -> usize {
- match *self {
- ACMode::DualMono => 2,
- ACMode::Mono => 1,
- ACMode::Stereo => 2,
- ACMode::Mode3_0 => 3,
- ACMode::Mode2_1 => 3,
- ACMode::Mode3_1 => 4,
- ACMode::Mode2_2 => 4,
- ACMode::Mode3_2 => 5,
- }
- }
- fn get_channel_map_str(&self) -> &'static str {
- match *self {
- ACMode::DualMono => "C,C",
- ACMode::Mono => "C",
- ACMode::Stereo => "L,R",
- ACMode::Mode3_0 => "L,C,R",
- ACMode::Mode2_1 => "L,R,Cs",
- ACMode::Mode3_1 => "L,C,R,Cs",
- ACMode::Mode2_2 => "L,R,Ls,Rs",
- ACMode::Mode3_2 => "L,C,R,Ls,Rs",
- }
- }
- fn get_channel_map(&self, has_lfe: bool) -> NAChannelMap {
- let mut chmap = NAChannelMap::from_str(self.get_channel_map_str()).unwrap();
- if has_lfe {
- chmap.add_channel(NAChannelType::LFE);
- }
- chmap
- }
- fn is_3_x(&self) -> bool {
- match *self {
- ACMode::Mode3_0 |
- ACMode::Mode3_1 |
- ACMode::Mode3_2 => true,
- _ => false,
- }
- }
- fn is_surround(&self) -> bool {
- match *self {
- ACMode::Mode2_1 |
- ACMode::Mode3_1 |
- ACMode::Mode2_2 |
- ACMode::Mode3_2 => true,
- _ => false,
- }
- }
-}
-
-const AC_MODES: [ACMode; 8] = [
- ACMode::DualMono, ACMode::Mono, ACMode::Stereo,
- ACMode::Mode3_0, ACMode::Mode2_1,
- ACMode::Mode3_1, ACMode::Mode2_2,
- ACMode::Mode3_2
-];
-
-#[derive(Debug,Clone,Copy)]
-struct Mixinfo {
- dialnorm: u8,
- compr: Option<u8>,
- langcod: Option<u8>,
- mixlevel: Option<u8>,
- roomtyp: Option<u8>,
-}
-
-impl Mixinfo {
- fn read(br: &mut BitReader) -> DecoderResult<Self> {
- let dialnorm = br.read(5)? as u8;
- let compr = br.read_optional8()?;
- let langcod = br.read_optional8()?;
- let (mixlevel, roomtyp) = if br.read_bool()? {
- let mlev = br.read(5)? as u8;
- let rt = br.read(2)? as u8;
- validate!(rt < 3);
- (Some(mlev), Some(rt))
- } else {
- (None, None)
- };
- Ok(Mixinfo { dialnorm, compr, langcod, mixlevel, roomtyp })
- }
-}
-
-#[derive(Debug,Clone,Copy)]
-struct BSI {
- bsid: u8,
- shift: u8,
- bsmod: u8,
- acmod: ACMode,
- cmixlev: Option<u8>,
- surmixlev: Option<u8>,
- dsurmod: Option<u8>,
- lfeon: bool,
- mixinfo: Mixinfo,
- mixinfo2: Option<Mixinfo>,
- copysmth: bool,
- origbs: bool,
- timecod1: Option<u16>,
- timecod2: Option<u16>,
- has_addb: bool,
-}
-
-impl BSI {
- fn read(br: &mut BitReader) -> DecoderResult<BSI> {
- let bsid = br.read(5)? as u8;
- validate!(bsid <= 10);
- let shift = if bsid < 9 { 0 } else { bsid - 9 + 1 };
- let bsmod = br.read(3)? as u8;
- let acmod_id = br.read(3)? as usize;
- validate!(acmod_id < AC_MODES.len());
- let acmod = AC_MODES[acmod_id];
- let cmixlev = if acmod.is_3_x() {
- let cl = br.read(2)? as u8;
- validate!(cl < 3);
- Some(cl)
- } else { None };
- let surmixlev = if acmod.is_surround() {
- let sml = br.read(2)? as u8;
- validate!(sml < 3);
- Some(sml)
- } else { None };
- let dsurmod = if acmod == ACMode::Stereo {
- let dsm = br.read(2)? as u8;
- validate!(dsm < 3);
- Some(dsm)
- } else { None };
- let lfeon = br.read_bool()?;
- let mixinfo = Mixinfo::read(br)?;
- let mixinfo2 = if acmod == ACMode::DualMono {
- Some(Mixinfo::read(br)?)
- } else {
- None
- };
- let copysmth = br.read_bool()?;
- let origbs = br.read_bool()?;
- let timecod1 = br.read_optional16(14)?;
- let timecod2 = br.read_optional16(14)?;
- let has_addb = br.read_bool()?;
- Ok(BSI{
- bsid, shift, bsmod, acmod, lfeon,
- cmixlev, surmixlev, dsurmod,
- mixinfo: mixinfo, mixinfo2: mixinfo2,
- copysmth, origbs, timecod1, timecod2, has_addb,
- })
- }
-}
-
-#[derive(Clone, Copy)]
-struct ChannelData {
- blksw: bool,
- dithflag: bool,
-
- chincpl: bool,
- cplcoe: bool,
- cplcoexp: [u8; MAX_CPLBANDS],
- cplcomant: [u8; MAX_CPLBANDS],
- mstrcplco: u8,
-
- chbwcod: u8,
-
- expstr: u8,
- gainrng: u8,
- startmant: usize,
- endmant: usize,
- groups: usize,
-
- fsnroffst: u8,
- fgaincod: usize,
- snroffset: i32,
-
- deltbae: u8,
- deltnseg: usize,
- deltoffst: [u8; 8],
- deltlen: [usize; 8],
- deltba: [u8; 8],
-
- bap: [u8; 256],
- exps: [u8; 256],
- mant: [i32; 256],
-
- psd: [i16; 256],
- bndpsd: [i32; 64],
-}
-
-const GROUPS: [usize; 4] = [ 0, 3, 6, 12 ];
-const GROUP_BIAS: [usize; 4] = [ 0, 0, 3, 9 ];
-
-fn decode_exps(br: &mut BitReader, dst: &mut [u8], mut prev: u8, grplen: usize) -> DecoderResult<()> {
- let repeat = grplen / 3;
-
- for out in dst.chunks_mut(grplen) {
- let val = br.read(7)? as u8;
- validate!(val < 125);
- let diff: [u8; 3] = [ val / 25, (val / 5) % 5, val % 5 ];
- for (i, exps) in out.chunks_mut(repeat).enumerate() {
- exps[0] = (prev + diff[i]).wrapping_sub(2);
- validate!(exps[0] <= 24);
- for j in 1..repeat {
- exps[j] = exps[0];
- }
- prev = exps[0];
- }
- }
-
- Ok(())
-}
-
-macro_rules! read_bap {
- ($br: expr, $tab:ident, $nbits:expr) => ({
- let val = $br.read($nbits)? as usize;
- validate!(val < $tab.len());
- $tab[val]
- });
- ($br:expr, $tab:ident, $nbits:expr, $bufidx:expr, $bap_buf:expr, $bap_buf_fill:expr) => (
- if $bap_buf_fill[$bufidx] > 0 {
- $bap_buf_fill[$bufidx] -= 1;
- $bap_buf[$bufidx][$bap_buf_fill[$bufidx]]
- } else {
- let val = $br.read($nbits)? as usize;
- validate!(val < $tab.len());
- for i in 1..$tab[0].len() {
- $bap_buf[$bufidx][i - 1] = $tab[val][i];
- }
- $bap_buf_fill[$bufidx] = $tab[0].len() - 1;
- $tab[val][0]
- }
- );
-}
-
-impl ChannelData {
- fn new() -> Self {
- ChannelData {
- blksw: false,
- dithflag: false,
-
- chincpl: false,
- cplcoe: false,
- cplcoexp: [0; MAX_CPLBANDS],
- cplcomant: [0; MAX_CPLBANDS],
- mstrcplco: 0,
-
- chbwcod: 0,
-
- expstr: 0,
- gainrng: 0,
- startmant: 0,
- endmant: 0,
- groups: 0,
-
- fsnroffst: 0,
- fgaincod: 0,
- snroffset: 0,
-
- deltbae: 0,
- deltnseg: 0,
- deltoffst: [0; 8],
- deltlen: [0; 8],
- deltba: [0; 8],
-
- bap: [0; 256],
- exps: [0; 256],
- mant: [0; 256],
-
- psd: [0; 256],
- bndpsd: [0; 64],
- }
- }
- fn read_strategy(&mut self, br: &mut BitReader, blk_no: usize) -> DecoderResult<()> {
- self.expstr = br.read(2)? as u8;
- validate!(blk_no != 0 || self.expstr != STRATEGY_REUSE);
- if self.expstr != STRATEGY_REUSE {
- if self.startmant > 0 {
- self.groups = (self.endmant - self.startmant) / GROUPS[self.expstr as usize];
- } else if self.endmant != 0{
- let idx = self.expstr as usize;
- self.groups = (self.endmant + GROUP_BIAS[idx] - 1) / GROUPS[idx];
- } else {
- self.groups = 0;
- }
- }
- Ok(())
- }
- fn read_exps(&mut self, br: &mut BitReader, is_cpl: bool, is_lfe: bool) -> DecoderResult<()> {
- if self.expstr == STRATEGY_REUSE { return Ok(()); }
- let grpsize = GROUPS[self.expstr as usize];
- self.exps = [0; 256];
- if is_cpl {
- let first = (br.read(4)? as u8) << 1;
- let out = &mut self.exps[self.startmant..self.endmant];
- decode_exps(br, out, first, grpsize)?;
- } else if !is_lfe {
- self.exps[0] = br.read(4)? as u8;
- let first = self.exps[0];
- let out = &mut self.exps[1..self.endmant];
- decode_exps(br, out, first, grpsize)?;
- self.gainrng = br.read(2)? as u8;
- } else {
- self.exps[0] = br.read(4)? as u8;
- let first = self.exps[0];
- let out = &mut self.exps[1..7];
- decode_exps(br, out, first, grpsize)?;
- }
- Ok(())
- }
- fn read_snr(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- self.fsnroffst = br.read(4)? as u8;
- self.fgaincod = br.read(3)? as usize;
- Ok(())
- }
- fn read_deltbai(&mut self, br: &mut BitReader) -> DecoderResult<()> {
- if self.deltbae == 1 {
- self.deltnseg = (br.read(3)? as usize) + 1;
- for seg in 0..self.deltnseg {
- self.deltoffst[seg] = br.read(5)? as u8;
- self.deltlen[seg] = br.read(4)? as usize;
- self.deltba[seg] = br.read(3)? as u8;
- }
- }
- Ok(())
- }
-
- fn compute_bndpsd(&mut self) {
- let start = self.startmant;
- let end = self.endmant;
- let exps = &mut self.exps;
- let psd = &mut self.psd;
- let bndpsd = &mut self.bndpsd;
-
- for bin in start..end {
- psd[bin] = 3072 - ((exps[bin] as i16) << 7);
- }
-
- let mut bin = start;
- let mut band = TS102366_BIN_TO_BAND[bin] as usize;
- let mut lastbin;
- loop {
- lastbin = ((TS102366_BAND_START[band] as usize) + (TS102366_BAND_SIZE[band] as usize)).min(end);
- bndpsd[band] = psd[bin] as i32;
- bin += 1;
- while bin < lastbin {
- bndpsd[band] = logadd(bndpsd[band], psd[bin] as i32);
- bin += 1;
- }
- band += 1;
- if lastbin >= end { break; }
- }
- }
- fn compute_mask(&mut self, mask: &mut [i32; MAX_BANDS], fscod: usize, sgain: u16, fdecay: u8, sdecay: u8,
- dbknee: u16, cplfleak: u16, cplsleak: u16, shift: u8) {
- let fgain = TS102366_FAST_GAIN[self.fgaincod] as i32;
-
- let bndstart = TS102366_BIN_TO_BAND[self.startmant] as usize;
- let bndend = (TS102366_BIN_TO_BAND[self.endmant - 1] as usize) + 1;
-
- let mut excite: [i32; MAX_BANDS] = [0; MAX_BANDS];
-
- let begin;
- let mut fast_leak;
- let mut slow_leak;
- if bndstart == 0 {
- let lowcomp0 = calc_lowcomp(0, self.bndpsd[0], self.bndpsd[1], 0);
- excite[0] = self.bndpsd[0] - fgain - lowcomp0;
- let lowcomp1 = calc_lowcomp(lowcomp0, self.bndpsd[1], self.bndpsd[2], 1);
- excite[1] = self.bndpsd[1] - fgain - lowcomp1;
- let mut sband = 7;
- let mut lowcomp = lowcomp1;
- fast_leak = 0;
- slow_leak = 0;
- for band in 2..7 {
- let not_lfe_case = (bndend != 7) || (band != 6);
- if not_lfe_case {
- lowcomp = calc_lowcomp(lowcomp, self.bndpsd[band], self.bndpsd[band + 1], band);
- }
- fast_leak = self.bndpsd[band] - fgain;
- slow_leak = self.bndpsd[band] - (sgain as i32);
- excite[band] = fast_leak - lowcomp;
- if not_lfe_case {
- if self.bndpsd[band] <= self.bndpsd[band + 1] {
- sband = band + 1;
- break;
- }
- }
- }
- for band in sband..bndend.min(22) {
- if (bndend != 7) || (band != 6) {
- lowcomp = calc_lowcomp(lowcomp, self.bndpsd[band], self.bndpsd[band + 1], band);
- }
- fast_leak = (fast_leak - (fdecay as i32)).max(self.bndpsd[band] - (fgain as i32));
- slow_leak = (slow_leak - (sdecay as i32)).max(self.bndpsd[band] - (sgain as i32));
- excite[band] = slow_leak.max(fast_leak - lowcomp);
- }
- begin = 22;
- } else {
- begin = bndstart;
- fast_leak = cplfleak as i32;
- slow_leak = cplsleak as i32;
- }
- for band in begin..bndend {
- fast_leak = (fast_leak - (fdecay as i32)).max(self.bndpsd[band] - (fgain as i32));
- slow_leak = (slow_leak - (sdecay as i32)).max(self.bndpsd[band] - (sgain as i32));
- excite[band] = fast_leak.max(slow_leak);
- }
- for band in bndstart..bndend {
- if self.bndpsd[band] < (dbknee as i32) {
- excite[band] += ((dbknee as i32) - self.bndpsd[band]) >> 2;
- }
- mask[band] = excite[band].max(TS102366_HTH[fscod][band >> shift] as i32);
- }
- }
- fn apply_delta_info(&mut self, mask: &mut [i32; MAX_BANDS]) {
- if self.deltbae == 0 || self.deltbae == 1 {
- let mut band = TS102366_BIN_TO_BAND[self.startmant] as usize;
- for seg in 0..self.deltnseg {
- band += self.deltoffst[seg] as usize;
- let delta = if self.deltba[seg] >= 4 {
- ((self.deltba[seg] as i32) - 3) << 7
- } else {
- ((self.deltba[seg] as i32) - 4) << 7
- };
- if band + self.deltlen[seg] > MAX_BANDS { break; }
- for _ in 0..self.deltlen[seg] {
- mask[band] += delta;
- band += 1;
- }
- }
- }
- }
- fn calc_snr_offset(&mut self, csnroffst: u8) {
- self.snroffset = ((((csnroffst as i32) - 15) << 4) + (self.fsnroffst as i32)) << 2;
- }
- fn compute_bap(&mut self, mask: &mut [i32; MAX_BANDS], floor: u16) {
- let end = self.endmant;
- let mut band = TS102366_BIN_TO_BAND[self.startmant] as usize;
- let mut bin = self.startmant;
- let mut lastbin;
- loop {
- lastbin = ((TS102366_BAND_START[band] as usize) + (TS102366_BAND_SIZE[band] as usize)).min(end);
- mask[band] = (mask[band] - self.snroffset - (floor as i32)).max(0) & 0x1FE0;
- mask[band] += floor as i32;
- while bin < lastbin {
- let addr = (((self.psd[bin] as i32) - mask[band]) >> 5).min(63).max(0) as usize;
- self.bap[bin] = TS102366_BAPTAB[addr];
- bin += 1;
- }
- if lastbin == end { break; }
- band += 1;
- }
- }
- fn read_mant(&mut self, br: &mut BitReader, bap_buf: &mut [[i32; 2]; 3], bap_buf_fill: &mut [usize; 3]) -> DecoderResult<()> {
- self.mant = [0; BLOCK_LEN];
- for bin in self.startmant..self.endmant {
- self.mant[bin] = match self.bap[bin] {
- 0 => {
- if self.dithflag {
- 42 // todo dither
- } else {
- 0
- }
- },
- 1 => { read_bap!(br, TS102366_QUANT3_MAP, 5, 0, bap_buf, bap_buf_fill) },
- 2 => { read_bap!(br, TS102366_QUANT5_MAP, 7, 1, bap_buf, bap_buf_fill) },
- 3 => { read_bap!(br, TS102366_QUANT7_MAP, 3) },
- 4 => { read_bap!(br, TS102366_QUANT11_MAP, 7, 2, bap_buf, bap_buf_fill) },
- 5 => { read_bap!(br, TS102366_QUANT15_MAP, 4) },
- _ => {
- validate!(self.bap[bin] < 15);
- let nbits = TS102366_BAP_BITS[(self.bap[bin] as usize) - 6];
- let val = br.read(nbits)? as i16;
- ((val << (16 - nbits)) as i32) << 9
- },
- };
- self.mant[bin] >>= self.exps[bin];
- }
- Ok(())
- }
-
- fn synth(&mut self, imdct512: &mut IMDCTContext, imdct256: &mut IMDCTContext, tmp: &mut IMDCTWorkspace, delay: &mut [f32; BLOCK_LEN], dst: &mut [f32]) {
- if !self.blksw {
- imdct512.do_imdct(&self.mant, tmp);
- } else {
- imdct256.do_imdct_ileave(&self.mant, tmp);
- }
- overlap(delay, &tmp.out, dst);
- }
-}
-
-fn logadd(acc: i32, add: i32) -> i32 {
- let c = acc - add;
- let addr = (c.abs() >> 1).min(255);
- if c >= 0 {
- acc + (TS102366_LATAB[addr as usize] as i32)
- } else {
- add + (TS102366_LATAB[addr as usize] as i32)
- }
-}
-
-fn calc_lowcomp(a: i32, b0: i32, b1: i32, band: usize) -> i32 {
- if band < 7 {
- if (b0 + 256) == b1 {
- 384
- } else if b0 > b1 {
- 0.max(a - 64)
- } else {
- a
- }
- } else if band < 20 {
- if (b0 + 256) == b1 {
- 320
- } else if b0 > b1 {
- 0.max(a - 64)
- } else {
- a
- }
- } else {
- 0.max(a - 128)
- }
-}
-
-fn overlap(delay: &mut [f32; BLOCK_LEN], src: &[f32; BLOCK_LEN * 2], out: &mut [f32]) {
- {
- let dly = &delay;
- for ((d, s), o) in dly.into_iter().zip(src.into_iter()).zip(out.iter_mut()) {
- *o = (*d + *s) * 2.0;
- }
- }
- delay.copy_from_slice(&src[BLOCK_LEN..]);
-}
-
-#[derive(Clone)]
-struct AudioBlock {
- dynrng: Option<u8>,
- dynrng2: Option<u8>,
-
- cplstre: bool,
- cplinu: bool,
- phsflginu: bool,
- cplbegf: usize,
- cplendf: usize,
- ncplsubnd: usize,
- ncplbnd: usize,
- cplbndstrc: [bool; MAX_CPLBANDS],
-
- phsflg: [bool; MAX_CPLBANDS],
- rematstr: bool,
- rematflg: [bool; 4],
-
- chdata: [ChannelData; MAX_CHANNELS + 2],
-
- baie: bool,
- fdcycod: usize,
- sdcycod: usize,
- sgaincod: usize,
- dbpbcod: usize,
- floorcod: usize,
- snroffste: bool,
- csnroffst: u8,
- cplleake: bool,
- cplfleak: u8,
- cplsleak: u8,
-
- deltbaie: bool,
-
- bap_buf: [[i32; 2]; 3],
- bap_buf_fill: [usize; 3],
-}
-
-impl AudioBlock {
- fn new() -> Self {
- AudioBlock {
- chdata: [ChannelData::new(); MAX_CHANNELS + 2],
-
- dynrng: None,
- dynrng2: None,
-
- cplstre: false,
- cplinu: false,
- phsflginu: false,
- cplbegf: 0,
- cplendf: 0,
- ncplsubnd: 0,
- ncplbnd: 0,
- cplbndstrc: [false; MAX_CPLBANDS],
-
- phsflg: [false; MAX_CPLBANDS],
- rematstr: false,
- rematflg: [false; 4],
-
- baie: false,
- sdcycod: 0,
- fdcycod: 0,
- sgaincod: 0,
- dbpbcod: 0,
- floorcod: 0,
- snroffste: false,
- csnroffst: 0,
- cplleake: false,
- cplfleak: 0,
- cplsleak: 0,
-
- deltbaie: false,
-
- bap_buf: [[0; 2]; 3],
- bap_buf_fill: [0; 3],
- }
- }
- fn read(&mut self, br: &mut BitReader, bsi: &BSI, fscod: usize, blk_no: usize) -> DecoderResult<bool> {
- let channels = bsi.acmod.get_num_channels();
- let is_stereo = bsi.acmod == ACMode::Stereo;
-
- for ch in 0..channels {
- self.chdata[ch].blksw = br.read_bool()?;
- }
- // dynamic range information
- for ch in 0..channels {
- self.chdata[ch].dithflag = br.read_bool()?;
- }
- self.dynrng = br.read_optional8()?;
- if bsi.acmod == ACMode::DualMono {
- self.dynrng2 = br.read_optional8()?;
- }
- // coupling strategy information
- self.cplstre = br.read_bool()?;
- validate!((blk_no != 0) || self.cplstre);
- if self.cplstre {
- self.cplinu = br.read_bool()?;
- if self.cplinu {
- for ch in 0..channels {
- self.chdata[ch].chincpl = br.read_bool()?;
- }
- if is_stereo {
- self.phsflginu = br.read_bool()?;
- }
- self.cplbegf = br.read(4)? as usize;
- self.cplendf = (br.read(4)? as usize) + 3;
- validate!(self.cplendf >= self.cplbegf);
- self.ncplsubnd = self.cplendf - self.cplbegf;
- self.ncplbnd = self.ncplsubnd;
- self.chdata[CPL_CHANNEL].startmant = self.cplbegf * 12 + 37;
- self.chdata[CPL_CHANNEL].endmant = self.cplendf * 12 + 37;
- for bnd in 1..self.ncplsubnd {
- self.cplbndstrc[bnd] = br.read_bool()?;
- if self.cplbndstrc[bnd] {
- self.ncplbnd -= 1;
- }
- }
- }
- }
- // coupling coordinates
- if self.cplinu {
- for c in 0..channels {
- let ch = &mut self.chdata[c];
- if ch.chincpl {
- ch.cplcoe = br.read_bool()?;
- if ch.cplcoe {
- ch.mstrcplco = br.read(2)? as u8;
- for bnd in 0..self.ncplbnd {
- ch.cplcoexp [bnd] = br.read(4)? as u8;
- ch.cplcomant[bnd] = br.read(4)? as u8;
- }
- }
- }
- }
- if is_stereo && self.phsflginu && (self.chdata[0].cplcoe || self.chdata[1].cplcoe) {
- for bnd in 0..self.ncplbnd {
- self.phsflg[bnd] = br.read_bool()?;
- }
- }
- } else {
- for ch in 0..channels {
- self.chdata[ch].chincpl = false;
- }
- }
- // stereo rematrixing
- if is_stereo {
- self.rematstr = br.read_bool()?;
- if self.rematstr {
- if self.cplbegf > 2 || !self.cplinu {
- for rbnd in 0..4 {
- self.rematflg[rbnd] = br.read_bool()?;
- }
- }
- if self.cplbegf > 0 && self.cplbegf <= 2 && self.cplinu {
- for rbnd in 0..3 {
- self.rematflg[rbnd] = br.read_bool()?;
- }
- }
- if self.cplbegf == 0 && self.cplinu {
- for rbnd in 0..2 {
- self.rematflg[rbnd] = br.read_bool()?;
- }
- }
- }
- }
- // exponent strategy
- if self.cplinu {
- self.chdata[CPL_CHANNEL].read_strategy(br, blk_no)?;
- }
- for ch in 0..channels {
- self.chdata[ch].read_strategy(br, blk_no)?;
- }
- if bsi.lfeon {
- self.chdata[LFE_CHANNEL].expstr = br.read(1)? as u8;
- validate!(blk_no != 0 || self.chdata[LFE_CHANNEL].expstr != STRATEGY_REUSE);
- self.chdata[LFE_CHANNEL].groups = 2;
- self.chdata[LFE_CHANNEL].startmant = 0;
- self.chdata[LFE_CHANNEL].endmant = 7;
- }
- let cpl_startmant = self.chdata[CPL_CHANNEL].startmant;
- for c in 0..channels {
- let ch = &mut self.chdata[c];
- if ch.expstr != STRATEGY_REUSE && !ch.chincpl {
- ch.chbwcod = br.read(6)? as u8;
- }
- if !ch.chincpl {
- ch.startmant = 0;
- ch.endmant = ((ch.chbwcod as usize) + 12) * 3 + 37;
- } else {
- ch.startmant = 0;
- ch.endmant = cpl_startmant;
- }
- }
- // set number of mantissas
- if self.cplinu {
- self.chdata[CPL_CHANNEL].read_exps(br, true, false)?;
- }
- for ch in 0..channels {
- self.chdata[ch].read_exps(br, false, false)?;
- }
- if bsi.lfeon {
- self.chdata[LFE_CHANNEL].read_exps(br, false, true)?;
- }
- // bit allocation parameters
- self.baie = br.read_bool()?;
- if self.baie {
- self.sdcycod = br.read(2)? as usize;
- self.fdcycod = br.read(2)? as usize;
- self.sgaincod = br.read(2)? as usize;
- self.dbpbcod = br.read(2)? as usize;
- self.floorcod = br.read(3)? as usize;
- }
- self.snroffste = br.read_bool()?;
- if self.snroffste {
- self.csnroffst = br.read(6)? as u8;
- if self.cplinu {
- self.chdata[CPL_CHANNEL].read_snr(br)?;
- }
- for ch in 0..channels {
- self.chdata[ch].read_snr(br)?;
- }
- if bsi.lfeon {
- self.chdata[LFE_CHANNEL].read_snr(br)?;
- }
- }
- if self.cplinu {
- self.cplleake = br.read_bool()?;
- if self.cplleake {
- self.cplfleak = br.read(3)? as u8;
- self.cplsleak = br.read(3)? as u8;
- }
- }
- // delta bit allocation information
- self.deltbaie = br.read_bool()?;
- if self.deltbaie {
- if self.cplinu {
- self.chdata[CPL_CHANNEL].deltbae = br.read(2)? as u8;
- validate!(blk_no != 0 || self.chdata[CPL_CHANNEL].deltbae != 0);
- validate!(self.chdata[CPL_CHANNEL].deltbae != 3);
- }
- for ch in 0..channels {
- self.chdata[ch].deltbae = br.read(2)? as u8;
- validate!(blk_no != 0 || self.chdata[ch].deltbae != 0);
- validate!(self.chdata[ch].deltbae != 3);
- }
- if self.cplinu {
- self.chdata[CPL_CHANNEL].read_deltbai(br)?;
- }
- for ch in 0..channels {
- self.chdata[ch].read_deltbai(br)?;
- }
- }
- // dummy data
- if br.read_bool()? {
- let skipl = br.read(9)?;
- br.skip(skipl * 8)?;
- }
-
- let all_zero = self.calc_bitalloc(bsi, channels, fscod);
- if all_zero { return Ok(true); }
-
- // quantised mantissa values
- let mut got_cplchan = false;
- for i in 0..self.bap_buf_fill.len() { self.bap_buf_fill[i] = 0; }
- for c in 0..channels {
- {
- let ch = &mut self.chdata[c];
- ch.read_mant(br, &mut self.bap_buf, &mut self.bap_buf_fill)?;
- }
- if self.cplinu && self.chdata[c].chincpl && !got_cplchan {
- let cplch = &mut self.chdata[CPL_CHANNEL];
- cplch.read_mant(br, &mut self.bap_buf, &mut self.bap_buf_fill)?;
- got_cplchan = true;
- }
- }
- if bsi.lfeon {
- let lfech = &mut self.chdata[LFE_CHANNEL];
- lfech.read_mant(br, &mut self.bap_buf, &mut self.bap_buf_fill)?;
- }
- Ok(false)
- }
- fn calc_bitalloc(&mut self, bsi: &BSI, channels: usize, fscod: usize) -> bool {
- let sdecay1 = TS102366_SLOW_DECAY[self.sdcycod];
- let fdecay1 = TS102366_FAST_DECAY[self.fdcycod];
-
- let sdecay = sdecay1 >> bsi.shift;
- let fdecay = fdecay1 >> bsi.shift;
- let sgain = TS102366_SLOW_GAIN[self.sgaincod];
- let dbknee = TS102366_DBP_TAB[self.dbpbcod];
- let floor = TS102366_FLOOR_TAB[self.floorcod];
-
- let mut all_zero = self.csnroffst == 0;
- if !all_zero && self.chdata[LFE_CHANNEL].fsnroffst == 0 {
- for ch in 0..channels {
- if self.chdata[ch].fsnroffst != 0 {
- all_zero = false;
- break;
- }
- }
- }
- if all_zero { return true; }
-
- let mut mask: [i32; MAX_BANDS] = [0; MAX_BANDS];
-
- if self.cplinu {
- self.chdata[CPL_CHANNEL].compute_bndpsd();
- self.chdata[CPL_CHANNEL].compute_mask(&mut mask, fscod, sgain, fdecay, sdecay, dbknee,
- ((self.cplfleak as u16) << 8) + 768, ((self.cplsleak as u16) << 8) + 768, bsi.shift);
- self.chdata[CPL_CHANNEL].apply_delta_info(&mut mask);
- self.chdata[CPL_CHANNEL].calc_snr_offset(self.csnroffst);
- self.chdata[CPL_CHANNEL].compute_bap(&mut mask, floor);
- }
- for ch in 0..channels {
- self.chdata[ch].compute_bndpsd();
- self.chdata[ch].compute_mask(&mut mask, fscod, sgain, fdecay, sdecay, dbknee, 0, 0, bsi.shift);
- self.chdata[ch].apply_delta_info(&mut mask);
- self.chdata[ch].calc_snr_offset(self.csnroffst);
- self.chdata[ch].compute_bap(&mut mask, floor);
- }
- if bsi.lfeon {
- self.chdata[LFE_CHANNEL].compute_bndpsd();
- self.chdata[LFE_CHANNEL].compute_mask(&mut mask, fscod, sgain, fdecay, sdecay, dbknee,
- 0, 0, bsi.shift);
- self.chdata[LFE_CHANNEL].calc_snr_offset(self.csnroffst);
- self.chdata[LFE_CHANNEL].compute_bap(&mut mask, floor);
- }
-
- false
- }
- fn couple_channels(&mut self, acmod: ACMode) {
- if !self.cplinu { return; }
- for ch in 0..acmod.get_num_channels() {
- if !self.chdata[ch].chincpl { continue; }
- let mut pband = 0;
- for band in self.cplbegf..self.cplendf {
- let cband = band - self.cplbegf;
- let comant = self.chdata[ch].cplcomant[cband];
- let mut cotemp = (if self.chdata[ch].cplcoexp[cband] == 15 { comant << 1 } else { comant + 16 }) as i32;
- if (acmod == ACMode::Stereo) && (ch == 1) && self.phsflginu && self.phsflg[pband] {
- cotemp = -cotemp;
- }
- if !self.cplbndstrc[cband] {
- pband += 1;
- }
- let exp = self.chdata[ch].cplcoexp[cband] + 3 * self.chdata[ch].mstrcplco + 5 - 3;
- let start = band * 12 + 37;
- for bin in 0..12 {
- self.chdata[ch].mant[start + bin] = self.chdata[CPL_CHANNEL].mant[start + bin] * cotemp >> exp;
- }
-//todo dither
- }
- }
- }
- fn rematrix(&mut self) {
- let maxbin = self.chdata[0].endmant.min(self.chdata[1].endmant);
- if self.rematflg[0] {
- let end = maxbin.min(25);
- for bin in 13..end {
- let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin];
- let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin];
- self.chdata[0].mant[bin] = d;
- self.chdata[1].mant[bin] = s;
- }
- if maxbin <= 25 { return; }
- }
- if self.rematflg[1] {
- let end = maxbin.min(37);
- for bin in 25..end {
- let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin];
- let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin];
- self.chdata[0].mant[bin] = d;
- self.chdata[1].mant[bin] = s;
- }
- if maxbin <= 37 { return; }
- }
- if self.rematflg[2] {
- let end = maxbin.min(61);
- for bin in 37..end {
- let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin];
- let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin];
- self.chdata[0].mant[bin] = d;
- self.chdata[1].mant[bin] = s;
- }
- if maxbin <= 61 { return; }
- }
- if self.rematflg[3] {
- let end = maxbin;
- for bin in 61..end {
- let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin];
- let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin];
- self.chdata[0].mant[bin] = d;
- self.chdata[1].mant[bin] = s;
- }
- }
- }
- fn synth_audio_block(&mut self, imdct512: &mut IMDCTContext, imdct256: &mut IMDCTContext, tmp: &mut IMDCTWorkspace, channel: usize, delay: &mut [f32; BLOCK_LEN], dst: &mut [f32]) {
- self.chdata[channel].synth(imdct512, imdct256, tmp, delay, dst);
- }
-}
-
-impl NADecoder for AudioDecoder {
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
- if let NACodecTypeInfo::Audio(_) = info.get_properties() {
- self.info = info.clone();
- Ok(())
- } else {
- Err(DecoderError::InvalidData)
- }
- }
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
- let info = pkt.get_stream().get_info();
- validate!(info.get_properties().is_audio());
- let pktbuf = pkt.get_buffer();
- validate!(pktbuf.len() > 5);
-
- let mut br;
- if (pktbuf[0] == MAGIC_BYTE0) && (pktbuf[1] == MAGIC_BYTE1) {
- br = BitReader::new(pktbuf.as_slice(), pktbuf.len(), BitReaderMode::BE);
- } else if (pktbuf[0] == MAGIC_BYTE1) && (pktbuf[1] == MAGIC_BYTE0) {
- br = BitReader::new(pktbuf.as_slice(), pktbuf.len(), BitReaderMode::LE16MSB);
- } else {
- return Err(DecoderError::InvalidData);
- }
-
- let sinfo = Syncinfo::read(&mut br)?;
- validate!(sinfo.is_valid());
-
- let bsi = BSI::read(&mut br)?;
- if bsi.has_addb {
- let len = br.read(6)? as u32;
- br.skip((len + 1) * 8)?;
- }
-
- let duration = BLOCK_LEN * NBLOCKS;
-
- let core_channels = bsi.acmod.get_num_channels();
- let channels = core_channels + if bsi.lfeon { 1 } else { 0 };
-
- let ainfo = NAAudioInfo::new(sinfo.samplerate >> bsi.shift, channels as u8,
- SND_F32P_FORMAT, BLOCK_LEN);
-
- let mut abuf = alloc_audio_buffer(ainfo, duration, bsi.acmod.get_channel_map(bsi.lfeon))?;
- let mut adata = abuf.get_abuf_f32().unwrap();
- let mut output = adata.get_data_mut();
-
- self.ablk = AudioBlock::new();
- for blk in 0..NBLOCKS {
- let all_zero = self.ablk.read(&mut br, &bsi, sinfo.fscod as usize, blk)?;
- let off = blk * BLOCK_LEN;
- self.ablk.couple_channels(bsi.acmod);
- if bsi.acmod == ACMode::Stereo {
- self.ablk.rematrix();
- }
- for ch in 0..core_channels {
- let dpos = abuf.get_offset(ch) + off;
- let dst = &mut output[dpos..][..BLOCK_LEN];
- if !all_zero {
- self.ablk.synth_audio_block(&mut self.imdct512, &mut self.imdct256, &mut self.tmp, ch, &mut self.delay[ch], dst);
- } else {
- self.delay[ch] = [0.0; BLOCK_LEN];
- for i in 0..BLOCK_LEN { dst[i] = 0.0; }
- }
- }
- if bsi.lfeon {
- let dpos = abuf.get_offset(core_channels) + off;
- let dst = &mut output[dpos..][..BLOCK_LEN];
- if !all_zero {
- self.ablk.synth_audio_block(&mut self.imdct512, &mut self.imdct256, &mut self.tmp, LFE_CHANNEL, &mut self.delay[LFE_CHANNEL], dst);
- } else {
- self.delay[LFE_CHANNEL] = [0.0; BLOCK_LEN];
- for i in 0..BLOCK_LEN { dst[i] = 0.0; }
- }
- }
- }
-//todo skip auxdata
-//todo do errorcheck
-
- let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
- frm.set_keyframe(true);
- Ok(Rc::new(RefCell::new(frm)))
- }
-}
-
-pub fn get_decoder() -> Box<NADecoder> {
- Box::new(AudioDecoder::new())
-}
-
-#[cfg(test)]
-mod test {
- use crate::test::dec_video::*;
- #[test]
- fn test_ts102366() {
- let file = "assets/RV/sp_sample1.rm";
- test_decode_audio("realmedia", file, Some(12000), "ac3");
- }
-}
-
-const TS102366_SLOW_DECAY: [u8; 4] = [ 0x0F, 0x11, 0x13, 0x15 ];
-const TS102366_FAST_DECAY: [u8; 4] = [ 0x3F, 0x53, 0x67, 0x7B ];
-const TS102366_SLOW_GAIN: [u16; 4] = [ 0x540, 0x4D8, 0x478, 0x410 ];
-const TS102366_FAST_GAIN: [u16; 8] = [ 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380, 0x400 ];
-const TS102366_DBP_TAB: [u16; 4] = [ 0x000, 0x700, 0x900, 0xB00 ];
-const TS102366_FLOOR_TAB: [u16; 8] = [ 0x02F0, 0x02B0, 0x0270, 0x0230, 0x01F0, 0x0170, 0x00F0, 0xF800 ];
-
-const TS102366_BIN_TO_BAND: [u8; 256] = [
- 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, 28,
- 28, 29, 29, 29, 30, 30, 30, 31, 31, 31,
- 32, 32, 32, 33, 33, 33, 34, 34, 34, 35,
- 35, 35, 35, 35, 35, 36, 36, 36, 36, 36,
- 36, 37, 37, 37, 37, 37, 37, 38, 38, 38,
- 38, 38, 38, 39, 39, 39, 39, 39, 39, 40,
- 40, 40, 40, 40, 40, 41, 41, 41, 41, 41,
- 41, 41, 41, 41, 41, 41, 41, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 43,
- 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 0, 0, 0
-];
-const TS102366_BAND_SIZE: [u8; MAX_BANDS] = [
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 3, 3,
- 3, 3, 3, 3, 3, 6, 6, 6, 6, 6,
- 6, 12, 12, 12, 12, 24, 24, 24, 24, 24
-];
-const TS102366_BAND_START: [u8; MAX_BANDS] = [
- 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, 31,
- 34, 37, 40, 43, 46, 49, 55, 61, 67, 73,
- 79, 85, 97, 109, 121, 133, 157, 181, 205, 229
-];
-
-const TS102366_LATAB: [u16; 256] = [
- 0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003b, 0x003a, 0x0039,
- 0x0038, 0x0037, 0x0036, 0x0035, 0x0034, 0x0034, 0x0033, 0x0032,
- 0x0031, 0x0030, 0x002f, 0x002f, 0x002e, 0x002d, 0x002c, 0x002c,
- 0x002b, 0x002a, 0x0029, 0x0029, 0x0028, 0x0027, 0x0026, 0x0026,
- 0x0025, 0x0024, 0x0024, 0x0023, 0x0023, 0x0022, 0x0021, 0x0021,
- 0x0020, 0x0020, 0x001f, 0x001e, 0x001e, 0x001d, 0x001d, 0x001c,
- 0x001c, 0x001b, 0x001b, 0x001a, 0x001a, 0x0019, 0x0019, 0x0018,
- 0x0018, 0x0017, 0x0017, 0x0016, 0x0016, 0x0015, 0x0015, 0x0015,
- 0x0014, 0x0014, 0x0013, 0x0013, 0x0013, 0x0012, 0x0012, 0x0012,
- 0x0011, 0x0011, 0x0011, 0x0010, 0x0010, 0x0010, 0x000f, 0x000f,
- 0x000f, 0x000e, 0x000e, 0x000e, 0x000d, 0x000d, 0x000d, 0x000d,
- 0x000c, 0x000c, 0x000c, 0x000c, 0x000b, 0x000b, 0x000b, 0x000b,
- 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0009, 0x0009, 0x0009,
- 0x0009, 0x0009, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
- 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0006, 0x0006,
- 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0005, 0x0005,
- 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0004, 0x0004,
- 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
- 0x0004, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
- 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0002,
- 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
- 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
- 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-];
-const TS102366_HTH: [[u16; MAX_BANDS]; 3] = [
- [
- 0x04D0, 0x04D0, 0x0440, 0x0400, 0x03E0, 0x03C0, 0x03B0, 0x03B0, 0x03A0, 0x03A0,
- 0x03A0, 0x03A0, 0x03A0, 0x0390, 0x0390, 0x0390, 0x0380, 0x0380, 0x0370, 0x0370,
- 0x0360, 0x0360, 0x0350, 0x0350, 0x0340, 0x0340, 0x0330, 0x0320, 0x0310, 0x0300,
- 0x02F0, 0x02F0, 0x02F0, 0x02F0, 0x0300, 0x0310, 0x0340, 0x0390, 0x03E0, 0x0420,
- 0x0460, 0x0490, 0x04A0, 0x0460, 0x0440, 0x0440, 0x0520, 0x0800, 0x0840, 0x0840,
- ], [
- 0x04F0, 0x04F0, 0x0460, 0x0410, 0x03E0, 0x03D0, 0x03C0, 0x03B0, 0x03B0, 0x03A0,
- 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x0390, 0x0390, 0x0390, 0x0380, 0x0380, 0x0380,
- 0x0370, 0x0370, 0x0360, 0x0360, 0x0350, 0x0350, 0x0340, 0x0340, 0x0320, 0x0310,
- 0x0300, 0x02F0, 0x02F0, 0x02F0, 0x02F0, 0x0300, 0x0320, 0x0350, 0x0390, 0x03E0,
- 0x0420, 0x0450, 0x04A0, 0x0490, 0x0460, 0x0440, 0x0480, 0x0630, 0x0840, 0x0840,
- ], [
- 0x0580, 0x0580, 0x04B0, 0x0450, 0x0420, 0x03F0, 0x03E0, 0x03D0, 0x03C0, 0x03B0,
- 0x03B0, 0x03B0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0,
- 0x0390, 0x0390, 0x0390, 0x0390, 0x0380, 0x0380, 0x0380, 0x0370, 0x0360, 0x0350,
- 0x0340, 0x0330, 0x0320, 0x0310, 0x0300, 0x02F0, 0x02F0, 0x02F0, 0x0300, 0x0310,
- 0x0330, 0x0350, 0x03C0, 0x0410, 0x0470, 0x04A0, 0x0460, 0x0440, 0x0450, 0x04E0,
- ]
-];
-const TS102366_BAPTAB: [u8; 64] = [
- 0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
- 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10,
- 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14,
- 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15
-];
-
-const TS102366_QUANT3_MAP: [[i32; 3]; 27] = [
- [ -0x0AAAAAA, -0x0AAAAAA, -0x0AAAAAA ],
- [ -0x0AAAAAA, -0x0AAAAAA, 0x00000000 ],
- [ -0x0AAAAAA, -0x0AAAAAA, 0x00AAAAAA ],
- [ -0x0AAAAAA, 0x00000000, -0x0AAAAAA ],
- [ -0x0AAAAAA, 0x00000000, 0x00000000 ],
- [ -0x0AAAAAA, 0x00000000, 0x00AAAAAA ],
- [ -0x0AAAAAA, 0x00AAAAAA, -0x0AAAAAA ],
- [ -0x0AAAAAA, 0x00AAAAAA, 0x00000000 ],
- [ -0x0AAAAAA, 0x00AAAAAA, 0x00AAAAAA ],
- [ 0x00000000, -0x0AAAAAA, -0x0AAAAAA ],
- [ 0x00000000, -0x0AAAAAA, 0x00000000 ],
- [ 0x00000000, -0x0AAAAAA, 0x00AAAAAA ],
- [ 0x00000000, 0x00000000, -0x0AAAAAA ],
- [ 0x00000000, 0x00000000, 0x00000000 ],
- [ 0x00000000, 0x00000000, 0x00AAAAAA ],
- [ 0x00000000, 0x00AAAAAA, -0x0AAAAAA ],
- [ 0x00000000, 0x00AAAAAA, 0x00000000 ],
- [ 0x00000000, 0x00AAAAAA, 0x00AAAAAA ],
- [ 0x00AAAAAA, -0x0AAAAAA, -0x0AAAAAA ],
- [ 0x00AAAAAA, -0x0AAAAAA, 0x00000000 ],
- [ 0x00AAAAAA, -0x0AAAAAA, 0x00AAAAAA ],
- [ 0x00AAAAAA, 0x00000000, -0x0AAAAAA ],
- [ 0x00AAAAAA, 0x00000000, 0x00000000 ],
- [ 0x00AAAAAA, 0x00000000, 0x00AAAAAA ],
- [ 0x00AAAAAA, 0x00AAAAAA, -0x0AAAAAA ],
- [ 0x00AAAAAA, 0x00AAAAAA, 0x00000000 ],
- [ 0x00AAAAAA, 0x00AAAAAA, 0x00AAAAAA ]
-];
-const TS102366_QUANT5_MAP: [[i32; 3]; 125] = [
- [ -0x0CCCCCC, -0x0CCCCCC, -0x0CCCCCC ], [ -0x0CCCCCC, -0x0CCCCCC, -0x0666666 ], [ -0x0CCCCCC, -0x0CCCCCC, 0x00000000 ],
- [ -0x0CCCCCC, -0x0CCCCCC, 0x00666666 ], [ -0x0CCCCCC, -0x0CCCCCC, 0x00CCCCCC ],
- [ -0x0CCCCCC, -0x0666666, -0x0CCCCCC ], [ -0x0CCCCCC, -0x0666666, -0x0666666 ], [ -0x0CCCCCC, -0x0666666, 0x00000000 ],
- [ -0x0CCCCCC, -0x0666666, 0x00666666 ], [ -0x0CCCCCC, -0x0666666, 0x00CCCCCC ],
- [ -0x0CCCCCC, 0x00000000, -0x0CCCCCC ], [ -0x0CCCCCC, 0x00000000, -0x0666666 ], [ -0x0CCCCCC, 0x00000000, 0x00000000 ],
- [ -0x0CCCCCC, 0x00000000, 0x00666666 ], [ -0x0CCCCCC, 0x00000000, 0x00CCCCCC ],
- [ -0x0CCCCCC, 0x00666666, -0x0CCCCCC ], [ -0x0CCCCCC, 0x00666666, -0x0666666 ], [ -0x0CCCCCC, 0x00666666, 0x00000000 ],
- [ -0x0CCCCCC, 0x00666666, 0x00666666 ], [ -0x0CCCCCC, 0x00666666, 0x00CCCCCC ],
- [ -0x0CCCCCC, 0x00CCCCCC, -0x0CCCCCC ], [ -0x0CCCCCC, 0x00CCCCCC, -0x0666666 ], [ -0x0CCCCCC, 0x00CCCCCC, 0x00000000 ],
- [ -0x0CCCCCC, 0x00CCCCCC, 0x00666666 ], [ -0x0CCCCCC, 0x00CCCCCC, 0x00CCCCCC ],
- [ -0x0666666, -0x0CCCCCC, -0x0CCCCCC ], [ -0x0666666, -0x0CCCCCC, -0x0666666 ], [ -0x0666666, -0x0CCCCCC, 0x00000000 ],
- [ -0x0666666, -0x0CCCCCC, 0x00666666 ], [ -0x0666666, -0x0CCCCCC, 0x00CCCCCC ],
- [ -0x0666666, -0x0666666, -0x0CCCCCC ], [ -0x0666666, -0x0666666, -0x0666666 ], [ -0x0666666, -0x0666666, 0x00000000 ],
- [ -0x0666666, -0x0666666, 0x00666666 ], [ -0x0666666, -0x0666666, 0x00CCCCCC ],
- [ -0x0666666, 0x00000000, -0x0CCCCCC ], [ -0x0666666, 0x00000000, -0x0666666 ], [ -0x0666666, 0x00000000, 0x00000000 ],
- [ -0x0666666, 0x00000000, 0x00666666 ], [ -0x0666666, 0x00000000, 0x00CCCCCC ],
- [ -0x0666666, 0x00666666, -0x0CCCCCC ], [ -0x0666666, 0x00666666, -0x0666666 ], [ -0x0666666, 0x00666666, 0x00000000 ],
- [ -0x0666666, 0x00666666, 0x00666666 ], [ -0x0666666, 0x00666666, 0x00CCCCCC ],
- [ -0x0666666, 0x00CCCCCC, -0x0CCCCCC ], [ -0x0666666, 0x00CCCCCC, -0x0666666 ], [ -0x0666666, 0x00CCCCCC, 0x00000000 ],
- [ -0x0666666, 0x00CCCCCC, 0x00666666 ], [ -0x0666666, 0x00CCCCCC, 0x00CCCCCC ],
- [ 0x00000000, -0x0CCCCCC, -0x0CCCCCC ], [ 0x00000000, -0x0CCCCCC, -0x0666666 ], [ 0x00000000, -0x0CCCCCC, 0x00000000 ],
- [ 0x00000000, -0x0CCCCCC, 0x00666666 ], [ 0x00000000, -0x0CCCCCC, 0x00CCCCCC ],
- [ 0x00000000, -0x0666666, -0x0CCCCCC ], [ 0x00000000, -0x0666666, -0x0666666 ], [ 0x00000000, -0x0666666, 0x00000000 ],
- [ 0x00000000, -0x0666666, 0x00666666 ], [ 0x00000000, -0x0666666, 0x00CCCCCC ],
- [ 0x00000000, 0x00000000, -0x0CCCCCC ], [ 0x00000000, 0x00000000, -0x0666666 ], [ 0x00000000, 0x00000000, 0x00000000 ],
- [ 0x00000000, 0x00000000, 0x00666666 ], [ 0x00000000, 0x00000000, 0x00CCCCCC ],
- [ 0x00000000, 0x00666666, -0x0CCCCCC ], [ 0x00000000, 0x00666666, -0x0666666 ], [ 0x00000000, 0x00666666, 0x00000000 ],
- [ 0x00000000, 0x00666666, 0x00666666 ], [ 0x00000000, 0x00666666, 0x00CCCCCC ],
- [ 0x00000000, 0x00CCCCCC, -0x0CCCCCC ], [ 0x00000000, 0x00CCCCCC, -0x0666666 ], [ 0x00000000, 0x00CCCCCC, 0x00000000 ],
- [ 0x00000000, 0x00CCCCCC, 0x00666666 ], [ 0x00000000, 0x00CCCCCC, 0x00CCCCCC ],
- [ 0x00666666, -0x0CCCCCC, -0x0CCCCCC ], [ 0x00666666, -0x0CCCCCC, -0x0666666 ], [ 0x00666666, -0x0CCCCCC, 0x00000000 ],
- [ 0x00666666, -0x0CCCCCC, 0x00666666 ], [ 0x00666666, -0x0CCCCCC, 0x00CCCCCC ],
- [ 0x00666666, -0x0666666, -0x0CCCCCC ], [ 0x00666666, -0x0666666, -0x0666666 ], [ 0x00666666, -0x0666666, 0x00000000 ],
- [ 0x00666666, -0x0666666, 0x00666666 ], [ 0x00666666, -0x0666666, 0x00CCCCCC ],
- [ 0x00666666, 0x00000000, -0x0CCCCCC ], [ 0x00666666, 0x00000000, -0x0666666 ], [ 0x00666666, 0x00000000, 0x00000000 ],
- [ 0x00666666, 0x00000000, 0x00666666 ], [ 0x00666666, 0x00000000, 0x00CCCCCC ],
- [ 0x00666666, 0x00666666, -0x0CCCCCC ], [ 0x00666666, 0x00666666, -0x0666666 ], [ 0x00666666, 0x00666666, 0x00000000 ],
- [ 0x00666666, 0x00666666, 0x00666666 ], [ 0x00666666, 0x00666666, 0x00CCCCCC ],
- [ 0x00666666, 0x00CCCCCC, -0x0CCCCCC ], [ 0x00666666, 0x00CCCCCC, -0x0666666 ], [ 0x00666666, 0x00CCCCCC, 0x00000000 ],
- [ 0x00666666, 0x00CCCCCC, 0x00666666 ], [ 0x00666666, 0x00CCCCCC, 0x00CCCCCC ],
- [ 0x00CCCCCC, -0x0CCCCCC, -0x0CCCCCC ], [ 0x00CCCCCC, -0x0CCCCCC, -0x0666666 ], [ 0x00CCCCCC, -0x0CCCCCC, 0x00000000 ],
- [ 0x00CCCCCC, -0x0CCCCCC, 0x00666666 ], [ 0x00CCCCCC, -0x0CCCCCC, 0x00CCCCCC ],
- [ 0x00CCCCCC, -0x0666666, -0x0CCCCCC ], [ 0x00CCCCCC, -0x0666666, -0x0666666 ], [ 0x00CCCCCC, -0x0666666, 0x00000000 ],
- [ 0x00CCCCCC, -0x0666666, 0x00666666 ], [ 0x00CCCCCC, -0x0666666, 0x00CCCCCC ],
- [ 0x00CCCCCC, 0x00000000, -0x0CCCCCC ], [ 0x00CCCCCC, 0x00000000, -0x0666666 ], [ 0x00CCCCCC, 0x00000000, 0x00000000 ],
- [ 0x00CCCCCC, 0x00000000, 0x00666666 ], [ 0x00CCCCCC, 0x00000000, 0x00CCCCCC ],
- [ 0x00CCCCCC, 0x00666666, -0x0CCCCCC ], [ 0x00CCCCCC, 0x00666666, -0x0666666 ], [ 0x00CCCCCC, 0x00666666, 0x00000000 ],
- [ 0x00CCCCCC, 0x00666666, 0x00666666 ], [ 0x00CCCCCC, 0x00666666, 0x00CCCCCC ],
- [ 0x00CCCCCC, 0x00CCCCCC, -0x0CCCCCC ], [ 0x00CCCCCC, 0x00CCCCCC, -0x0666666 ], [ 0x00CCCCCC, 0x00CCCCCC, 0x00000000 ],
- [ 0x00CCCCCC, 0x00CCCCCC, 0x00666666 ], [ 0x00CCCCCC, 0x00CCCCCC, 0x00CCCCCC ],
-];
-const TS102366_QUANT7_MAP: [i32; 7] = [
- -0xDB6DB6, -0x924924, -0x492492, 0x000000, 0x492492, 0x924924, 0xDB6DB6
-];
-const TS102366_QUANT11_MAP: [[i32; 2]; 121] = [
- [ -0x0E8BA2E, -0x0E8BA2E ], [ -0x0E8BA2E, -0x0BA2E8B ], [ -0x0E8BA2E, -0x08BA2E8 ],
- [ -0x0E8BA2E, -0x05D1745 ], [ -0x0E8BA2E, -0x02E8BA2 ], [ -0x0E8BA2E, 0x00000000 ],
- [ -0x0E8BA2E, 0x002E8BA2 ], [ -0x0E8BA2E, 0x005D1745 ], [ -0x0E8BA2E, 0x008BA2E8 ],
- [ -0x0E8BA2E, 0x00BA2E8B ], [ -0x0E8BA2E, 0x00E8BA2E ], [ -0x0BA2E8B, -0x0E8BA2E ],
- [ -0x0BA2E8B, -0x0BA2E8B ], [ -0x0BA2E8B, -0x08BA2E8 ], [ -0x0BA2E8B, -0x05D1745 ],
- [ -0x0BA2E8B, -0x02E8BA2 ], [ -0x0BA2E8B, 0x00000000 ], [ -0x0BA2E8B, 0x002E8BA2 ],
- [ -0x0BA2E8B, 0x005D1745 ], [ -0x0BA2E8B, 0x008BA2E8 ], [ -0x0BA2E8B, 0x00BA2E8B ],
- [ -0x0BA2E8B, 0x00E8BA2E ], [ -0x08BA2E8, -0x0E8BA2E ], [ -0x08BA2E8, -0x0BA2E8B ],
- [ -0x08BA2E8, -0x08BA2E8 ], [ -0x08BA2E8, -0x05D1745 ], [ -0x08BA2E8, -0x02E8BA2 ],
- [ -0x08BA2E8, 0x00000000 ], [ -0x08BA2E8, 0x002E8BA2 ], [ -0x08BA2E8, 0x005D1745 ],
- [ -0x08BA2E8, 0x008BA2E8 ], [ -0x08BA2E8, 0x00BA2E8B ], [ -0x08BA2E8, 0x00E8BA2E ],
- [ -0x05D1745, -0x0E8BA2E ], [ -0x05D1745, -0x0BA2E8B ], [ -0x05D1745, -0x08BA2E8 ],
- [ -0x05D1745, -0x05D1745 ], [ -0x05D1745, -0x02E8BA2 ], [ -0x05D1745, 0x00000000 ],
- [ -0x05D1745, 0x002E8BA2 ], [ -0x05D1745, 0x005D1745 ], [ -0x05D1745, 0x008BA2E8 ],
- [ -0x05D1745, 0x00BA2E8B ], [ -0x05D1745, 0x00E8BA2E ], [ -0x02E8BA2, -0x0E8BA2E ],
- [ -0x02E8BA2, -0x0BA2E8B ], [ -0x02E8BA2, -0x08BA2E8 ], [ -0x02E8BA2, -0x05D1745 ],
- [ -0x02E8BA2, -0x02E8BA2 ], [ -0x02E8BA2, 0x00000000 ], [ -0x02E8BA2, 0x002E8BA2 ],
- [ -0x02E8BA2, 0x005D1745 ], [ -0x02E8BA2, 0x008BA2E8 ], [ -0x02E8BA2, 0x00BA2E8B ],
- [ -0x02E8BA2, 0x00E8BA2E ], [ 0x00000000, -0x0E8BA2E ], [ 0x00000000, -0x0BA2E8B ],
- [ 0x00000000, -0x08BA2E8 ], [ 0x00000000, -0x05D1745 ], [ 0x00000000, -0x02E8BA2 ],
- [ 0x00000000, 0x00000000 ], [ 0x00000000, 0x002E8BA2 ], [ 0x00000000, 0x005D1745 ],
- [ 0x00000000, 0x008BA2E8 ], [ 0x00000000, 0x00BA2E8B ], [ 0x00000000, 0x00E8BA2E ],
- [ 0x002E8BA2, -0x0E8BA2E ], [ 0x002E8BA2, -0x0BA2E8B ], [ 0x002E8BA2, -0x08BA2E8 ],
- [ 0x002E8BA2, -0x05D1745 ], [ 0x002E8BA2, -0x02E8BA2 ], [ 0x002E8BA2, 0x00000000 ],
- [ 0x002E8BA2, 0x002E8BA2 ], [ 0x002E8BA2, 0x005D1745 ], [ 0x002E8BA2, 0x008BA2E8 ],
- [ 0x002E8BA2, 0x00BA2E8B ], [ 0x002E8BA2, 0x00E8BA2E ], [ 0x005D1745, -0x0E8BA2E ],
- [ 0x005D1745, -0x0BA2E8B ], [ 0x005D1745, -0x08BA2E8 ], [ 0x005D1745, -0x05D1745 ],
- [ 0x005D1745, -0x02E8BA2 ], [ 0x005D1745, 0x00000000 ], [ 0x005D1745, 0x002E8BA2 ],
- [ 0x005D1745, 0x005D1745 ], [ 0x005D1745, 0x008BA2E8 ], [ 0x005D1745, 0x00BA2E8B ],
- [ 0x005D1745, 0x00E8BA2E ], [ 0x008BA2E8, -0x0E8BA2E ], [ 0x008BA2E8, -0x0BA2E8B ],
- [ 0x008BA2E8, -0x08BA2E8 ], [ 0x008BA2E8, -0x05D1745 ], [ 0x008BA2E8, -0x02E8BA2 ],
- [ 0x008BA2E8, 0x00000000 ], [ 0x008BA2E8, 0x002E8BA2 ], [ 0x008BA2E8, 0x005D1745 ],
- [ 0x008BA2E8, 0x008BA2E8 ], [ 0x008BA2E8, 0x00BA2E8B ], [ 0x008BA2E8, 0x00E8BA2E ],
- [ 0x00BA2E8B, -0x0E8BA2E ], [ 0x00BA2E8B, -0x0BA2E8B ], [ 0x00BA2E8B, -0x08BA2E8 ],
- [ 0x00BA2E8B, -0x05D1745 ], [ 0x00BA2E8B, -0x02E8BA2 ], [ 0x00BA2E8B, 0x00000000 ],
- [ 0x00BA2E8B, 0x002E8BA2 ], [ 0x00BA2E8B, 0x005D1745 ], [ 0x00BA2E8B, 0x008BA2E8 ],
- [ 0x00BA2E8B, 0x00BA2E8B ], [ 0x00BA2E8B, 0x00E8BA2E ], [ 0x00E8BA2E, -0x0E8BA2E ],
- [ 0x00E8BA2E, -0x0BA2E8B ], [ 0x00E8BA2E, -0x08BA2E8 ], [ 0x00E8BA2E, -0x05D1745 ],
- [ 0x00E8BA2E, -0x02E8BA2 ], [ 0x00E8BA2E, 0x00000000 ], [ 0x00E8BA2E, 0x002E8BA2 ],
- [ 0x00E8BA2E, 0x005D1745 ], [ 0x00E8BA2E, 0x008BA2E8 ], [ 0x00E8BA2E, 0x00BA2E8B ],
- [ 0x00E8BA2E, 0x00E8BA2E ],
-];
-const TS102366_QUANT15_MAP: [i32; 15] = [
- -0x0EEEEEE, -0x0CCCCCC, -0x0AAAAAA, -0x0888888, -0x0666666, -0x0444444, -0x0222222, 0x00000000,
- 0x00222222, 0x00444444, 0x00666666, 0x00888888, 0x00AAAAAA, 0x00CCCCCC, 0x00EEEEEE,
-];
-const TS102366_BAP_BITS: [u8; 10] = [ 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 ];
-
-const TS102366_WINDOW: [f32; 256] = [
- 0.00014, 0.00024, 0.00037, 0.00051, 0.00067, 0.00086, 0.00107, 0.00130,
- 0.00157, 0.00187, 0.00220, 0.00256, 0.00297, 0.00341, 0.00390, 0.00443,
- 0.00501, 0.00564, 0.00632, 0.00706, 0.00785, 0.00871, 0.00962, 0.01061,
- 0.01166, 0.01279, 0.01399, 0.01526, 0.01662, 0.01806, 0.01959, 0.02121,
- 0.02292, 0.02472, 0.02662, 0.02863, 0.03073, 0.03294, 0.03527, 0.03770,
- 0.04025, 0.04292, 0.04571, 0.04862, 0.05165, 0.05481, 0.05810, 0.06153,
- 0.06508, 0.06878, 0.07261, 0.07658, 0.08069, 0.08495, 0.08935, 0.09389,
- 0.09859, 0.10343, 0.10842, 0.11356, 0.11885, 0.12429, 0.12988, 0.13563,
- 0.14152, 0.14757, 0.15376, 0.16011, 0.16661, 0.17325, 0.18005, 0.18699,
- 0.19407, 0.20130, 0.20867, 0.21618, 0.22382, 0.23161, 0.23952, 0.24757,
- 0.25574, 0.26404, 0.27246, 0.28100, 0.28965, 0.29841, 0.30729, 0.31626,
- 0.32533, 0.33450, 0.34376, 0.35311, 0.36253, 0.37204, 0.38161, 0.39126,
- 0.40096, 0.41072, 0.42054, 0.43040, 0.44030, 0.45023, 0.46020, 0.47019,
- 0.48020, 0.49022, 0.50025, 0.51028, 0.52031, 0.53033, 0.54033, 0.55031,
- 0.56026, 0.57019, 0.58007, 0.58991, 0.59970, 0.60944, 0.61912, 0.62873,
- 0.63827, 0.64774, 0.65713, 0.66643, 0.67564, 0.68476, 0.69377, 0.70269,
- 0.71150, 0.72019, 0.72877, 0.73723, 0.74557, 0.75378, 0.76186, 0.76981,
- 0.77762, 0.78530, 0.79283, 0.80022, 0.80747, 0.81457, 0.82151, 0.82831,
- 0.83496, 0.84145, 0.84779, 0.85398, 0.86001, 0.86588, 0.87160, 0.87716,
- 0.88257, 0.88782, 0.89291, 0.89785, 0.90264, 0.90728, 0.91176, 0.91610,
- 0.92028, 0.92432, 0.92822, 0.93197, 0.93558, 0.93906, 0.94240, 0.94560,
- 0.94867, 0.95162, 0.95444, 0.95713, 0.95971, 0.96217, 0.96451, 0.96674,
- 0.96887, 0.97089, 0.97281, 0.97463, 0.97635, 0.97799, 0.97953, 0.98099,
- 0.98236, 0.98366, 0.98488, 0.98602, 0.98710, 0.98811, 0.98905, 0.98994,
- 0.99076, 0.99153, 0.99225, 0.99291, 0.99353, 0.99411, 0.99464, 0.99513,
- 0.99558, 0.99600, 0.99639, 0.99674, 0.99706, 0.99736, 0.99763, 0.99788,
- 0.99811, 0.99831, 0.99850, 0.99867, 0.99882, 0.99895, 0.99908, 0.99919,
- 0.99929, 0.99938, 0.99946, 0.99953, 0.99959, 0.99965, 0.99969, 0.99974,
- 0.99978, 0.99981, 0.99984, 0.99986, 0.99988, 0.99990, 0.99992, 0.99993,
- 0.99994, 0.99995, 0.99996, 0.99997, 0.99998, 0.99998, 0.99998, 0.99999,
- 0.99999, 0.99999, 0.99999, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000,
- 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000,
-];
diff --git a/src/demuxers/avi.rs b/src/demuxers/avi.rs
deleted file mode 100644
index a326561..0000000
--- a/src/demuxers/avi.rs
+++ /dev/null
@@ -1,421 +0,0 @@
-use super::*;
-use crate::register;
-use super::DemuxerError::*;
-//use io::byteio::*;
-//use frame::*;
-use crate::formats::*;
-
-macro_rules! mktag {
- ($a:expr, $b:expr, $c:expr, $d:expr) => ({
- (($a as u32) << 24) | (($b as u32) << 16) | (($c as u32) << 8) | ($d as u32)
- });
- ($arr:expr) => ({
- (($arr[0] as u32) << 24) | (($arr[1] as u32) << 16) | (($arr[2] as u32) << 8) | ($arr[3] as u32)
- });
-}
-
-struct StreamState {
- strm_no: u8,
- got_strf: bool,
- strm_type: Option<StreamType>,
-}
-
-impl StreamState {
- fn new() -> Self {
- StreamState { strm_no: 0, got_strf: true, strm_type: None }
- }
- fn reset(&mut self) {
- self.strm_type = None;
- self.got_strf = true;
- self.strm_no += 1;
- }
- fn valid_state(&self) -> bool {
- match self.strm_type {
- None => self.got_strf,
- _ => false,
- }
- }
-}
-
-#[allow(dead_code)]
-struct AVIDemuxer<'a> {
- src: &'a mut ByteReader<'a>,
- cur_frame: Vec<u64>,
- num_streams: u8,
- size: usize,
- movi_size: usize,
- sstate: StreamState,
- tb_num: u32,
- tb_den: u32,
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-enum RIFFTag {
- Chunk(u32),
- List(u32,u32),
-}
-
-struct RIFFParser {
- tag: RIFFTag,
- parse: fn(&mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize>,
-}
-
-impl<'a> DemuxCore<'a> for AVIDemuxer<'a> {
- #[allow(unused_variables)]
- fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- self.read_header(strmgr)?;
- Ok(())
- }
-
- fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
- if self.movi_size == 0 { return Err(EOF); }
- let mut tag: [u8; 4] = [0; 4];
- loop {
- if (self.src.tell() & 1) == 1 {
- self.src.read_skip(1)?;
- self.movi_size -= 1;
- if self.movi_size == 0 { return Err(EOF); }
- }
- self.src.read_buf(&mut tag)?;
- let size = self.src.read_u32le()? as usize;
- if mktag!(tag) == mktag!(b"JUNK") {
- self.movi_size -= size + 8;
- self.src.read_skip(size)?;
- if self.movi_size == 0 { return Err(EOF); }
- continue;
- }
- if mktag!(tag) == mktag!(b"LIST") {
- self.movi_size -= 12;
- self.src.read_skip(4)?;
- if self.movi_size == 0 { return Err(EOF); }
- continue;
- }
- if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' {
- return Err(InvalidData);
- }
- let stream_no = (tag[0] - b'0') * 10 + (tag[1] - b'0');
- let str = strmgr.get_stream(stream_no as usize);
- if let None = str { return Err(InvalidData); }
- let stream = str.unwrap();
- if size == 0 {
- self.movi_size -= 8;
- if self.movi_size == 0 { return Err(EOF); }
- continue;
- }
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(Some(self.cur_frame[stream_no as usize]), None, None, tb_num, tb_den);
- let pkt = self.src.read_packet(stream, ts, false, size)?;
- self.cur_frame[stream_no as usize] += 1;
- self.movi_size -= size + 8;
-
- return Ok(pkt);
- }
- }
-
- #[allow(unused_variables)]
- fn seek(&mut self, time: u64) -> DemuxerResult<()> {
- Err(NotImplemented)
- }
-}
-
-impl<'a> AVIDemuxer<'a> {
- fn new(io: &'a mut ByteReader<'a>) -> Self {
- AVIDemuxer {
- cur_frame: Vec::new(),
- num_streams: 0,
- src: io,
- size: 0,
- movi_size: 0,
- sstate: StreamState::new(),
- tb_num: 0,
- tb_den: 0,
- }
- }
-
- fn parse_chunk(&mut self, strmgr: &mut StreamManager, end_tag: RIFFTag, csize: usize, depth: u16) -> DemuxerResult<(usize, bool)> {
- if csize < 8 { return Err(InvalidData); }
- if depth > 42 { return Err(InvalidData); }
-
- let tag = self.src.read_u32be()?;
- let size = self.src.read_u32le()? as usize;
- if size > csize { return Err(InvalidData); }
- if RIFFTag::Chunk(tag) == end_tag {
- return Ok((size, true));
- }
- let is_list = is_list_tag(tag);
- let ltag = if is_list { self.src.read_u32be()? } else { 0 };
- if RIFFTag::List(tag, ltag) == end_tag {
- return Ok((size, true));
- }
-
- for i in 0..CHUNKS.len() {
- if RIFFTag::Chunk(tag) == CHUNKS[i].tag {
- let psize = (CHUNKS[i].parse)(self, strmgr, size)?;
- if psize != size { return Err(InvalidData); }
- if (psize & 1) == 1 { self.src.read_skip(1)?; }
- return Ok((size + 8, false));
- }
- if RIFFTag::List(tag, ltag) == CHUNKS[i].tag {
- let mut rest_size = size - 4;
- let psize = (CHUNKS[i].parse)(self, strmgr, rest_size)?;
- if psize > rest_size { return Err(InvalidData); }
- rest_size -= psize;
- while rest_size > 0 {
- let (psize, _) = self.parse_chunk(strmgr, end_tag, rest_size, depth+1)?;
- if psize > rest_size { return Err(InvalidData); }
- rest_size -= psize;
- if (psize & 1) == 1 {
- if rest_size > 0 {
- rest_size -= 1;
- }
- }
- }
-
- return Ok((size + 8, false));
- }
- }
- if !is_list {
- self.src.read_skip(size)?;
- } else {
- if size < 4 { return Err(InvalidData); }
- self.src.read_skip(size - 4)?;
- }
- if (size & 1) == 1 { self.src.read_skip(1)?; }
- return Ok((size + 8, false));
- }
-
- fn read_header(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- let riff_tag = self.src.read_u32be()?;
- let size = self.src.read_u32le()? as usize;
- let avi_tag = self.src.read_u32be()?;
- if riff_tag != mktag!(b"RIFF") || avi_tag != mktag!(b"AVI ") {
- return Err(InvalidData);
- }
- self.size = size;
- let mut rest_size = size;
- loop {
- let (csz, end) = self.parse_chunk(strmgr, RIFFTag::List(mktag!(b"LIST"), mktag!(b"movi")), rest_size,0)?;
- if end { self.movi_size = csz - 4; break; }
- rest_size -= csz;
- }
- if !self.sstate.valid_state() || self.sstate.strm_no != self.num_streams {
- return Err(InvalidData);
- }
- Ok(())
- }
-
- fn read_extradata(&mut self, size: usize) -> DemuxerResult<Option<Vec<u8>>> {
- if size == 0 { return Ok(None); }
- let mut edvec: Vec<u8> = Vec::with_capacity(size);
- edvec.resize(size, 0);
- self.src.read_buf(&mut edvec)?;
- Ok(Some(edvec))
- }
-}
-
-const CHUNKS: [RIFFParser; 6] = [
- RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"hdrl")), parse: parse_hdrl },
- RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"strl")), parse: parse_strl },
- RIFFParser { tag: RIFFTag::Chunk(mktag!(b"avih")), parse: parse_avih },
- RIFFParser { tag: RIFFTag::Chunk(mktag!(b"strf")), parse: parse_strf },
- RIFFParser { tag: RIFFTag::Chunk(mktag!(b"strh")), parse: parse_strh },
- RIFFParser { tag: RIFFTag::Chunk(mktag!(b"JUNK")), parse: parse_junk },
-];
-
-fn is_list_tag(tag: u32) -> bool {
- for i in 0..CHUNKS.len() {
- if let RIFFTag::List(ltag, _) = CHUNKS[i].tag {
- if tag == ltag {
- return true;
- }
- }
- }
- false
-}
-
-#[allow(unused_variables)]
-fn parse_hdrl(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- Ok(0)
-}
-
-#[allow(unused_variables)]
-fn parse_strl(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- Ok(0)
-}
-
-#[allow(unused_variables)]
-fn parse_strh(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if size < 0x38 { return Err(InvalidData); }
- let tag = dmx.src.read_u32be()?; //stream type
- let fcc = dmx.src.read_u32be()?; //handler(fourcc)
- dmx.src.read_u32le()?; //flags
- dmx.src.read_skip(2)?; //priority
- dmx.src.read_skip(2)?; //language
- dmx.src.read_skip(4)?; //initial frames
- dmx.tb_num = dmx.src.read_u32le()?; //scale
- dmx.tb_den = dmx.src.read_u32le()?; //rate
- dmx.src.read_skip(4)?; //start
- dmx.src.read_skip(4)?; //length
- dmx.src.read_skip(4)?; //buf size
- dmx.src.read_skip(4)?; //quality
- dmx.src.read_skip(4)?; //sample size
- let a = dmx.src.read_u16le()?;
- let b = dmx.src.read_u16le()?;
- let c = dmx.src.read_u16le()?;
- let d = dmx.src.read_u16le()?;
-
- dmx.src.read_skip(size - 0x38)?;
-
- if !dmx.sstate.valid_state() || dmx.sstate.strm_no >= dmx.num_streams {
- return Err(InvalidData);
- }
- if tag == mktag!(b"vids") {
- dmx.sstate.strm_type = Some(StreamType::Video);
- } else if tag == mktag!(b"auds") {
- dmx.sstate.strm_type = Some(StreamType::Audio);
- } else {
- dmx.sstate.strm_type = Some(StreamType::Data);
- }
- dmx.sstate.got_strf = false;
-
- Ok(size)
-}
-
-fn parse_strf(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if let None = dmx.sstate.strm_type { return Err(InvalidData); }
- match dmx.sstate.strm_type.unwrap() {
- StreamType::Video => parse_strf_vids(dmx, strmgr, size),
- StreamType::Audio => parse_strf_auds(dmx, strmgr, size),
- _ => parse_strf_xxxx(dmx, strmgr, size),
- }
-}
-
-#[allow(unused_variables)]
-fn parse_strf_vids(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if size < 40 { return Err(InvalidData); }
- let bi_size = dmx.src.read_u32le()?;
- if (bi_size as usize) > size { return Err(InvalidData); }
- let width = dmx.src.read_u32le()?;
- let height = dmx.src.read_u32le()? as i32;
- let planes = dmx.src.read_u16le()?;
- let bitcount = dmx.src.read_u16le()?;
- let mut compression: [u8; 4] = [0; 4];
- dmx.src.read_buf(&mut compression)?;
- let img_size = dmx.src.read_u32le()?;
- let xdpi = dmx.src.read_u32le()?;
- let ydpi = dmx.src.read_u32le()?;
- let colors = dmx.src.read_u32le()?;
- let imp_colors = dmx.src.read_u32le()?;
-
- let flip = height < 0;
- let format = if bitcount > 8 { RGB24_FORMAT } else { PAL8_FORMAT };
- let vhdr = NAVideoInfo::new(width as usize, if flip { -height as usize } else { height as usize}, flip, PAL8_FORMAT);
- let vci = NACodecTypeInfo::Video(vhdr);
- let edata = dmx.read_extradata(size - 40)?;
- let cname = match register::find_codec_from_avi_fourcc(&compression) {
- None => "unknown",
- Some(name) => name,
- };
- let vinfo = NACodecInfo::new(cname, vci, edata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Video, dmx.sstate.strm_no as u32, vinfo, dmx.tb_num, dmx.tb_den));
- if let None = res { return Err(MemoryError); }
- dmx.sstate.reset();
- Ok(size)
-}
-
-#[allow(unused_variables)]
-fn parse_strf_auds(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if size < 16 { return Err(InvalidData); }
- let w_format_tag = dmx.src.read_u16le()?;
- let channels = dmx.src.read_u16le()?;
- let samplespersec = dmx.src.read_u32le()?;
- let avgbytespersec = dmx.src.read_u32le()?;
- let block_align = dmx.src.read_u16le()?;
- let bits_per_sample = dmx.src.read_u16le()? * 8;
-
- let soniton = NASoniton::new(bits_per_sample as u8, SONITON_FLAG_SIGNED);
- let ahdr = NAAudioInfo::new(samplespersec, channels as u8, soniton, block_align as usize);
- let edata = dmx.read_extradata(size - 16)?;
- let cname = match register::find_codec_from_wav_twocc(w_format_tag) {
- None => "unknown",
- Some(name) => name,
- };
- let ainfo = NACodecInfo::new(cname, NACodecTypeInfo::Audio(ahdr), edata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Audio, dmx.sstate.strm_no as u32, ainfo, dmx.tb_num, dmx.tb_den));
- if let None = res { return Err(MemoryError); }
- dmx.sstate.reset();
- Ok(size)
-}
-
-fn parse_strf_xxxx(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- let edata = dmx.read_extradata(size)?;
- let info = NACodecInfo::new("unknown", NACodecTypeInfo::None, edata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Data, dmx.sstate.strm_no as u32, info, dmx.tb_num, dmx.tb_den));
- if let None = res { return Err(MemoryError); }
- dmx.sstate.reset();
- Ok(size)
-}
-
-#[allow(unused_variables)]
-fn parse_avih(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- if size < 0x38 { return Err(InvalidData); }
- let timebase = dmx.src.read_u32le()?; //microsec per frame
- dmx.src.read_skip(4)?; //max frame size
- dmx.src.read_skip(4)?; //padding
- dmx.src.read_u32le()?; //flags
- let frames = dmx.src.read_u32le()?; //frames
- dmx.src.read_skip(4)?; //initial frames
- let streams = dmx.src.read_u32le()?; //streams
- if streams > 100 { return Err(InvalidData); }
- dmx.num_streams = streams as u8;
-
- dmx.src.read_skip(4)?; //buf size
- let width = dmx.src.read_u32le()?; //width
- let height = dmx.src.read_u32le()? as i32; //height
- dmx.src.read_skip(16)?; //reserved
-
- dmx.cur_frame.resize(streams as usize, 0);
- dmx.src.read_skip(size - 0x38)?;
- Ok(size)
-}
-
-#[allow(unused_variables)]
-fn parse_junk(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
- dmx.src.read_skip(size)?;
- Ok(size)
-}
-
-pub struct AVIDemuxerCreator { }
-
-impl DemuxerCreator for AVIDemuxerCreator {
- fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> {
- Box::new(AVIDemuxer::new(br))
- }
- fn get_name(&self) -> &'static str { "avi" }
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
- use std::fs::File;
-
- #[test]
- fn test_avi_demux() {
- let mut file = File::open("assets/laser05.avi").unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let mut dmx = AVIDemuxer::new(&mut br);
- let mut sm = StreamManager::new();
- dmx.open(&mut sm).unwrap();
-
- loop {
- let pktres = dmx.get_frame(&mut sm);
- if let Err(e) = pktres {
- if e == DemuxerError::EOF { break; }
- panic!("error");
- }
- let pkt = pktres.unwrap();
- println!("Got {}", pkt);
- }
- }
-}
diff --git a/src/demuxers/gdv.rs b/src/demuxers/gdv.rs
deleted file mode 100644
index 63b7364..0000000
--- a/src/demuxers/gdv.rs
+++ /dev/null
@@ -1,196 +0,0 @@
-use super::*;
-//use io::byteio::*;
-//use frame::*;
-use crate::formats::*;
-//use std::collections::HashMap;
-
-enum GDVState {
- NewFrame,
- AudioRead,
-}
-
-#[allow(dead_code)]
-struct GremlinVideoDemuxer<'a> {
- src: &'a mut ByteReader<'a>,
- frames: u16,
- cur_frame: u16,
- asize: usize,
- apacked: bool,
- state: GDVState,
- pktdta: Vec<u8>,
- a_id: Option<usize>,
- v_id: Option<usize>,
-}
-
-struct GDVFixedSizes {
- id: u16,
- width: u16,
- height: u16,
-}
-const GDV_SIZE_TABLE: &[GDVFixedSizes] = &[
- GDVFixedSizes { id: 0, width: 320, height: 200 },
- GDVFixedSizes { id: 1, width: 640, height: 200 },
- GDVFixedSizes { id: 2, width: 320, height: 167 },
- GDVFixedSizes { id: 3, width: 320, height: 180 },
- GDVFixedSizes { id: 4, width: 320, height: 400 },
- GDVFixedSizes { id: 5, width: 320, height: 170 },
- GDVFixedSizes { id: 6, width: 160, height: 85 },
- GDVFixedSizes { id: 7, width: 160, height: 83 },
- GDVFixedSizes { id: 8, width: 160, height: 90 },
- GDVFixedSizes { id: 9, width: 280, height: 128 },
- GDVFixedSizes { id: 10, width: 320, height: 240 },
- GDVFixedSizes { id: 11, width: 320, height: 201 },
- GDVFixedSizes { id: 16, width: 640, height: 400 },
- GDVFixedSizes { id: 17, width: 640, height: 200 },
- GDVFixedSizes { id: 18, width: 640, height: 180 },
- GDVFixedSizes { id: 19, width: 640, height: 167 },
- GDVFixedSizes { id: 20, width: 640, height: 170 },
- GDVFixedSizes { id: 21, width: 320, height: 240 },
-];
-
-impl<'a> DemuxCore<'a> for GremlinVideoDemuxer<'a> {
- #[allow(unused_variables)]
- fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- let src = &mut self.src;
- let magic = src.read_u32le()?;
- if magic != 0x29111994 { return Err(DemuxerError::InvalidData); }
- let id = src.read_u16le()?;
- let frames = src.read_u16le()?;
- let fps = src.read_u16le()?;
- let aflags = src.read_u16le()?;
- let rate = src.read_u16le()?;
- let depth = src.read_u16le()?;
- let max_fs = src.read_u16le()?;
- src.read_skip(2)?;
- let mut width = src.read_u16le()?;
- let mut height = src.read_u16le()?;
- if (width == 0) && (height == 0) {
- for el in GDV_SIZE_TABLE {
- if el.id == id {
- width = el.width;
- height = el.height;
- break;
- }
- }
- if (width == 0) && (height == 0) { return Err(DemuxerError::InvalidData); }
- }
- if max_fs > 0 {
- let mut edata: Vec<u8> = Vec::with_capacity(768);
- if depth == 1 {
- edata.resize(768, 0);
- src.read_buf(edata.as_mut_slice())?;
- }
- let vhdr = NAVideoInfo::new(width as usize, height as usize, false, PAL8_FORMAT);
- let vci = NACodecTypeInfo::Video(vhdr);
- let vinfo = NACodecInfo::new("gdv-video", vci, if edata.len() == 0 { None } else { Some(edata) });
- self.v_id = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 1, fps as u32));
- }
- if (aflags & 1) != 0 {
- let channels = if (aflags & 2) != 0 { 2 } else { 1 };
- let packed = if (aflags & 8) != 0 { 1 } else { 0 };
- let depth = if (aflags & 4) != 0 { 16 } else { 8 };
-
- let ahdr = NAAudioInfo::new(rate as u32, channels as u8, if depth == 16 { SND_S16_FORMAT } else { SND_U8_FORMAT }, 2);
- let ainfo = NACodecInfo::new(if packed != 0 { "gdv-audio" } else { "pcm" },
- NACodecTypeInfo::Audio(ahdr), None);
- self.a_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, rate as u32));
-
- self.asize = (((rate / fps) * channels * (depth / 8)) >> packed) as usize;
- self.apacked = (aflags & 8) != 0;
- }
- self.frames = frames;
- self.state = GDVState::NewFrame;
- Ok(())
- }
-
- #[allow(unused_variables)]
- fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
- if self.cur_frame >= self.frames { return Err(DemuxerError::EOF); }
- match self.state {
- GDVState::NewFrame if self.asize > 0 => { self.read_achunk(strmgr) }
- _ => { self.read_vchunk(strmgr) }
- }
- }
-
- #[allow(unused_variables)]
- fn seek(&mut self, time: u64) -> DemuxerResult<()> {
- Err(DemuxerError::NotImplemented)
- }
-}
-/*impl<'a> Drop for GremlinVideoDemuxer<'a> {
- #[allow(unused_variables)]
- fn drop(&mut self) {
- }
-}*/
-impl<'a> GremlinVideoDemuxer<'a> {
- fn new(io: &'a mut ByteReader<'a>) -> Self {
- GremlinVideoDemuxer {
- cur_frame: 0,
- frames: 0,
- asize: 0,
- apacked: false,
- state: GDVState::NewFrame,
-pktdta: Vec::new(),
- src: io,
- a_id: None,
- v_id: None,
- }
- }
-
- fn read_achunk(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
- self.state = GDVState::AudioRead;
- let str = strmgr.get_stream(self.a_id.unwrap()).unwrap();
- let (tb_num, tb_den) = str.get_timebase();
- let ts = NATimeInfo::new(Some(self.cur_frame as u64), None, None, tb_num, tb_den);
- self.src.read_packet(str, ts, true, self.asize)
- }
-
- fn read_vchunk(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
- let str = strmgr.get_stream(self.v_id.unwrap()).unwrap();
- let src = &mut self.src;
- let magic = src.read_u16be()?;
- if magic != 0x0513 { return Err(DemuxerError::InvalidData); }
- let size = (src.read_u16le()? as usize) + 4;
- let tmp = src.peek_u32le()?;
- let flags = (tmp & 0xFF) as usize;
- self.state = GDVState::NewFrame;
- self.cur_frame = self.cur_frame + 1;
- let (tb_num, tb_den) = str.get_timebase();
- let ts = NATimeInfo::new(Some((self.cur_frame - 1) as u64), None, None, tb_num, tb_den);
- src.read_packet(str, ts, if (flags & 64) != 0 { true } else { false }, size)
- }
-}
-
-pub struct GDVDemuxerCreator { }
-
-impl DemuxerCreator for GDVDemuxerCreator {
- fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> {
- Box::new(GremlinVideoDemuxer::new(br))
- }
- fn get_name(&self) -> &'static str { "gdv" }
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
- use std::fs::File;
-
- #[test]
- fn test_gdv_demux() {
- let mut file = File::open("assets/intro1.gdv").unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let mut dmx = GremlinVideoDemuxer::new(&mut br);
- let mut sm = StreamManager::new();
- dmx.open(&mut sm).unwrap();
- loop {
- let pktres = dmx.get_frame(&mut sm);
- if let Err(e) = pktres {
- if (e as i32) == (DemuxerError::EOF as i32) { break; }
- panic!("error");
- }
- let pkt = pktres.unwrap();
- println!("Got {}", pkt);
- }
- }
-}
diff --git a/src/demuxers/mod.rs b/src/demuxers/mod.rs
deleted file mode 100644
index adf954a..0000000
--- a/src/demuxers/mod.rs
+++ /dev/null
@@ -1,242 +0,0 @@
-use std::rc::Rc;
-use crate::frame::*;
-use crate::io::byteio::*;
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-#[allow(dead_code)]
-pub enum DemuxerError {
- EOF,
- NoSuchInput,
- InvalidData,
- IOError,
- NotImplemented,
- MemoryError,
- TryAgain,
-}
-
-type DemuxerResult<T> = Result<T, DemuxerError>;
-
-pub trait DemuxCore<'a> {
- fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()>;
- fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket>;
- fn seek(&mut self, time: u64) -> DemuxerResult<()>;
-}
-
-pub trait NAPacketReader {
- fn read_packet(&mut self, str: Rc<NAStream>, ts: NATimeInfo, keyframe: bool, size: usize) -> DemuxerResult<NAPacket>;
- fn fill_packet(&mut self, pkt: &mut NAPacket) -> DemuxerResult<()>;
-}
-
-impl<'a> NAPacketReader for ByteReader<'a> {
- fn read_packet(&mut self, str: Rc<NAStream>, ts: NATimeInfo, kf: bool, size: usize) -> DemuxerResult<NAPacket> {
- let mut buf: Vec<u8> = Vec::with_capacity(size);
- if buf.capacity() < size { return Err(DemuxerError::MemoryError); }
- buf.resize(size, 0);
- let res = self.read_buf(buf.as_mut_slice());
- if let Err(_) = res { return Err(DemuxerError::IOError); }
- let pkt = NAPacket::new(str, ts, kf, buf);
- Ok(pkt)
- }
- fn fill_packet(&mut self, pkt: &mut NAPacket) -> DemuxerResult<()> {
- let mut refbuf = pkt.get_buffer();
- let buf = Rc::make_mut(&mut refbuf);
- let res = self.read_buf(buf.as_mut_slice());
- if let Err(_) = res { return Err(DemuxerError::IOError); }
- Ok(())
- }
-}
-
-pub struct StreamManager {
- streams: Vec<Rc<NAStream>>,
- ignored: Vec<bool>,
- no_ign: bool,
-}
-
-impl StreamManager {
- pub fn new() -> Self {
- StreamManager {
- streams: Vec::new(),
- ignored: Vec::new(),
- no_ign: true,
- }
- }
- pub fn iter(&self) -> StreamIter { StreamIter::new(&self.streams) }
-
- pub fn add_stream(&mut self, stream: NAStream) -> Option<usize> {
- let stream_num = self.streams.len();
- let mut str = stream.clone();
- str.set_num(stream_num);
- self.streams.push(Rc::new(str));
- self.ignored.push(false);
- Some(stream_num)
- }
- pub fn get_stream(&self, idx: usize) -> Option<Rc<NAStream>> {
- if idx < self.streams.len() {
- Some(self.streams[idx].clone())
- } else {
- None
- }
- }
- pub fn get_stream_by_id(&self, id: u32) -> Option<Rc<NAStream>> {
- for i in 0..self.streams.len() {
- if self.streams[i].get_id() == id {
- return Some(self.streams[i].clone());
- }
- }
- None
- }
- pub fn get_num_streams(&self) -> usize { self.streams.len() }
- pub fn is_ignored(&self, idx: usize) -> bool {
- if self.no_ign {
- true
- } else if idx < self.ignored.len() {
- self.ignored[idx]
- } else {
- false
- }
- }
- pub fn is_ignored_id(&self, id: u32) -> bool {
- for i in 0..self.streams.len() {
- if self.streams[i].get_id() == id {
- return self.ignored[i];
- }
- }
- false
- }
- pub fn set_ignored(&mut self, idx: usize) {
- if idx < self.ignored.len() {
- self.ignored[idx] = true;
- self.no_ign = false;
- }
- }
- pub fn set_unignored(&mut self, idx: usize) {
- if idx < self.ignored.len() {
- self.ignored[idx] = false;
- }
- }
-}
-
-pub struct StreamIter<'a> {
- streams: &'a Vec<Rc<NAStream>>,
- pos: usize,
-}
-
-impl<'a> StreamIter<'a> {
- pub fn new(streams: &'a Vec<Rc<NAStream>>) -> Self {
- StreamIter { streams: streams, pos: 0 }
- }
-}
-
-impl<'a> Iterator for StreamIter<'a> {
- type Item = Rc<NAStream>;
-
- fn next(&mut self) -> Option<Self::Item> {
- if self.pos >= self.streams.len() { return None; }
- let ret = self.streams[self.pos].clone();
- self.pos += 1;
- Some(ret)
- }
-}
-
-pub struct Demuxer<'a> {
- dmx: Box<DemuxCore<'a> + 'a>,
- streams: StreamManager,
-}
-
-impl<'a> Demuxer<'a> {
- fn new(dmx: Box<DemuxCore<'a> + 'a>, str: StreamManager) -> Self {
- Demuxer {
- dmx: dmx,
- streams: str,
- }
- }
- pub fn get_stream(&self, idx: usize) -> Option<Rc<NAStream>> {
- self.streams.get_stream(idx)
- }
- pub fn get_stream_by_id(&self, id: u32) -> Option<Rc<NAStream>> {
- self.streams.get_stream_by_id(id)
- }
- pub fn get_num_streams(&self) -> usize {
- self.streams.get_num_streams()
- }
- pub fn get_streams(&self) -> StreamIter {
- self.streams.iter()
- }
- pub fn is_ignored_stream(&self, idx: usize) -> bool {
- self.streams.is_ignored(idx)
- }
- pub fn set_ignored_stream(&mut self, idx: usize) {
- self.streams.set_ignored(idx)
- }
- pub fn set_unignored_stream(&mut self, idx: usize) {
- self.streams.set_unignored(idx)
- }
-
- pub fn get_frame(&mut self) -> DemuxerResult<NAPacket> {
- loop {
- let res = self.dmx.get_frame(&mut self.streams);
- if self.streams.no_ign || res.is_err() { return res; }
- let res = res.unwrap();
- let idx = res.get_stream().get_num();
- if !self.is_ignored_stream(idx) {
- return Ok(res);
- }
- }
- }
- pub fn seek(&mut self, time: u64) -> DemuxerResult<()> {
- self.dmx.seek(time)
- }
-}
-
-impl From<ByteIOError> for DemuxerError {
- fn from(_: ByteIOError) -> Self { DemuxerError::IOError }
-}
-
-///The structure used to create demuxers.
-pub trait DemuxerCreator {
- /// Create new demuxer instance that will use `ByteReader` source as an input.
- fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a>;
- /// Get the name of current demuxer creator.
- fn get_name(&self) -> &'static str;
-}
-
-macro_rules! validate {
- ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DemuxerError::InvalidData); } };
-}
-
-#[cfg(feature="demuxer_gdv")]
-mod gdv;
-#[cfg(feature="demuxer_avi")]
-mod avi;
-#[cfg(feature="demuxer_real")]
-mod realmedia;
-
-
-const DEMUXERS: &[&'static DemuxerCreator] = &[
-#[cfg(feature="demuxer_avi")]
- &avi::AVIDemuxerCreator {},
-#[cfg(feature="demuxer_gdv")]
- &gdv::GDVDemuxerCreator {},
-#[cfg(feature="demuxer_real")]
- &realmedia::RealMediaDemuxerCreator {},
-#[cfg(feature="demuxer_real")]
- &realmedia::RealAudioDemuxerCreator {},
-#[cfg(feature="demuxer_real")]
- &realmedia::RealIVRDemuxerCreator {},
-];
-
-pub fn find_demuxer(name: &str) -> Option<&DemuxerCreator> {
- for &dmx in DEMUXERS {
- if dmx.get_name() == name {
- return Some(dmx);
- }
- }
- None
-}
-
-pub fn create_demuxer<'a>(dmxcr: &DemuxerCreator, br: &'a mut ByteReader<'a>) -> DemuxerResult<Demuxer<'a>> {
- let mut dmx = dmxcr.new_demuxer(br);
- let mut str = StreamManager::new();
- dmx.open(&mut str)?;
- Ok(Demuxer::new(dmx, str))
-}
diff --git a/src/demuxers/realmedia.rs b/src/demuxers/realmedia.rs
deleted file mode 100644
index 9026384..0000000
--- a/src/demuxers/realmedia.rs
+++ /dev/null
@@ -1,1675 +0,0 @@
-use super::*;
-use super::DemuxerError::*;
-//use io::byteio::*;
-//use frame::*;
-use crate::formats::*;
-use std::io::SeekFrom;
-use std::mem;
-use std::fmt;
-
-macro_rules! mktag {
- ($a:expr, $b:expr, $c:expr, $d:expr) => ({
- (($a as u32) << 24) | (($b as u32) << 16) | (($c as u32) << 8) | ($d as u32)
- });
- ($arr:expr) => ({
- (($arr[0] as u32) << 24) | (($arr[1] as u32) << 16) | (($arr[2] as u32) << 8) | ($arr[3] as u32)
- });
-}
-
-const RM_SIPRO_BLOCK_SIZES: [usize; 4] = [ 29, 19, 37, 20 ];
-const RM_SIPRO_SWAPS: [[u8; 2]; 38] = [
- [ 0, 63 ], [ 1, 22 ], [ 2, 44 ], [ 3, 90 ],
- [ 5, 81 ], [ 7, 31 ], [ 8, 86 ], [ 9, 58 ],
- [ 10, 36 ], [ 12, 68 ], [ 13, 39 ], [ 14, 73 ],
- [ 15, 53 ], [ 16, 69 ], [ 17, 57 ], [ 19, 88 ],
- [ 20, 34 ], [ 21, 71 ], [ 24, 46 ], [ 25, 94 ],
- [ 26, 54 ], [ 28, 75 ], [ 29, 50 ], [ 32, 70 ],
- [ 33, 92 ], [ 35, 74 ], [ 38, 85 ], [ 40, 56 ],
- [ 42, 87 ], [ 43, 65 ], [ 45, 59 ], [ 48, 79 ],
- [ 49, 93 ], [ 51, 89 ], [ 55, 95 ], [ 61, 76 ],
- [ 67, 83 ], [ 77, 80 ]
-];
-
-struct RMVideoStream {
- frame: Vec<u8>,
- hdr_size: usize,
- frame_size: usize,
- frame_pos: usize,
-}
-
-impl RMVideoStream {
- fn new() -> Self {
- RMVideoStream {
- frame: Vec::new(),
- hdr_size: 0,
- frame_size: 0,
- frame_pos: 0,
- }
- }
- fn flush(&mut self) {
- self.frame.truncate(0);
- self.frame_size = 0;
- self.frame_pos = 0;
- }
- fn start_slice(&mut self, num_slices: usize, frame_size: usize, data: &[u8]) {
- self.hdr_size = num_slices * 8 + 1;
- self.frame.resize(frame_size + self.hdr_size, 0);
- self.frame[0] = (num_slices - 1) as u8;
- self.frame_pos = 0;
- self.add_slice(1, data);
- }
- fn add_slice(&mut self, slice_no: usize, data: &[u8]) {
- self.write_slice_info(slice_no);
- let dslice = &mut self.frame[self.hdr_size + self.frame_pos..][..data.len()];
- dslice.copy_from_slice(data);
- self.frame_pos += data.len();
- }
- fn write_slice_info(&mut self, slice_no: usize) {
- let off = 1 + (slice_no - 1) * 8;
- self.frame[off + 0] = 0;
- self.frame[off + 1] = 0;
- self.frame[off + 2] = 0;
- self.frame[off + 3] = 1;
- self.frame[off + 4] = (self.frame_pos >> 24) as u8;
- self.frame[off + 5] = (self.frame_pos >> 16) as u8;
- self.frame[off + 6] = (self.frame_pos >> 8) as u8;
- self.frame[off + 7] = (self.frame_pos >> 0) as u8;
- }
- fn get_frame_data(&mut self) -> Vec<u8> {
- let mut v: Vec<u8> = Vec::new();
- mem::swap(&mut v, &mut self.frame);
- self.flush();
- v
- }
-}
-
-#[derive(Clone,Copy,PartialEq)]
-enum Deinterleaver {
- None,
- RA28_8,
- Generic,
- Sipro,
- VBR,
-}
-
-struct RMAudioStream {
- deint: Deinterleaver,
- iinfo: Option<InterleaveInfo>,
- buf: Vec<u8>,
- sub_packet: usize,
-}
-
-const RM_ILEAVE_INT0: u32 = mktag!(b"Int0");
-const RM_ILEAVE_INT4: u32 = mktag!(b"Int4");
-const RM_ILEAVE_GENR: u32 = mktag!(b"genr");
-const RM_ILEAVE_SIPR: u32 = mktag!(b"sipr");
-const RM_ILEAVE_VBRF: u32 = mktag!(b"vbrf");
-const RM_ILEAVE_VBRS: u32 = mktag!(b"vbrs");
-
-impl RMAudioStream {
- fn new(iinfo: Option<InterleaveInfo>) -> Self {
- let deint;
- let mut buf: Vec<u8>;
- if let Some(info) = iinfo {
- deint = match info.id {
- RM_ILEAVE_INT0 => Deinterleaver::None,
- RM_ILEAVE_INT4 => Deinterleaver::RA28_8,
- RM_ILEAVE_GENR => Deinterleaver::Generic,
- RM_ILEAVE_SIPR => Deinterleaver::Sipro,
- RM_ILEAVE_VBRF => Deinterleaver::VBR,
- RM_ILEAVE_VBRS => Deinterleaver::VBR,
- _ => {println!("unknown deint {:X}", info.id); Deinterleaver::None },
- };
- match deint {
- Deinterleaver::None => { buf = Vec::new(); },
- Deinterleaver::RA28_8 |
- Deinterleaver::Generic |
- Deinterleaver::Sipro => {
- let bsize = (info.frame_size as usize) * (info.factor as usize);
- buf = Vec::with_capacity(bsize);
- buf.resize(bsize, 0u8);
- },
- Deinterleaver::VBR => {
- buf = Vec::new();
- },
- };
- } else {
- deint = Deinterleaver::None;
- buf = Vec::new();
- }
- RMAudioStream { deint: deint, iinfo: iinfo, buf: buf, sub_packet: 0 }
- }
- fn read_apackets(&mut self, queued_packets: &mut Vec<NAPacket>, src: &mut ByteReader, stream: Rc<NAStream>, ts: u32, keyframe: bool, payload_size: usize) -> DemuxerResult<NAPacket> {
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den);
-
- if keyframe {
- self.sub_packet = 0;
- }
- match self.deint {
- Deinterleaver::None => { return src.read_packet(stream, ts, keyframe, payload_size); },
- Deinterleaver::RA28_8 => {
- let iinfo = self.iinfo.unwrap();
- let factor = iinfo.factor as usize;
- let halffact = factor >> 1;
- let fsize = iinfo.frame_size as usize;
- let bsize = iinfo.block_size as usize;
- let ppos = self.sub_packet;
- for sb in 0..halffact {
- let mut dst = &mut self.buf[sb * 2 * fsize + ppos * bsize..][..bsize];
- src.read_buf(&mut dst)?;
- }
- self.sub_packet += 1;
- if self.sub_packet == factor {
- self.sub_packet = 0;
- return Ok(NAPacket::new(stream, ts, true, self.buf.clone()));
- } else {
- return Err(DemuxerError::TryAgain);
- }
- },
- Deinterleaver::Generic => {
- let iinfo = self.iinfo.unwrap();
- let factor = iinfo.factor as usize;
- let fsize = iinfo.frame_size as usize;
- let bsize = iinfo.block_size as usize;
- let factor2 = fsize / bsize;
- let ppos = self.sub_packet;
-
- for sb in 0..factor2 {
- let sb_pos = factor * sb + ((factor + 1) >> 1) * (ppos & 1) + (ppos >> 1);
- let mut dst = &mut self.buf[bsize * sb_pos..][..bsize];
- src.read_buf(&mut dst)?;
- }
- },
- Deinterleaver::Sipro => {
- let iinfo = self.iinfo.unwrap();
- let fsize = iinfo.frame_size as usize;
- let ppos = self.sub_packet;
-
- let mut dst = &mut self.buf[fsize * ppos..][..fsize];
- src.read_buf(&mut dst)?;
- },
- Deinterleaver::VBR => {
- validate!(payload_size >= 5);
- let hdrsizesize = src.read_u16be()?;
- let num_entries = (hdrsizesize / 16) as usize;
- validate!(payload_size >= num_entries * 3 + 2);
- let mut sizes: Vec<usize> = Vec::with_capacity(num_entries);
- let mut tot_size = 0;
- for _ in 0..num_entries {
- let sz = src.read_u16be()? as usize;
- tot_size += sz;
- sizes.push(sz);
- }
- validate!(tot_size + num_entries * 2 + 2 == payload_size);
- let pkt_ts = NATimeInfo::new(None, None, None, tb_num, tb_den);
- let mut first = true;
- for size in sizes.iter() {
- let cur_ts = if first { ts } else { pkt_ts };
- first = false;
- let pkt = src.read_packet(stream.clone(), cur_ts, true, *size)?;
- queued_packets.push(pkt);
- }
- queued_packets.reverse();
- let pkt0 = queued_packets.pop().unwrap();
- return Ok(pkt0);
- },
- };
-
- let iinfo = self.iinfo.unwrap();
- let factor = iinfo.factor as usize;
- let fsize = if iinfo.block_size != 0 { iinfo.block_size } else { iinfo.frame_size } as usize;
-
- self.sub_packet += 1;
- if self.sub_packet < factor {
- return Err(DemuxerError::TryAgain);
- }
-
- self.sub_packet = 0;
-
- if self.deint == Deinterleaver::Sipro {
- sipro_restore(&mut self.buf, factor, fsize);
- }
-
- let mut frames_iter = self.buf.chunks(fsize);
- let pkt0 = frames_iter.next().unwrap();
-
- let pkt_ts = NATimeInfo::new(None, None, None, tb_num, tb_den);
- for pkts in frames_iter {
- let pkt = NAPacket::new(stream.clone(), pkt_ts, true, pkts.to_vec());
- queued_packets.push(pkt);
- }
- queued_packets.reverse();
- Ok(NAPacket::new(stream, ts, true, pkt0.to_vec()))
- }
-}
-
-fn sipro_restore(buf: &mut [u8], factor: usize, fsize: usize) {
- let stride = factor * fsize * 2 / 96;
- for i in 0..38 {
- let mut sidx = (RM_SIPRO_SWAPS[i][0] as usize) * stride;
- let mut didx = (RM_SIPRO_SWAPS[i][1] as usize) * stride;
- for _ in 0..stride {
- let in0 = buf[sidx >> 1];
- let in1 = buf[didx >> 1];
- let nib0 = (in0 >> ((sidx & 1) * 4)) & 0xF;
- let nib1 = (in1 >> ((didx & 1) * 4)) & 0xF;
-
- buf[didx >> 1] = (nib0 << (4 * (didx & 1))) | (in1 & (0xF << (4 * (!didx & 1))));
- buf[sidx >> 1] = (nib1 << (4 * (sidx & 1))) | (in0 & (0xF << (4 * (!sidx & 1))));
-
- sidx += 1;
- didx += 1;
- }
- }
-}
-
-struct SubstreamInfo {
- id: u32,
- map: Vec<u16>,
- str_ids: Vec<u32>,
-}
-
-struct MLTIMapper {
- sub_info: Vec<SubstreamInfo>,
- sstr_id: u32,
-}
-
-impl MLTIMapper {
- fn new() -> Self {
- MLTIMapper {
- sub_info: Vec::new(),
- sstr_id: 0x10000,
- }
- }
- fn add_stream(&mut self, stream_no: u32) {
- let ssinfo = SubstreamInfo { id: stream_no, map: Vec::new(), str_ids: Vec::new() };
- self.sub_info.push(ssinfo);
- }
- fn get_substream_no(&self) -> u32 {
- self.sstr_id - 1
- }
- fn find_idx(&self, stream_no: u32) -> Option<usize> {
- self.sub_info.iter().position(|x| x.id == stream_no)
- }
- fn add_map_rule(&mut self, map_ss: u16) {
- let idx = self.sub_info.len() - 1;
- self.sub_info[idx].map.push(map_ss);
- }
- fn add_substream(&mut self) {
- let idx = self.sub_info.len() - 1;
- self.sub_info[idx].str_ids.push(self.sstr_id);
- self.sstr_id += 1;
- }
- fn is_mlti_stream(&self, stream_no: u32) -> bool {
- self.find_idx(stream_no).is_some()
- }
- fn find_substream(&self, stream_no: u32, grp: u16) -> Option<u32> {
- if let Some(idx) = self.find_idx(stream_no) {
- if (grp as usize) < self.sub_info[idx].map.len() {
- let sub_id = self.sub_info[idx].map[grp as usize] as usize;
- if sub_id < self.sub_info[idx].str_ids.len() {
- return Some(self.sub_info[idx].str_ids[sub_id]);
- }
- }
- }
- None
- }
-}
-
-enum RMStreamType {
- Audio(RMAudioStream),
- Video(RMVideoStream),
- Logical,
- Unknown,
-}
-
-struct CommonStreamData {
- streams: Vec<RMStreamType>,
- str_ids: Vec<u32>,
- mlti_mapper: MLTIMapper,
-}
-
-impl CommonStreamData {
- fn new() -> Self {
- CommonStreamData {
- streams: Vec::new(),
- str_ids: Vec::new(),
- mlti_mapper: MLTIMapper::new(),
- }
- }
- fn get_stream_id(&self, str_no: u32, pkt_grp: u16) -> u32 {
- if !self.mlti_mapper.is_mlti_stream(str_no) {
- str_no
- } else {
- self.mlti_mapper.find_substream(str_no, pkt_grp).unwrap()
- }
- }
- fn find_stream(&self, stream_id: u32) -> Option<usize> {
- self.str_ids.iter().position(|x| *x == stream_id)
- }
-}
-
-struct RealMediaDemuxer<'a> {
- src: &'a mut ByteReader<'a>,
- data_pos: u64,
- next_data: u64,
- data_ver: u16,
- num_packets: u32,
- cur_packet: u32,
-
- str_data: CommonStreamData,
-
- queued_pkts: Vec<NAPacket>,
- slice_buf: Vec<u8>,
-}
-
-fn find_codec_name(registry: &[(&[u8;4], &'static str)], fcc: u32) -> &'static str {
- for &(fourcc, name) in registry {
- if mktag!(fourcc) == fcc { return name; }
- }
- "unknown"
-}
-
-fn read_14or30(src: &mut ByteReader) -> DemuxerResult<(bool, u32)> {
- let tmp = src.read_u16be()?;
- let flag = (tmp & 0x8000) != 0;
- if (tmp & 0x4000) == 0x4000 {
- Ok((flag, ((tmp & 0x3FFF) as u32)))
- } else {
- let val = ((tmp as u32) << 16) | (src.read_u16be()? as u32);
- Ok((flag, val & 0x3FFFFFFF))
- }
-}
-
-fn read_video_buf(src: &mut ByteReader, stream: Rc<NAStream>, ts: u32, keyframe: bool, frame_size: usize) -> DemuxerResult<NAPacket> {
- let size = (frame_size as usize) + 9;
- let mut vec: Vec<u8> = Vec::with_capacity(size);
- vec.resize(size, 0);
- //v[0] = 0; // 1 slice
- vec[4] = 1;
- src.read_buf(&mut vec[9..])?;
-
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den);
- Ok(NAPacket::new(stream, ts, keyframe, vec))
-}
-
-fn read_multiple_frame(src: &mut ByteReader, stream: Rc<NAStream>, keyframe: bool, skip_mtype: bool) -> DemuxerResult<NAPacket> {
- if !skip_mtype {
- let mtype = src.read_byte()?;
- validate!(mtype == 0xC0);
- }
- let (_, frame_size) = read_14or30(src)?;
- let (_, timestamp) = read_14or30(src)?;
- let _seq_no = src.read_byte()?;
-//println!(" multiple frame size {} ts {} seq {}", frame_size, timestamp, seq_no);
-
- read_video_buf(src, stream, timestamp, keyframe, frame_size as usize)
-}
-
-struct RMDemuxCommon {}
-
-impl RMDemuxCommon {
- fn parse_stream_info(str_data: &mut CommonStreamData, strmgr: &mut StreamManager, stream_no: u32, edata: &Vec<u8>) -> DemuxerResult<bool> {
- let mut is_mlti = false;
- let mut mr = MemoryReader::new_read(edata.as_slice());
- let mut src = ByteReader::new(&mut mr);
- let tag = src.read_u32be()?;
- let tag2 = src.peek_u32be()?;
-//println!("tag1 {:X} tag2 {:X}", tag, tag2);
- if tag == mktag!('.', 'r', 'a', 0xFD) {
- Self::parse_audio_stream(strmgr, &mut str_data.streams, stream_no, &mut src, edata.as_slice())?;
- } else if ((tag2 == mktag!('V', 'I', 'D', 'O')) || (tag2 == mktag!('I', 'M', 'A', 'G'))) && ((tag as usize) <= edata.len()) {
- Self::parse_video_stream(strmgr, &mut str_data.streams, stream_no, &mut src, edata.as_slice(), tag2)?;
- } else if tag == mktag!(b"LSD:") {
- let extradata = Some(edata.clone());
-
- src.read_skip(4)?; //version
- let channels = src.read_u16be()?;
- let samp_size = src.read_u16be()?;
- let sample_rate = src.read_u32be()?;
-
- println!("LSD sr {}, {} ch", sample_rate, channels);
- let soniton = NASoniton::new(samp_size as u8, SONITON_FLAG_SIGNED);
- let ahdr = NAAudioInfo::new(sample_rate, channels as u8, soniton, 1);
- let nainfo = NACodecInfo::new("ralf", NACodecTypeInfo::Audio(ahdr), extradata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Audio, stream_no as u32, nainfo, 1, sample_rate));
- if res.is_none() { return Err(MemoryError); }
- let astr = RMAudioStream::new(None);
- str_data.streams.push(RMStreamType::Audio(astr));
- } else if tag == mktag!(b"MLTI") {
- is_mlti = true;
- let num_rules = src.read_u16be()? as usize;
- let mut max_sub = 0;
- str_data.mlti_mapper.add_stream(stream_no);
- for _ in 0..num_rules {
- let substr = src.read_u16be()?;
- max_sub = max_sub.max(substr);
- str_data.mlti_mapper.add_map_rule(substr);
- }
- let num_substreams = src.read_u16be()? as usize;
- validate!(num_substreams > (max_sub as usize));
- for _ in 0..num_substreams {
- let hdr_size = src.read_u32be()? as usize;
- validate!(hdr_size > 8);
- let pos = src.tell() as usize;
- src.read_skip(hdr_size)?;
- str_data.mlti_mapper.add_substream();
- {
- let hdrsrc = &edata[pos..][..hdr_size];
- let mut mr = MemoryReader::new_read(hdrsrc);
- let mut hsrc = ByteReader::new(&mut mr);
-
- let tag = hsrc.read_u32be()?;
- let tag2 = hsrc.peek_u32be()?;
- let stream_no = str_data.mlti_mapper.get_substream_no();
-//todo check that all substreams are of the same type");
- if tag == mktag!('.', 'r', 'a', 0xFD) {
- Self::parse_audio_stream(strmgr, &mut str_data.streams, stream_no, &mut hsrc, hdrsrc)?;
- } else if (tag2 == mktag!('V', 'I', 'D', 'O')) && ((tag as usize) <= hdr_size) {
- Self::parse_video_stream(strmgr, &mut str_data.streams, stream_no, &mut hsrc, hdrsrc, tag2)?;
- } else {
-println!("unknown MLTI substream {:08X} / {:08X}", tag, tag2);
- return Err(DemuxerError::InvalidData);
- }
- str_data.str_ids.push(stream_no);
- }
- }
- } else {
- str_data.streams.push(RMStreamType::Logical);
- }
- Ok(is_mlti)
- }
- fn parse_audio_stream(strmgr: &mut StreamManager, streams: &mut Vec<RMStreamType>, stream_no: u32, src: &mut ByteReader, edata_: &[u8]) -> DemuxerResult<()> {
- let ver = src.read_u16be()?;
- let ainfo = match ver {
- 3 => {
- parse_aformat3(src)?
- },
- 4 => {
- parse_aformat4(src)?
- },
- 5 => {
- parse_aformat5(src)?
- },
- _ => {
- println!("unknown version {}", ver);
- return Err(DemuxerError::InvalidData);
- },
- };
-println!(" got ainfo {:?}", ainfo);
- let cname = find_codec_name(RM_AUDIO_CODEC_REGISTER, ainfo.fcc);
- let blk_size = if ainfo.fcc != mktag!(b"sipr") {
- ainfo.granularity as usize
- } else {
- validate!(ainfo.flavor <= 3);
- RM_SIPRO_BLOCK_SIZES[ainfo.flavor as usize]
- };
- let srate = ainfo.sample_rate;
- let soniton = NASoniton::new(ainfo.sample_size as u8, SONITON_FLAG_SIGNED);
- let ahdr = NAAudioInfo::new(srate, ainfo.channels as u8, soniton, blk_size);
- let extradata = if ainfo.edata_size == 0 {
- None
- } else {
- let eslice = &edata_[(src.tell() as usize)..];
- Some(eslice.to_vec())
- };
- let nainfo = NACodecInfo::new(cname, NACodecTypeInfo::Audio(ahdr), extradata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Audio, stream_no as u32, nainfo, 1, srate));
- if res.is_none() { return Err(MemoryError); }
-
- let astr = RMAudioStream::new(ainfo.ileave_info);
- streams.push(RMStreamType::Audio(astr));
- Ok(())
- }
-#[allow(unused_variables)]
- fn parse_video_stream(strmgr: &mut StreamManager, streams: &mut Vec<RMStreamType>, stream_no: u32, src: &mut ByteReader, edata_: &[u8], tag2: u32) -> DemuxerResult<()> {
- src.read_skip(4)?;
- let fcc = src.read_u32be()?;
- let width = src.read_u16be()? as usize;
- let height = src.read_u16be()? as usize;
- let bpp = src.read_u16be()?;
- let pad_w = src.read_u16be()?;
- let pad_h = src.read_u16be()?;
- let fps;
- if tag2 == mktag!('V', 'I', 'D', 'O') {
- fps = src.read_u32be()?;
- } else {
- fps = 0x10000;
- }
- let extradata: Option<Vec<u8>>;
- if src.left() > 0 {
- let eslice = &edata_[(src.tell() as usize)..];
- extradata = Some(eslice.to_vec());
- } else {
- extradata = None;
- }
- let cname = find_codec_name(RM_VIDEO_CODEC_REGISTER, fcc);
-
- let vhdr = NAVideoInfo::new(width, height, false, RGB24_FORMAT);
- let vinfo = NACodecInfo::new(cname, NACodecTypeInfo::Video(vhdr), extradata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Video, stream_no as u32, vinfo, 0x10000, fps));
- if res.is_none() { return Err(DemuxerError::MemoryError); }
-
- let vstr = RMVideoStream::new();
- streams.push(RMStreamType::Video(vstr));
- Ok(())
- }
-#[allow(unused_variables)]
- fn parse_packet_payload(src: &mut ByteReader, rmstream: &mut RMStreamType, stream: Rc<NAStream>, slice_buf: &mut Vec<u8>, queued_pkts: &mut Vec<NAPacket>, keyframe: bool, ts: u32, payload_size: usize) -> DemuxerResult<NAPacket> {
- match rmstream {
- RMStreamType::Video(ref mut vstr) => {
-
- let pos = src.tell();
- let b0 = src.read_byte()?;
- match b0 >> 6 {
- 0 => { // partial frame
- let b1 = src.read_byte()?;
- let hdr1 = ((b0 as u16) << 8) | (b1 as u16);
- let num_pkts = ((hdr1 >> 7) & 0x7F) as usize;
- let packet_num = hdr1 & 0x7F;
- let (_, frame_size) = read_14or30(src)?;
- let (_, off) = read_14or30(src)?;
- let seq_no = src.read_byte()?;
-//println!(" mode 0 pkt {}/{} off {}/{} seq {}", packet_num, num_pkts, off, frame_size, seq_no);
- let hdr_skip = (src.tell() - pos) as usize;
-
- let slice_size = (payload_size - hdr_skip) as usize;
- slice_buf.resize(slice_size, 0);
- src.read_buf(slice_buf.as_mut_slice())?;
- if packet_num == 1 {
- vstr.start_slice(num_pkts, frame_size as usize, slice_buf.as_slice());
- } else {
- vstr.add_slice(packet_num as usize, slice_buf.as_slice());
- }
- if (packet_num as usize) < num_pkts {
- return Err(DemuxerError::TryAgain);
- }
- //todo: check if full frame is received
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den);
- let pkt = NAPacket::new(stream, ts, keyframe, vstr.get_frame_data());
- Ok(pkt)
- },
- 1 => { // whole frame
- let seq_no = src.read_byte()?;
-//println!(" mode 1 seq {}", seq_no);
- read_video_buf(src, stream, ts, keyframe, payload_size - 2)
- },
- 2 => { // last partial frame
- let b1 = src.read_byte()?;
- let hdr1 = ((b0 as u16) << 8) | (b1 as u16);
- let num_pkts = ((hdr1 >> 7) & 0x7F) as usize;
- let packet_num = hdr1 & 0x7F;
- let (_, frame_size) = read_14or30(src)?;
- let (_, tail_size) = read_14or30(src)?;
- let seq_no = src.read_byte()?;
-//println!(" mode 2 pkt {}/{} tail {}/{} seq {}", packet_num, num_pkts, tail_size, frame_size, seq_no);
- slice_buf.resize(tail_size as usize, 0);
- src.read_buf(slice_buf.as_mut_slice())?;
- if packet_num == 1 && frame_size == tail_size {
- vstr.start_slice(num_pkts, frame_size as usize, slice_buf.as_slice());
- } else {
- vstr.add_slice(packet_num as usize, slice_buf.as_slice());
- }
-
- while src.tell() < pos + (payload_size as u64) {
- let res = read_multiple_frame(src, stream.clone(), false, false);
- if res.is_err() { break; }
- queued_pkts.push(res.unwrap());
- }
- queued_pkts.reverse();
- let (tb_num, tb_den) = stream.get_timebase();
- let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den);
- let pkt = NAPacket::new(stream, ts, keyframe, vstr.get_frame_data());
- Ok(pkt)
- },
- _ => { // multiple frames
-//println!(" mode 3");
- let res = read_multiple_frame(src, stream.clone(), keyframe, true);
- if res.is_err() { return res; }
- while src.tell() < pos + (payload_size as u64) {
- let res = read_multiple_frame(src, stream.clone(), false, false);
- if res.is_err() { break; }
- queued_pkts.push(res.unwrap());
- }
- queued_pkts.reverse();
- res
- },
- }
- },
- RMStreamType::Audio(ref mut astr) => {
- astr.read_apackets(queued_pkts, src, stream, ts, keyframe, payload_size)
- },
- _ => {
- src.read_skip(payload_size)?;
- Err(DemuxerError::InvalidData)
- },
- }
- }
-}
-
-impl<'a> DemuxCore<'a> for RealMediaDemuxer<'a> {
- #[allow(unused_variables)]
- fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- self.read_header(strmgr)?;
- Ok(())
- }
-
-#[allow(unused_variables)]
- fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
- if !self.queued_pkts.is_empty() {
- let pkt = self.queued_pkts.pop().unwrap();
- return Ok(pkt);
- }
- loop {
- if self.cur_packet >= self.num_packets {
- if (self.next_data != 0) && (self.next_data == self.src.tell()) {
- let res = read_chunk(self.src);
- if let Ok((id, size, ver)) = res {
- self.data_pos = self.src.tell();
- self.data_ver = ver;
- if self.parse_data_start().is_ok() {
- continue;
- }
- }
- }
- return Err(DemuxerError::EOF);
- }
-
- let pkt_start = self.src.tell();
- let ver = self.src.read_u16be()?;
- validate!(ver <= 1);
- let len = self.src.read_u16be()? as usize;
- let str_no = self.src.read_u16be()? as u32;
- let ts = self.src.read_u32be()?;
- let pkt_grp;
- let flags;
- if ver == 0 {
- pkt_grp = self.src.read_byte()? as u16;
- flags = self.src.read_byte()?;
- } else {
- //asm_rule = self.src.read_u16be()?;
- //asm_flags = self.src.read_byte()?;
- self.src.read_skip(2)?;
- pkt_grp = 0;
- self.src.read_skip(1)?;
- flags = 0;
- }
- let hdr_size = self.src.tell() - pkt_start;
-//println!("packet @{:X} size {} for {} ts {} grp {} flags {:X}", pkt_start, len, str_no, ts, pkt_grp, flags);
- self.cur_packet += 1;
-
- let payload_size = len - (hdr_size as usize);
-
- let stream_id = self.str_data.get_stream_id(str_no as u32, pkt_grp);
- let sr = self.str_data.find_stream(stream_id);
- if sr.is_none() {
-//println!("stream {} not found", str_no);
- self.src.read_skip(payload_size)?;
- return Err(DemuxerError::InvalidData);
- }
- let str_id = sr.unwrap();
-
- let streamres = strmgr.get_stream_by_id(stream_id);
- if streamres.is_none() {
- self.src.read_skip(payload_size)?;
- continue;
- }
- let stream = streamres.unwrap();
-//println!(" stream {}", str_id);
- if strmgr.is_ignored_id(stream_id) {
- self.src.read_skip(payload_size)?;
- continue;
- }
- //todo skip unwanted packet
- let keyframe = (flags & KEYFRAME_FLAG) != 0;
-
- let ret = RMDemuxCommon::parse_packet_payload(&mut self.src, &mut self.str_data.streams[str_id], stream, &mut self.slice_buf, &mut self.queued_pkts, keyframe, ts, payload_size);
- if let Err(DemuxerError::TryAgain) = ret {
- continue;
- } else {
- return ret;
- }
- }
- }
-
- #[allow(unused_variables)]
- fn seek(&mut self, time: u64) -> DemuxerResult<()> {
- Err(NotImplemented)
- }
-}
-
-fn read_chunk(src: &mut ByteReader) -> DemuxerResult<(u32, u32, u16)> {
- let id = src.read_u32be()?;
-if id == 0 { return Ok((0, 0, 0)); }
- let size = src.read_u32be()?;
-if size == 0 {
- let ver = src.read_u16be()?;
- validate!(ver <= 2);
- return Ok((id, 0x0FFFFFFF, ver));
-}
- validate!(size >= 10);
- let ver = src.read_u16be()?;
- validate!(ver <= 2);
- Ok((id, size, ver))
-}
-
-#[derive(Clone,Copy,Debug)]
-struct InterleaveInfo {
- id: u32,
- factor: u16,
- block_size: u16,
- frame_size: u16,
-}
-
-#[derive(Clone,Copy,Debug)]
-struct RealAudioInfo {
- fcc: u32,
- sample_rate: u32,
- sample_size: u16,
- flavor: u16,
- channels: u16,
- channel_mask: u32,
- granularity: u32,
- bytes_per_minute: u32,
- total_bytes: u32,
- edata_size: u32,
- ileave_info: Option<InterleaveInfo>
-}
-
-fn skip_ra_metadata(src: &mut ByteReader) -> DemuxerResult<()> {
- let title_len = src.read_byte()? as usize;
- src.read_skip(title_len)?;
- let author_len = src.read_byte()? as usize;
- src.read_skip(author_len)?;
- let copywrong_len = src.read_byte()? as usize;
- src.read_skip(copywrong_len)?;
- let comment_len = src.read_byte()? as usize;
- src.read_skip(comment_len)?;
- Ok(())
-}
-
-#[allow(unused_variables)]
-fn parse_aformat3(src: &mut ByteReader) -> DemuxerResult<RealAudioInfo> {
- let start = src.tell();
- let header_len = src.read_u16be()?;
- validate!(header_len >= 24);
- let flavor = src.read_u16be()?;
- let granularity = src.read_u32be()?;
- let bytes_per_minute = src.read_u32be()?;
- let total_bytes = src.read_u32be()?;
-
- skip_ra_metadata(src)?;
-
- let _can_copy = src.read_byte()?;
- let fcc_len = src.read_byte()?;
- validate!(fcc_len == 4);
- let fcc = src.read_u32be()?;
-
- let end = src.tell();
- validate!(end - start <= (header_len as u64) + 2);
-
- Ok(RealAudioInfo {
- fcc: fcc, flavor: flavor,
- sample_rate: 8000, sample_size: 16, channels: 1, channel_mask: 0,
- granularity: granularity, bytes_per_minute: bytes_per_minute,
- total_bytes: total_bytes, edata_size: 0,
- ileave_info: None,
- })
-}
-
-#[allow(unused_variables)]
-fn parse_aformat4(src: &mut ByteReader) -> DemuxerResult<RealAudioInfo> {
- let start = src.tell();
- src.read_skip(2)?; // zeroes
- let id = src.read_u32be()?;
- validate!(id == mktag!(b".ra4"));
- let data_size = src.read_u32be()?;
- let _ver4 = src.read_u16be()?; // should be 4
- let header_size = src.read_u32be()?;
- let flavor = src.read_u16be()?;
- let granularity = src.read_u32be()?;
- let total_bytes = src.read_u32be()?;
- let bytes_per_minute = src.read_u32be()?;
- let _bytes_per_minute2 = src.read_u32be()?;
- let ileave_factor = src.read_u16be()?;
- let ileave_block_size = src.read_u16be()?;
- let _user_data = src.read_u16be()?;
- let sample_rate = src.read_u32be()?;
- let sample_size = src.read_u32be()?;
- let channels = src.read_u16be()?;
- let interleaver_id_len = src.read_byte()?;
- validate!(interleaver_id_len == 4);
- let interleaver_id = src.read_u32be()?;
- let fcc_len = src.read_byte()?;
- validate!(fcc_len == 4);
- let fcc = src.read_u32be()?;
- let is_interleaved = src.read_byte()?;
- let _can_copy = src.read_byte()?;
- let _stream_type = src.read_byte()?;
-
- skip_ra_metadata(src)?;
-
- let end = src.tell();
- validate!(end - start <= (header_size as u64) + 10);
-
- let ileave_info = if is_interleaved != 0 {
- Some(InterleaveInfo {
- id: interleaver_id, factor: ileave_factor, block_size: granularity as u16,
- frame_size: ileave_block_size,
- })
- } else {
- None
- };
-
- Ok(RealAudioInfo {
- fcc: fcc, flavor: flavor,
- sample_rate: sample_rate, sample_size: sample_size as u16, channels: channels, channel_mask: 0,
- granularity: granularity, bytes_per_minute: bytes_per_minute,
- total_bytes: total_bytes & 0xFFFFFF, edata_size: 0,
- ileave_info: ileave_info,
- })
-}
-
-#[allow(unused_variables)]
-fn parse_aformat5(src: &mut ByteReader) -> DemuxerResult<RealAudioInfo> {
- let start = src.tell();
- src.read_skip(2)?; // zeroes
- let id = src.read_u32be()?;
- validate!((id == mktag!(b".ra5")) || (id == mktag!(b".ra4")));
- let data_size = src.read_u32be()?;
- let _ver5 = src.read_u16be()?; // should be 5
- let header_size = src.read_u32be()?;
- let flavor = src.read_u16be()?;
- let granularity = src.read_u32be()?;
- let total_bytes = src.read_u32be()?;
- let bytes_per_minute = src.read_u32be()?;
- let _bytes_per_minute2 = src.read_u32be()?;
- let ileave_factor = src.read_u16be()?;
- let frame_size = src.read_u16be()?;
- let ileave_block_size = src.read_u16be()?;
- let user_data = src.read_u32be()?;
- let _sample_rate1 = src.read_u16be()?;
- let sample_rate = src.read_u32be()?;
- let sample_size = src.read_u32be()?;
- let channels = src.read_u16be()?;
- let interleaver_id = src.read_u32be()?;
- let fcc = src.read_u32be()?;
- let is_interleaved = src.read_byte()?;
- let _can_copy = src.read_byte()?;
- let _stream_type = src.read_byte()?;
- let has_ileave_pattern = src.read_byte()?;
- if has_ileave_pattern != 0 {
-unimplemented!("ra5 interleave pattern");
- }
- let mut edata_size = src.read_u32be()?;
- let end = src.tell();
- if id == mktag!(b".ra5") {
- validate!(end - start <= (header_size as u64) + 10);
-// src.read_skip(((end - start) as usize) - (header_size as usize) - 10)?;
- } else {
- validate!(end - start <= (header_size as u64) + 15);
- }
-
- let ileave_info = if is_interleaved != 0 {
- Some(InterleaveInfo {
- id: interleaver_id, factor: ileave_factor, block_size: ileave_block_size, frame_size: frame_size,
- })
- } else {
- None
- };
- if (fcc == mktag!(b"raac")) || (fcc == mktag!(b"racp")) {
- validate!(edata_size > 1);
- edata_size -= 1;
- src.read_skip(1)?;
- }
-
- Ok(RealAudioInfo {
- fcc: fcc, flavor: flavor,
- sample_rate: sample_rate, sample_size: sample_size as u16, channels: channels, channel_mask: 0,
- granularity: granularity, bytes_per_minute: bytes_per_minute,
- total_bytes: total_bytes & 0xFFFFFF, edata_size: edata_size,
- ileave_info: ileave_info,
- })
-}
-
-const RMVB_HDR_SIZE: u32 = 18;
-const RMVB_PROP_SIZE: u32 = 50;
-const KEYFRAME_FLAG: u8 = 0x02;
-
-impl<'a> RealMediaDemuxer<'a> {
- fn new(io: &'a mut ByteReader<'a>) -> Self {
- RealMediaDemuxer {
- src: io,
- data_pos: 0,
- next_data: 0,
- data_ver: 0,
- num_packets: 0,
- cur_packet: 0,
- str_data: CommonStreamData::new(),
- queued_pkts: Vec::new(),
- slice_buf: Vec::new(),
- }
- }
-#[allow(unused_variables)]
- fn read_header(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- let (id, size, ver) = read_chunk(self.src)?;
- validate!((id == mktag!(b".RMF")) || (id == mktag!(b".RMP")));
- validate!(size >= RMVB_HDR_SIZE);
- let fver = self.src.read_u32be()?;
- validate!(fver <= 1);
- let num_hdr = self.src.read_u32be()? as usize;
- validate!(num_hdr >= 1);
- if size > RMVB_HDR_SIZE {
- self.src.read_skip((size - RMVB_HDR_SIZE) as usize)?;
- }
-
- let (id, size, ver) = read_chunk(self.src)?;
- let prop_size = if ver == 0 { RMVB_PROP_SIZE } else { RMVB_PROP_SIZE + 4 };
- validate!(size >= prop_size);
- validate!((ver == 0) || (ver == 2));
- let maxbr = self.src.read_u32be()?;
- let avgbr = self.src.read_u32be()?;
- let maxps = self.src.read_u32be()?;
- let avgps = self.src.read_u32be()?;
- let num_pkt = self.src.read_u32be()? as usize;
- let duration = self.src.read_u32be()?;
- let preroll = self.src.read_u32be()?;
- if ver == 2 {
- self.src.read_skip(4)?;
- }
- let idx_off = self.src.read_u32be()?;
- let data_off = self.src.read_u32be()?;
- let num_streams = self.src.read_u16be()? as usize;
- let flags = self.src.read_u16be()?;
- if size > prop_size {
- self.src.read_skip((size - prop_size) as usize)?;
- }
-
- for _ in 0..num_hdr {
- if self.src.is_eof() {
- //warn maybe?
- break;
- }
- let res = self.parse_chunk(strmgr);
- match res {
- Ok(last) => { if last { break; } },
- Err(DemuxerError::IOError) => { break; },
- Err(etype) => {
- if self.data_pos == 0 { // data is not found, report error
- return Err(etype);
- }
- },
- };
- }
-//println!("now @ {:X} / {}", self.src.tell(), self.data_pos);
- validate!(self.data_pos > 0);
- self.src.seek(SeekFrom::Start(self.data_pos))?;
- self.parse_data_start()?;
- Ok(())
- }
- fn parse_data_start(&mut self) -> DemuxerResult<()> {
- let num_packets = self.src.read_u32be()?;
- if self.data_ver == 2 {
- self.src.read_skip(12)?; // zeroes?
- }
- let next_data_hdr = self.src.read_u32be()?;
- self.num_packets = if num_packets > 0 { num_packets } else { 0xFFFFFF };
- self.cur_packet = 0;
- self.next_data = next_data_hdr as u64;
- Ok(())
- }
- fn parse_chunk(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<bool> {
- let (id, size, ver) = read_chunk(self.src)?;
- let end_pos = self.src.tell() - 10 + (size as u64);
-
- validate!((ver == 0) || (ver == 2));
- if id == mktag!(b"CONT") { self.parse_content_desc()?; }
- else if id == mktag!(b"MDPR") { self.parse_mdpr(strmgr)?; }
- else if id == mktag!(b"DATA") { if self.data_pos == 0 { self.data_ver = ver; self.data_pos = self.src.tell(); } }
- else if id == mktag!(b"INDX") { /* do nothing for now */ }
- else if id == 0 { return Ok(true); }
- else { println!("unknown chunk type {:08X}", id); }
-
- let cpos = self.src.tell();
- if cpos < end_pos {
- self.src.read_skip((end_pos - cpos) as usize)?;
- }
- Ok(false)
- }
-#[allow(unused_variables)]
- fn parse_content_desc(&mut self) -> DemuxerResult<()> {
- let title_len = self.src.read_u16be()? as usize;
- self.src.read_skip(title_len)?;
- let author_len = self.src.read_u16be()? as usize;
- self.src.read_skip(author_len)?;
- let copywrong_len = self.src.read_u16be()? as usize;
- self.src.read_skip(copywrong_len)?;
- let comment_len = self.src.read_u16be()? as usize;
- self.src.read_skip(comment_len)?;
- Ok(())
- }
-#[allow(unused_variables)]
- fn parse_mdpr(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- let stream_no = self.src.read_u16be()? as u32;
-//todo check stream_no for duplicates
- let maxbr = self.src.read_u32be()?;
- let avgbr = self.src.read_u32be()?;
- let maxps = self.src.read_u32be()?;
- let avgps = self.src.read_u32be()?;
- let start = self.src.read_u32be()?;
- let preroll = self.src.read_u32be()?;
- let duration = self.src.read_u32be()?;
- let sname_size = self.src.read_byte()? as usize;
- let sname = read_string_size(self.src, sname_size)?;
-//println!("str #{} sname = {} pkts {}/{} start {} preroll {}", stream_no, sname, maxps, avgps, start, preroll);
- let mime_size = self.src.read_byte()? as usize;
- let mime = read_string_size(self.src, mime_size)?;
-//println!("mime = {}", mime);
- let edata_size = self.src.read_u32be()? as usize;
- let edata: Option<Vec<u8>> = if edata_size == 0 { None } else {
- let mut edvec: Vec<u8> = Vec::with_capacity(edata_size);
- edvec.resize(edata_size, 0);
- self.src.read_buf(&mut edvec)?;
- Some(edvec)
- };
- let mut is_mlti = false;
- if edata_size > 8 {
- if let Some(edata_) = edata {
- is_mlti = RMDemuxCommon::parse_stream_info(&mut self.str_data, strmgr, stream_no, &edata_)?;
- }
- } else {
- self.str_data.streams.push(RMStreamType::Unknown);
- }
- if !is_mlti {
- self.str_data.str_ids.push(stream_no);
- }
-
- Ok(())
- }
-}
-
-fn read_string_size(src: &mut ByteReader, size: usize) -> DemuxerResult<String> {
- let mut vec: Vec<u8> = Vec::new();
- for _ in 0..size {
- let c = src.read_byte()?;
- vec.push(c);
- }
- let str = String::from_utf8(vec);
- if str.is_ok() {
- Ok(str.unwrap())
- } else {
- Ok(String::new())
- }
-}
-
-struct RealAudioDemuxer<'a> {
- src: &'a mut ByteReader<'a>,
- stream: Option<RMAudioStream>,
- data_start: u64,
- data_end: u64,
- blk_size: usize,
- queued_pkts: Vec<NAPacket>,
-}
-
-impl<'a> DemuxCore<'a> for RealAudioDemuxer<'a> {
- #[allow(unused_variables)]
- fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- let magic = self.src.read_u32be()?;
- validate!(magic == mktag!(b".ra\xFD"));
- let ver = self.src.read_u16be()?;
- let ainfo = match ver {
- 3 => {
- parse_aformat3(&mut self.src)?
- },
- 4 => {
- parse_aformat4(&mut self.src)?
- },
- 5 => {
- parse_aformat5(&mut self.src)?
- },
- _ => {
- println!("unknown version {}", ver);
- return Err(DemuxerError::InvalidData);
- },
- };
-println!(" got ainfo {:?}", ainfo);
- let cname = find_codec_name(RM_AUDIO_CODEC_REGISTER, ainfo.fcc);
- let blk_size = if ainfo.fcc != mktag!(b"sipr") {
- ainfo.granularity as usize
- } else {
- validate!(ainfo.flavor <= 3);
- RM_SIPRO_BLOCK_SIZES[ainfo.flavor as usize]
- };
- let srate = ainfo.sample_rate;
- let soniton = NASoniton::new(ainfo.sample_size as u8, SONITON_FLAG_SIGNED);
- let ahdr = NAAudioInfo::new(srate, ainfo.channels as u8, soniton, blk_size);
- let extradata = if ainfo.edata_size == 0 {
- None
- } else {
- let mut dta: Vec<u8> = Vec::with_capacity(ainfo.edata_size as usize);
- dta.resize(ainfo.edata_size as usize, 0);
- self.src.read_buf(dta.as_mut_slice())?;
- Some(dta)
- };
- let nainfo = NACodecInfo::new(cname, NACodecTypeInfo::Audio(ahdr), extradata);
- let res = strmgr.add_stream(NAStream::new(StreamType::Audio, 0, nainfo, 1, srate));
- if res.is_none() { return Err(MemoryError); }
-
- let astr = RMAudioStream::new(ainfo.ileave_info);
- self.data_start = self.src.tell();
- self.data_end = if ainfo.total_bytes > 0 { self.src.tell() + (ainfo.total_bytes as u64) } else { 0 };
- self.blk_size = blk_size;
- self.stream = Some(astr);
-
- Ok(())
- }
-
- fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
- if !self.queued_pkts.is_empty() {
- let pkt = self.queued_pkts.pop().unwrap();
- return Ok(pkt);
- }
- if (self.data_end != 0) && (self.src.tell() >= self.data_end) {
- return Err(DemuxerError::EOF);
- }
- let streamres = strmgr.get_stream_by_id(0);
- let stream = streamres.unwrap();
- if let Some(ref mut astr) = self.stream {
- loop {
- let ret = astr.read_apackets(&mut self.queued_pkts, &mut self.src, stream.clone(), 0, false, self.blk_size);
- if let Err(DemuxerError::TryAgain) = ret {
- continue;
- }
- return ret;
- }
- }
- Err(DemuxerError::NoSuchInput)
- }
-
- #[allow(unused_variables)]
- fn seek(&mut self, time: u64) -> DemuxerResult<()> {
- Err(NotImplemented)
- }
-}
-
-impl<'a> RealAudioDemuxer<'a> {
- fn new(io: &'a mut ByteReader<'a>) -> Self {
- RealAudioDemuxer {
- src: io,
- data_start: 0,
- data_end: 0,
- blk_size: 0,
- stream: None,
- queued_pkts: Vec::new(),
- }
- }
-}
-
-enum IVRRecord {
- Invalid(u8),
- StreamProperties(usize),
- Packet { ts: u32, str: u32, flags: u32, len: usize, checksum: u32 },
- IntValue(Vec<u8>, u32),
- BinaryData(Vec<u8>, Vec<u8>),
- StringData(Vec<u8>, Vec<u8>),
- HeaderEnd,
- DataStart,
- DataEnd,
-}
-
-impl IVRRecord {
- fn read_string(src: &mut ByteReader) -> DemuxerResult<Vec<u8>> {
- let len = src.read_u32be()? as usize;
- let mut val = Vec::with_capacity(len);
- val.resize(len, 0);
- src.read_buf(val.as_mut_slice())?;
- Ok(val)
- }
-
- fn read(src: &mut ByteReader) -> DemuxerResult<Self> {
- let code = src.read_byte()?;
- match code {
- 1 => {
- let val = src.read_u32be()? as usize;
- Ok(IVRRecord::StreamProperties(val))
- },
- 2 => {
- let ts = src.read_u32be()?;
- let str = src.read_u16be()? as u32;
- let flags = src.read_u32be()?;
- let len = src.read_u32be()? as usize;
- let chk = src.read_u32be()?;
- Ok(IVRRecord::Packet { ts, str, flags, len, checksum: chk })
- },
- 3 => {
- let name = Self::read_string(src)?;
- let len = src.read_u32be()?;
- validate!(len == 4);
- let val = src.read_u32be()?;
- Ok(IVRRecord::IntValue(name, val))
- },
- 4 => {
- let name = Self::read_string(src)?;
- let len = src.read_u32be()? as usize;
- let mut val = Vec::with_capacity(len);
- val.resize(len, 0);
- src.read_buf(val.as_mut_slice())?;
- Ok(IVRRecord::BinaryData(name, val))
- },
- 5 => {
- let name = Self::read_string(src)?;
- let val = Self::read_string(src)?;
- Ok(IVRRecord::StringData(name, val))
- },
- 6 => Ok(IVRRecord::HeaderEnd),
- 7 => {
- src.read_skip(8)?; // always zero?
- Ok(IVRRecord::DataEnd)
- },
- 8 => {
- src.read_skip(8)?; // always zero?
- Ok(IVRRecord::DataStart)
- },
- _ => Ok(IVRRecord::Invalid(code)),
- }
- }
- fn is_data_start(&self) -> bool {
- match *self {
- IVRRecord::DataStart => true,
- _ => false,
- }
- }
-}
-
-impl fmt::Display for IVRRecord {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- match *self {
- IVRRecord::Invalid(typ) => write!(f, "Invalid({:02X})", typ),
- IVRRecord::StreamProperties(num) =>
- write!(f, "({} stream properties)", num),
- IVRRecord::Packet { ts, str, flags, len, checksum } =>
- write!(f, "paket({}, {}, {:X}, {}, {})", ts, str, flags, len, checksum),
- IVRRecord::IntValue(ref name, val) =>
- write!(f, "({} = {})", String::from_utf8_lossy(name), val),
- IVRRecord::BinaryData(ref name, ref val) =>
- write!(f, "({} = {} bytes)", String::from_utf8_lossy(name), val.len()),
- IVRRecord::StringData(ref name, ref val) =>
- write!(f, "({} = {})", String::from_utf8_lossy(name), String::from_utf8_lossy(val)),
- IVRRecord::HeaderEnd => write!(f, "header end"),
- IVRRecord::DataEnd => write!(f, "data end"),
- IVRRecord::DataStart => write!(f, "data start"),
- }
- }
-}
-
-struct RecordDemuxer {
- start_pos: u64,
- cur_pos: u64,
- start_str: u32,
- remap_ids: Vec<u32>,
-}
-
-impl RecordDemuxer {
- fn new(pos: u64, start_str: u32) -> Self {
- RecordDemuxer {
- start_pos: pos,
- cur_pos: pos,
- start_str: start_str,
- remap_ids: Vec::new(),
- }
- }
- fn parse_header(&mut self, src: &mut ByteReader, strmgr: &mut StreamManager, str_data: &mut CommonStreamData) -> DemuxerResult<()> {
- src.seek(SeekFrom::Start(self.cur_pos))?;
- let magic = src.read_u32be()?;
- validate!(magic == mktag!(b".REC"));
- let _smth = src.read_byte()?;
- let num_entries = src.read_u32be()? as usize;
- for _ in 0..num_entries {
- let _rec = IVRRecord::read(src)?;
-//println!(" header rec {}", _rec);
- }
- let mut has_seek_table = false;
- let mut cur_str_no = 0;
- loop {
- let rec = IVRRecord::read(src)?;
- match rec {
- IVRRecord::HeaderEnd => { break; },
- IVRRecord::StreamProperties(num) => {
- let stream_no = cur_str_no + self.start_str;
- cur_str_no += 1;
- let mut parsed = false;
- let mut real_stream_no = 0;
- for _ in 0..num {
- let rec = IVRRecord::read(src)?;
-//println!(" strm property {}", rec);
- match rec {
- IVRRecord::IntValue(ref name, val) => {
- if name == b"StreamNumber\0" {
- real_stream_no = val;
- }
- },
- IVRRecord::BinaryData(ref name, ref val) => {
- if name == b"OpaqueData\0" {
- validate!(!parsed);
- let is_mlti = RMDemuxCommon::parse_stream_info(str_data, strmgr, stream_no, val)?;
- if !is_mlti {
- str_data.str_ids.push(stream_no);
- }
- parsed = true;
- }
- },
- IVRRecord::StringData(ref name, ref val) => {
- if (name == b"SeekType\0") && (val != b"None\0") {
- has_seek_table = true;
- }
- },
- _ => { return Err(DemuxerError::InvalidData); }
- };
- }
- if !parsed {
- str_data.streams.push(RMStreamType::Unknown);
- str_data.str_ids.push(stream_no);
- }
- self.remap_ids.push(real_stream_no);
- },
- _ => {println!(" unexpected {}", rec); return Err(DemuxerError::InvalidData); }
- };
- }
- println!(" now @ {:X}", src.tell());
- let off0 = src.read_u32be()? as u64;
- let _off1 = src.read_u32be()?;
- let _off2 = src.read_u32be()?;
- validate!(off0 + self.start_pos == src.tell());
- println!(" has seek tab: {}", has_seek_table);
- if has_seek_table {
- src.read_skip(4)?;
- let data_off = src.read_u32be()? as u64;
- println!(" new off {:X}", data_off);
- let pos = src.tell();
- validate!(data_off + self.start_pos > pos);
- src.read_skip((data_off + self.start_pos - pos) as usize)?;
- let rec = IVRRecord::read(src)?;
- validate!(rec.is_data_start());
- } else {
- let ntype = src.peek_byte()?;
- validate!((ntype == 2) || (ntype == 7)); // packet or data end, no start
- }
-
- self.cur_pos = src.tell();
-
- Ok(())
- }
- fn get_packet(&mut self, src: &mut ByteReader, str_data: &mut CommonStreamData, strmgr: &StreamManager, queued_pkts: &mut Vec<NAPacket>, slice_buf: &mut Vec<u8>) -> DemuxerResult<NAPacket> {
- src.seek(SeekFrom::Start(self.cur_pos))?;
- loop {
- let rec = IVRRecord::read(src)?;
- match rec {
- IVRRecord::Packet { ts, str, flags: _, len, checksum: _ } => {
- let payload_size = len;
- let sr = self.remap_ids.iter().position(|x| *x == str);
- validate!(sr.is_some());
- let str_no = self.start_str + (sr.unwrap() as u32);
- let stream_id = str_data.get_stream_id(str_no as u32, 0/*pkt_grp*/);
- let sr = str_data.find_stream(stream_id);
- if sr.is_none() {
- src.read_skip(payload_size)?;
- return Err(DemuxerError::InvalidData);
- }
- let str_id = sr.unwrap();
-
- let streamres = strmgr.get_stream_by_id(stream_id);
- if streamres.is_none() {
- src.read_skip(payload_size)?;
- continue;
- }
- let stream = streamres.unwrap();
- if strmgr.is_ignored_id(stream_id) {
- src.read_skip(payload_size)?;
- continue;
- }
- let keyframe = false;
- let ret = RMDemuxCommon::parse_packet_payload(src, &mut str_data.streams[str_id], stream, slice_buf, queued_pkts, keyframe, ts, payload_size);
- if let Err(DemuxerError::TryAgain) = ret {
- continue;
- } else {
- self.cur_pos = src.tell();
- return ret;
- }
- },
- IVRRecord::DataEnd => return Err(DemuxerError::EOF),
- _ => return Err(DemuxerError::InvalidData),
- }
- }
- }
-}
-
-struct RealIVRDemuxer<'a> {
- src: &'a mut ByteReader<'a>,
- recs: Vec<RecordDemuxer>,
- cur_rec: usize,
- queued_pkts: Vec<NAPacket>,
- slice_buf: Vec<u8>,
- str_data: CommonStreamData,
-}
-
-impl<'a> DemuxCore<'a> for RealIVRDemuxer<'a> {
- #[allow(unused_variables)]
- fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
- let magic = self.src.peek_u32be()?;
- if magic == mktag!(b".REC") {
- let mut rec = RecordDemuxer::new(0, 0);
- rec.parse_header(&mut self.src, strmgr, &mut self.str_data)?;
- self.recs.push(rec);
- } else if magic == mktag!(b".R1M") {
-println!("R1M kind");
- self.src.read_skip(4)?; // magic
- self.src.read_skip(3)?; // always 0, 1, 1 ?
- let _name = IVRRecord::read_string(&mut self.src)?;
- self.src.read_skip(1)?; // always 0?
- let len1 = self.src.read_u32be()? as u64;
- let off1 = self.src.read_u64be()?;
- let cpos = self.src.tell();
- validate!(off1 == len1 + cpos - 8);
- self.src.read_skip((off1 - cpos) as usize)?;
- loop {
- let typ = self.src.read_byte()?;
- println!(" at {:X} type {:02X}", self.src.tell(), typ);
- match typ {
- 1 => {
- let len = self.src.read_u32be()?;
- self.src.read_skip(len as usize)?;
- },
- 2 => {
- let len = self.src.read_u32be()? as u64;
- let pos = self.src.tell();
- let num_streams = self.str_data.streams.len() as u32;
- let mut rec = RecordDemuxer::new(pos + 12, num_streams);
- rec.parse_header(&mut self.src, strmgr, &mut self.str_data)?;
- self.recs.push(rec);
- self.src.seek(SeekFrom::Start(pos + len))?;
- },
- b'R' => {
- let mut buf: [u8; 2] = [0; 2];
- self.src.peek_buf(&mut buf)?;
- if (buf[0] == b'J') && (buf[1] == b'M') { // RJMx markers at the end of file
- break;
- } else {
- return Err(DemuxerError::InvalidData);
- }
- },
- _ => { return Err(DemuxerError::InvalidData); },
- };
- }
- } else {
- return Err(DemuxerError::InvalidData);
- }
-
- Ok(())
- }
-
- fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
- if !self.queued_pkts.is_empty() {
- let pkt = self.queued_pkts.pop().unwrap();
- return Ok(pkt);
- }
- loop {
- if self.cur_rec >= self.recs.len() { return Err(DemuxerError::EOF); }
- let res = self.recs[self.cur_rec].get_packet(&mut self.src, &mut self.str_data, strmgr, &mut self.queued_pkts, &mut self.slice_buf);
- if let Err(DemuxerError::EOF) = res {
- self.cur_rec += 1;
- } else {
- return res;
- }
- }
- }
-
- #[allow(unused_variables)]
- fn seek(&mut self, time: u64) -> DemuxerResult<()> {
- Err(NotImplemented)
- }
-}
-
-impl<'a> RealIVRDemuxer<'a> {
- fn new(io: &'a mut ByteReader<'a>) -> Self {
- RealIVRDemuxer {
- src: io,
- recs: Vec::new(),
- cur_rec: 0,
- queued_pkts: Vec::new(),
- slice_buf: Vec::new(),
- str_data: CommonStreamData::new(),
- }
- }
-}
-
-static RM_VIDEO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[
- (b"RV10", "realvideo1"),
- (b"RV20", "realvideo2"),
- (b"RVTR", "realvideo2"),
- (b"RV30", "realvideo3"),
- (b"RV40", "realvideo4"),
- (b"RV60", "realvideo6"),
- (b"CLV1", "clearvideo_rm"),
-];
-
-static RM_AUDIO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[
- (b"lpcJ", "ra14.4"),
- (b"28_8", "ra28.8"),
- (b"cook", "cook"),
- (b"dnet", "ac3"),
- (b"sipr", "sipro"),
- (b"atrc", "atrac3"),
- (b"LSD:", "ralf"),
- (b"raac", "aac"),
- (b"racp", "aac"),
-];
-
-pub struct RealMediaDemuxerCreator { }
-
-impl DemuxerCreator for RealMediaDemuxerCreator {
- fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> {
- Box::new(RealMediaDemuxer::new(br))
- }
- fn get_name(&self) -> &'static str { "realmedia" }
-}
-
-pub struct RealAudioDemuxerCreator { }
-
-impl DemuxerCreator for RealAudioDemuxerCreator {
- fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> {
- Box::new(RealAudioDemuxer::new(br))
- }
- fn get_name(&self) -> &'static str { "realaudio" }
-}
-
-pub struct RealIVRDemuxerCreator { }
-
-impl DemuxerCreator for RealIVRDemuxerCreator {
- fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> {
- Box::new(RealIVRDemuxer::new(br))
- }
- fn get_name(&self) -> &'static str { "real_ivr" }
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
- use std::fs::File;
-
- #[test]
- fn test_rm_demux() {
- let mut file =
- File::open("assets/RV/rv10_dnet_640x352_realvideo_encoder_4.0.rm").unwrap();
-// File::open("assets/RV/rv20_cook_640x352_realproducer_plus_8.51.rm").unwrap();
-// File::open("assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm").unwrap();
-// File::open("assets/RV/rv30_atrc_384x208_realproducer_plus_8.51.rm").unwrap();
-// File::open("assets/RV/rv30_chroma_drift.rm").unwrap();
-// File::open("assets/RV/rv30_weighted_mc.rm").unwrap();
-// File::open("assets/RV/rv40_weighted_mc.rmvb").unwrap();
-// File::open("assets/RV/rv40_weighted_mc_2.rmvb").unwrap();
-// File::open("assets/RV/clv1_sipr_384x208_realvideo_encoder_4.0.rm").unwrap();
-// File::open("assets/RV/luckynight.rmvb").unwrap();
-// File::open("assets/RV/rv40_ralf.rmvb").unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let mut dmx = RealMediaDemuxer::new(&mut br);
- let mut sm = StreamManager::new();
- dmx.open(&mut sm).unwrap();
-
- loop {
- let pktres = dmx.get_frame(&mut sm);
- if let Err(e) = pktres {
- if e == DemuxerError::EOF { break; }
- panic!("error");
- }
- let pkt = pktres.unwrap();
- println!("Got {}", pkt);
- }
-//panic!("the end");
- }
- #[test]
- fn test_ra_demux() {
- let mut file =
-// File::open("assets/RV/welcome288.ra").unwrap();
- File::open("assets/RV/diemusik.ra").unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let mut dmx = RealAudioDemuxer::new(&mut br);
- let mut sm = StreamManager::new();
- dmx.open(&mut sm).unwrap();
-
- loop {
- let pktres = dmx.get_frame(&mut sm);
- if let Err(e) = pktres {
- if e == DemuxerError::EOF { break; }
- panic!("error");
- }
- let pkt = pktres.unwrap();
- println!("Got {}", pkt);
- }
- }
- #[test]
- fn test_ivr_demux() {
- let mut file =
- File::open("assets/RV/Opener_rm_hi.ivr").unwrap();
-// File::open("assets/RV/SherwinWilliamsCommercial.ivr").unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let mut dmx = RealIVRDemuxer::new(&mut br);
- let mut sm = StreamManager::new();
- dmx.open(&mut sm).unwrap();
-
- loop {
- let pktres = dmx.get_frame(&mut sm);
- if let Err(e) = pktres {
- if e == DemuxerError::EOF { break; }
- panic!("error");
- }
- let pkt = pktres.unwrap();
- println!("Got {}", pkt);
- }
- }
-}
diff --git a/src/detect.rs b/src/detect.rs
deleted file mode 100644
index 0b60641..0000000
--- a/src/detect.rs
+++ /dev/null
@@ -1,268 +0,0 @@
-use std::io::SeekFrom;
-use crate::io::byteio::ByteReader;
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum DetectionScore {
- No,
- ExtensionMatches,
- MagicMatches,
-}
-
-impl DetectionScore {
- pub fn less(&self, other: DetectionScore) -> bool {
- (*self as i32) < (other as i32)
- }
-}
-
-#[allow(dead_code)]
-enum Arg {
- Byte(u8),
- U16BE(u16),
- U16LE(u16),
- U24BE(u32),
- U24LE(u32),
- U32BE(u32),
- U32LE(u32),
- U64BE(u64),
- U64LE(u64),
-}
-
-impl Arg {
- fn val(&self) -> u64 {
- match *self {
- Arg::Byte(b) => { b as u64 }
- Arg::U16BE(v) => { v as u64 }
- Arg::U16LE(v) => { v as u64 }
- Arg::U24BE(v) => { v as u64 }
- Arg::U24LE(v) => { v as u64 }
- Arg::U32BE(v) => { v as u64 }
- Arg::U32LE(v) => { v as u64 }
- Arg::U64BE(v) => { v }
- Arg::U64LE(v) => { v }
- }
- }
- fn read_val(&self, src: &mut ByteReader) -> Option<u64> {
- match *self {
- Arg::Byte(_) => {
- let res = src.peek_byte();
- if let Err(_) = res { return None; }
- Some(res.unwrap() as u64)
- }
- Arg::U16BE(_) => {
- let res = src.peek_u16be();
- if let Err(_) = res { return None; }
- Some(res.unwrap() as u64)
- }
- Arg::U16LE(_) => {
- let res = src.peek_u16le();
- if let Err(_) = res { return None; }
- Some(res.unwrap() as u64)
- }
- Arg::U24BE(_) => {
- let res = src.peek_u24be();
- if let Err(_) = res { return None; }
- Some(res.unwrap() as u64)
- }
- Arg::U24LE(_) => {
- let res = src.peek_u24le();
- if let Err(_) = res { return None; }
- Some(res.unwrap() as u64)
- }
- Arg::U32BE(_) => {
- let res = src.peek_u32be();
- if let Err(_) = res { return None; }
- Some(res.unwrap() as u64)
- }
- Arg::U32LE(_) => {
- let res = src.peek_u32le();
- if let Err(_) = res { return None; }
- Some(res.unwrap() as u64)
- }
- Arg::U64BE(_) => {
- let res = src.peek_u64be();
- if let Err(_) = res { return None; }
- Some(res.unwrap())
- }
- Arg::U64LE(_) => {
- let res = src.peek_u64le();
- if let Err(_) = res { return None; }
- Some(res.unwrap())
- }
- }
- }
- fn eq(&self, src: &mut ByteReader) -> bool {
- let val = self.read_val(src);
- if let None = val { false }
- else { val.unwrap() == self.val() }
- }
- fn ge(&self, src: &mut ByteReader) -> bool {
- let val = self.read_val(src);
- if let None = val { false }
- else { val.unwrap() >= self.val() }
- }
- fn gt(&self, src: &mut ByteReader) -> bool {
- let val = self.read_val(src);
- if let None = val { false }
- else { val.unwrap() > self.val() }
- }
- fn le(&self, src: &mut ByteReader) -> bool {
- let val = self.read_val(src);
- if let None = val { false }
- else { val.unwrap() <= self.val() }
- }
- fn lt(&self, src: &mut ByteReader) -> bool {
- let val = self.read_val(src);
- if let None = val { false }
- else { val.unwrap() < self.val() }
- }
-}
-
-#[allow(dead_code)]
-enum CC<'a> {
- Or(&'a CC<'a>, &'a CC<'a>),
- Eq(Arg),
- Str(&'static [u8]),
- In(Arg, Arg),
- Lt(Arg),
- Le(Arg),
- Gt(Arg),
- Ge(Arg),
-}
-
-impl<'a> CC<'a> {
- fn eval(&self, src: &mut ByteReader) -> bool {
- match *self {
- CC::Or (ref a, ref b) => { a.eval(src) || b.eval(src) },
- CC::Eq(ref arg) => { arg.eq(src) },
- CC::In(ref a, ref b) => { a.le(src) && b.ge(src) },
- CC::Lt(ref arg) => { arg.lt(src) },
- CC::Le(ref arg) => { arg.le(src) },
- CC::Gt(ref arg) => { arg.gt(src) },
- CC::Ge(ref arg) => { arg.ge(src) },
- CC::Str(str) => {
- let mut val: Vec<u8> = Vec::with_capacity(str.len());
- val.resize(str.len(), 0);
- let res = src.peek_buf(val.as_mut_slice());
- if let Err(_) = res { return false; }
- val == str
- }
- }
- }
-}
-
-struct CheckItem<'a> {
- offs: u32,
- cond: &'a CC<'a>,
-}
-
-#[allow(dead_code)]
-struct DetectConditions<'a> {
- demux_name: &'static str,
- extensions: &'static str,
- conditions: &'a [CheckItem<'a>],
-}
-
-const DETECTORS: &[DetectConditions] = &[
- DetectConditions {
- demux_name: "avi",
- extensions: ".avi",
- conditions: &[CheckItem{offs: 0, cond: &CC::Or(&CC::Str(b"RIFF"), &CC::Str(b"ON2 ")) },
- CheckItem{offs: 8, cond: &CC::Or(&CC::Or(&CC::Str(b"AVI LIST"),
- &CC::Str(b"AVIXLIST")),
- &CC::Str(b"ON2fLIST")) },
- ]
- },
- DetectConditions {
- demux_name: "gdv",
- extensions: ".gdv",
- conditions: &[CheckItem{offs: 0, cond: &CC::Eq(Arg::U32LE(0x29111994))}],
- },
- DetectConditions {
- demux_name: "realaudio",
- extensions: ".ra,.ram",
- conditions: &[CheckItem{offs: 0, cond: &CC::Str(b".ra\xFD")}],
- },
- DetectConditions {
- demux_name: "realmedia",
- extensions: ".rm,.rmvb,.rma,.ra,.ram",
- conditions: &[CheckItem{offs: 0, cond: &CC::Or(&CC::Str(b".RMF"), &CC::Str(b".RMP")) },
- CheckItem{offs: 4, cond: &CC::Ge(Arg::U32BE(10))}],
- },
- DetectConditions {
- demux_name: "real_ivr",
- extensions: ".ivr",
- conditions: &[CheckItem{offs: 0, cond: &CC::Or(&CC::Str(b".R1M"), &CC::Str(b".REC"))}],
- },
-];
-
-pub fn detect_format(name: &str, src: &mut ByteReader) -> Option<(&'static str, DetectionScore)> {
- let mut result = None;
- let lname = name.to_lowercase();
- for detector in DETECTORS {
- let mut score = DetectionScore::No;
- if name.len() > 0 {
- for ext in detector.extensions.split(',') {
- if lname.ends_with(ext) {
- score = DetectionScore::ExtensionMatches;
- break;
- }
- }
- }
- let mut passed = detector.conditions.len() > 0;
- for ck in detector.conditions {
- let ret = src.seek(SeekFrom::Start(ck.offs as u64));
- if let Err(_) = ret {
- passed = false;
- break;
- }
- if !ck.cond.eval(src) {
- passed = false;
- break;
- }
- }
- if passed {
- score = DetectionScore::MagicMatches;
- }
- if score == DetectionScore::MagicMatches {
- return Some((detector.demux_name, score));
- }
- if let None = result {
- result = Some((detector.demux_name, score));
- } else {
- let (_, oldsc) = result.unwrap();
- if oldsc.less(score) {
- result = Some((detector.demux_name, score));
- }
- }
- }
- result
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
- use std::fs::File;
- use crate::io::byteio::*;
-
- #[test]
- fn test_avi_detect() {
- let name = "assets/laser05.avi";
- let mut file = File::open(name).unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let (name, score) = detect_format(name, &mut br).unwrap();
- assert_eq!(name, "avi");
- assert_eq!(score, DetectionScore::MagicMatches);
- }
-
- #[test]
- fn test_gdv_detect() {
- let name = "assets/intro1.gdv";
- let mut file = File::open(name).unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let (name, score) = detect_format(name, &mut br).unwrap();
- assert_eq!(name, "gdv");
- assert_eq!(score, DetectionScore::MagicMatches);
- }
-}
diff --git a/src/dsp/fft.rs b/src/dsp/fft.rs
deleted file mode 100644
index 98f8904..0000000
--- a/src/dsp/fft.rs
+++ /dev/null
@@ -1,475 +0,0 @@
-use std::f32::{self, consts};
-use std::ops::{Not, Neg, Add, AddAssign, Sub, SubAssign, Mul, MulAssign};
-use std::fmt;
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub struct FFTComplex {
- pub re: f32,
- pub im: f32,
-}
-
-impl FFTComplex {
- pub fn exp(val: f32) -> Self {
- FFTComplex { re: val.cos(), im: val.sin() }
- }
- pub fn rotate(self) -> Self {
- FFTComplex { re: -self.im, im: self.re }
- }
- pub fn scale(self, scale: f32) -> Self {
- FFTComplex { re: self.re * scale, im: self.im * scale }
- }
-}
-
-impl Neg for FFTComplex {
- type Output = FFTComplex;
- fn neg(self) -> Self::Output {
- FFTComplex { re: -self.re, im: -self.im }
- }
-}
-
-impl Not for FFTComplex {
- type Output = FFTComplex;
- fn not(self) -> Self::Output {
- FFTComplex { re: self.re, im: -self.im }
- }
-}
-
-impl Add for FFTComplex {
- type Output = FFTComplex;
- fn add(self, other: Self) -> Self::Output {
- FFTComplex { re: self.re + other.re, im: self.im + other.im }
- }
-}
-
-impl AddAssign for FFTComplex {
- fn add_assign(&mut self, other: Self) {
- self.re += other.re;
- self.im += other.im;
- }
-}
-
-impl Sub for FFTComplex {
- type Output = FFTComplex;
- fn sub(self, other: Self) -> Self::Output {
- FFTComplex { re: self.re - other.re, im: self.im - other.im }
- }
-}
-
-impl SubAssign for FFTComplex {
- fn sub_assign(&mut self, other: Self) {
- self.re -= other.re;
- self.im -= other.im;
- }
-}
-
-impl Mul for FFTComplex {
- type Output = FFTComplex;
- fn mul(self, other: Self) -> Self::Output {
- FFTComplex { re: self.re * other.re - self.im * other.im,
- im: self.im * other.re + self.re * other.im }
- }
-}
-
-impl MulAssign for FFTComplex {
- fn mul_assign(&mut self, other: Self) {
- let re = self.re * other.re - self.im * other.im;
- let im = self.im * other.re + self.re * other.im;
- self.re = re;
- self.im = im;
- }
-}
-
-impl fmt::Display for FFTComplex {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "({}, {})", self.re, self.im)
- }
-}
-
-pub const FFTC_ZERO: FFTComplex = FFTComplex { re: 0.0, im: 0.0 };
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum FFTMode {
- Matrix,
- CooleyTukey,
- SplitRadix,
-}
-
-pub struct FFT {
- table: Vec<FFTComplex>,
- perms: Vec<usize>,
- swaps: Vec<usize>,
- bits: u32,
- mode: FFTMode,
-}
-
-impl FFT {
- fn do_fft_inplace_ct(&mut self, data: &mut [FFTComplex], bits: u32, forward: bool) {
- if bits == 0 { return; }
- if bits == 1 {
- let sum01 = data[0] + data[1];
- let dif01 = data[0] - data[1];
- data[0] = sum01;
- data[1] = dif01;
- return;
- }
- if bits == 2 {
- let sum01 = data[0] + data[1];
- let dif01 = data[0] - data[1];
- let sum23 = data[2] + data[3];
- let dif23 = data[2] - data[3];
- if forward {
- data[0] = sum01 + sum23;
- data[1] = dif01 - dif23.rotate();
- data[2] = sum01 - sum23;
- data[3] = dif01 + dif23.rotate();
- } else {
- data[0] = sum01 + sum23;
- data[1] = dif01 + dif23.rotate();
- data[2] = sum01 - sum23;
- data[3] = dif01 - dif23.rotate();
- }
- return;
- }
-
- let hsize = (1 << (bits - 1)) as usize;
- self.do_fft_inplace_ct(&mut data[0..hsize], bits - 1, forward);
- self.do_fft_inplace_ct(&mut data[hsize..], bits - 1, forward);
- let offs = hsize;
- {
- let e = data[0];
- let o = data[hsize];
- data[0] = e + o;
- data[hsize] = e - o;
- }
- if forward {
- for k in 1..hsize {
- let e = data[k];
- let o = data[k + hsize] * self.table[offs + k];
- data[k] = e + o;
- data[k + hsize] = e - o;
- }
- } else {
- for k in 1..hsize {
- let e = data[k];
- let o = data[k + hsize] * !self.table[offs + k];
- data[k] = e + o;
- data[k + hsize] = e - o;
- }
- }
- }
-
- fn do_fft_inplace_splitradix(&mut self, data: &mut [FFTComplex], bits: u32, forward: bool) {
- if bits == 0 { return; }
- if bits == 1 {
- let sum01 = data[0] + data[1];
- let dif01 = data[0] - data[1];
- data[0] = sum01;
- data[1] = dif01;
- return;
- }
- if bits == 2 {
- let sum01 = data[0] + data[2];
- let dif01 = data[0] - data[2];
- let sum23 = data[1] + data[3];
- let dif23 = data[1] - data[3];
- if forward {
- data[0] = sum01 + sum23;
- data[1] = dif01 - dif23.rotate();
- data[2] = sum01 - sum23;
- data[3] = dif01 + dif23.rotate();
- } else {
- data[0] = sum01 + sum23;
- data[1] = dif01 + dif23.rotate();
- data[2] = sum01 - sum23;
- data[3] = dif01 - dif23.rotate();
- }
- return;
- }
- let qsize = (1 << (bits - 2)) as usize;
- let hsize = (1 << (bits - 1)) as usize;
- let q3size = qsize + hsize;
-
- self.do_fft_inplace_splitradix(&mut data[0 ..hsize], bits - 1, forward);
- self.do_fft_inplace_splitradix(&mut data[hsize ..q3size], bits - 2, forward);
- self.do_fft_inplace_splitradix(&mut data[q3size..], bits - 2, forward);
- let off = hsize;
- if forward {
- {
- let t3 = data[0 + hsize] + data[0 + q3size];
- let t4 = (data[0 + hsize] - data[0 + q3size]).rotate();
- let e1 = data[0];
- let e2 = data[0 + qsize];
- data[0] = e1 + t3;
- data[0 + qsize] = e2 - t4;
- data[0 + hsize] = e1 - t3;
- data[0 + q3size] = e2 + t4;
- }
- for k in 1..qsize {
- let t1 = self.table[off + k * 2 + 0] * data[k + hsize];
- let t2 = self.table[off + k * 2 + 1] * data[k + q3size];
- let t3 = t1 + t2;
- let t4 = (t1 - t2).rotate();
- let e1 = data[k];
- let e2 = data[k + qsize];
- data[k] = e1 + t3;
- data[k + qsize] = e2 - t4;
- data[k + hsize] = e1 - t3;
- data[k + qsize * 3] = e2 + t4;
- }
- } else {
- {
- let t3 = data[0 + hsize] + data[0 + q3size];
- let t4 = (data[0 + hsize] - data[0 + q3size]).rotate();
- let e1 = data[0];
- let e2 = data[0 + qsize];
- data[0] = e1 + t3;
- data[0 + qsize] = e2 + t4;
- data[0 + hsize] = e1 - t3;
- data[0 + q3size] = e2 - t4;
- }
- for k in 1..qsize {
- let t1 = !self.table[off + k * 2 + 0] * data[k + hsize];
- let t2 = !self.table[off + k * 2 + 1] * data[k + q3size];
- let t3 = t1 + t2;
- let t4 = (t1 - t2).rotate();
- let e1 = data[k];
- let e2 = data[k + qsize];
- data[k] = e1 + t3;
- data[k + qsize] = e2 + t4;
- data[k + hsize] = e1 - t3;
- data[k + qsize * 3] = e2 - t4;
- }
- }
- }
-
- pub fn do_fft(&mut self, src: &[FFTComplex], dst: &mut [FFTComplex], forward: bool) {
- match self.mode {
- FFTMode::Matrix => {
- let base = if forward { -consts::PI * 2.0 / (src.len() as f32) }
- else { consts::PI * 2.0 / (src.len() as f32) };
- for k in 0..src.len() {
- let mut sum = FFTC_ZERO;
- for n in 0..src.len() {
- let w = FFTComplex::exp(base * ((n * k) as f32));
- sum += src[n] * w;
- }
- dst[k] = sum;
- }
- },
- FFTMode::CooleyTukey => {
- let bits = self.bits;
- for k in 0..src.len() { dst[k] = src[self.perms[k]]; }
- self.do_fft_inplace_ct(dst, bits, forward);
- },
- FFTMode::SplitRadix => {
- let bits = self.bits;
- for k in 0..src.len() { dst[k] = src[self.perms[k]]; }
- self.do_fft_inplace_splitradix(dst, bits, forward);
- },
- };
- }
-
- pub fn do_fft_inplace(&mut self, data: &mut [FFTComplex], forward: bool) {
- for idx in 0..self.swaps.len() {
- let nidx = self.swaps[idx];
- if idx != nidx {
- let t = data[nidx];
- data[nidx] = data[idx];
- data[idx] = t;
- }
- }
- match self.mode {
- FFTMode::Matrix => {
- let size = (1 << self.bits) as usize;
- let base = if forward { -consts::PI * 2.0 / (size as f32) }
- else { consts::PI * 2.0 / (size as f32) };
- let mut res: Vec<FFTComplex> = Vec::with_capacity(size);
- for k in 0..size {
- let mut sum = FFTC_ZERO;
- for n in 0..size {
- let w = FFTComplex::exp(base * ((n * k) as f32));
- sum += data[n] * w;
- }
- res.push(sum);
- }
- for k in 0..size {
- data[k] = res[k];
- }
- },
- FFTMode::CooleyTukey => {
- let bits = self.bits;
- self.do_fft_inplace_ct(data, bits, forward);
- },
- FFTMode::SplitRadix => {
- let bits = self.bits;
- self.do_fft_inplace_splitradix(data, bits, forward);
- },
- };
- }
-}
-
-pub struct FFTBuilder {
-}
-
-fn reverse_bits(inval: u32) -> u32 {
- const REV_TAB: [u8; 16] = [
- 0b0000, 0b1000, 0b0100, 0b1100, 0b0010, 0b1010, 0b0110, 0b1110,
- 0b0001, 0b1001, 0b0101, 0b1101, 0b0011, 0b1011, 0b0111, 0b1111,
- ];
-
- let mut ret = 0;
- let mut val = inval;
- for _ in 0..8 {
- ret = (ret << 4) | (REV_TAB[(val & 0xF) as usize] as u32);
- val = val >> 4;
- }
- ret
-}
-
-fn swp_idx(idx: usize, bits: u32) -> usize {
- let s = reverse_bits(idx as u32) as usize;
- s >> (32 - bits)
-}
-
-fn gen_sr_perms(swaps: &mut [usize], size: usize) {
- if size <= 4 { return; }
- let mut evec: Vec<usize> = Vec::with_capacity(size / 2);
- let mut ovec1: Vec<usize> = Vec::with_capacity(size / 4);
- let mut ovec2: Vec<usize> = Vec::with_capacity(size / 4);
- for k in 0..size/4 {
- evec.push (swaps[k * 4 + 0]);
- ovec1.push(swaps[k * 4 + 1]);
- evec.push (swaps[k * 4 + 2]);
- ovec2.push(swaps[k * 4 + 3]);
- }
- for k in 0..size/2 { swaps[k] = evec[k]; }
- for k in 0..size/4 { swaps[k + size/2] = ovec1[k]; }
- for k in 0..size/4 { swaps[k + 3*size/4] = ovec2[k]; }
- gen_sr_perms(&mut swaps[0..size/2], size/2);
- gen_sr_perms(&mut swaps[size/2..3*size/4], size/4);
- gen_sr_perms(&mut swaps[3*size/4..], size/4);
-}
-
-fn gen_swaps_for_perm(swaps: &mut Vec<usize>, perms: &Vec<usize>) {
- let mut idx_arr: Vec<usize> = Vec::with_capacity(perms.len());
- for i in 0..perms.len() { idx_arr.push(i); }
- let mut run_size = 0;
- let mut run_pos = 0;
- for idx in 0..perms.len() {
- if perms[idx] == idx_arr[idx] {
- if run_size == 0 { run_pos = idx; }
- run_size += 1;
- } else {
- for i in 0..run_size {
- swaps.push(run_pos + i);
- }
- run_size = 0;
- let mut spos = idx + 1;
- while idx_arr[spos] != perms[idx] { spos += 1; }
- idx_arr[spos] = idx_arr[idx];
- idx_arr[idx] = perms[idx];
- swaps.push(spos);
- }
- }
-}
-
-impl FFTBuilder {
- pub fn new_fft(mode: FFTMode, size: usize) -> FFT {
- let mut swaps: Vec<usize>;
- let mut perms: Vec<usize>;
- let mut table: Vec<FFTComplex>;
- let bits = 31 - (size as u32).leading_zeros();
- match mode {
- FFTMode::Matrix => {
- swaps = Vec::new();
- perms = Vec::new();
- table = Vec::new();
- },
- FFTMode::CooleyTukey => {
- perms = Vec::with_capacity(size);
- for i in 0..size {
- perms.push(swp_idx(i, bits));
- }
- swaps = Vec::with_capacity(size);
- table = Vec::with_capacity(size);
- for _ in 0..4 { table.push(FFTC_ZERO); }
- for b in 3..(bits+1) {
- let hsize = (1 << (b - 1)) as usize;
- let base = -consts::PI / (hsize as f32);
- for k in 0..hsize {
- table.push(FFTComplex::exp(base * (k as f32)));
- }
- }
- },
- FFTMode::SplitRadix => {
- perms = Vec::with_capacity(size);
- for i in 0..size {
- perms.push(i);
- }
- gen_sr_perms(perms.as_mut_slice(), 1 << bits);
- swaps = Vec::with_capacity(size);
- table = Vec::with_capacity(size);
- for _ in 0..4 { table.push(FFTC_ZERO); }
- for b in 3..(bits+1) {
- let qsize = (1 << (b - 2)) as usize;
- let base = -consts::PI / ((qsize * 2) as f32);
- for k in 0..qsize {
- table.push(FFTComplex::exp(base * ((k * 1) as f32)));
- table.push(FFTComplex::exp(base * ((k * 3) as f32)));
- }
- }
- },
- };
- gen_swaps_for_perm(&mut swaps, &perms);
- FFT { mode: mode, swaps: swaps, perms: perms, bits: bits, table: table }
- }
-}
-
-
-#[cfg(test)]
-mod test {
- use super::*;
-
- #[test]
- fn test_fft() {
- let mut fin: [FFTComplex; 128] = [FFTC_ZERO; 128];
- let mut fout1: [FFTComplex; 128] = [FFTC_ZERO; 128];
- let mut fout2: [FFTComplex; 128] = [FFTC_ZERO; 128];
- let mut fout3: [FFTComplex; 128] = [FFTC_ZERO; 128];
- let mut fft1 = FFTBuilder::new_fft(FFTMode::Matrix, fin.len());
- let mut fft2 = FFTBuilder::new_fft(FFTMode::CooleyTukey, fin.len());
- let mut fft3 = FFTBuilder::new_fft(FFTMode::SplitRadix, fin.len());
- let mut seed: u32 = 42;
- for i in 0..fin.len() {
- seed = seed.wrapping_mul(1664525).wrapping_add(1013904223);
- let val = (seed >> 16) as i16;
- fin[i].re = (val as f32) / 256.0;
- seed = seed.wrapping_mul(1664525).wrapping_add(1013904223);
- let val = (seed >> 16) as i16;
- fin[i].im = (val as f32) / 256.0;
- }
- fft1.do_fft(&fin, &mut fout1, true);
- fft2.do_fft(&fin, &mut fout2, true);
- fft3.do_fft(&fin, &mut fout3, true);
-
- for i in 0..fin.len() {
- assert!((fout1[i].re - fout2[i].re).abs() < 1.0);
- assert!((fout1[i].im - fout2[i].im).abs() < 1.0);
- assert!((fout1[i].re - fout3[i].re).abs() < 1.0);
- assert!((fout1[i].im - fout3[i].im).abs() < 1.0);
- }
- fft1.do_fft_inplace(&mut fout1, false);
- fft2.do_fft_inplace(&mut fout2, false);
- fft3.do_fft_inplace(&mut fout3, false);
-
- let sc = 1.0 / (fin.len() as f32);
- for i in 0..fin.len() {
- assert!((fin[i].re - fout1[i].re * sc).abs() < 1.0);
- assert!((fin[i].im - fout1[i].im * sc).abs() < 1.0);
- assert!((fout1[i].re - fout2[i].re).abs() < 1.0);
- assert!((fout1[i].im - fout2[i].im).abs() < 1.0);
- assert!((fout1[i].re - fout3[i].re).abs() < 1.0);
- assert!((fout1[i].im - fout3[i].im).abs() < 1.0);
- }
- }
-}
diff --git a/src/dsp/mdct.rs b/src/dsp/mdct.rs
deleted file mode 100644
index 540ae45..0000000
--- a/src/dsp/mdct.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-use std::f32::consts;
-use super::fft::*;
-
-pub struct IMDCT {
- twiddle: Vec<FFTComplex>,
- fft: FFT,
- size: usize,
- z: Vec<FFTComplex>,
-}
-
-/*
-fn imdct(src: &[f32], dst: &mut [f32], length: usize) {
- for n in 0..length*2 {
- dst[n] = 0.0;
- for k in 0..length {
- dst[n] += src[k] * (consts::PI / (length as f32) * ((n as f32) + 0.5 + ((length/2) as f32)) * ((k as f32) + 0.5)).cos();
- }
- }
-}*/
-
-impl IMDCT {
- pub fn new(mode: FFTMode, size: usize, scaledown: bool) -> Self {
- let mut twiddle: Vec<FFTComplex> = Vec::with_capacity(size / 4);
- let factor = 2.0 * consts::PI / ((8 * size) as f32);
- let scale = if scaledown { (1.0 / (size as f32)).sqrt() } else { 1.0 };
- for k in 0..size/4 {
- twiddle.push(FFTComplex::exp(factor * ((8 * k + 1) as f32)).scale(scale));
- }
- let fft = FFTBuilder::new_fft(mode, size/4);
- let mut z: Vec<FFTComplex> = Vec::with_capacity(size / 2);
- z.resize(size / 2, FFTC_ZERO);
- IMDCT { twiddle, fft, size, z }
- }
- pub fn imdct(&mut self, src: &[f32], dst: &mut [f32]) {
- let size2 = self.size / 2;
- let size4 = self.size / 4;
- let size8 = self.size / 8;
- for k in 0..size4 {
- let c = FFTComplex { re: src[size2 - 2 * k - 1], im: src[ 2 * k] };
- self.z[k] = c * self.twiddle[k];
- }
- self.fft.do_fft_inplace(&mut self.z, false);
- for k in 0..size4 {
- self.z[k] *= self.twiddle[k];
- }
- for n in 0..size8 {
- dst[ 2 * n] = -self.z[size8 + n] .im;
- dst[ 2 * n + 1] = self.z[size8 - n - 1].re;
- dst[ size4 + 2 * n] = -self.z[ n] .re;
- dst[ size4 + 2 * n + 1] = self.z[size4 - n - 1].im;
- dst[ size2 + 2 * n] = -self.z[size8 + n] .re;
- dst[ size2 + 2 * n + 1] = self.z[size8 - n - 1].im;
- dst[3 * size4 + 2 * n] = self.z[ n] .im;
- dst[3 * size4 + 2 * n + 1] = -self.z[size4 - n - 1].re;
- }
- }
-}
diff --git a/src/dsp/mod.rs b/src/dsp/mod.rs
deleted file mode 100644
index 439ad98..0000000
--- a/src/dsp/mod.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-#[cfg(feature="fft")]
-pub mod fft;
-#[cfg(feature="mdct")]
-pub mod mdct;
-#[cfg(feature="dsp_window")]
-pub mod window;
diff --git a/src/dsp/window.rs b/src/dsp/window.rs
deleted file mode 100644
index 42b6b6d..0000000
--- a/src/dsp/window.rs
+++ /dev/null
@@ -1,52 +0,0 @@
-use std::f32::consts;
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum WindowType {
- Square,
- Sine,
- KaiserBessel(f32),
-}
-
-pub fn generate_window(mode: WindowType, scale: f32, size: usize, half: bool, dst: &mut [f32]) {
- match mode {
- WindowType::Square => {
- for n in 0..size { dst[n] = scale; }
- },
- WindowType::Sine => {
- let param;
- if half {
- param = consts::PI / ((2 * size) as f32);
- } else {
- param = consts::PI / (size as f32);
- }
- for n in 0..size {
- dst[n] = (((n as f32) + 0.5) * param).sin() * scale;
- }
- },
- WindowType::KaiserBessel(alpha) => {
- let dlen = if half { size as f32 } else { (size as f32) * 0.5 };
- let alpha2 = ((alpha * consts::PI / dlen) * (alpha * consts::PI / dlen)) as f64;
-
- let mut kb: Vec<f64> = Vec::with_capacity(size);
- let mut sum = 0.0;
- for n in 0..size {
- let b = bessel_i0(((n * (size - n)) as f64) * alpha2);
- sum += b;
- kb.push(sum);
- }
- sum += 1.0;
- for n in 0..size {
- dst[n] = (kb[n] / sum).sqrt() as f32;
- }
- },
- };
-}
-
-fn bessel_i0(inval: f64) -> f64 {
- let mut val: f64 = 1.0;
- for n in (1..64).rev() {
- val *= inval / ((n * n) as f64);
- val += 1.0;
- }
- val
-}
diff --git a/src/formats.rs b/src/formats.rs
deleted file mode 100644
index 53b28dc..0000000
--- a/src/formats.rs
+++ /dev/null
@@ -1,511 +0,0 @@
-use std::str::FromStr;
-use std::string::*;
-use std::fmt;
-
-#[derive(Debug,Copy,Clone,PartialEq)]
-pub struct NASoniton {
- bits: u8,
- be: bool,
- packed: bool,
- planar: bool,
- float: bool,
- signed: bool,
-}
-
-pub const SONITON_FLAG_BE :u32 = 0x01;
-pub const SONITON_FLAG_PACKED :u32 = 0x02;
-pub const SONITON_FLAG_PLANAR :u32 = 0x04;
-pub const SONITON_FLAG_FLOAT :u32 = 0x08;
-pub const SONITON_FLAG_SIGNED :u32 = 0x10;
-
-pub const SND_U8_FORMAT: NASoniton = NASoniton { bits: 8, be: false, packed: false, planar: false, float: false, signed: false };
-pub const SND_S16_FORMAT: NASoniton = NASoniton { bits: 16, be: false, packed: false, planar: false, float: false, signed: true };
-pub const SND_S16P_FORMAT: NASoniton = NASoniton { bits: 16, be: false, packed: false, planar: true, float: false, signed: true };
-pub const SND_F32P_FORMAT: NASoniton = NASoniton { bits: 32, be: false, packed: false, planar: true, float: true, signed: true };
-
-impl NASoniton {
- pub fn new(bits: u8, flags: u32) -> Self {
- let is_be = (flags & SONITON_FLAG_BE) != 0;
- let is_pk = (flags & SONITON_FLAG_PACKED) != 0;
- let is_pl = (flags & SONITON_FLAG_PLANAR) != 0;
- let is_fl = (flags & SONITON_FLAG_FLOAT) != 0;
- let is_sg = (flags & SONITON_FLAG_SIGNED) != 0;
- NASoniton { bits: bits, be: is_be, packed: is_pk, planar: is_pl, float: is_fl, signed: is_sg }
- }
-
- pub fn get_bits(&self) -> u8 { self.bits }
- pub fn is_be(&self) -> bool { self.be }
- pub fn is_packed(&self) -> bool { self.packed }
- pub fn is_planar(&self) -> bool { self.planar }
- pub fn is_float(&self) -> bool { self.float }
- pub fn is_signed(&self) -> bool { self.signed }
-
- pub fn get_audio_size(&self, length: u64) -> usize {
- if self.packed {
- ((length * (self.bits as u64) + 7) >> 3) as usize
- } else {
- (length * (((self.bits + 7) >> 3) as u64)) as usize
- }
- }
-}
-
-impl fmt::Display for NASoniton {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let fmt = if self.float { "float" } else if self.signed { "int" } else { "uint" };
- let end = if self.be { "BE" } else { "LE" };
- write!(f, "({} bps, {} planar: {} packed: {} {})", self.bits, end, self.packed, self.planar, fmt)
- }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum NAChannelType {
- C, L, R, Cs, Ls, Rs, Lss, Rss, LFE, Lc, Rc, Lh, Rh, Ch, LFE2, Lw, Rw, Ov, Lhs, Rhs, Chs, Ll, Rl, Cl, Lt, Rt, Lo, Ro
-}
-
-impl NAChannelType {
- pub fn is_center(&self) -> bool {
- match *self {
- NAChannelType::C => true, NAChannelType::Ch => true,
- NAChannelType::Cl => true, NAChannelType::Ov => true,
- NAChannelType::LFE => true, NAChannelType::LFE2 => true,
- NAChannelType::Cs => true, NAChannelType::Chs => true,
- _ => false,
- }
- }
- pub fn is_left(&self) -> bool {
- match *self {
- NAChannelType::L => true, NAChannelType::Ls => true,
- NAChannelType::Lss => true, NAChannelType::Lc => true,
- NAChannelType::Lh => true, NAChannelType::Lw => true,
- NAChannelType::Lhs => true, NAChannelType::Ll => true,
- NAChannelType::Lt => true, NAChannelType::Lo => true,
- _ => false,
- }
- }
- pub fn is_right(&self) -> bool {
- match *self {
- NAChannelType::R => true, NAChannelType::Rs => true,
- NAChannelType::Rss => true, NAChannelType::Rc => true,
- NAChannelType::Rh => true, NAChannelType::Rw => true,
- NAChannelType::Rhs => true, NAChannelType::Rl => true,
- NAChannelType::Rt => true, NAChannelType::Ro => true,
- _ => false,
- }
- }
-}
-
-#[derive(Clone,Copy,Debug,PartialEq)]
-pub struct ChannelParseError {}
-
-impl FromStr for NAChannelType {
- type Err = ChannelParseError;
-
- fn from_str(s: &str) -> Result<Self, Self::Err> {
- match s {
- "C" => Ok(NAChannelType::C),
- "L" => Ok(NAChannelType::L),
- "R" => Ok(NAChannelType::R),
- "Cs" => Ok(NAChannelType::Cs),
- "Ls" => Ok(NAChannelType::Ls),
- "Rs" => Ok(NAChannelType::Rs),
- "Lss" => Ok(NAChannelType::Lss),
- "Rss" => Ok(NAChannelType::Rss),
- "LFE" => Ok(NAChannelType::LFE),
- "Lc" => Ok(NAChannelType::Lc),
- "Rc" => Ok(NAChannelType::Rc),
- "Lh" => Ok(NAChannelType::Lh),
- "Rh" => Ok(NAChannelType::Rh),
- "Ch" => Ok(NAChannelType::Ch),
- "LFE2" => Ok(NAChannelType::LFE2),
- "Lw" => Ok(NAChannelType::Lw),
- "Rw" => Ok(NAChannelType::Rw),
- "Ov" => Ok(NAChannelType::Ov),
- "Lhs" => Ok(NAChannelType::Lhs),
- "Rhs" => Ok(NAChannelType::Rhs),
- "Chs" => Ok(NAChannelType::Chs),
- "Ll" => Ok(NAChannelType::Ll),
- "Rl" => Ok(NAChannelType::Rl),
- "Cl" => Ok(NAChannelType::Cl),
- "Lt" => Ok(NAChannelType::Lt),
- "Rt" => Ok(NAChannelType::Rt),
- "Lo" => Ok(NAChannelType::Lo),
- "Ro" => Ok(NAChannelType::Ro),
- _ => Err(ChannelParseError{}),
- }
- }
-}
-
-impl fmt::Display for NAChannelType {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let name = match *self {
- NAChannelType::C => "C".to_string(),
- NAChannelType::L => "L".to_string(),
- NAChannelType::R => "R".to_string(),
- NAChannelType::Cs => "Cs".to_string(),
- NAChannelType::Ls => "Ls".to_string(),
- NAChannelType::Rs => "Rs".to_string(),
- NAChannelType::Lss => "Lss".to_string(),
- NAChannelType::Rss => "Rss".to_string(),
- NAChannelType::LFE => "LFE".to_string(),
- NAChannelType::Lc => "Lc".to_string(),
- NAChannelType::Rc => "Rc".to_string(),
- NAChannelType::Lh => "Lh".to_string(),
- NAChannelType::Rh => "Rh".to_string(),
- NAChannelType::Ch => "Ch".to_string(),
- NAChannelType::LFE2 => "LFE2".to_string(),
- NAChannelType::Lw => "Lw".to_string(),
- NAChannelType::Rw => "Rw".to_string(),
- NAChannelType::Ov => "Ov".to_string(),
- NAChannelType::Lhs => "Lhs".to_string(),
- NAChannelType::Rhs => "Rhs".to_string(),
- NAChannelType::Chs => "Chs".to_string(),
- NAChannelType::Ll => "Ll".to_string(),
- NAChannelType::Rl => "Rl".to_string(),
- NAChannelType::Cl => "Cl".to_string(),
- NAChannelType::Lt => "Lt".to_string(),
- NAChannelType::Rt => "Rt".to_string(),
- NAChannelType::Lo => "Lo".to_string(),
- NAChannelType::Ro => "Ro".to_string(),
- };
- write!(f, "{}", name)
- }
-}
-
-#[derive(Clone)]
-pub struct NAChannelMap {
- ids: Vec<NAChannelType>,
-}
-
-const MS_CHANNEL_MAP: [NAChannelType; 11] = [
- NAChannelType::L,
- NAChannelType::R,
- NAChannelType::C,
- NAChannelType::LFE,
- NAChannelType::Ls,
- NAChannelType::Rs,
- NAChannelType::Lss,
- NAChannelType::Rss,
- NAChannelType::Cs,
- NAChannelType::Lc,
- NAChannelType::Rc,
-];
-
-impl NAChannelMap {
- pub fn new() -> Self { NAChannelMap { ids: Vec::new() } }
- pub fn add_channel(&mut self, ch: NAChannelType) {
- self.ids.push(ch);
- }
- pub fn add_channels(&mut self, chs: &[NAChannelType]) {
- for i in 0..chs.len() {
- self.ids.push(chs[i]);
- }
- }
- pub fn num_channels(&self) -> usize {
- self.ids.len()
- }
- pub fn get_channel(&self, idx: usize) -> NAChannelType {
- self.ids[idx]
- }
- pub fn find_channel_id(&self, t: NAChannelType) -> Option<u8> {
- for i in 0..self.ids.len() {
- if self.ids[i] as i32 == t as i32 { return Some(i as u8); }
- }
- None
- }
- pub fn from_ms_mapping(chmap: u32) -> Self {
- let mut cm = NAChannelMap::new();
- for i in 0..MS_CHANNEL_MAP.len() {
- if ((chmap >> i) & 1) != 0 {
- cm.add_channel(MS_CHANNEL_MAP[i]);
- }
- }
- cm
- }
-}
-
-impl fmt::Display for NAChannelMap {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let mut map = String::new();
- for el in self.ids.iter() {
- if map.len() > 0 { map.push(','); }
- map.push_str(&*el.to_string());
- }
- write!(f, "{}", map)
- }
-}
-
-impl FromStr for NAChannelMap {
- type Err = ChannelParseError;
-
- fn from_str(s: &str) -> Result<Self, Self::Err> {
- let mut chm = NAChannelMap::new();
- for tok in s.split(',') {
- chm.add_channel(NAChannelType::from_str(tok)?);
- }
- Ok(chm)
- }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum RGBSubmodel {
- RGB,
- SRGB,
-}
-
-impl fmt::Display for RGBSubmodel {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let name = match *self {
- RGBSubmodel::RGB => "RGB".to_string(),
- RGBSubmodel::SRGB => "sRGB".to_string(),
- };
- write!(f, "{}", name)
- }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum YUVSubmodel {
- YCbCr,
- YIQ,
- YUVJ,
-}
-
-impl fmt::Display for YUVSubmodel {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let name = match *self {
- YUVSubmodel::YCbCr => "YCbCr".to_string(),
- YUVSubmodel::YIQ => "YIQ".to_string(),
- YUVSubmodel::YUVJ => "YUVJ".to_string(),
- };
- write!(f, "{}", name)
- }
-}
-
-#[derive(Debug, Clone,Copy,PartialEq)]
-pub enum ColorModel {
- RGB(RGBSubmodel),
- YUV(YUVSubmodel),
- CMYK,
- HSV,
- LAB,
- XYZ,
-}
-
-impl ColorModel {
- pub fn get_default_components(&self) -> usize {
- match *self {
- ColorModel::CMYK => 4,
- _ => 3,
- }
- }
-}
-
-impl fmt::Display for ColorModel {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let name = match *self {
- ColorModel::RGB(fmt) => format!("RGB({})", fmt).to_string(),
- ColorModel::YUV(fmt) => format!("YUV({})", fmt).to_string(),
- ColorModel::CMYK => "CMYK".to_string(),
- ColorModel::HSV => "HSV".to_string(),
- ColorModel::LAB => "LAB".to_string(),
- ColorModel::XYZ => "XYZ".to_string(),
- };
- write!(f, "{}", name)
- }
-}
-
-#[derive(Clone,Copy,PartialEq)]
-pub struct NAPixelChromaton {
- h_ss: u8,
- v_ss: u8,
- packed: bool,
- depth: u8,
- shift: u8,
- comp_offs: u8,
- next_elem: u8,
-}
-
-pub const FORMATON_FLAG_BE :u32 = 0x01;
-pub const FORMATON_FLAG_ALPHA :u32 = 0x02;
-pub const FORMATON_FLAG_PALETTE :u32 = 0x04;
-
-
-#[derive(Clone,Copy,PartialEq)]
-pub struct NAPixelFormaton {
- model: ColorModel,
- components: u8,
- comp_info: [Option<NAPixelChromaton>; 5],
- elem_size: u8,
- be: bool,
- alpha: bool,
- palette: bool,
-}
-
-macro_rules! chromaton {
- ($hs: expr, $vs: expr, $pck: expr, $d: expr, $sh: expr, $co: expr, $ne: expr) => ({
- Some(NAPixelChromaton{ h_ss: $hs, v_ss: $vs, packed: $pck, depth: $d, shift: $sh, comp_offs: $co, next_elem: $ne })
- });
- (yuv8; $hs: expr, $vs: expr, $co: expr) => ({
- Some(NAPixelChromaton{ h_ss: $hs, v_ss: $vs, packed: false, depth: 8, shift: 0, comp_offs: $co, next_elem: 1 })
- });
- (packrgb; $d: expr, $s: expr, $co: expr, $ne: expr) => ({
- Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: $d, shift: $s, comp_offs: $co, next_elem: $ne })
- });
- (pal8; $co: expr) => ({
- Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: 8, shift: 0, comp_offs: $co, next_elem: 3 })
- });
-}
-
-pub const YUV420_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::YUV(YUVSubmodel::YUVJ), components: 3,
- comp_info: [
- chromaton!(0, 0, false, 8, 0, 0, 1),
- chromaton!(yuv8; 1, 1, 1),
- chromaton!(yuv8; 1, 1, 2),
- None, None],
- elem_size: 0, be: false, alpha: false, palette: false };
-
-pub const YUV410_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::YUV(YUVSubmodel::YUVJ), components: 3,
- comp_info: [
- chromaton!(0, 0, false, 8, 0, 0, 1),
- chromaton!(yuv8; 2, 2, 1),
- chromaton!(yuv8; 2, 2, 2),
- None, None],
- elem_size: 0, be: false, alpha: false, palette: false };
-pub const YUVA410_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::YUV(YUVSubmodel::YUVJ), components: 4,
- comp_info: [
- chromaton!(0, 0, false, 8, 0, 0, 1),
- chromaton!(yuv8; 2, 2, 1),
- chromaton!(yuv8; 2, 2, 2),
- chromaton!(0, 0, false, 8, 0, 3, 1),
- None],
- elem_size: 0, be: false, alpha: true, palette: false };
-
-pub const PAL8_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3,
- comp_info: [
- chromaton!(pal8; 0),
- chromaton!(pal8; 1),
- chromaton!(pal8; 2),
- None, None],
- elem_size: 3, be: false, alpha: false, palette: true };
-
-pub const RGB565_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3,
- comp_info: [
- chromaton!(packrgb; 5, 11, 0, 2),
- chromaton!(packrgb; 6, 5, 0, 2),
- chromaton!(packrgb; 5, 0, 0, 2),
- None, None],
- elem_size: 2, be: false, alpha: false, palette: false };
-
-pub const RGB24_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3,
- comp_info: [
- chromaton!(packrgb; 8, 0, 2, 3),
- chromaton!(packrgb; 8, 0, 1, 3),
- chromaton!(packrgb; 8, 0, 0, 3),
- None, None],
- elem_size: 3, be: false, alpha: false, palette: false };
-
-impl NAPixelChromaton {
- pub fn get_subsampling(&self) -> (u8, u8) { (self.h_ss, self.v_ss) }
- pub fn is_packed(&self) -> bool { self.packed }
- pub fn get_depth(&self) -> u8 { self.depth }
- pub fn get_shift(&self) -> u8 { self.shift }
- pub fn get_offset(&self) -> u8 { self.comp_offs }
- pub fn get_step(&self) -> u8 { self.next_elem }
-
- pub fn get_width(&self, width: usize) -> usize {
- (width + ((1 << self.h_ss) - 1)) >> self.h_ss
- }
- pub fn get_height(&self, height: usize) -> usize {
- (height + ((1 << self.v_ss) - 1)) >> self.v_ss
- }
- pub fn get_linesize(&self, width: usize) -> usize {
- let d = self.depth as usize;
- if self.packed {
- (self.get_width(width) * d + d - 1) >> 3
- } else {
- self.get_width(width)
- }
- }
- pub fn get_data_size(&self, width: usize, height: usize) -> usize {
- let nh = (height + ((1 << self.v_ss) - 1)) >> self.v_ss;
- self.get_linesize(width) * nh
- }
-}
-
-impl fmt::Display for NAPixelChromaton {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let pfmt = if self.packed {
- let mask = ((1 << self.depth) - 1) << self.shift;
- format!("packed(+{},{:X}, step {})", self.comp_offs, mask, self.next_elem)
- } else {
- format!("planar({},{})", self.comp_offs, self.next_elem)
- };
- write!(f, "({}x{}, {})", self.h_ss, self.v_ss, pfmt)
- }
-}
-
-impl NAPixelFormaton {
- pub fn new(model: ColorModel,
- comp1: Option<NAPixelChromaton>,
- comp2: Option<NAPixelChromaton>,
- comp3: Option<NAPixelChromaton>,
- comp4: Option<NAPixelChromaton>,
- comp5: Option<NAPixelChromaton>,
- flags: u32, elem_size: u8) -> Self {
- let mut chromatons: [Option<NAPixelChromaton>; 5] = [None; 5];
- let mut ncomp = 0;
- let be = (flags & FORMATON_FLAG_BE) != 0;
- let alpha = (flags & FORMATON_FLAG_ALPHA) != 0;
- let palette = (flags & FORMATON_FLAG_PALETTE) != 0;
- if let Some(c) = comp1 { chromatons[0] = Some(c); ncomp += 1; }
- if let Some(c) = comp2 { chromatons[1] = Some(c); ncomp += 1; }
- if let Some(c) = comp3 { chromatons[2] = Some(c); ncomp += 1; }
- if let Some(c) = comp4 { chromatons[3] = Some(c); ncomp += 1; }
- if let Some(c) = comp5 { chromatons[4] = Some(c); ncomp += 1; }
- NAPixelFormaton { model: model,
- components: ncomp,
- comp_info: chromatons,
- elem_size: elem_size,
- be: be, alpha: alpha, palette: palette }
- }
-
- pub fn get_model(&self) -> ColorModel { self.model }
- pub fn get_num_comp(&self) -> usize { self.components as usize }
- pub fn get_chromaton(&self, idx: usize) -> Option<NAPixelChromaton> {
- if idx < self.comp_info.len() { return self.comp_info[idx]; }
- None
- }
- pub fn is_be(&self) -> bool { self.be }
- pub fn has_alpha(&self) -> bool { self.alpha }
- pub fn is_paletted(&self) -> bool { self.palette }
- pub fn get_elem_size(&self) -> u8 { self.elem_size }
-}
-
-impl fmt::Display for NAPixelFormaton {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let end = if self.be { "BE" } else { "LE" };
- let palstr = if self.palette { "palette " } else { "" };
- let astr = if self.alpha { "alpha " } else { "" };
- let mut str = format!("Formaton for {} ({}{}elem {} size {}): ", self.model, palstr, astr,end, self.elem_size);
- for i in 0..self.comp_info.len() {
- if let Some(chr) = self.comp_info[i] {
- str = format!("{} {}", str, chr);
- }
- }
- write!(f, "[{}]", str)
- }
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
-
- #[test]
- fn test_fmt() {
- println!("{}", SND_S16_FORMAT);
- println!("{}", SND_U8_FORMAT);
- println!("{}", SND_F32P_FORMAT);
- println!("formaton yuv- {}", YUV420_FORMAT);
- println!("formaton pal- {}", PAL8_FORMAT);
- println!("formaton rgb565- {}", RGB565_FORMAT);
- }
-}
diff --git a/src/frame.rs b/src/frame.rs
deleted file mode 100644
index 2bfbe61..0000000
--- a/src/frame.rs
+++ /dev/null
@@ -1,688 +0,0 @@
-use std::cmp::max;
-use std::collections::HashMap;
-use std::fmt;
-use std::rc::Rc;
-use std::cell::*;
-use crate::formats::*;
-
-#[allow(dead_code)]
-#[derive(Clone,Copy,PartialEq)]
-pub struct NAAudioInfo {
- sample_rate: u32,
- channels: u8,
- format: NASoniton,
- block_len: usize,
-}
-
-impl NAAudioInfo {
- pub fn new(sr: u32, ch: u8, fmt: NASoniton, bl: usize) -> Self {
- NAAudioInfo { sample_rate: sr, channels: ch, format: fmt, block_len: bl }
- }
- pub fn get_sample_rate(&self) -> u32 { self.sample_rate }
- pub fn get_channels(&self) -> u8 { self.channels }
- pub fn get_format(&self) -> NASoniton { self.format }
- pub fn get_block_len(&self) -> usize { self.block_len }
-}
-
-impl fmt::Display for NAAudioInfo {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{} Hz, {} ch", self.sample_rate, self.channels)
- }
-}
-
-#[allow(dead_code)]
-#[derive(Clone,Copy,PartialEq)]
-pub struct NAVideoInfo {
- width: usize,
- height: usize,
- flipped: bool,
- format: NAPixelFormaton,
-}
-
-impl NAVideoInfo {
- pub fn new(w: usize, h: usize, flip: bool, fmt: NAPixelFormaton) -> Self {
- NAVideoInfo { width: w, height: h, flipped: flip, format: fmt }
- }
- pub fn get_width(&self) -> usize { self.width as usize }
- pub fn get_height(&self) -> usize { self.height as usize }
- pub fn is_flipped(&self) -> bool { self.flipped }
- pub fn get_format(&self) -> NAPixelFormaton { self.format }
- pub fn set_width(&mut self, w: usize) { self.width = w; }
- pub fn set_height(&mut self, h: usize) { self.height = h; }
-}
-
-impl fmt::Display for NAVideoInfo {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{}x{}", self.width, self.height)
- }
-}
-
-#[derive(Clone,Copy,PartialEq)]
-pub enum NACodecTypeInfo {
- None,
- Audio(NAAudioInfo),
- Video(NAVideoInfo),
-}
-
-impl NACodecTypeInfo {
- pub fn get_video_info(&self) -> Option<NAVideoInfo> {
- match *self {
- NACodecTypeInfo::Video(vinfo) => Some(vinfo),
- _ => None,
- }
- }
- pub fn get_audio_info(&self) -> Option<NAAudioInfo> {
- match *self {
- NACodecTypeInfo::Audio(ainfo) => Some(ainfo),
- _ => None,
- }
- }
- pub fn is_video(&self) -> bool {
- match *self {
- NACodecTypeInfo::Video(_) => true,
- _ => false,
- }
- }
- pub fn is_audio(&self) -> bool {
- match *self {
- NACodecTypeInfo::Audio(_) => true,
- _ => false,
- }
- }
-}
-
-impl fmt::Display for NACodecTypeInfo {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let ret = match *self {
- NACodecTypeInfo::None => format!(""),
- NACodecTypeInfo::Audio(fmt) => format!("{}", fmt),
- NACodecTypeInfo::Video(fmt) => format!("{}", fmt),
- };
- write!(f, "{}", ret)
- }
-}
-
-pub type NABufferRefT<T> = Rc<RefCell<Vec<T>>>;
-
-#[derive(Clone)]
-pub struct NAVideoBuffer<T> {
- info: NAVideoInfo,
- data: NABufferRefT<T>,
- offs: Vec<usize>,
- strides: Vec<usize>,
-}
-
-impl<T: Clone> NAVideoBuffer<T> {
- pub fn get_offset(&self, idx: usize) -> usize {
- if idx >= self.offs.len() { 0 }
- else { self.offs[idx] }
- }
- pub fn get_info(&self) -> NAVideoInfo { self.info }
- pub fn get_data(&self) -> Ref<Vec<T>> { self.data.borrow() }
- pub fn get_data_mut(&mut self) -> RefMut<Vec<T>> { self.data.borrow_mut() }
- pub fn copy_buffer(&mut self) -> Self {
- let mut data: Vec<T> = Vec::with_capacity(self.data.borrow().len());
- data.clone_from(self.data.borrow().as_ref());
- let mut offs: Vec<usize> = Vec::with_capacity(self.offs.len());
- offs.clone_from(&self.offs);
- let mut strides: Vec<usize> = Vec::with_capacity(self.strides.len());
- strides.clone_from(&self.strides);
- NAVideoBuffer { info: self.info, data: Rc::new(RefCell::new(data)), offs: offs, strides: strides }
- }
- pub fn get_stride(&self, idx: usize) -> usize {
- if idx >= self.strides.len() { return 0; }
- self.strides[idx]
- }
- pub fn get_dimensions(&self, idx: usize) -> (usize, usize) {
- get_plane_size(&self.info, idx)
- }
-}
-
-#[derive(Clone)]
-pub struct NAAudioBuffer<T> {
- info: NAAudioInfo,
- data: NABufferRefT<T>,
- offs: Vec<usize>,
- chmap: NAChannelMap,
- len: usize,
-}
-
-impl<T: Clone> NAAudioBuffer<T> {
- pub fn get_offset(&self, idx: usize) -> usize {
- if idx >= self.offs.len() { 0 }
- else { self.offs[idx] }
- }
- pub fn get_info(&self) -> NAAudioInfo { self.info }
- pub fn get_chmap(&self) -> NAChannelMap { self.chmap.clone() }
- pub fn get_data(&self) -> Ref<Vec<T>> { self.data.borrow() }
- pub fn get_data_mut(&mut self) -> RefMut<Vec<T>> { self.data.borrow_mut() }
- pub fn copy_buffer(&mut self) -> Self {
- let mut data: Vec<T> = Vec::with_capacity(self.data.borrow().len());
- data.clone_from(self.data.borrow().as_ref());
- let mut offs: Vec<usize> = Vec::with_capacity(self.offs.len());
- offs.clone_from(&self.offs);
- NAAudioBuffer { info: self.info, data: Rc::new(RefCell::new(data)), offs: offs, chmap: self.get_chmap(), len: self.len }
- }
- pub fn get_length(&self) -> usize { self.len }
-}
-
-impl NAAudioBuffer<u8> {
- pub fn new_from_buf(info: NAAudioInfo, data: NABufferRefT<u8>, chmap: NAChannelMap) -> Self {
- let len = data.borrow().len();
- NAAudioBuffer { info: info, data: data, chmap: chmap, offs: Vec::new(), len: len }
- }
-}
-
-#[derive(Clone)]
-pub enum NABufferType {
- Video (NAVideoBuffer<u8>),
- Video16 (NAVideoBuffer<u16>),
- VideoPacked(NAVideoBuffer<u8>),
- AudioU8 (NAAudioBuffer<u8>),
- AudioI16 (NAAudioBuffer<i16>),
- AudioI32 (NAAudioBuffer<i32>),
- AudioF32 (NAAudioBuffer<f32>),
- AudioPacked(NAAudioBuffer<u8>),
- Data (NABufferRefT<u8>),
- None,
-}
-
-impl NABufferType {
- pub fn get_offset(&self, idx: usize) -> usize {
- match *self {
- NABufferType::Video(ref vb) => vb.get_offset(idx),
- NABufferType::Video16(ref vb) => vb.get_offset(idx),
- NABufferType::VideoPacked(ref vb) => vb.get_offset(idx),
- NABufferType::AudioU8(ref ab) => ab.get_offset(idx),
- NABufferType::AudioI16(ref ab) => ab.get_offset(idx),
- NABufferType::AudioF32(ref ab) => ab.get_offset(idx),
- NABufferType::AudioPacked(ref ab) => ab.get_offset(idx),
- _ => 0,
- }
- }
- pub fn get_vbuf(&mut self) -> Option<NAVideoBuffer<u8>> {
- match *self {
- NABufferType::Video(ref vb) => Some(vb.clone()),
- NABufferType::VideoPacked(ref vb) => Some(vb.clone()),
- _ => None,
- }
- }
- pub fn get_vbuf16(&mut self) -> Option<NAVideoBuffer<u16>> {
- match *self {
- NABufferType::Video16(ref vb) => Some(vb.clone()),
- _ => None,
- }
- }
- pub fn get_abuf_u8(&mut self) -> Option<NAAudioBuffer<u8>> {
- match *self {
- NABufferType::AudioU8(ref ab) => Some(ab.clone()),
- NABufferType::AudioPacked(ref ab) => Some(ab.clone()),
- _ => None,
- }
- }
- pub fn get_abuf_i16(&mut self) -> Option<NAAudioBuffer<i16>> {
- match *self {
- NABufferType::AudioI16(ref ab) => Some(ab.clone()),
- _ => None,
- }
- }
- pub fn get_abuf_i32(&mut self) -> Option<NAAudioBuffer<i32>> {
- match *self {
- NABufferType::AudioI32(ref ab) => Some(ab.clone()),
- _ => None,
- }
- }
- pub fn get_abuf_f32(&mut self) -> Option<NAAudioBuffer<f32>> {
- match *self {
- NABufferType::AudioF32(ref ab) => Some(ab.clone()),
- _ => None,
- }
- }
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-pub enum AllocatorError {
- TooLargeDimensions,
- FormatError,
-}
-
-pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result<NABufferType, AllocatorError> {
- let fmt = &vinfo.format;
- let mut new_size: usize = 0;
- let mut offs: Vec<usize> = Vec::new();
- let mut strides: Vec<usize> = Vec::new();
-
- for i in 0..fmt.get_num_comp() {
- if fmt.get_chromaton(i) == None { return Err(AllocatorError::FormatError); }
- }
-
- let align_mod = ((1 << align) as usize) - 1;
- let width = ((vinfo.width as usize) + align_mod) & !align_mod;
- let height = ((vinfo.height as usize) + align_mod) & !align_mod;
- let mut max_depth = 0;
- let mut all_packed = true;
- for i in 0..fmt.get_num_comp() {
- let ochr = fmt.get_chromaton(i);
- if let None = ochr { continue; }
- let chr = ochr.unwrap();
- if !chr.is_packed() {
- all_packed = false;
- break;
- }
- max_depth = max(max_depth, chr.get_depth());
- }
-
-//todo semi-packed like NV12
- if fmt.is_paletted() {
-//todo various-sized palettes?
- let stride = vinfo.get_format().get_chromaton(0).unwrap().get_linesize(width);
- let pic_sz = stride.checked_mul(height);
- if pic_sz == None { return Err(AllocatorError::TooLargeDimensions); }
- let pal_size = 256 * (fmt.get_elem_size() as usize);
- let new_size = pic_sz.unwrap().checked_add(pal_size);
- if new_size == None { return Err(AllocatorError::TooLargeDimensions); }
- offs.push(0);
- offs.push(stride * height);
- strides.push(stride);
- let mut data: Vec<u8> = Vec::with_capacity(new_size.unwrap());
- data.resize(new_size.unwrap(), 0);
- let buf: NAVideoBuffer<u8> = NAVideoBuffer { data: Rc::new(RefCell::new(data)), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::Video(buf))
- } else if !all_packed {
- for i in 0..fmt.get_num_comp() {
- let ochr = fmt.get_chromaton(i);
- if let None = ochr { continue; }
- let chr = ochr.unwrap();
- if !vinfo.is_flipped() {
- offs.push(new_size as usize);
- }
- let stride = chr.get_linesize(width);
- let cur_h = chr.get_height(height);
- let cur_sz = stride.checked_mul(cur_h);
- if cur_sz == None { return Err(AllocatorError::TooLargeDimensions); }
- let new_sz = new_size.checked_add(cur_sz.unwrap());
- if new_sz == None { return Err(AllocatorError::TooLargeDimensions); }
- new_size = new_sz.unwrap();
- if vinfo.is_flipped() {
- offs.push(new_size as usize);
- }
- strides.push(stride);
- }
- if max_depth <= 8 {
- let mut data: Vec<u8> = Vec::with_capacity(new_size);
- data.resize(new_size, 0);
- let buf: NAVideoBuffer<u8> = NAVideoBuffer { data: Rc::new(RefCell::new(data)), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::Video(buf))
- } else {
- let mut data: Vec<u16> = Vec::with_capacity(new_size);
- data.resize(new_size, 0);
- let buf: NAVideoBuffer<u16> = NAVideoBuffer { data: Rc::new(RefCell::new(data)), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::Video16(buf))
- }
- } else {
- let elem_sz = fmt.get_elem_size();
- let line_sz = width.checked_mul(elem_sz as usize);
- if line_sz == None { return Err(AllocatorError::TooLargeDimensions); }
- let new_sz = line_sz.unwrap().checked_mul(height);
- if new_sz == None { return Err(AllocatorError::TooLargeDimensions); }
- new_size = new_sz.unwrap();
- let mut data: Vec<u8> = Vec::with_capacity(new_size);
- data.resize(new_size, 0);
- strides.push(line_sz.unwrap());
- let buf: NAVideoBuffer<u8> = NAVideoBuffer { data: Rc::new(RefCell::new(data)), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::VideoPacked(buf))
- }
-}
-
-pub fn alloc_audio_buffer(ainfo: NAAudioInfo, nsamples: usize, chmap: NAChannelMap) -> Result<NABufferType, AllocatorError> {
- let mut offs: Vec<usize> = Vec::new();
- if ainfo.format.is_planar() || (ainfo.channels == 1 && (ainfo.format.get_bits() % 8) == 0) {
- let len = nsamples.checked_mul(ainfo.channels as usize);
- if len == None { return Err(AllocatorError::TooLargeDimensions); }
- let length = len.unwrap();
- for i in 0..ainfo.channels {
- offs.push((i as usize) * nsamples);
- }
- if ainfo.format.is_float() {
- if ainfo.format.get_bits() == 32 {
- let mut data: Vec<f32> = Vec::with_capacity(length);
- data.resize(length, 0.0);
- let buf: NAAudioBuffer<f32> = NAAudioBuffer { data: Rc::new(RefCell::new(data)), info: ainfo, offs: offs, chmap: chmap, len: nsamples };
- Ok(NABufferType::AudioF32(buf))
- } else {
- Err(AllocatorError::TooLargeDimensions)
- }
- } else {
- if ainfo.format.get_bits() == 8 && !ainfo.format.is_signed() {
- let mut data: Vec<u8> = Vec::with_capacity(length);
- data.resize(length, 0);
- let buf: NAAudioBuffer<u8> = NAAudioBuffer { data: Rc::new(RefCell::new(data)), info: ainfo, offs: offs, chmap: chmap, len: nsamples };
- Ok(NABufferType::AudioU8(buf))
- } else if ainfo.format.get_bits() == 16 && ainfo.format.is_signed() {
- let mut data: Vec<i16> = Vec::with_capacity(length);
- data.resize(length, 0);
- let buf: NAAudioBuffer<i16> = NAAudioBuffer { data: Rc::new(RefCell::new(data)), info: ainfo, offs: offs, chmap: chmap, len: nsamples };
- Ok(NABufferType::AudioI16(buf))
- } else {
- Err(AllocatorError::TooLargeDimensions)
- }
- }
- } else {
- let len = nsamples.checked_mul(ainfo.channels as usize);
- if len == None { return Err(AllocatorError::TooLargeDimensions); }
- let length = ainfo.format.get_audio_size(len.unwrap() as u64);
- let mut data: Vec<u8> = Vec::with_capacity(length);
- data.resize(length, 0);
- let buf: NAAudioBuffer<u8> = NAAudioBuffer { data: Rc::new(RefCell::new(data)), info: ainfo, offs: offs, chmap: chmap, len: nsamples };
- Ok(NABufferType::AudioPacked(buf))
- }
-}
-
-pub fn alloc_data_buffer(size: usize) -> Result<NABufferType, AllocatorError> {
- let mut data: Vec<u8> = Vec::with_capacity(size);
- data.resize(size, 0);
- let buf: NABufferRefT<u8> = Rc::new(RefCell::new(data));
- Ok(NABufferType::Data(buf))
-}
-
-pub fn copy_buffer(buf: NABufferType) -> NABufferType {
- buf.clone()
-}
-
-#[allow(dead_code)]
-#[derive(Clone)]
-pub struct NACodecInfo {
- name: &'static str,
- properties: NACodecTypeInfo,
- extradata: Option<Rc<Vec<u8>>>,
-}
-
-impl NACodecInfo {
- pub fn new(name: &'static str, p: NACodecTypeInfo, edata: Option<Vec<u8>>) -> Self {
- let extradata = match edata {
- None => None,
- Some(vec) => Some(Rc::new(vec)),
- };
- NACodecInfo { name: name, properties: p, extradata: extradata }
- }
- pub fn new_ref(name: &'static str, p: NACodecTypeInfo, edata: Option<Rc<Vec<u8>>>) -> Self {
- NACodecInfo { name: name, properties: p, extradata: edata }
- }
- pub fn get_properties(&self) -> NACodecTypeInfo { self.properties }
- pub fn get_extradata(&self) -> Option<Rc<Vec<u8>>> {
- if let Some(ref vec) = self.extradata { return Some(vec.clone()); }
- None
- }
- pub fn get_name(&self) -> &'static str { self.name }
- pub fn is_video(&self) -> bool {
- if let NACodecTypeInfo::Video(_) = self.properties { return true; }
- false
- }
- pub fn is_audio(&self) -> bool {
- if let NACodecTypeInfo::Audio(_) = self.properties { return true; }
- false
- }
- pub fn new_dummy() -> Rc<Self> {
- Rc::new(DUMMY_CODEC_INFO)
- }
- pub fn replace_info(&self, p: NACodecTypeInfo) -> Rc<Self> {
- Rc::new(NACodecInfo { name: self.name, properties: p, extradata: self.extradata.clone() })
- }
-}
-
-impl fmt::Display for NACodecInfo {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let edata = match self.extradata.clone() {
- None => format!("no extradata"),
- Some(v) => format!("{} byte(s) of extradata", v.len()),
- };
- write!(f, "{}: {} {}", self.name, self.properties, edata)
- }
-}
-
-pub const DUMMY_CODEC_INFO: NACodecInfo = NACodecInfo {
- name: "none",
- properties: NACodecTypeInfo::None,
- extradata: None };
-
-#[derive(Debug,Clone)]
-pub enum NAValue {
- None,
- Int(i32),
- Long(i64),
- String(String),
- Data(Rc<Vec<u8>>),
-}
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-#[allow(dead_code)]
-pub enum FrameType {
- I,
- P,
- B,
- Skip,
- Other,
-}
-
-impl fmt::Display for FrameType {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- match *self {
- FrameType::I => write!(f, "I"),
- FrameType::P => write!(f, "P"),
- FrameType::B => write!(f, "B"),
- FrameType::Skip => write!(f, "skip"),
- FrameType::Other => write!(f, "x"),
- }
- }
-}
-
-#[derive(Debug,Clone,Copy)]
-pub struct NATimeInfo {
- pts: Option<u64>,
- dts: Option<u64>,
- duration: Option<u64>,
- tb_num: u32,
- tb_den: u32,
-}
-
-impl NATimeInfo {
- pub fn new(pts: Option<u64>, dts: Option<u64>, duration: Option<u64>, tb_num: u32, tb_den: u32) -> Self {
- NATimeInfo { pts: pts, dts: dts, duration: duration, tb_num: tb_num, tb_den: tb_den }
- }
- pub fn get_pts(&self) -> Option<u64> { self.pts }
- pub fn get_dts(&self) -> Option<u64> { self.dts }
- pub fn get_duration(&self) -> Option<u64> { self.duration }
- pub fn set_pts(&mut self, pts: Option<u64>) { self.pts = pts; }
- pub fn set_dts(&mut self, dts: Option<u64>) { self.dts = dts; }
- pub fn set_duration(&mut self, dur: Option<u64>) { self.duration = dur; }
-}
-
-#[allow(dead_code)]
-#[derive(Clone)]
-pub struct NAFrame {
- ts: NATimeInfo,
- buffer: NABufferType,
- info: Rc<NACodecInfo>,
- ftype: FrameType,
- key: bool,
- options: HashMap<String, NAValue>,
-}
-
-pub type NAFrameRef = Rc<RefCell<NAFrame>>;
-
-fn get_plane_size(info: &NAVideoInfo, idx: usize) -> (usize, usize) {
- let chromaton = info.get_format().get_chromaton(idx);
- if let None = chromaton { return (0, 0); }
- let (hs, vs) = chromaton.unwrap().get_subsampling();
- let w = (info.get_width() + ((1 << hs) - 1)) >> hs;
- let h = (info.get_height() + ((1 << vs) - 1)) >> vs;
- (w, h)
-}
-
-impl NAFrame {
- pub fn new(ts: NATimeInfo,
- ftype: FrameType,
- keyframe: bool,
- info: Rc<NACodecInfo>,
- options: HashMap<String, NAValue>,
- buffer: NABufferType) -> Self {
- NAFrame { ts: ts, buffer: buffer, info: info, ftype: ftype, key: keyframe, options: options }
- }
- pub fn get_info(&self) -> Rc<NACodecInfo> { self.info.clone() }
- pub fn get_frame_type(&self) -> FrameType { self.ftype }
- pub fn is_keyframe(&self) -> bool { self.key }
- pub fn set_frame_type(&mut self, ftype: FrameType) { self.ftype = ftype; }
- pub fn set_keyframe(&mut self, key: bool) { self.key = key; }
- pub fn get_time_information(&self) -> NATimeInfo { self.ts }
- pub fn get_pts(&self) -> Option<u64> { self.ts.get_pts() }
- pub fn get_dts(&self) -> Option<u64> { self.ts.get_dts() }
- pub fn get_duration(&self) -> Option<u64> { self.ts.get_duration() }
- pub fn set_pts(&mut self, pts: Option<u64>) { self.ts.set_pts(pts); }
- pub fn set_dts(&mut self, dts: Option<u64>) { self.ts.set_dts(dts); }
- pub fn set_duration(&mut self, dur: Option<u64>) { self.ts.set_duration(dur); }
-
- pub fn get_buffer(&self) -> NABufferType { self.buffer.clone() }
-}
-
-impl fmt::Display for NAFrame {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let mut foo = format!("frame type {}", self.ftype);
- if let Some(pts) = self.ts.pts { foo = format!("{} pts {}", foo, pts); }
- if let Some(dts) = self.ts.dts { foo = format!("{} dts {}", foo, dts); }
- if let Some(dur) = self.ts.duration { foo = format!("{} duration {}", foo, dur); }
- if self.key { foo = format!("{} kf", foo); }
- write!(f, "[{}]", foo)
- }
-}
-
-/// Possible stream types.
-#[derive(Debug,Clone,Copy)]
-#[allow(dead_code)]
-pub enum StreamType {
- /// video stream
- Video,
- /// audio stream
- Audio,
- /// subtitles
- Subtitles,
- /// any data stream (or might be an unrecognized audio/video stream)
- Data,
- /// nonexistent stream
- None,
-}
-
-impl fmt::Display for StreamType {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- match *self {
- StreamType::Video => write!(f, "Video"),
- StreamType::Audio => write!(f, "Audio"),
- StreamType::Subtitles => write!(f, "Subtitles"),
- StreamType::Data => write!(f, "Data"),
- StreamType::None => write!(f, "-"),
- }
- }
-}
-
-#[allow(dead_code)]
-#[derive(Clone)]
-pub struct NAStream {
- media_type: StreamType,
- id: u32,
- num: usize,
- info: Rc<NACodecInfo>,
- tb_num: u32,
- tb_den: u32,
-}
-
-pub fn reduce_timebase(tb_num: u32, tb_den: u32) -> (u32, u32) {
- if tb_num == 0 { return (tb_num, tb_den); }
- if (tb_den % tb_num) == 0 { return (1, tb_den / tb_num); }
-
- let mut a = tb_num;
- let mut b = tb_den;
-
- while a != b {
- if a > b { a -= b; }
- else if b > a { b -= a; }
- }
-
- (tb_num / a, tb_den / a)
-}
-
-impl NAStream {
- pub fn new(mt: StreamType, id: u32, info: NACodecInfo, tb_num: u32, tb_den: u32) -> Self {
- let (n, d) = reduce_timebase(tb_num, tb_den);
- NAStream { media_type: mt, id: id, num: 0, info: Rc::new(info), tb_num: n, tb_den: d }
- }
- pub fn get_id(&self) -> u32 { self.id }
- pub fn get_num(&self) -> usize { self.num }
- pub fn set_num(&mut self, num: usize) { self.num = num; }
- pub fn get_info(&self) -> Rc<NACodecInfo> { self.info.clone() }
- pub fn get_timebase(&self) -> (u32, u32) { (self.tb_num, self.tb_den) }
- pub fn set_timebase(&mut self, tb_num: u32, tb_den: u32) {
- let (n, d) = reduce_timebase(tb_num, tb_den);
- self.tb_num = n;
- self.tb_den = d;
- }
-}
-
-impl fmt::Display for NAStream {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "({}#{} @ {}/{} - {})", self.media_type, self.id, self.tb_num, self.tb_den, self.info.get_properties())
- }
-}
-
-#[allow(dead_code)]
-pub struct NAPacket {
- stream: Rc<NAStream>,
- ts: NATimeInfo,
- buffer: Rc<Vec<u8>>,
- keyframe: bool,
-// options: HashMap<String, NAValue<'a>>,
-}
-
-impl NAPacket {
- pub fn new(str: Rc<NAStream>, ts: NATimeInfo, kf: bool, vec: Vec<u8>) -> Self {
-// let mut vec: Vec<u8> = Vec::new();
-// vec.resize(size, 0);
- NAPacket { stream: str, ts: ts, keyframe: kf, buffer: Rc::new(vec) }
- }
- pub fn get_stream(&self) -> Rc<NAStream> { self.stream.clone() }
- pub fn get_time_information(&self) -> NATimeInfo { self.ts }
- pub fn get_pts(&self) -> Option<u64> { self.ts.get_pts() }
- pub fn get_dts(&self) -> Option<u64> { self.ts.get_dts() }
- pub fn get_duration(&self) -> Option<u64> { self.ts.get_duration() }
- pub fn is_keyframe(&self) -> bool { self.keyframe }
- pub fn get_buffer(&self) -> Rc<Vec<u8>> { self.buffer.clone() }
-}
-
-impl Drop for NAPacket {
- fn drop(&mut self) {}
-}
-
-impl fmt::Display for NAPacket {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let mut foo = format!("[pkt for {} size {}", self.stream, self.buffer.len());
- if let Some(pts) = self.ts.pts { foo = format!("{} pts {}", foo, pts); }
- if let Some(dts) = self.ts.dts { foo = format!("{} dts {}", foo, dts); }
- if let Some(dur) = self.ts.duration { foo = format!("{} duration {}", foo, dur); }
- if self.keyframe { foo = format!("{} kf", foo); }
- foo = foo + "]";
- write!(f, "{}", foo)
- }
-}
-
-pub trait FrameFromPacket {
- fn new_from_pkt(pkt: &NAPacket, info: Rc<NACodecInfo>, buf: NABufferType) -> NAFrame;
- fn fill_timestamps(&mut self, pkt: &NAPacket);
-}
-
-impl FrameFromPacket for NAFrame {
- fn new_from_pkt(pkt: &NAPacket, info: Rc<NACodecInfo>, buf: NABufferType) -> NAFrame {
- NAFrame::new(pkt.ts, FrameType::Other, pkt.keyframe, info, HashMap::new(), buf)
- }
- fn fill_timestamps(&mut self, pkt: &NAPacket) {
- self.ts = pkt.get_time_information();
- }
-}
-
diff --git a/src/io/bitreader.rs b/src/io/bitreader.rs
deleted file mode 100644
index ea5f27c..0000000
--- a/src/io/bitreader.rs
+++ /dev/null
@@ -1,250 +0,0 @@
-#[derive(Debug)]
-pub enum BitReaderMode {
- BE,
- LE,
- LE16MSB,
- LE32MSB,
-}
-
-#[derive(Debug)]
-pub enum BitReaderError {
- BitstreamEnd,
- TooManyBitsRequested,
- InvalidValue,
-}
-
-use self::BitReaderError::*;
-
-pub type BitReaderResult<T> = Result<T, BitReaderError>;
-
-#[derive(Debug)]
-pub struct BitReader<'a> {
- cache: u64,
- bits: u8,
- pos: usize,
- end: usize,
- src: &'a [u8],
- mode: BitReaderMode,
-}
-
-impl<'a> BitReader<'a> {
-
- pub fn new(src: &'a [u8], size: usize, mode: BitReaderMode) -> Self {
- if src.len() < size { panic!("size is less than needed"); }
- BitReader{ cache: 0, pos: 0, bits: 0, end: size, src: src, mode: mode }
- }
-
- pub fn tell(&self) -> usize {
- self.pos * 8 - (self.bits as usize)
- }
-
- pub fn left(&self) -> isize {
- ((self.end as isize) - (self.pos as isize)) * 8 + (self.bits as isize)
- }
-
- fn fill32be(&mut self, src: &[u8]) {
- let nw = (((src[0] as u32) << 24) |
- ((src[1] as u32) << 16) |
- ((src[2] as u32) << 8) |
- ((src[3] as u32) << 0)) as u64;
- self.cache |= nw << (32 - self.bits);
- }
-
- fn fill32le16(&mut self, src: &[u8]) {
- let nw = (((src[1] as u32) << 24) |
- ((src[0] as u32) << 16) |
- ((src[3] as u32) << 8) |
- ((src[2] as u32) << 0)) as u64;
- self.cache |= nw << (32 - self.bits);
- }
-
- fn fill32le32(&mut self, src: &[u8], lsb: bool) {
- let nw = (((src[3] as u32) << 24) |
- ((src[2] as u32) << 16) |
- ((src[1] as u32) << 8) |
- ((src[0] as u32) << 0)) as u64;
- if lsb {
- self.cache |= nw << self.bits;
- } else {
- self.cache |= nw << (32 - self.bits);
- }
- }
-
- #[inline(always)]
- fn refill(&mut self) -> BitReaderResult<()> {
- if self.pos >= self.end { return Err(BitstreamEnd) }
- while self.bits <= 32 {
- if self.pos + 4 <= self.end {
- let buf = &self.src[self.pos..];
- match self.mode {
- BitReaderMode::BE => self.fill32be (buf),
- BitReaderMode::LE16MSB => self.fill32le16(buf),
- BitReaderMode::LE => self.fill32le32(buf, true),
- BitReaderMode::LE32MSB => self.fill32le32(buf, false),
- }
- self.pos += 4;
- self.bits += 32;
- } else {
- let mut buf: [u8; 4] = [0, 0, 0, 0];
- let mut newbits: u8 = 0;
- for i in 0..3 {
- if self.pos < self.end {
- buf[i] = self.src[self.pos];
- self.pos = self.pos + 1;
- newbits += 8;
- }
- }
- if newbits == 0 { break; }
- match self.mode {
- BitReaderMode::BE => self.fill32be (&buf),
- BitReaderMode::LE16MSB => self.fill32le16(&buf),
- BitReaderMode::LE => self.fill32le32(&buf, true),
- BitReaderMode::LE32MSB => self.fill32le32(&buf, false),
- }
- self.bits += newbits;
- }
- }
- Ok(())
- }
-
- #[inline(always)]
- fn read_cache(&mut self, nbits: u8) -> u32 {
- let res = match self.mode {
- BitReaderMode::LE => ((1u64 << nbits) - 1) & self.cache,
- _ => (self.cache as u64) >> (64 - nbits),
- };
- res as u32
- }
-
- fn read_cache_s(&mut self, nbits: u8) -> i32 {
- let res = match self.mode {
- BitReaderMode::LE => ((self.cache as i64) << (64 - nbits)) >> (64 - nbits),
- _ => (self.cache as i64) >> (64 - nbits),
- };
- res as i32
- }
-
- #[inline(always)]
- fn skip_cache(&mut self, nbits: u8) {
- match self.mode {
- BitReaderMode::LE => self.cache >>= nbits,
- _ => self.cache <<= nbits,
- };
- self.bits -= nbits;
- }
-
- #[inline(always)]
- fn reset_cache(&mut self) {
- self.bits = 0;
- self.cache = 0;
- }
-
- #[inline(always)]
- pub fn read(&mut self, nbits: u8) -> BitReaderResult<u32> {
- if nbits == 0 { return Ok(0) }
- if nbits > 32 { return Err(TooManyBitsRequested) }
- if self.bits < nbits {
- if let Err(err) = self.refill() { return Err(err) }
- if self.bits < nbits { return Err(BitstreamEnd) }
- }
- let res = self.read_cache(nbits);
- self.skip_cache(nbits);
- Ok(res)
- }
-
- pub fn read_s(&mut self, nbits: u8) -> BitReaderResult<i32> {
- if nbits == 0 || nbits > 32 { return Err(TooManyBitsRequested) }
- if self.bits < nbits {
- if let Err(err) = self.refill() { return Err(err) }
- if self.bits < nbits { return Err(BitstreamEnd) }
- }
- let res = self.read_cache_s(nbits);
- self.skip_cache(nbits);
- Ok(res)
- }
-
- #[inline(always)]
- pub fn read_bool(&mut self) -> BitReaderResult<bool> {
- if self.bits < 1 {
- if let Err(err) = self.refill() { return Err(err) }
- if self.bits < 1 { return Err(BitstreamEnd) }
- }
- let res = self.read_cache(1);
- self.skip_cache(1);
- Ok(res == 1)
- }
-
- #[inline(always)]
- pub fn peek(&mut self, nbits: u8) -> u32 {
- if nbits > 32 { return 0 }
- if self.bits < nbits { let _ = self.refill(); }
- self.read_cache(nbits)
- }
-
- #[inline(always)]
- pub fn skip(&mut self, nbits: u32) -> BitReaderResult<()> {
- if self.bits as u32 >= nbits {
- self.skip_cache(nbits as u8);
- return Ok(());
- }
- let mut skip_bits = nbits - (self.bits as u32);
- self.reset_cache();
- self.pos += ((skip_bits / 32) * 4) as usize;
- skip_bits = skip_bits & 0x1F;
- self.refill()?;
- if skip_bits > 0 {
- self.skip_cache(skip_bits as u8);
- }
- Ok(())
- }
-
- pub fn seek(&mut self, nbits: u32) -> BitReaderResult<()> {
- if ((nbits + 7) >> 3) as usize > self.end { return Err(TooManyBitsRequested); }
- self.reset_cache();
- self.pos = ((nbits / 32) * 4) as usize;
- self.skip(nbits & 0x1F)
- }
-
- pub fn align(&mut self) {
- let pos = self.bits & 7;
- if pos != 0 {
- self.skip_cache(pos);
- }
- }
-}
-
-pub fn reverse_bits(inval: u32, len: u8) -> u32 {
- if len == 0 { return 0; }
- const REV_TAB: [u8; 16] = [
- 0b0000, 0b1000, 0b0100, 0b1100, 0b0010, 0b1010, 0b0110, 0b1110,
- 0b0001, 0b1001, 0b0101, 0b1101, 0b0011, 0b1011, 0b0111, 0b1111,
- ];
-
- let mut ret = 0;
- let mut val = inval;
- for _ in 0..8 {
- ret = (ret << 4) | (REV_TAB[(val & 0xF) as usize] as u32);
- val = val >> 4;
- }
- ret >> (32 - len)
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
-
- #[test]
- fn br_works() {
- const DATA: [u8; 18] = [0b00011011; 18];
- let src = &DATA;
- let mut br = BitReader::new(src, src.len(), BitReaderMode::LE16MSB);
-
- for _ in 0..8 {
- assert_eq!(br.read(16).unwrap(), 0x1B1B);
- }
- const DATA2: [u8; 1] = [ 0b00011011 ];
- let src = &DATA2;
- let mut br = BitReader::new(src, src.len(), BitReaderMode::LE);
- assert_eq!(br.read_s(5).unwrap(), -5);
- }
-}
diff --git a/src/io/byteio.rs b/src/io/byteio.rs
deleted file mode 100644
index 966169c..0000000
--- a/src/io/byteio.rs
+++ /dev/null
@@ -1,634 +0,0 @@
-use std::io::SeekFrom;
-use std::fs::File;
-use std::io::prelude::*;
-
-#[derive(Debug)]
-pub enum ByteIOError {
- EOF,
- WrongRange,
- WrongIOMode,
- NotImplemented,
- ReadError,
- WriteError,
- SeekError,
-}
-
-pub type ByteIOResult<T> = Result<T, ByteIOError>;
-
-pub trait ByteIO {
- fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>;
- fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>;
- fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>;
- fn read_byte(&mut self) -> ByteIOResult<u8>;
- fn peek_byte(&mut self) -> ByteIOResult<u8>;
- fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()>;
- fn tell(&mut self) -> u64;
- fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64>;
- fn is_eof(&mut self) -> bool;
- fn is_seekable(&mut self) -> bool;
- fn size(&mut self) -> i64;
-}
-
-#[allow(dead_code)]
-pub struct ByteReader<'a> {
- io: &'a mut ByteIO,
-}
-
-pub struct MemoryReader<'a> {
- buf: &'a [u8],
- size: usize,
- pos: usize,
-}
-
-pub struct FileReader<'a> {
- file: &'a File,
- eof: bool,
-}
-
-macro_rules! read_int {
- ($s: ident, $inttype: ty, $size: expr, $which: ident) => ({
- let mut buf = [0; $size];
- $s.read_buf(&mut buf)?;
- unsafe {
- Ok((*(buf.as_ptr() as *const $inttype)).$which())
- }
- })
-}
-
-macro_rules! peek_int {
- ($s: ident, $inttype: ty, $size: expr, $which: ident) => ({
- let mut buf = [0; $size];
- $s.peek_buf(&mut buf)?;
- unsafe {
- Ok((*(buf.as_ptr() as *const $inttype)).$which())
- }
- })
-}
-
-impl<'a> ByteReader<'a> {
- pub fn new(io: &'a mut ByteIO) -> Self { ByteReader { io: io } }
-
- pub fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- self.io.read_buf(buf)
- }
-
- pub fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- self.io.read_buf_some(buf)
- }
-
- pub fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- self.io.peek_buf(buf)
- }
-
- pub fn read_byte(&mut self) -> ByteIOResult<u8> {
- self.io.read_byte()
- }
-
- pub fn peek_byte(&mut self) -> ByteIOResult<u8> {
- self.io.peek_byte()
- }
-
- pub fn read_u16be(&mut self) -> ByteIOResult<u16> {
- read_int!(self, u16, 2, to_be)
- }
-
- pub fn peek_u16be(&mut self) -> ByteIOResult<u16> {
- peek_int!(self, u16, 2, to_be)
- }
-
- pub fn read_u24be(&mut self) -> ByteIOResult<u32> {
- let p16 = self.read_u16be()?;
- let p8 = self.read_byte()?;
- Ok(((p16 as u32) << 8) | (p8 as u32))
- }
-
- pub fn peek_u24be(&mut self) -> ByteIOResult<u32> {
- let mut src: [u8; 3] = [0; 3];
- self.peek_buf(&mut src)?;
- Ok(((src[0] as u32) << 16) | ((src[1] as u32) << 8) | (src[2] as u32))
- }
-
- pub fn read_u32be(&mut self) -> ByteIOResult<u32> {
- read_int!(self, u32, 4, to_be)
- }
-
- pub fn peek_u32be(&mut self) -> ByteIOResult<u32> {
- peek_int!(self, u32, 4, to_be)
- }
-
- pub fn read_u64be(&mut self) -> ByteIOResult<u64> {
- read_int!(self, u64, 8, to_be)
- }
-
- pub fn peek_u64be(&mut self) -> ByteIOResult<u64> {
- peek_int!(self, u64, 8, to_be)
- }
-
- pub fn read_u16le(&mut self) -> ByteIOResult<u16> {
- read_int!(self, u16, 2, to_le)
- }
-
- pub fn peek_u16le(&mut self) -> ByteIOResult<u16> {
- peek_int!(self, u16, 2, to_le)
- }
-
- pub fn read_u24le(&mut self) -> ByteIOResult<u32> {
- let p8 = self.read_byte()?;
- let p16 = self.read_u16le()?;
- Ok(((p16 as u32) << 8) | (p8 as u32))
- }
-
- pub fn peek_u24le(&mut self) -> ByteIOResult<u32> {
- let mut src: [u8; 3] = [0; 3];
- self.peek_buf(&mut src)?;
- Ok((src[0] as u32) | ((src[1] as u32) << 8) | ((src[2] as u32) << 16))
- }
-
- pub fn read_u32le(&mut self) -> ByteIOResult<u32> {
- read_int!(self, u32, 4, to_le)
- }
-
- pub fn peek_u32le(&mut self) -> ByteIOResult<u32> {
- peek_int!(self, u32, 4, to_le)
- }
-
- pub fn read_u64le(&mut self) -> ByteIOResult<u64> {
- read_int!(self, u64, 8, to_le)
- }
-
- pub fn peek_u64le(&mut self) -> ByteIOResult<u64> {
- peek_int!(self, u64, 8, to_le)
- }
-
- pub fn read_skip(&mut self, len: usize) -> ByteIOResult<()> {
- if self.io.is_seekable() {
- self.io.seek(SeekFrom::Current(len as i64))?;
- } else {
- let mut ssize = len;
- let mut buf : [u8; 16] = [0; 16];
- let bref = &mut buf;
- while ssize > bref.len() {
- self.io.read_buf(bref)?;
- ssize -= bref.len();
- }
- while ssize > 0 {
- self.io.read_byte()?;
- ssize = ssize - 1;
- }
- }
- Ok(())
- }
-
- pub fn tell(&mut self) -> u64 {
- self.io.tell()
- }
-
- pub fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
- self.io.seek(pos)
- }
-
- pub fn is_eof(&mut self) -> bool {
- self.io.is_eof()
- }
-
- pub fn size(&mut self) -> i64 {
- self.io.size()
- }
-
- pub fn left(&mut self) -> i64 {
- let size = self.io.size();
- if size == -1 { return -1; }
- return size - (self.io.tell() as i64)
- }
-}
-
-impl<'a> MemoryReader<'a> {
-
- pub fn new_read(buf: &'a [u8]) -> Self {
- MemoryReader { buf: buf, size: buf.len(), pos: 0 }
- }
-
- fn real_seek(&mut self, pos: i64) -> ByteIOResult<u64> {
- if pos < 0 || (pos as usize) > self.size {
- return Err(ByteIOError::WrongRange)
- }
- self.pos = pos as usize;
- Ok(pos as u64)
- }
-}
-
-impl<'a> ByteIO for MemoryReader<'a> {
- fn read_byte(&mut self) -> ByteIOResult<u8> {
- if self.is_eof() { return Err(ByteIOError::EOF); }
- let res = self.buf[self.pos];
- self.pos = self.pos + 1;
- Ok(res)
- }
-
- fn peek_byte(&mut self) -> ByteIOResult<u8> {
- if self.is_eof() { return Err(ByteIOError::EOF); }
- Ok(self.buf[self.pos])
- }
-
- fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- let copy_size = if self.size - self.pos < buf.len() { self.size } else { buf.len() };
- if copy_size == 0 { return Err(ByteIOError::EOF); }
- for i in 0..copy_size {
- buf[i] = self.buf[self.pos + i];
- }
- Ok(copy_size)
- }
-
- fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- let read_size = self.peek_buf(buf)?;
- if read_size < buf.len() { return Err(ByteIOError::EOF); }
- self.pos += read_size;
- Ok(read_size)
- }
-
- fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- let read_size = self.peek_buf(buf)?;
- self.pos += read_size;
- Ok(read_size)
- }
-
- #[allow(unused_variables)]
- fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> {
- Err(ByteIOError::NotImplemented)
- }
-
- fn tell(&mut self) -> u64 {
- self.pos as u64
- }
-
- fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
- let cur_pos = self.pos as i64;
- let cur_size = self.size as i64;
- match pos {
- SeekFrom::Start(x) => self.real_seek(x as i64),
- SeekFrom::Current(x) => self.real_seek(cur_pos + x),
- SeekFrom::End(x) => self.real_seek(cur_size + x),
- }
- }
-
- fn is_eof(&mut self) -> bool {
- self.pos >= self.size
- }
-
- fn is_seekable(&mut self) -> bool {
- true
- }
-
- fn size(&mut self) -> i64 {
- self.buf.len() as i64
- }
-}
-
-impl<'a> FileReader<'a> {
-
- pub fn new_read(file: &'a mut File) -> Self {
- FileReader { file: file, eof : false }
- }
-}
-
-impl<'a> ByteIO for FileReader<'a> {
- fn read_byte(&mut self) -> ByteIOResult<u8> {
- let mut byte : [u8; 1] = [0];
- let err = self.file.read(&mut byte);
- if let Err(_) = err { return Err(ByteIOError::ReadError); }
- let sz = err.unwrap();
- if sz == 0 { self.eof = true; return Err(ByteIOError::EOF); }
- Ok (byte[0])
- }
-
- fn peek_byte(&mut self) -> ByteIOResult<u8> {
- let b = self.read_byte()?;
- self.seek(SeekFrom::Current(-1))?;
- Ok(b)
- }
-
- fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- let res = self.file.read(buf);
- if let Err(_) = res { return Err(ByteIOError::ReadError); }
- let sz = res.unwrap();
- if sz < buf.len() { self.eof = true; return Err(ByteIOError::EOF); }
- Ok(sz)
- }
-
- fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- let res = self.file.read(buf);
- if let Err(_) = res { return Err(ByteIOError::ReadError); }
- let sz = res.unwrap();
- if sz < buf.len() { self.eof = true; }
- Ok(sz)
- }
-
- fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- let size = self.read_buf(buf)?;
- self.seek(SeekFrom::Current(-(size as i64)))?;
- Ok(size)
- }
-
- #[allow(unused_variables)]
- fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> {
- Err(ByteIOError::NotImplemented)
- }
-
- fn tell(&mut self) -> u64 {
- self.file.seek(SeekFrom::Current(0)).unwrap()
- }
-
- fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
- let res = self.file.seek(pos);
- match res {
- Ok(r) => Ok(r),
- Err(_) => Err(ByteIOError::SeekError),
- }
- }
-
- fn is_eof(&mut self) -> bool {
- self.eof
- }
-
- fn is_seekable(&mut self) -> bool {
- true
- }
-
- fn size(&mut self) -> i64 {
- -1
- }
-}
-
-#[allow(dead_code)]
-pub struct ByteWriter<'a> {
- io: &'a mut ByteIO,
-}
-
-pub struct MemoryWriter<'a> {
- buf: &'a mut [u8],
- size: usize,
- pos: usize,
-}
-
-pub struct FileWriter {
- file: File,
-}
-
-impl<'a> ByteWriter<'a> {
- pub fn new(io: &'a mut ByteIO) -> Self { ByteWriter { io: io } }
-
- pub fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> {
- self.io.write_buf(buf)
- }
-
- pub fn write_byte(&mut self, val: u8) -> ByteIOResult<()> {
- let buf: [u8; 1] = [val];
- self.io.write_buf(&buf)
- }
-
- pub fn write_u16be(&mut self, val: u16) -> ByteIOResult<()> {
- let buf: [u8; 2] = [((val >> 8) & 0xFF) as u8, (val & 0xFF) as u8];
- self.io.write_buf(&buf)
- }
-
- pub fn write_u16le(&mut self, val: u16) -> ByteIOResult<()> {
- let buf: [u8; 2] = [(val & 0xFF) as u8, ((val >> 8) & 0xFF) as u8];
- self.io.write_buf(&buf)
- }
-
- pub fn write_u24be(&mut self, val: u32) -> ByteIOResult<()> {
- let buf: [u8; 3] = [((val >> 16) & 0xFF) as u8, ((val >> 8) & 0xFF) as u8, (val & 0xFF) as u8];
- self.write_buf(&buf)
- }
-
- pub fn write_u24le(&mut self, val: u32) -> ByteIOResult<()> {
- let buf: [u8; 3] = [(val & 0xFF) as u8, ((val >> 8) & 0xFF) as u8, ((val >> 16) & 0xFF) as u8];
- self.write_buf(&buf)
- }
-
- pub fn write_u32be(&mut self, val: u32) -> ByteIOResult<()> {
- self.write_u16be(((val >> 16) & 0xFFFF) as u16)?;
- self.write_u16be((val & 0xFFFF) as u16)
- }
-
- pub fn write_u32le(&mut self, val: u32) -> ByteIOResult<()> {
- self.write_u16le((val & 0xFFFF) as u16)?;
- self.write_u16le(((val >> 16) & 0xFFFF) as u16)
- }
-
- pub fn write_u64be(&mut self, val: u64) -> ByteIOResult<()> {
- self.write_u32be(((val >> 32) & 0xFFFFFFFF) as u32)?;
- self.write_u32be((val & 0xFFFFFFFF) as u32)
- }
-
- pub fn write_u64le(&mut self, val: u64) -> ByteIOResult<()> {
- self.write_u32le((val & 0xFFFFFFFF) as u32)?;
- self.write_u32le(((val >> 32) & 0xFFFFFFFF) as u32)
- }
-
- pub fn tell(&mut self) -> u64 {
- self.io.tell()
- }
-
- pub fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
- self.io.seek(pos)
- }
-
- pub fn size_left(&mut self) -> i64 {
- let sz = self.io.size();
- if sz == -1 { return -1; }
- sz - (self.tell() as i64)
- }
-}
-
-impl<'a> MemoryWriter<'a> {
-
- pub fn new_write(buf: &'a mut [u8]) -> Self {
- let len = buf.len();
- MemoryWriter { buf: buf, size: len, pos: 0 }
- }
-
- fn real_seek(&mut self, pos: i64) -> ByteIOResult<u64> {
- if pos < 0 || (pos as usize) > self.size {
- return Err(ByteIOError::WrongRange)
- }
- self.pos = pos as usize;
- Ok(pos as u64)
- }
-}
-
-impl<'a> ByteIO for MemoryWriter<'a> {
- #[allow(unused_variables)]
- fn read_byte(&mut self) -> ByteIOResult<u8> {
- Err(ByteIOError::NotImplemented)
- }
-
- #[allow(unused_variables)]
- fn peek_byte(&mut self) -> ByteIOResult<u8> {
- Err(ByteIOError::NotImplemented)
- }
-
- #[allow(unused_variables)]
- fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- Err(ByteIOError::NotImplemented)
- }
-
- #[allow(unused_variables)]
- fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- Err(ByteIOError::NotImplemented)
- }
-
- #[allow(unused_variables)]
- fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- Err(ByteIOError::NotImplemented)
- }
-
- fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> {
- if self.pos + buf.len() > self.size { return Err(ByteIOError::WriteError); }
- for i in 0..buf.len() {
- self.buf[self.pos + i] = buf[i];
- }
- self.pos += buf.len();
- Ok(())
- }
-
- fn tell(&mut self) -> u64 {
- self.pos as u64
- }
-
- fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
- let cur_pos = self.pos as i64;
- let cur_size = self.size as i64;
- match pos {
- SeekFrom::Start(x) => self.real_seek(x as i64),
- SeekFrom::Current(x) => self.real_seek(cur_pos + x),
- SeekFrom::End(x) => self.real_seek(cur_size + x),
- }
- }
-
- fn is_eof(&mut self) -> bool {
- self.pos >= self.size
- }
-
- fn is_seekable(&mut self) -> bool {
- true
- }
-
- fn size(&mut self) -> i64 {
- self.buf.len() as i64
- }
-}
-
-impl FileWriter {
- pub fn new_write(file: File) -> Self {
- FileWriter { file: file }
- }
-}
-
-impl ByteIO for FileWriter {
- #[allow(unused_variables)]
- fn read_byte(&mut self) -> ByteIOResult<u8> {
- Err(ByteIOError::NotImplemented)
- }
-
- #[allow(unused_variables)]
- fn peek_byte(&mut self) -> ByteIOResult<u8> {
- Err(ByteIOError::NotImplemented)
- }
-
- #[allow(unused_variables)]
- fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- Err(ByteIOError::NotImplemented)
- }
-
- #[allow(unused_variables)]
- fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- Err(ByteIOError::NotImplemented)
- }
-
- #[allow(unused_variables)]
- fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
- Err(ByteIOError::NotImplemented)
- }
-
- fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> {
- match self.file.write_all(buf) {
- Ok(()) => Ok(()),
- Err(_) => Err(ByteIOError::WriteError),
- }
- }
-
- fn tell(&mut self) -> u64 {
- self.file.seek(SeekFrom::Current(0)).unwrap()
- }
-
- fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
- let res = self.file.seek(pos);
- match res {
- Ok(r) => Ok(r),
- Err(_) => Err(ByteIOError::SeekError),
- }
- }
-
- fn is_eof(&mut self) -> bool {
- false
- }
-
- fn is_seekable(&mut self) -> bool {
- true
- }
-
- fn size(&mut self) -> i64 {
- -1
- }
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
- use std::fs::File;
-
- #[test]
- fn test_read() {
- //const DATA : &'static [u8] = include_bytes!("../../assets/file");
- let buf: [u8; 64] = [1; 64];
- let mut mr = MemoryReader::new_read(&buf);
- let mut reader = ByteReader::new(&mut mr);
- assert_eq!(reader.read_byte().unwrap(), 0x01u8);
- assert_eq!(reader.read_u16le().unwrap(), 0x0101u16);
- assert_eq!(reader.read_u24le().unwrap(), 0x010101u32);
- assert_eq!(reader.read_u32le().unwrap(), 0x01010101u32);
- assert_eq!(reader.read_u64le().unwrap(), 0x0101010101010101u64);
- let mut file = File::open("assets/MaoMacha.asx").unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br2 = ByteReader::new(&mut fr);
- assert_eq!(br2.read_byte().unwrap(), 0x30);
- assert_eq!(br2.read_u24be().unwrap(), 0x26B275);
- assert_eq!(br2.read_u24le().unwrap(), 0xCF668E);
- assert_eq!(br2.read_u32be().unwrap(), 0x11A6D900);
- assert_eq!(br2.read_u32le().unwrap(), 0xCE6200AA);
- }
- #[test]
- fn test_write() {
- let mut buf: [u8; 64] = [0; 64];
- {
- let mut mw = MemoryWriter::new_write(&mut buf);
- let mut bw = ByteWriter::new(&mut mw);
- bw.write_byte(0x00).unwrap();
- bw.write_u16be(0x0102).unwrap();
- bw.write_u24be(0x030405).unwrap();
- bw.write_u32be(0x06070809).unwrap();
- bw.write_u64be(0x0A0B0C0D0E0F1011).unwrap();
- bw.write_byte(0x00).unwrap();
- bw.write_u16le(0x0201).unwrap();
- bw.write_u24le(0x050403).unwrap();
- bw.write_u32le(0x09080706).unwrap();
- bw.write_u64le(0x11100F0E0D0C0B0A).unwrap();
- assert_eq!(bw.size_left(), 28);
- }
- for i in 0..0x12 {
- assert_eq!(buf[(i + 0x00) as usize], i);
- assert_eq!(buf[(i + 0x12) as usize], i);
- }
- }
-}
diff --git a/src/io/codebook.rs b/src/io/codebook.rs
deleted file mode 100644
index 78ef5ae..0000000
--- a/src/io/codebook.rs
+++ /dev/null
@@ -1,415 +0,0 @@
-use std::collections::HashMap;
-use std::cmp::{max, min};
-use super::bitreader::BitReader;
-
-#[derive(Debug)]
-pub enum CodebookError {
- InvalidCodebook,
- MemoryError,
- InvalidCode,
-}
-
-#[derive(Debug, Copy, Clone)]
-pub enum CodebookMode {
- MSB,
- LSB,
-}
-
-type CodebookResult<T> = Result<T, CodebookError>;
-
-pub struct FullCodebookDesc<S> {
- code: u32,
- bits: u8,
- sym: S,
-}
-
-pub struct ShortCodebookDesc {
- code: u32,
- bits: u8,
-}
-
-pub trait CodebookDescReader<S> {
- fn bits(&mut self, idx: usize) -> u8;
- fn code(&mut self, idx: usize) -> u32;
- fn sym (&mut self, idx: usize) -> S;
- fn len (&mut self) -> usize;
-}
-
-#[allow(dead_code)]
-pub struct Codebook<S> {
- table: Vec<u32>,
- syms: Vec<S>,
- lut_bits: u8,
-}
-
-pub trait CodebookReader<S> {
- fn read_cb(&mut self, cb: &Codebook<S>) -> CodebookResult<S>;
-}
-
-const TABLE_FILL_VALUE: u32 = 0x7F;
-const MAX_LUT_BITS: u8 = 10;
-
-fn fill_lut_msb(table: &mut Vec<u32>, off: usize,
- code: u32, bits: u8, lut_bits: u8, symidx: u32, esc: bool) {
- if !esc {
- let fill_len = lut_bits - bits;
- let fill_size = 1 << fill_len;
- let fill_code = code << (lut_bits - bits);
- let lut_value = (symidx << 8) | (bits as u32);
- for j in 0..fill_size {
- let idx = (fill_code + j) as usize;
- table[idx + off] = lut_value;
- }
- } else {
- let idx = (code as usize) + off;
- table[idx] = (symidx << 8) | 0x80 | (bits as u32);
- }
-}
-
-fn fill_lut_lsb(table: &mut Vec<u32>, off: usize,
- code: u32, bits: u8, lut_bits: u8, symidx: u32, esc: bool) {
- if !esc {
- let fill_len = lut_bits - bits;
- let fill_size = 1 << fill_len;
- let fill_code = code;
- let step = lut_bits - fill_len;
- for j in 0..fill_size {
- let idx = (fill_code + (j << step)) as usize;
- table[idx + off] = (symidx << 8) | (bits as u32);
- }
- } else {
- let idx = (code as usize) + off;
- table[idx] = (symidx << 8) | 0x80 | (bits as u32);
- }
-}
-
-fn fill_lut(table: &mut Vec<u32>, mode: CodebookMode,
- off: usize, code: u32, bits: u8, lut_bits: u8, symidx: u32, esc: bool) -> bool {
- match mode {
- CodebookMode::MSB => fill_lut_msb(table, off, code, bits, lut_bits, symidx, esc),
- CodebookMode::LSB => fill_lut_lsb(table, off, code, bits, lut_bits, symidx, esc),
- };
- bits > lut_bits
-}
-
-fn resize_table(table: &mut Vec<u32>, bits: u8) -> CodebookResult<u32> {
- let add_size = (1 << bits) as usize;
- table.reserve(add_size);
- let cur_off = table.len() as u32;
- let new_size = table.len() + add_size;
- if table.capacity() < new_size { return Err(CodebookError::MemoryError); }
- table.resize(new_size, TABLE_FILL_VALUE);
- Ok(cur_off)
-}
-
-
-fn extract_lut_part(code: u32, bits: u8, lut_bits: u8, mode: CodebookMode) -> u32 {
- match mode {
- CodebookMode::MSB => code >> (bits - lut_bits),
- CodebookMode::LSB => code & ((1 << lut_bits) - 1),
- }
-}
-
-fn extract_esc_part(code: u32, bits: u8, lut_bits: u8, mode: CodebookMode) -> u32 {
- match mode {
- CodebookMode::MSB => code & ((1 << (bits - lut_bits)) - 1),
- CodebookMode::LSB => code >> lut_bits,
- }
-}
-
-#[derive(Clone,Copy)]
-struct Code {
- code: u32,
- bits: u8,
- idx: usize,
-}
-
-struct CodeBucket {
- maxlen: u8,
- offset: usize,
- codes: Vec<Code>,
-}
-
-impl CodeBucket {
- fn new() -> Self {
- CodeBucket { maxlen: 0, offset: 0, codes: Vec::new() }
- }
- fn add_code(&mut self, c: Code) {
- if c.bits > self.maxlen { self.maxlen = c.bits; }
- self.codes.push(c);
- }
-}
-
-type EscapeCodes = HashMap<u32, CodeBucket>;
-
-fn add_esc_code(cc: &mut EscapeCodes, key: u32, code: u32, bits: u8, idx: usize) {
- if !cc.contains_key(&key) { cc.insert(key, CodeBucket::new()); }
- let b = cc.get_mut(&key);
- if let Some(bucket) = b {
- bucket.add_code(Code {code: code, bits: bits, idx: idx });
- } else { panic!("no bucket when expected!"); }
-}
-
-fn build_esc_lut(table: &mut Vec<u32>,
- mode: CodebookMode,
- bucket: &CodeBucket) -> CodebookResult<()> {
- let mut escape_list: EscapeCodes = HashMap::new();
- let maxlen = if bucket.maxlen > MAX_LUT_BITS { MAX_LUT_BITS } else { bucket.maxlen };
-
- for code in &bucket.codes {
- let bits = code.bits;
- if code.bits <= MAX_LUT_BITS {
- fill_lut(table, mode, bucket.offset, code.code, bits,
- maxlen, code.idx as u32, false);
- } else {
- let ckey = extract_lut_part(code.code, bits, MAX_LUT_BITS, mode);
- let cval = extract_esc_part(code.code, bits, MAX_LUT_BITS, mode);
- add_esc_code(&mut escape_list, ckey, cval, bits - MAX_LUT_BITS, code.idx);
- }
- }
-
- let cur_offset = bucket.offset;
- for (ckey, sec_bucket) in &mut escape_list {
- let key = *ckey as u32;
- let maxlen = min(sec_bucket.maxlen, MAX_LUT_BITS);
- let new_off = resize_table(table, maxlen)?;
- fill_lut(table, mode, cur_offset, key, maxlen,
- MAX_LUT_BITS, new_off, true);
- sec_bucket.offset = new_off as usize;
- }
-
- for (_, sec_bucket) in &escape_list {
- build_esc_lut(table, mode, sec_bucket)?;
- }
-
- Ok(())
-}
-
-impl<S: Copy> Codebook<S> {
-
- pub fn new(cb: &mut CodebookDescReader<S>, mode: CodebookMode) -> CodebookResult<Self> {
- let mut maxbits = 0;
- let mut nnz = 0;
- let mut escape_list: EscapeCodes = HashMap::new();
-
- let mut symidx: usize = 0;
- for i in 0..cb.len() {
- let bits = cb.bits(i);
- if bits > 0 {
- nnz = nnz + 1;
- if cb.code(i) >= (1 << bits) {
- return Err(CodebookError::InvalidCodebook);
- }
- }
- maxbits = max(bits, maxbits);
- if bits > MAX_LUT_BITS {
- let code = cb.code(i);
- let ckey = extract_lut_part(code, bits, MAX_LUT_BITS, mode);
- let cval = extract_esc_part(code, bits, MAX_LUT_BITS, mode);
- add_esc_code(&mut escape_list, ckey, cval, bits - MAX_LUT_BITS, symidx);
- }
- if bits > 0 { symidx = symidx + 1; }
- }
- if maxbits == 0 { return Err(CodebookError::InvalidCodebook); }
-
- if maxbits > MAX_LUT_BITS { maxbits = MAX_LUT_BITS; }
-
- let tab_len = 1 << maxbits;
- let mut table: Vec<u32> = Vec::with_capacity(tab_len);
- let mut syms: Vec<S> = Vec::with_capacity(nnz);
- if table.capacity() < tab_len { return Err(CodebookError::MemoryError); }
- if syms.capacity() < nnz { return Err(CodebookError::MemoryError); }
- table.resize(tab_len, TABLE_FILL_VALUE);
-
- let mut symidx: u32 = 0;
- for i in 0..cb.len() {
- let bits = cb.bits(i);
- let code = cb.code(i);
- if bits == 0 { continue; }
- if bits <= MAX_LUT_BITS {
- fill_lut(&mut table, mode, 0, code, bits, maxbits, symidx, false);
- } else {
- let ckey = extract_lut_part(code, bits, MAX_LUT_BITS, mode) as usize;
- if table[ckey] == TABLE_FILL_VALUE {
- let key = ckey as u32;
- if let Some(bucket) = escape_list.get_mut(&key) {
- let maxlen = min(bucket.maxlen, MAX_LUT_BITS);
- let new_off = resize_table(&mut table, maxlen)?;
- fill_lut(&mut table, mode, 0, key, maxlen, MAX_LUT_BITS, new_off, true);
- bucket.offset = new_off as usize;
- }
- }
- }
- symidx = symidx + 1;
- }
-
- for (_, bucket) in &escape_list {
- build_esc_lut(&mut table, mode, &bucket)?;
- }
-
- for i in 0..cb.len() {
- if cb.bits(i) > 0 {
- syms.push(cb.sym(i));
- }
- }
-
- Ok(Codebook { table: table, syms: syms, lut_bits: maxbits })
- }
-}
-
-impl<'a, S: Copy> CodebookReader<S> for BitReader<'a> {
- #[allow(unused_variables)]
- fn read_cb(&mut self, cb: &Codebook<S>) -> CodebookResult<S> {
- let mut esc = true;
- let mut idx = 0;
- let mut lut_bits = cb.lut_bits;
- while esc {
- let lut_idx = (self.peek(lut_bits) as usize) + (idx as usize);
- if cb.table[lut_idx] == TABLE_FILL_VALUE { return Err(CodebookError::InvalidCode); }
- let bits = cb.table[lut_idx] & 0x7F;
- esc = (cb.table[lut_idx] & 0x80) != 0;
- idx = (cb.table[lut_idx] >> 8) as usize;
- if (bits as isize) > self.left() {
- return Err(CodebookError::InvalidCode);
- }
- let skip_bits = if esc { lut_bits as u32 } else { bits };
- if let Err(_) = self.skip(skip_bits as u32) {}
- lut_bits = bits as u8;
- }
- Ok(cb.syms[idx])
- }
-}
-
-pub struct FullCodebookDescReader<S> {
- data: Vec<FullCodebookDesc<S>>,
-}
-
-impl<S> FullCodebookDescReader<S> {
- pub fn new(data: Vec<FullCodebookDesc<S>>) -> Self {
- FullCodebookDescReader { data: data }
- }
-}
-
-impl<S: Copy> CodebookDescReader<S> for FullCodebookDescReader<S> {
- fn bits(&mut self, idx: usize) -> u8 { self.data[idx].bits }
- fn code(&mut self, idx: usize) -> u32 { self.data[idx].code }
- fn sym (&mut self, idx: usize) -> S { self.data[idx].sym }
- fn len(&mut self) -> usize { self.data.len() }
-}
-
-pub struct ShortCodebookDescReader {
- data: Vec<ShortCodebookDesc>,
-}
-
-impl ShortCodebookDescReader {
- pub fn new(data: Vec<ShortCodebookDesc<>>) -> Self {
- ShortCodebookDescReader { data: data }
- }
-}
-
-impl CodebookDescReader<u32> for ShortCodebookDescReader {
- fn bits(&mut self, idx: usize) -> u8 { self.data[idx].bits }
- fn code(&mut self, idx: usize) -> u32 { self.data[idx].code }
- fn sym (&mut self, idx: usize) -> u32 { idx as u32 }
- fn len(&mut self) -> usize { self.data.len() }
-}
-
-pub struct TableCodebookDescReader<CodeType:'static, IndexType:'static> {
- bits: &'static [u8],
- codes: &'static [CodeType],
- idx_map: fn(usize) -> IndexType,
-}
-
-impl<'a, CodeType, IndexType> TableCodebookDescReader<CodeType, IndexType> {
- pub fn new(codes: &'static [CodeType], bits: &'static [u8], idx_map: fn(usize) -> IndexType) -> Self {
- Self { bits, codes, idx_map }
- }
-}
-impl<CodeType: Copy+Into<u32>, IndexType> CodebookDescReader<IndexType> for TableCodebookDescReader<CodeType, IndexType>
-{
- fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
- fn code(&mut self, idx: usize) -> u32 { self.codes[idx].into() }
- fn sym (&mut self, idx: usize) -> IndexType { (self.idx_map)(idx) }
- fn len(&mut self) -> usize { self.bits.len() }
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
- use crate::io::bitreader::*;
-
- #[test]
- fn test_cb() {
- const BITS: [u8; 2] = [0b01011011, 0b10111100];
- let cb_desc: Vec<FullCodebookDesc<i8>> = vec!(
- FullCodebookDesc { code: 0b0, bits: 1, sym: 16 },
- FullCodebookDesc { code: 0b10, bits: 2, sym: -3 },
- FullCodebookDesc { code: 0b110, bits: 3, sym: 42 },
- FullCodebookDesc { code: 0b1110, bits: 4, sym: -42 }
- );
- let buf = &BITS;
- let mut br = BitReader::new(buf, buf.len(), BitReaderMode::BE);
- let mut cfr = FullCodebookDescReader::new(cb_desc);
- let cb = Codebook::new(&mut cfr, CodebookMode::MSB).unwrap();
- assert_eq!(br.read_cb(&cb).unwrap(), 16);
- assert_eq!(br.read_cb(&cb).unwrap(), -3);
- assert_eq!(br.read_cb(&cb).unwrap(), 42);
- assert_eq!(br.read_cb(&cb).unwrap(), -42);
- let ret = br.read_cb(&cb);
- if let Err(e) = ret {
- assert_eq!(e as i32, CodebookError::InvalidCode as i32);
- } else {
- assert_eq!(0, 1);
- }
-
- let scb_desc: Vec<ShortCodebookDesc> = vec!(
- ShortCodebookDesc { code: 0b0, bits: 1 },
- ShortCodebookDesc { code: 0, bits: 0 },
- ShortCodebookDesc { code: 0b10, bits: 2 },
- ShortCodebookDesc { code: 0, bits: 0 },
- ShortCodebookDesc { code: 0, bits: 0 },
- ShortCodebookDesc { code: 0b110, bits: 3 },
- ShortCodebookDesc { code: 0, bits: 0 },
- ShortCodebookDesc { code: 0b11100, bits: 5 },
- ShortCodebookDesc { code: 0b11101, bits: 5 },
- ShortCodebookDesc { code: 0b1111010, bits: 7 },
- ShortCodebookDesc { code: 0b1111011, bits: 7 },
- ShortCodebookDesc { code: 0b1111110, bits: 7 },
- ShortCodebookDesc { code: 0b11111111, bits: 8 }
- );
- let mut br2 = BitReader::new(buf, buf.len(), BitReaderMode::BE);
- let mut cfr = ShortCodebookDescReader::new(scb_desc);
- let cb = Codebook::new(&mut cfr, CodebookMode::MSB).unwrap();
- assert_eq!(br2.read_cb(&cb).unwrap(), 0);
- assert_eq!(br2.read_cb(&cb).unwrap(), 2);
- assert_eq!(br2.read_cb(&cb).unwrap(), 5);
- assert_eq!(br2.read_cb(&cb).unwrap(), 8);
-
- assert_eq!(reverse_bits(0b0000_0101_1011_1011_1101_1111_0111_1111, 32),
- 0b1111_1110_1111_1011_1101_1101_1010_0000);
-
- const BITS_LE: [u8; 3] = [0b11101111, 0b01110010, 0b01];
- let buf = &BITS_LE;
- let scble_desc: Vec<ShortCodebookDesc> = vec!(
- ShortCodebookDesc { code: 0b00, bits: 2 },
- ShortCodebookDesc { code: 0, bits: 0 },
- ShortCodebookDesc { code: 0b01, bits: 2 },
- ShortCodebookDesc { code: 0, bits: 0 },
- ShortCodebookDesc { code: 0, bits: 0 },
- ShortCodebookDesc { code: 0b011, bits: 3 },
- ShortCodebookDesc { code: 0, bits: 0 },
- ShortCodebookDesc { code: 0b10111, bits: 5 },
- ShortCodebookDesc { code: 0b00111, bits: 5 },
- ShortCodebookDesc { code: 0b0101111, bits: 7 },
- ShortCodebookDesc { code: 0b0111111, bits: 7 },
- ShortCodebookDesc { code: 0b1011101111, bits: 10 }
- );
- let mut brl = BitReader::new(buf, buf.len(), BitReaderMode::LE);
- let mut cfr = ShortCodebookDescReader::new(scble_desc);
- let cb = Codebook::new(&mut cfr, CodebookMode::LSB).unwrap();
- assert_eq!(brl.read_cb(&cb).unwrap(), 11);
- assert_eq!(brl.read_cb(&cb).unwrap(), 0);
- assert_eq!(brl.read_cb(&cb).unwrap(), 7);
- assert_eq!(brl.read_cb(&cb).unwrap(), 0);
- }
-}
diff --git a/src/io/intcode.rs b/src/io/intcode.rs
deleted file mode 100644
index 8d87920..0000000
--- a/src/io/intcode.rs
+++ /dev/null
@@ -1,145 +0,0 @@
-use crate::io::bitreader::{BitReader, BitReaderError, BitReaderResult};
-
-#[derive(Debug)]
-pub enum UintCodeType {
- UnaryOnes,
- UnaryZeroes,
- Unary012,
- Unary210,
- LimitedUnary(u32, u32),
- Golomb(u8),
- Rice(u8),
- Gamma,
- GammaP,
-}
-
-pub enum IntCodeType {
- Golomb(u8),
- Rice(u8),
- Gamma,
- GammaP,
-}
-
-pub trait IntCodeReader {
- fn read_code(&mut self, t: UintCodeType) -> BitReaderResult<u32>;
- fn read_code_signed(&mut self, t: IntCodeType) -> BitReaderResult<i32>;
-}
-
-fn read_unary(br: &mut BitReader, terminator: u32) -> BitReaderResult<u32> {
- let mut res: u32 = 0;
- loop {
- if br.read(1)? == terminator { return Ok(res); }
- res = res + 1;
- }
-}
-
-fn read_unary_lim(br: &mut BitReader, len: u32, terminator: u32) -> BitReaderResult<u32> {
- let mut res: u32 = 0;
- loop {
- if br.read(1)? == terminator { return Ok(res); }
- res = res + 1;
- if res == len { return Ok(res); }
- }
-}
-
-fn read_unary210(br: &mut BitReader) -> BitReaderResult<u32> {
- let val = read_unary_lim(br, 2, 0)?;
- Ok(2 - val)
-}
-
-fn read_golomb(br: &mut BitReader, m: u8) -> BitReaderResult<u32> {
- if m == 0 { return Err(BitReaderError::InvalidValue); }
- let nbits = (8 - m.leading_zeros()) as u8;
- if (m & (m - 1)) == 0 { return read_rice(br, nbits); }
- let cutoff = ((1 << nbits) - m) as u32;
- let pfx = read_unary(br, 0)?;
- let tail = br.read(nbits - 1)?;
- if tail < cutoff {
- let res = pfx * (m as u32) + tail;
- Ok (res)
- } else {
- let add = br.read(1)?;
- let res = pfx * (m as u32) + (tail - cutoff) * 2 + add + cutoff;
- Ok (res)
- }
-}
-
-fn read_rice(br: &mut BitReader, k: u8) -> BitReaderResult<u32> {
- let pfx = read_unary(br, 1)?;
- let ret = (pfx << k) + br.read(k)?;
- Ok(ret)
-}
-
-fn read_gamma(br: &mut BitReader) -> BitReaderResult<u32> {
- let mut ret = 1;
- while br.read(1)? != 1 {
- ret = (ret << 1) | br.read(1)?;
- }
- Ok(ret - 1)
-}
-
-fn read_gammap(br: &mut BitReader) -> BitReaderResult<u32> {
- let pfx = read_unary(br, 1)?;
- if pfx > 32 { return Err(BitReaderError::InvalidValue); }
- let ret = (1 << pfx) + br.read(pfx as u8)?;
- Ok(ret)
-}
-
-fn uval_to_sval0mp(uval: u32) -> i32 {
- if (uval & 1) != 0 { -((uval >> 1) as i32) }
- else { (uval >> 1) as i32 }
-}
-
-fn uval_to_sval0pm(uval: u32) -> i32 {
- if (uval & 1) != 0 { ((uval + 1) >> 1) as i32 }
- else { -((uval >> 1) as i32) }
-}
-
-impl<'a> IntCodeReader for BitReader<'a> {
- #[inline(always)]
- fn read_code(&mut self, t: UintCodeType) -> BitReaderResult<u32> {
- match t {
- UintCodeType::UnaryOnes => read_unary(self, 0),
- UintCodeType::UnaryZeroes => read_unary(self, 1),
- UintCodeType::LimitedUnary(len, term) => read_unary_lim(self, len, term),
- UintCodeType::Unary012 => read_unary_lim(self, 2, 0),
- UintCodeType::Unary210 => read_unary210(self),
- UintCodeType::Golomb(m) => read_golomb(self, m),
- UintCodeType::Rice(k) => read_rice(self, k),
- UintCodeType::Gamma => read_gamma(self),
- UintCodeType::GammaP => read_gammap(self),
- }
- }
- #[allow(unused_variables)]
- fn read_code_signed(&mut self, t: IntCodeType) -> BitReaderResult<i32> {
- let uval =
- match t {
- IntCodeType::Golomb(m) => read_golomb(self, m)?,
- IntCodeType::Rice(k) => read_rice(self, k)?,
- IntCodeType::Gamma => read_gamma(self)?,
- IntCodeType::GammaP => read_gammap(self)?,
- };
- match t {
- IntCodeType::Golomb(m) => Ok(uval_to_sval0mp(uval)),
- IntCodeType::Rice(k) => Ok(uval_to_sval0mp(uval)),
- IntCodeType::Gamma => Ok(uval_to_sval0pm(uval)),
- IntCodeType::GammaP => Ok(uval_to_sval0pm(uval)),
- }
- }
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
- use crate::io::bitreader::*;
-
- #[test]
- fn int_codes() {
- const GDATA: [u8; 6] = [0b000_001_01, 0b0_0110_011, 0b1_1000_100, 0b1_1010_101, 0b10_10111_1, 0b1000_0000];
- let src = &GDATA;
- let mut br = BitReader::new(src, src.len(), BitReaderMode::BE);
- for i in 0..11 {
- assert_eq!(br.read_code(UintCodeType::Golomb(5)).unwrap(), i);
- }
- }
-}
diff --git a/src/io/mod.rs b/src/io/mod.rs
deleted file mode 100644
index bfe78f6..0000000
--- a/src/io/mod.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-pub mod bitreader;
-pub mod codebook;
-pub mod intcode;
-pub mod byteio;
-
diff --git a/src/lib.rs b/src/lib.rs
deleted file mode 100644
index 07c451e..0000000
--- a/src/lib.rs
+++ /dev/null
@@ -1,17 +0,0 @@
-#[cfg(feature="decoders")]
-pub mod codecs;
-
-#[cfg(feature="demuxers")]
-pub mod demuxers;
-
-pub mod formats;
-pub mod frame;
-pub mod io;
-pub mod register;
-pub mod detect;
-
-#[cfg(feature="dsp")]
-pub mod dsp;
-
-#[cfg(test)]
-mod test;
diff --git a/src/register.rs b/src/register.rs
deleted file mode 100644
index b0bce3a..0000000
--- a/src/register.rs
+++ /dev/null
@@ -1,196 +0,0 @@
-use std::fmt;
-
-#[derive(Debug,Clone,Copy,PartialEq)]
-#[allow(dead_code)]
-pub enum CodecType {
- Video,
- Audio,
- Subtitles,
- Data,
- None,
-}
-
-impl fmt::Display for CodecType {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- match *self {
- CodecType::Video => write!(f, "Video"),
- CodecType::Audio => write!(f, "Audio"),
- CodecType::Subtitles => write!(f, "Subtitles"),
- CodecType::Data => write!(f, "Data"),
- CodecType::None => write!(f, "-"),
- }
- }
-}
-
-const CODEC_CAP_INTRAONLY:u32 = 0x000001;
-const CODEC_CAP_LOSSLESS:u32 = 0x000002;
-const CODEC_CAP_REORDER:u32 = 0x000004;
-const CODEC_CAP_HYBRID:u32 = 0x000008;
-const CODEC_CAP_SCALABLE:u32 = 0x000010;
-
-#[derive(Clone)]
-pub struct CodecDescription {
- name: &'static str,
- fname: &'static str,
- ctype: CodecType,
- caps: u32,
-}
-
-impl CodecDescription {
- pub fn get_name(&self) -> &'static str { self.name }
- pub fn get_full_name(&self) -> &'static str { self.fname }
- pub fn get_codec_type(&self) -> CodecType { self.ctype }
- pub fn is_intraonly(&self) -> bool { (self.caps & CODEC_CAP_INTRAONLY) != 0 }
- pub fn is_lossless(&self) -> bool { (self.caps & CODEC_CAP_LOSSLESS) != 0 }
- pub fn has_reorder(&self) -> bool { (self.caps & CODEC_CAP_REORDER) != 0 }
- pub fn is_hybrid(&self) -> bool { (self.caps & CODEC_CAP_HYBRID) != 0 }
- pub fn is_scalable(&self) -> bool { (self.caps & CODEC_CAP_SCALABLE) != 0 }
-}
-
-impl fmt::Display for CodecDescription {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let mut out = format!("{}", self.fname);
- if self.caps != 0 {
- let mut capfmt = "".to_string();
- if (self.caps & CODEC_CAP_INTRAONLY) != 0 {
- capfmt = format!("{} Intra-only", capfmt);
- }
- if (self.caps & CODEC_CAP_LOSSLESS) != 0 {
- capfmt = format!("{} Lossless", capfmt);
- }
- if (self.caps & CODEC_CAP_REORDER) != 0 {
- capfmt = format!("{} Frame reorder", capfmt);
- }
- if (self.caps & CODEC_CAP_HYBRID) != 0 {
- capfmt = format!("{} Can be lossy and lossless", capfmt);
- }
- if (self.caps & CODEC_CAP_SCALABLE) != 0 {
- capfmt = format!("{} Scalable", capfmt);
- }
- out = format!("{} ({})", out, capfmt);
- }
- write!(f, "{}", out)
- }
-}
-
-macro_rules! desc {
- (video; $n:expr, $fn:expr) => ({
- CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
- caps: 0 }
- });
- (video; $n:expr, $fn:expr, $c:expr) => ({
- CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
- caps: $c }
- });
- (video-ll; $n:expr, $fn:expr) => ({
- CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
- caps: CODEC_CAP_LOSSLESS | CODEC_CAP_INTRAONLY }
- });
- (video-llp; $n:expr, $fn:expr) => ({
- CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
- caps: CODEC_CAP_LOSSLESS }
- });
- (video-im; $n:expr, $fn:expr) => ({
- CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
- caps: CODEC_CAP_INTRAONLY }
- });
- (video-modern; $n:expr, $fn:expr) => ({
- CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
- caps: CODEC_CAP_REORDER | CODEC_CAP_HYBRID }
- });
- (audio; $n:expr, $fn:expr) => ({
- CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio,
- caps: 0 }
- });
- (audio-ll; $n:expr, $fn:expr) => ({
- CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio,
- caps: CODEC_CAP_LOSSLESS | CODEC_CAP_INTRAONLY }
- });
-}
-
-pub fn get_codec_description(name: &str) -> Option<&'static CodecDescription> {
- for reg in CODEC_REGISTER {
- if reg.name == name {
- return Some(reg);
- }
- }
- None
-}
-
-static CODEC_REGISTER: &'static [CodecDescription] = &[
- desc!(video-im; "indeo1", "Intel Raw IF09"),
- desc!(video-im; "indeo2", "Intel Indeo 2"),
- desc!(video; "indeo3", "Intel Indeo 3"),
- desc!(video; "indeo4", "Intel Indeo 4", CODEC_CAP_REORDER | CODEC_CAP_SCALABLE),
- desc!(video; "indeo5", "Intel Indeo 5", CODEC_CAP_REORDER | CODEC_CAP_SCALABLE),
- desc!(video; "intel263", "Intel I263", CODEC_CAP_REORDER),
- desc!(audio; "iac", "Intel Indeo audio"),
- desc!(audio; "imc", "Intel Music Coder"),
-
- desc!(video; "realvideo1", "Real Video 1"),
- desc!(video; "realvideo2", "Real Video 2"),
- desc!(video; "realvideo3", "Real Video 3", CODEC_CAP_REORDER),
- desc!(video; "realvideo4", "Real Video 4", CODEC_CAP_REORDER),
- desc!(video; "realvideo6", "Real Video 6", CODEC_CAP_REORDER),
- desc!(video; "clearvideo", "ClearVideo"),
- desc!(video; "clearvideo_rm", "ClearVideo"),
- desc!(audio; "ra14.4", "RealAudio 14.4"),
- desc!(audio; "ra28.8", "RealAudio 28.8"),
- desc!(audio; "cook", "RealAudio Cooker"),
- desc!(audio; "ralf", "RealAudio Lossless"),
- desc!(audio; "aac", "AAC"),
- desc!(audio; "ac3", "ETSI TS 102 366"),
- desc!(audio; "atrac3", "Sony Atrac3"),
- desc!(audio; "sipro", "Sipro Labs ADPCM"),
-];
-
-static AVI_VIDEO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[
- (b"IF09", "indeo1"),
- (b"RT21", "indeo2"),
- (b"IV31", "indeo3"),
- (b"IV32", "indeo3"),
- (b"IV41", "indeo4"),
- (b"IV50", "indeo5"),
- (b"I263", "intel263"),
-
- (b"UCOD", "clearvideo"),
-];
-
-static WAV_CODEC_REGISTER: &'static [(u16, &str)] = &[
- (0x0000, "pcm"),
- (0x0001, "pcm"),
- (0x0003, "pcm"),
- (0x0401, "imc"),
- (0x0402, "iac"),
-];
-
-pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
- for i in 0..AVI_VIDEO_CODEC_REGISTER.len() {
- let (fourcc, name) = AVI_VIDEO_CODEC_REGISTER[i];
- if fourcc == fcc { return Some(name); }
- }
- None
-}
-
-pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
- for i in 0..WAV_CODEC_REGISTER.len() {
- let (twocc, name) = WAV_CODEC_REGISTER[i];
- if twocc == tcc { return Some(name); }
- }
- None
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
-
- #[test]
- fn test_register() {
- let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap();
- let c2 = find_codec_from_wav_twocc(0x401).unwrap();
- println!("found {} and {}", c1, c2);
- let cd1 = get_codec_description(c1).unwrap();
- let cd2 = get_codec_description(c2).unwrap();
- println!("got {} and {}", cd1, cd2);
- }
-}
diff --git a/src/test/dec_video.rs b/src/test/dec_video.rs
deleted file mode 100644
index 4a18191..0000000
--- a/src/test/dec_video.rs
+++ /dev/null
@@ -1,212 +0,0 @@
-use std::fs::File;
-use std::io::prelude::*;
-use crate::frame::*;
-use crate::codecs::*;
-use crate::demuxers::*;
-use crate::io::byteio::*;
-use super::wavwriter::WavWriter;
-
-fn write_pgmyuv(pfx: &str, strno: usize, num: u64, frmref: NAFrameRef) {
- let frm = frmref.borrow();
- if let NABufferType::None = frm.get_buffer() { return; }
- let name = format!("assets/{}out{:02}_{:06}.pgm", pfx, strno, num);
- let mut ofile = File::create(name).unwrap();
- let buf = frm.get_buffer().get_vbuf().unwrap();
- let (w, h) = buf.get_dimensions(0);
- let (w2, h2) = buf.get_dimensions(1);
- let has_alpha = buf.get_info().get_format().has_alpha();
- let tot_h;
- if has_alpha {
- tot_h = h * 2 + h2;
- } else {
- tot_h = h + h2;
- }
- let hdr = format!("P5\n{} {}\n255\n", w, tot_h);
- ofile.write_all(hdr.as_bytes()).unwrap();
- let dta = buf.get_data();
- let ls = buf.get_stride(0);
- let mut idx = 0;
- let mut idx2 = w;
- let mut pad: Vec<u8> = Vec::with_capacity((w - w2 * 2) / 2);
- pad.resize((w - w2 * 2) / 2, 0xFF);
- for _ in 0..h {
- let line = &dta[idx..idx2];
- ofile.write_all(line).unwrap();
- idx += ls;
- idx2 += ls;
- }
- let mut base1 = buf.get_offset(1);
- let stride1 = buf.get_stride(1);
- let mut base2 = buf.get_offset(2);
- let stride2 = buf.get_stride(2);
- for _ in 0..h2 {
- let bend1 = base1 + w2;
- let line = &dta[base1..bend1];
- ofile.write_all(line).unwrap();
- ofile.write_all(pad.as_slice()).unwrap();
-
- let bend2 = base2 + w2;
- let line = &dta[base2..bend2];
- ofile.write_all(line).unwrap();
- ofile.write_all(pad.as_slice()).unwrap();
-
- base1 += stride1;
- base2 += stride2;
- }
- if has_alpha {
- let ls = buf.get_stride(3);
- let mut idx = buf.get_offset(3);
- let mut idx2 = idx + w;
- for _ in 0..h {
- let line = &dta[idx..idx2];
- ofile.write_all(line).unwrap();
- idx += ls;
- idx2 += ls;
- }
- }
-}
-
-fn write_palppm(pfx: &str, strno: usize, num: u64, frmref: NAFrameRef) {
- let frm = frmref.borrow();
- let name = format!("assets/{}out{:02}_{:06}.ppm", pfx, strno, num);
- let mut ofile = File::create(name).unwrap();
- let buf = frm.get_buffer().get_vbuf().unwrap();
- let (w, h) = buf.get_dimensions(0);
- let paloff = buf.get_offset(1);
- let hdr = format!("P6\n{} {}\n255\n", w, h);
- ofile.write_all(hdr.as_bytes()).unwrap();
- let dta = buf.get_data();
- let ls = buf.get_stride(0);
- let mut idx = 0;
- let mut line: Vec<u8> = Vec::with_capacity(w * 3);
- line.resize(w * 3, 0);
- for _ in 0..h {
- let src = &dta[idx..(idx+w)];
- for x in 0..w {
- let pix = src[x] as usize;
- line[x * 3 + 0] = dta[paloff + pix * 3 + 2];
- line[x * 3 + 1] = dta[paloff + pix * 3 + 1];
- line[x * 3 + 2] = dta[paloff + pix * 3 + 0];
- }
- ofile.write_all(line.as_slice()).unwrap();
- idx += ls;
- }
-}
-
-/*fn open_wav_out(pfx: &str, strno: usize) -> WavWriter {
- let name = format!("assets/{}out{:02}.wav", pfx, strno);
- let mut file = File::create(name).unwrap();
- let mut fw = FileWriter::new_write(&mut file);
- let mut wr = ByteWriter::new(&mut fw);
- WavWriter::new(&mut wr)
-}*/
-
-pub fn test_file_decoding(demuxer: &str, name: &str, limit: Option<u64>,
- decode_video: bool, decode_audio: bool,
- video_pfx: Option<&str>) {
- let dmx_f = find_demuxer(demuxer).unwrap();
- let mut file = File::open(name).unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let mut dmx = create_demuxer(dmx_f, &mut br).unwrap();
-
- let mut decs: Vec<Option<Box<NADecoder>>> = Vec::new();
- for i in 0..dmx.get_num_streams() {
- let s = dmx.get_stream(i).unwrap();
- let info = s.get_info();
- let decfunc = find_decoder(info.get_name());
- if let Some(df) = decfunc {
- if (decode_video && info.is_video()) || (decode_audio && info.is_audio()) {
- let mut dec = (df)();
- dec.init(info).unwrap();
- decs.push(Some(dec));
- } else {
- decs.push(None);
- }
- } else {
- decs.push(None);
- }
- }
-
- loop {
- let pktres = dmx.get_frame();
- if let Err(e) = pktres {
- if e == DemuxerError::EOF { break; }
- panic!("error");
- }
- let pkt = pktres.unwrap();
- if limit.is_some() && pkt.get_pts().is_some() {
- if pkt.get_pts().unwrap() > limit.unwrap() { break; }
- }
- let streamno = pkt.get_stream().get_id() as usize;
- if let Some(ref mut dec) = decs[streamno] {
- let frm = dec.decode(&pkt).unwrap();
- if pkt.get_stream().get_info().is_video() && video_pfx.is_some() && frm.borrow().get_frame_type() != FrameType::Skip {
- let pfx = video_pfx.unwrap();
- let pts = if let Some(fpts) = frm.borrow().get_pts() { fpts } else { pkt.get_pts().unwrap() };
- if frm.borrow().get_buffer().get_vbuf().unwrap().get_info().get_format().is_paletted() {
- write_palppm(pfx, streamno, pts, frm);
- } else {
- write_pgmyuv(pfx, streamno, pts, frm);
- }
- }
- }
- }
-}
-
-pub fn test_decode_audio(demuxer: &str, name: &str, limit: Option<u64>, audio_pfx: &str) {
- let dmx_f = find_demuxer(demuxer).unwrap();
- let mut file = File::open(name).unwrap();
- let mut fr = FileReader::new_read(&mut file);
- let mut br = ByteReader::new(&mut fr);
- let mut dmx = create_demuxer(dmx_f, &mut br).unwrap();
-
- let mut decs: Vec<Option<Box<NADecoder>>> = Vec::new();
- for i in 0..dmx.get_num_streams() {
- let s = dmx.get_stream(i).unwrap();
- let info = s.get_info();
- let decfunc = find_decoder(info.get_name());
- if let Some(df) = decfunc {
- if info.is_audio() {
- let mut dec = (df)();
- dec.init(info).unwrap();
- decs.push(Some(dec));
- } else {
- decs.push(None);
- }
- } else {
- decs.push(None);
- }
- }
-
- let name = format!("assets/{}out.wav", audio_pfx);
- let file = File::create(name).unwrap();
- let mut fw = FileWriter::new_write(file);
- let mut wr = ByteWriter::new(&mut fw);
- let mut wwr = WavWriter::new(&mut wr);
- let mut wrote_header = false;
-
- loop {
- let pktres = dmx.get_frame();
- if let Err(e) = pktres {
- if e == DemuxerError::EOF { break; }
- panic!("error");
- }
- let pkt = pktres.unwrap();
- if limit.is_some() && pkt.get_pts().is_some() {
- if pkt.get_pts().unwrap() > limit.unwrap() { break; }
- }
- let streamno = pkt.get_stream().get_id() as usize;
- if let Some(ref mut dec) = decs[streamno] {
- let frm_ = dec.decode(&pkt).unwrap();
- let frm = frm_.borrow();
- if frm.get_info().is_audio() {
- if !wrote_header {
- wwr.write_header(frm.get_info().as_ref().get_properties().get_audio_info().unwrap()).unwrap();
- wrote_header = true;
- }
- wwr.write_frame(frm.get_buffer()).unwrap();
- }
- }
- }
-}
diff --git a/src/test/mod.rs b/src/test/mod.rs
deleted file mode 100644
index aaabd51..0000000
--- a/src/test/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub mod dec_video;
-pub mod wavwriter;
diff --git a/src/test/wavwriter.rs b/src/test/wavwriter.rs
deleted file mode 100644
index 1cd9541..0000000
--- a/src/test/wavwriter.rs
+++ /dev/null
@@ -1,115 +0,0 @@
-use crate::io::byteio::*;
-use crate::frame::*;
-use std::io::SeekFrom;
-
-pub struct WavWriter<'a> {
- io: &'a mut ByteWriter<'a>,
- data_pos: u64,
-}
-
-fn write_byte(wr: &mut ByteWriter, sample: u8) -> ByteIOResult<()> {
- wr.write_byte(sample)
-}
-
-fn write_s16(wr: &mut ByteWriter, sample: i16) -> ByteIOResult<()> {
- wr.write_u16le(sample as u16)
-}
-
-fn write_s32(wr: &mut ByteWriter, sample: i32) -> ByteIOResult<()> {
- wr.write_u16le((sample >> 16) as u16)
-}
-
-fn write_f32(wr: &mut ByteWriter, sample: f32) -> ByteIOResult<()> {
- let mut out = (sample * 32768.0) as i32;
- if out < -32768 { out = -32768; }
- if out > 32767 { out = 32767; }
- if out < 0 { out += 65536; }
- wr.write_u16le(out as u16)
-}
-
-macro_rules! write_data {
- ($wr:expr, $buf:expr, $write:ident) => ({
- let len = $buf.get_length();
- let ainfo = $buf.get_info();
- let nch = ainfo.get_channels() as usize;
- let mut offs: Vec<usize> = Vec::with_capacity(nch);
- for ch in 0..nch { offs.push($buf.get_offset(ch)); }
- let data = $buf.get_data();
-
- for i in 0..len {
- for ch in 0..nch {
- let sample = data[offs[ch] + i];
- $write($wr, sample)?;
- }
- }
- })
-}
-
-impl<'a> WavWriter<'a> {
- pub fn new(io: &'a mut ByteWriter<'a>) -> Self {
- WavWriter { io: io, data_pos: 0 }
- }
- pub fn write_header(&mut self, ainfo: NAAudioInfo) -> ByteIOResult<()> {
- let bits = ainfo.get_format().get_bits() as usize;
-
- self.io.write_buf(b"RIFF")?;
- self.io.write_u32le(0)?;
- self.io.write_buf(b"WAVE")?;
-
- self.io.write_buf(b"fmt ")?;
- self.io.write_u32le(16)?;
- self.io.write_u16le(0x0001)?; // PCM
- self.io.write_u16le(ainfo.get_channels() as u16)?;
- self.io.write_u32le(ainfo.get_sample_rate() as u32)?;
-
- if bits < 16 {
- self.io.write_u32le((ainfo.get_channels() as u32) * (ainfo.get_sample_rate() as u32))?;
- self.io.write_u16le(ainfo.get_channels() as u16)?; // block align
- self.io.write_u16le(8)?;
- } else {
- self.io.write_u32le(2 * (ainfo.get_channels() as u32) * (ainfo.get_sample_rate() as u32))?;
- self.io.write_u16le((2 * ainfo.get_channels()) as u16)?; // block align
- self.io.write_u16le(16)?;
- }
-
- self.io.write_buf(b"data")?;
- self.io.write_u32le(0)?;
-
- self.data_pos = self.io.tell();
- Ok(())
- }
- pub fn write_frame(&mut self, abuf: NABufferType) -> ByteIOResult<()> {
- match abuf {
- NABufferType::AudioU8(ref buf) => {
- write_data!(self.io, buf, write_byte);
- }
- NABufferType::AudioI16(ref buf) => {
- write_data!(self.io, buf, write_s16);
- }
- NABufferType::AudioI32(ref buf) => {
- write_data!(self.io, buf, write_s32);
- }
- NABufferType::AudioF32(ref buf) => {
- write_data!(self.io, buf, write_f32);
- }
- NABufferType::AudioPacked(ref buf) => {
- self.io.write_buf(buf.get_data().as_slice())?;
- }
- _ => {},
- };
- Ok(())
- }
-}
-
-impl<'a> Drop for WavWriter<'a> {
- #[allow(unused_variables)]
- fn drop(&mut self) {
- let size = self.io.tell();
- if (self.data_pos > 0) && (size >= self.data_pos) {
- let res = self.io.seek(SeekFrom::Start(4));
- let res = self.io.write_u32le((size - 8) as u32);
- let res = self.io.seek(SeekFrom::Start(self.data_pos - 4));
- let res = self.io.write_u32le(((size as u64) - self.data_pos) as u32);
- }
- }
-}