Skip to content

ByteData should support memcpy from other type data objects #32080

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
abarth opened this issue Feb 7, 2018 · 14 comments
Open

ByteData should support memcpy from other type data objects #32080

abarth opened this issue Feb 7, 2018 · 14 comments
Labels
area-vm Use area-vm for VM related issues, including code coverage, and the AOT and JIT backends. library-typed-data type-enhancement A request for a change that isn't a bug

Comments

@abarth
Copy link
Contributor

abarth commented Feb 7, 2018

Writing this code makes me sad. The VM can do this much faster an easier than I can from inside Dart.

void _copyInt8(ByteData buffer, int offset, Int8List value) {
  final int count = value.length;
  for (int i = 0; i < count; ++i) {
    buffer.setInt8(offset + i, value[i]);
  }
}

void _copyUint8(ByteData buffer, int offset, Uint8List value) {
  final int count = value.length;
  for (int i = 0; i < count; ++i) {
    buffer.setUint8(offset + i, value[i]);
  }
}

void _copyInt16(ByteData buffer, int offset, Int16List value) {
  final int count = value.length;
  const int stride = 2;
  for (int i = 0; i < count; ++i) {
    buffer.setInt16(offset + i * stride, value[i], Endianness.LITTLE_ENDIAN);
  }
}

void _copyUint16(ByteData buffer, int offset, Uint16List value) {
  final int count = value.length;
  const int stride = 2;
  for (int i = 0; i < count; ++i) {
    buffer.setUint16(offset + i * stride, value[i], Endianness.LITTLE_ENDIAN);
  }
}

void _copyInt32(ByteData buffer, int offset, Int32List value) {
  final int count = value.length;
  const int stride = 4;
  for (int i = 0; i < count; ++i) {
    buffer.setInt32(offset + i * stride, value[i], Endianness.LITTLE_ENDIAN);
  }
}

void _copyUint32(ByteData buffer, int offset, Uint16List value) {
  final int count = value.length;
  const int stride = 4;
  for (int i = 0; i < count; ++i) {
    buffer.setUint32(offset + i * stride, value[i], Endianness.LITTLE_ENDIAN);
  }
}

void _copyInt64(ByteData buffer, int offset, Int32List value) {
  final int count = value.length;
  const int stride = 8;
  for (int i = 0; i < count; ++i) {
    buffer.setInt64(offset + i * stride, value[i], Endianness.LITTLE_ENDIAN);
  }
}

void _copyUint64(ByteData buffer, int offset, Uint16List value) {
  final int count = value.length;
  const int stride = 8;
  for (int i = 0; i < count; ++i) {
    buffer.setUint64(offset + i * stride, value[i], Endianness.LITTLE_ENDIAN);
  }
}

/cc @Hixie @zanderso

@rmacnak-google rmacnak-google added area-vm Use area-vm for VM related issues, including code coverage, and the AOT and JIT backends. library-typed-data type-enhancement A request for a change that isn't a bug labels Feb 7, 2018
@zanderso
Copy link
Member

zanderso commented Feb 7, 2018

Unfortunately it isn't as well documented as it should be, but the fromList constructors and the setRange methods on the typed data types are implemented in the VM when the argument types are also typed data. So:

Uint8List original;
...
Uint8List copy = new Uint8List.fromList(original);
// copy.buffer.asByteData() to get a ByteData.

and

Uint8List l1;
Uint8List l2;
...
l2.setRange(offset, length, l2);

Are implemented in the VM. See https://github.com/dart-lang/sdk/blob/master/runtime/lib/typed_data_patch.dart#L104 and https://github.com/dart-lang/sdk/blob/master/runtime/lib/typed_data.cc#L108

@abarth
Copy link
Contributor Author

abarth commented Feb 7, 2018

Does ByteData support a setRange? I guess I need to create a view of the underlying ByteBuffer for each type that I want to set as a range?

@zanderso
Copy link
Member

zanderso commented Feb 8, 2018

Right. ByteData doesn't have a setRange, but you can do for example byteData.buffer.asInt16List(...).setRange(...)

@abarth
Copy link
Contributor Author

abarth commented Feb 8, 2018

Do you have a sense for where the crossover point is in performance? For example, is there some length below which _copyInt16 is faster than byteData.buffer.asInt16List(...).setRange(...) ? I guess I can make a microbenchmark and figure that out myself.

@zanderso
Copy link
Member

zanderso commented Feb 8, 2018

I'm not sure. The answer might also be different between AOT and JIT. Maybe @mraleph can help.

@abarth
Copy link
Contributor Author

abarth commented Feb 8, 2018

The context of this question is the Dart FIDL2 encoder for Fuchsia:
https://fuchsia-review.googlesource.com/c/topaz/+/120996

I don't have any evidence that this code is a measurable part of the profile. I just felt silly writing these memcpy equivalents.

@zanderso
Copy link
Member

zanderso commented Feb 8, 2018

I ran some microbenchmarks on my x64 desktop:

https://gist.github.com/zanderso/51fcfd0a797f5d486200047a7ece92b7

50 elements seems like a reasonable cross-over point, except for Int64List where it looks like there is a bug:

CopyInt8Benchmark loop 50(RunTime): 1.4557483528209487 us.
CopyInt8Benchmark setRange 50(RunTime): 1.4949139273621506 us.
CopyInt16Benchmark loop 50(RunTime): 2.267146794201098 us.
CopyInt16Benchmark setRange 50(RunTime): 1.609126353375262 us.
CopyInt32Benchmark loop 50(RunTime): 2.0314798924128294 us.
CopyInt32Benchmark setRange 50(RunTime): 1.6735112547726414 us.
CopyInt64Benchmark loop 50(RunTime): 36.02046007132051 us.
CopyInt64Benchmark setRange 50(RunTime): 1.746860488841064 us.

/cc @alexmarkov

@mraleph
Copy link
Member

mraleph commented Feb 8, 2018

We don't have an inline version of setInt64 operation - we recognize it, but we don't have any special handling for it for some reason (probably simply forgot about it - our support for unboxed 64-bit integers is pretty sketchy and definitely something we have on radar to fix soon).

In general I would recommend using setRange(...) whenever possible. I think it will be easier for us to recognize it and essentially short circuit it to memcpy where applicable.

dart-bot pushed a commit that referenced this issue Feb 8, 2018
Issue: #32080
Change-Id: I692d1873acc4c9816ccc6929f51e0ed699f585da
Reviewed-on: https://dart-review.googlesource.com/40103
Reviewed-by: Vyacheslav Egorov <[email protected]>
Commit-Queue: Alexander Markov <[email protected]>
@ds84182
Copy link
Contributor

ds84182 commented Nov 21, 2018

After working on optimizing a computation bound problem today (small network protocol benchmark over a loopback socket, hits 200 mb/s if reading is stubbed), I found that using setRange is very slow in many cases, and I've found that replacing setRange calls with a for loop (since in my benchmark there are small amounts of data being copied into staging buffers) greatly increases performance (once I gained around 30 mb/s by removing a setRange call).

I've also found that array views also quite slow, but that's being handled by #35154.

vHanda added a commit to GitJournal/dart-git that referenced this issue Dec 28, 2021
I wish dart had some kind of memcpy operation.

Over here, using raw loops vs getRange and iterating, gives about ~3-5%
performance boost.

Related: dart-lang/sdk#32080
@Mr-Pepe
Copy link

Mr-Pepe commented Apr 15, 2024

I found that using setRange is very slow in many cases

This seems to still be the case. I need to copy a lot of small chunks (1-15 bytes) from one place in a Uint8List to another place in the same Uint8List and using a for loop is 3-4x faster than setRange/getRange.

@mraleph
Copy link
Member

mraleph commented Apr 15, 2024

@Mr-Pepe small chunks might indeed be faster to copy with an inline loop, but we did optimize setRange for TypedData to use fast copying.

Can you post the benchmark you are using?

@Mr-Pepe
Copy link

Mr-Pepe commented Apr 15, 2024

@mraleph Sure. Here is a stripped down version of my benchmark. It's an implementation of LZ77 decompression. The benchmarks creates a Uint8List of known size in advance. It then iterates over a list of blocks. A block can be compressed or uncompressed. An uncompressed block holds a byte value that can directly be inserted at the current position of the Uint8List. A compressed block tells the algorithm to go back a certain offset and then copy a certain number of bytes to the current position.

I have tried using a for-loop and setRange/getRange to copy the range for compressed blocks and the for-loop seems to be faster on my machine.

Here the code. Sorry, I have hardcoded the data (parts of CEDICT) because that was the fastest I could come up with :\

Code
import 'dart:typed_data';

void main() {
  const nRuns = 1000;
  final blocks = getBlocks();
  final decompressed = Uint8List(100000);

  final overallWatch = Stopwatch()..start();

  for (var i = 0; i < nRuns; i++) {
    int index = 0;

    for (final block in blocks) {
      if (block is CB) {
        decompressed.setRange(
          index,
          index + block.length,
          decompressed.getRange(
            index - block.offset,
            index - block.offset + block.length,
          ),
        );
        index += block.length;
        // for (var i = 0; i < block.length; i++) {
        //   decompressed[index] = decompressed[index - block.offset];
        //   index++;
        // }
      } else if (block is UB) {
        decompressed[index] = block.value;
        index++;
      }
    }
  }

  print('Average: ${overallWatch.elapsedMilliseconds / nRuns} ms');
}

class Block {}

/// A block of compressed data.
///
/// The data is compressed by pointing to a previous substring of the input.
/// The block contains the [offset] to the start of the substring and the
/// [length] of the substring. The substring can simply be copied to the output
/// to substitute this block.
class CB implements Block {
  CB(this.offset, this.length);
  final int offset;
  final int length;
}

/// A block of uncompressed data.
///
/// The [value] can be copied directly to the output.
class UB implements Block {
  UB(this.value);
  final int value;
}

Iterable<Block> getBlocks() {
  return [
    UB(35),
    UB(32),
    UB(67),
    UB(67),
    UB(45),
    UB(67),
    UB(69),
    UB(68),
    UB(73),
    UB(67),
    UB(84),
    UB(10),
    CB(12, 3),
    UB(111),
    UB(109),
    UB(109),
    UB(117),
    UB(110),
    UB(105),
    UB(116),
    UB(121),
    UB(32),
    UB(109),
    UB(97),
    UB(105),
    UB(110),
    UB(116),
    CB(4, 3),
    UB(101),
    UB(100),
    UB(32),
    UB(102),
    UB(114),
    UB(101),
    UB(101),
    UB(32),
    UB(67),
    UB(104),
    CB(12, 3),
    UB(115),
    UB(101),
    UB(45),
    UB(69),
    UB(110),
    UB(103),
    UB(108),
    UB(105),
    UB(115),
    UB(104),
    UB(32),
    UB(100),
    UB(105),
    UB(99),
    UB(116),
    UB(105),
    UB(111),
    UB(110),
    UB(97),
    UB(114),
    UB(121),
    UB(46),
    CB(56, 3),
    CB(3, 3),
    UB(80),
    UB(117),
    UB(98),
    CB(25, 4),
    CB(48, 3),
    UB(98),
    UB(121),
    UB(32),
    UB(77),
    UB(68),
    UB(66),
    UB(71),
    CB(23, 6),
    UB(76),
    UB(105),
    UB(99),
    UB(101),
    UB(110),
    UB(115),
    UB(101),
    UB(58),
    CB(93, 4),
    UB(114),
    UB(101),
    UB(97),
    UB(116),
    UB(105),
    UB(118),
    CB(76, 3),
    CB(102, 3),
    UB(111),
    UB(110),
    UB(115),
    UB(32),
    UB(65),
    UB(116),
    UB(116),
    UB(114),
    UB(105),
    UB(98),
    UB(117),
    CB(72, 4),
    UB(45),
    UB(83),
    UB(104),
    UB(97),
    UB(114),
    UB(101),
    UB(65),
    UB(108),
    UB(105),
    UB(107),
    UB(101),
    UB(32),
    UB(52),
    UB(46),
    UB(48),
    UB(32),
    UB(73),
    UB(110),
    UB(116),
    UB(101),
    UB(114),
    UB(110),
    CB(47, 3),
    CB(99, 3),
    UB(108),
    CB(69, 8),
    CB(68, 3),
    UB(104),
    UB(116),
    UB(116),
    UB(112),
    UB(115),
    UB(58),
    UB(47),
    UB(47),
    UB(99),
    CB(76, 7),
    UB(99),
    CB(75, 6),
    UB(46),
    UB(111),
    UB(114),
    UB(103),
    UB(47),
    UB(108),
    CB(38, 6),
    UB(115),
    UB(47),
    UB(98),
    UB(121),
    UB(45),
    UB(115),
    UB(97),
    UB(47),
    CB(71, 3),
    UB(47),
    CB(132, 6),
    UB(82),
    UB(101),
    UB(102),
    UB(101),
    UB(114),
    UB(101),
    UB(110),
    UB(99),
    CB(156, 3),
    UB(119),
    UB(111),
    UB(114),
    UB(107),
    UB(115),
    CB(141, 5),
    CB(243, 5),
    UB(32),
    UB(45),
    CB(141, 3),
    UB(112),
    UB(121),
    UB(114),
    UB(105),
    UB(103),
    UB(104),
    UB(116),
    UB(32),
    UB(40),
    UB(67),
    UB(41),
    UB(32),
    UB(49),
    UB(57),
    UB(57),
    UB(55),
    UB(44),
    CB(6, 4),
    UB(56),
    UB(32),
    UB(80),
    UB(97),
    UB(117),
    UB(108),
    UB(32),
    UB(65),
    UB(110),
    UB(100),
    UB(114),
    UB(101),
    UB(119),
    UB(32),
    UB(68),
    UB(101),
    UB(110),
    UB(105),
    UB(115),
    UB(111),
    UB(119),
    UB(115),
    UB(107),
    UB(105),
    CB(82, 6),
    CB(308, 9),
    UB(32),
    UB(99),
    UB(97),
    UB(110),
    UB(32),
    UB(98),
    UB(101),
    UB(32),
    UB(100),
    UB(111),
    UB(119),
    UB(110),
    UB(108),
    UB(111),
    UB(97),
    UB(100),
    CB(303, 5),
    UB(111),
    UB(109),
    CB(98, 4),
    CB(171, 8),
    UB(119),
    UB(119),
    UB(119),
    UB(46),
    UB(109),
    UB(100),
    UB(98),
    UB(103),
    UB(46),
    UB(110),
    UB(101),
    UB(116),
    UB(47),
    UB(99),
    CB(327, 6),
    UB(47),
    CB(319, 10),
    UB(63),
    UB(112),
    UB(97),
    UB(103),
    UB(101),
    UB(61),
    UB(99),
    UB(99),
    UB(45),
    CB(159, 3),
    CB(21, 3),
    CB(96, 6),
    UB(65),
    UB(100),
    UB(100),
    UB(105),
    CB(32, 4),
    UB(115),
    UB(32),
    UB(97),
    UB(110),
    UB(100),
    UB(32),
    UB(99),
    UB(111),
    UB(114),
    UB(114),
    UB(101),
    CB(48, 5),
    UB(115),
    CB(112, 8),
    UB(115),
    UB(101),
    UB(110),
    UB(116),
    UB(32),
    UB(116),
    UB(104),
    UB(114),
    UB(111),
    UB(117),
    UB(103),
    UB(104),
    CB(109, 12),
    CB(72, 9),
    CB(274, 5),
    CB(10, 3),
    UB(116),
    UB(111),
    UB(114),
    CB(7, 7),
    UB(46),
    UB(112),
    UB(104),
    UB(112),
    CB(94, 6),
    UB(70),
    UB(111),
    UB(114),
    UB(32),
    UB(109),
    UB(111),
    UB(114),
    UB(101),
    UB(32),
    UB(105),
    UB(110),
    UB(102),
    UB(111),
    UB(114),
    UB(109),
    CB(358, 5),
    UB(32),
    UB(97),
    UB(98),
    UB(111),
    UB(117),
    UB(116),
    CB(217, 11),
    UB(115),
    UB(101),
    CB(437, 5),
    CB(89, 15),
    CB(89, 7),
    UB(119),
    UB(105),
    UB(107),
    UB(105),
    CB(349, 6),
    UB(33),
    UB(32),
    UB(118),
    UB(101),
    UB(114),
    UB(115),
    CB(65, 3),
    UB(61),
    UB(49),
    CB(13, 4),
    UB(115),
    UB(117),
    UB(98),
    CB(16, 8),
    UB(48),
    CB(16, 4),
    CB(96, 6),
    UB(61),
    UB(116),
    UB(115),
    CB(13, 4),
    UB(99),
    CB(484, 3),
    UB(115),
    UB(101),
    UB(116),
    UB(61),
    UB(85),
    UB(84),
    UB(70),
    UB(45),
    UB(56),
    CB(17, 4),
    CB(197, 3),
    UB(114),
    UB(105),
    UB(101),
    UB(115),
    UB(61),
    UB(49),
    UB(50),
    UB(49),
    UB(54),
    UB(53),
    CB(48, 5),
    UB(112),
    CB(582, 7),
    UB(114),
    UB(61),
    CB(579, 6),
    UB(33),
    UB(32),
    CB(470, 7),
    UB(61),
    CB(506, 15),
    CB(506, 15),
    CB(506, 15),
    CB(506, 4),
    UB(33),
    UB(32),
    UB(100),
    UB(97),
    UB(116),
    UB(101),
    UB(61),
    UB(50),
    UB(48),
    UB(50),
    UB(51),
    UB(45),
    UB(48),
    UB(53),
    UB(45),
    UB(50),
    UB(55),
    UB(84),
    UB(49),
    UB(51),
    UB(58),
    UB(51),
    UB(54),
    UB(58),
    UB(49),
    UB(49),
    UB(90),
    CB(29, 4),
    UB(116),
    UB(105),
    UB(109),
    UB(101),
    UB(61),
    UB(49),
    UB(54),
    UB(56),
    UB(53),
    UB(49),
    UB(57),
    UB(52),
    UB(53),
    UB(55),
    UB(49),
    UB(10),
    UB(37),
    UB(32),
    UB(37),
    UB(32),
    UB(91),
    UB(112),
    UB(97),
    UB(49),
    UB(93),
    UB(32),
    UB(47),
    UB(112),
    UB(101),
    UB(114),
    CB(80, 3),
    CB(529, 3),
    UB(84),
    UB(119),
    UB(41),
    UB(47),
    UB(10),
    UB(50),
    UB(48),
    UB(49),
    UB(57),
    UB(229),
    UB(134),
    UB(160),
    UB(231),
    UB(139),
    UB(128),
    UB(231),
    UB(151),
    UB(133),
    UB(230),
    UB(175),
    UB(146),
    CB(6, 3),
    UB(32),
    CB(20, 8),
    UB(138),
    UB(182),
    CB(20, 10),
    UB(91),
    UB(101),
    UB(114),
    UB(52),
    CB(174, 3),
    UB(110),
    UB(103),
    UB(50),
    UB(32),
    UB(121),
    UB(105),
    UB(49),
    UB(32),
    UB(106),
    UB(105),
    UB(117),
    UB(51),
    UB(32),
    UB(103),
    UB(117),
    UB(97),
    UB(110),
    UB(49),
    UB(32),
    UB(122),
    UB(104),
    CB(7, 3),
    UB(103),
    UB(52),
    UB(32),
    UB(98),
    CB(29, 3),
    UB(52),
    UB(32),
    UB(100),
    UB(117),
    UB(50),
    CB(10, 6),
    CB(106, 3),
    UB(67),
    UB(79),
    UB(86),
    UB(73),
    UB(68),
    UB(45),
    UB(49),
    UB(57),
    UB(44),
    CB(460, 3),
    UB(101),
    CB(488, 4),
    CB(531, 3),
    UB(118),
    UB(105),
    UB(114),
    UB(117),
    UB(115),
    CB(864, 3),
    UB(115),
    UB(101),
    UB(97),
    UB(115),
    CB(419, 3),
    UB(100),
    CB(138, 3),
    UB(105),
    UB(102),
    UB(105),
    CB(601, 3),
    UB(105),
    UB(110),
    CB(120, 5),
    CB(146, 3),
    UB(49),
    UB(228),
    UB(184),
    UB(137),
    UB(233),
    UB(171),
    UB(148),
    UB(231),
    UB(182),
    UB(156),
    UB(229),
    UB(144),
    UB(136),
    UB(231),
    UB(151),
    UB(135),
    UB(32),
    CB(18, 5),
    UB(228),
    UB(189),
    UB(147),
    UB(231),
    UB(187),
    UB(188),
    CB(18, 7),
    CB(142, 5),
    UB(115),
    UB(104),
    UB(105),
    CB(141, 6),
    UB(115),
    CB(135, 4),
    UB(116),
    UB(105),
    UB(51),
    UB(32),
    UB(122),
    UB(111),
    UB(110),
    UB(103),
    UB(49),
    UB(32),
    UB(104),
    UB(101),
    UB(50),
    CB(149, 3),
    UB(101),
    CB(132, 6),
    CB(387, 3),
    UB(115),
    UB(111),
    UB(109),
    UB(121),
    UB(47),
    UB(68),
    CB(707, 3),
    UB(39),
    UB(115),
    UB(32),
    UB(115),
    UB(121),
    CB(755, 3),
    UB(111),
    UB(109),
    UB(101),
    UB(47),
    UB(10),
    UB(51),
    UB(67),
    UB(32),
    CB(3, 3),
    UB(91),
    CB(60, 5),
    UB(67),
    CB(41, 3),
    UB(97),
    UB(98),
    UB(98),
    UB(114),
    UB(46),
    CB(466, 4),
    CB(169, 3),
    UB(109),
    UB(112),
    UB(117),
    CB(929, 3),
    UB(115),
    UB(44),
    CB(11, 4),
    CB(1074, 4),
    UB(99),
    CB(581, 5),
    CB(16, 3),
    CB(688, 6),
    UB(110),
    UB(115),
    UB(117),
    UB(109),
    UB(101),
    UB(114),
    UB(32),
    UB(101),
    UB(108),
    CB(695, 3),
    CB(212, 3),
    UB(105),
    UB(99),
    UB(115),
    UB(47),
    CB(1089, 4),
    UB(97),
    CB(1019, 4),
    UB(112),
    UB(117),
    UB(108),
    UB(115),
    UB(111),
    UB(114),
    UB(121),
    UB(32),
    UB(67),
    UB(101),
    UB(114),
    CB(217, 4),
    CB(58, 3),
    UB(101),
    CB(891, 3),
    UB(67),
    UB(67),
    CB(363, 3),
    UB(51),
    UB(80),
    UB(32),
    CB(3, 3),
    CB(114, 6),
    UB(80),
    CB(114, 3),
    UB(40),
    UB(115),
    UB(108),
    CB(313, 3),
    UB(41),
    CB(745, 4),
    UB(101),
    UB(101),
    CB(165, 3),
    CB(149, 4),
    UB(81),
    UB(32),
    CB(3, 3),
    CB(35, 6),
    UB(81),
    CB(35, 4),
    CB(1066, 6),
    UB(101),
    UB(116),
    UB(32),
    CB(44, 9),
    UB(97),
    UB(110),
    UB(107),
    UB(32),
    UB(121),
    UB(111),
    UB(117),
    UB(32),
    UB(40),
    CB(913, 3),
    UB(110),
    CB(1009, 3),
    UB(100),
    CB(90, 3),
    UB(52),
    UB(50),
    UB(49),
    UB(32),
    CB(4, 4),
    UB(91),
    UB(115),
    UB(105),
    UB(52),
    UB(32),
    CB(283, 4),
    CB(278, 3),
    CB(62, 3),
    UB(102),
    UB(111),
    UB(117),
    UB(114),
    UB(32),
    UB(103),
    UB(114),
    CB(181, 3),
    UB(112),
    CB(1151, 3),
    UB(110),
    UB(116),
    CB(193, 3),
    UB(116),
    UB(119),
    UB(111),
    UB(32),
    CB(13, 7),
    CB(205, 5),
    CB(880, 3),
    UB(111),
    UB(110),
    UB(108),
    UB(121),
    CB(701, 3),
    UB(105),
    UB(108),
    UB(100),
    UB(47),
    UB(10),
    UB(53),
    UB(48),
    UB(50),
    UB(232),
    UB(134),
    UB(160),
    UB(32),
    CB(7, 4),
    UB(131),
    UB(182),
    UB(32),
    UB(91),
    UB(119),
    CB(485, 3),
    CB(500, 6),
    CB(85, 4),
    UB(106),
    UB(105),
    UB(97),
    UB(111),
    CB(87, 4),
    UB(99),
    UB(121),
    UB(97),
    UB(110),
    UB(111),
    UB(97),
    UB(99),
    UB(114),
    UB(121),
    UB(108),
    CB(221, 4),
    UB(103),
    UB(108),
    UB(117),
    CB(185, 3),
    UB(56),
    UB(56),
    UB(32),
    CB(3, 3),
    UB(91),
    UB(98),
    UB(97),
    UB(49),
    UB(32),
    CB(4, 3),
    CB(186, 15),
    CB(186, 5),
    UB(98),
    UB(121),
    UB(101),
    UB(45),
    CB(4, 3),
    UB(32),
    UB(40),
    UB(97),
    UB(108),
    CB(1277, 7),
    CB(1324, 3),
    CB(367, 4),
    UB(230),
    UB(139),
    UB(156),
    CB(3, 3),
    CB(59, 3),
    CB(462, 3),
    CB(5, 4),
    UB(93),
    CB(209, 3),
    UB(57),
    UB(57),
    UB(54),
    UB(32),
    CB(4, 4),
    UB(91),
    CB(616, 5),
    CB(5, 5),
    UB(108),
    UB(105),
    UB(117),
    CB(464, 4),
    UB(57),
    UB(97),
    UB(109),
    UB(45),
    UB(57),
    UB(112),
    UB(109),
    UB(44),
    UB(32),
    UB(115),
    UB(105),
    UB(120),
    CB(771, 3),
    UB(121),
    CB(199, 3),
    UB(32),
    UB(119),
    UB(101),
    UB(101),
    UB(107),
    UB(32),
    UB(40),
    CB(1277, 4),
    UB(32),
    UB(115),
    UB(99),
    CB(1444, 3),
    UB(117),
    UB(108),
    UB(101),
    CB(68, 3),
    UB(65),
    UB(32),
    UB(65),
    UB(32),
    UB(91),
    UB(65),
    CB(360, 11),
    CB(753, 4),
    UB(32),
    UB(116),
    UB(111),
    UB(32),
    UB(115),
    UB(116),
    UB(101),
    UB(97),
    UB(108),
    CB(32, 3),
    UB(65),
    UB(229),
    UB(136),
    UB(182),
    UB(32),
    CB(6, 6),
    UB(91),
    CB(45, 4),
    UB(122),
    UB(104),
    UB(105),
    CB(562, 5),
    CB(34, 3),
    UB(112),
    UB(108),
    UB(105),
    CB(1153, 4),
    UB(101),
    CB(715, 3),
    UB(108),
    UB(108),
    CB(18, 4),
    UB(103),
    UB(111),
    UB(32),
    UB(68),
    UB(117),
    UB(116),
    UB(99),
    UB(104),
    CB(55, 3),
    UB(66),
    CB(55, 5),
    CB(6, 5),
    CB(55, 3),
    UB(66),
    CB(55, 15),
    CB(55, 10),
    CB(146, 3),
    CB(1002, 3),
    UB(101),
    CB(16, 5),
    UB(109),
    UB(97),
    UB(108),
    CB(769, 4),
    UB(117),
    CB(276, 4),
    CB(383, 3),
    UB(116),
    CB(249, 3),
    UB(111),
    CB(386, 3),
    CB(27, 4),
    UB(108),
    UB(97),
    UB(114),
    UB(103),
    CB(589, 3),
    UB(112),
    UB(111),
    CB(560, 3),
    CB(1193, 3),
    UB(111),
    UB(102),
    CB(22, 5),
    CB(610, 3),
    UB(41),
    UB(47),
    UB(40),
    CB(10, 3),
    CB(355, 3),
    UB(114),
    UB(41),
    CB(228, 3),
    UB(115),
    UB(121),
    CB(183, 3),
    UB(109),
    UB(32),
    CB(83, 7),
    CB(454, 3),
    UB(97),
    UB(99),
    CB(1270, 3),
    CB(67, 3),
    UB(97),
    CB(1620, 3),
    UB(116),
    UB(117),
    UB(114),
    CB(1341, 3),
    CB(834, 3),
    CB(21, 3),
    CB(431, 3),
    CB(115, 7),
    CB(16, 3),
    UB(114),
    UB(111),
    UB(108),
    UB(101),
    UB(44),
    UB(32),
    UB(119),
    UB(105),
    UB(116),
    UB(104),
    CB(487, 3),
    UB(101),
    CB(52, 6),
    UB(32),
    UB(114),
    UB(101),
    UB(112),
    UB(108),
    UB(97),
    UB(99),
    CB(40, 8),
    UB(111),
    CB(5, 3),
    UB(114),
    UB(32),
    UB(105),
    UB(102),
    UB(32),
    UB(101),
    CB(38, 3),
    CB(10, 4),
    UB(115),
    UB(32),
    UB(117),
    CB(935, 3),
    UB(97),
    UB(105),
    UB(108),
    UB(97),
    UB(98),
    UB(108),
    CB(474, 3),
    UB(65),
    UB(67),
    UB(71),
    UB(32),
    CB(4, 4),
    CB(236, 3),
    UB(67),
    UB(32),
    UB(71),
    CB(809, 4),
    UB(99),
    CB(756, 3),
    UB(121),
    UB(109),
    CB(444, 5),
    UB(34),
    UB(97),
    UB(110),
    CB(1129, 3),
    CB(808, 5),
    CB(774, 3),
    CB(594, 5),
    UB(103),
    UB(97),
    UB(109),
    UB(101),
    UB(115),
    UB(34),
    CB(56, 3),
    UB(229),
    UB(146),
    UB(150),
    UB(32),
    CB(5, 5),
    CB(58, 3),
    UB(107),
    CB(532, 5),
    UB(99),
    UB(108),
    UB(97),
    UB(115),
    UB(115),
    UB(32),
    UB(34),
    UB(65),
    UB(34),
    CB(301, 3),
    UB(112),
    CB(665, 4),
    UB(100),
    CB(96, 4),
    UB(229),
    UB(156),
    UB(136),
    UB(229),
    UB(133),
    UB(146),
    CB(43, 3),
    CB(8, 3),
    UB(132),
    UB(191),
    CB(46, 4),
    UB(113),
    CB(1112, 5),
    UB(114),
    UB(53),
    CB(109, 4),
    CB(576, 3),
    UB(121),
    UB(109),
    UB(98),
    UB(111),
    UB(108),
    UB(44),
    UB(32),
    UB(64),
    CB(44, 3),
    UB(231),
    UB(137),
    UB(135),
    UB(32),
    CB(5, 5),
    CB(38, 3),
    UB(112),
    UB(105),
    UB(97),
    UB(110),
    CB(377, 4),
    UB(97),
    CB(496, 3),
    UB(116),
    CB(1522, 3),
    UB(118),
    UB(105),
    UB(101),
    UB(47),
    CB(326, 3),
    UB(110),
    UB(111),
    CB(89, 3),
    UB(112),
    UB(104),
    UB(121),
    CB(46, 3),
    UB(232),
    UB(143),
    UB(156),
    UB(32),
    CB(5, 5),
    CB(46, 3),
    UB(99),
    UB(97),
    CB(422, 5),
    CB(516, 5),
    UB(65),
    UB(45),
    UB(99),
    UB(104),
    UB(111),
    UB(121),
    UB(44),
    UB(32),
    CB(193, 3),
    UB(84),
    UB(97),
    UB(105),
    UB(119),
    UB(97),
    CB(1716, 4),
    UB(32),
    UB(108),
    UB(101),
    UB(116),
    UB(116),
    UB(117),
    UB(99),
    CB(672, 3),
    UB(76),
    CB(294, 3),
    UB(117),
    UB(99),
    CB(370, 3),
    CB(675, 4),
    UB(97),
    UB(32),
    UB(118),
    UB(97),
    CB(1047, 3),
    CB(12, 6),
    CB(579, 3),
    CB(1791, 4),
    CB(53, 11),
    UB(232),
    UB(144),
    UB(181),
    UB(228),
    UB(187),
    UB(148),
    CB(99, 3),
    UB(44),
    CB(21, 4),
    UB(45),
    UB(108),
    CB(861, 3),
    CB(46, 3),
    UB(91),
    UB(117),
    UB(101),
    UB(45),
    UB(195),
    UB(161),
    UB(45),
    UB(116),
    UB(115),
    UB(104),
    UB(195),
    UB(160),
    UB(105),
    UB(93),
    CB(103, 4),
    UB(91),
    CB(17, 12),
    CB(668, 4),
    UB(232),
    UB(178),
    UB(168),
    CB(155, 3),
    UB(180),
    UB(167),
    CB(155, 4),
    UB(104),
    UB(117),
    UB(111),
    CB(155, 4),
    UB(103),
    UB(111),
    UB(111),
    UB(100),
    UB(45),
    CB(251, 3),
    CB(580, 3),
    UB(121),
    UB(32),
    UB(102),
    CB(471, 3),
    UB(47),
    UB(10),
    UB(66),
    CB(607, 3),
    UB(91),
    UB(98),
    CB(972, 5),
    UB(101),
    UB(117),
    UB(112),
    UB(104),
    UB(101),
    UB(109),
    UB(105),
    UB(115),
    UB(116),
    UB(105),
    UB(99),
    CB(147, 4),
    CB(252, 3),
    UB(116),
    CB(556, 4),
    UB(229),
    UB(177),
    UB(132),
    CB(33, 5),
    CB(44, 3),
    UB(77),
    UB(32),
    CB(3, 3),
    UB(91),
    UB(66),
    UB(32),
    UB(77),
    CB(46, 3),
    UB(66),
    CB(1013, 4),
    CB(2217, 3),
    UB(101),
    UB(108),
    UB(118),
    CB(650, 3),
    CB(417, 3),
    UB(102),
    UB(97),
    CB(1326, 3),
    CB(607, 3),
    UB(98),
    CB(25, 4),
    UB(32),
    UB(107),
    UB(110),
    CB(1294, 3),
    CB(1260, 6),
    UB(108),
    CB(512, 4),
    CB(583, 4),
    CB(646, 3),
    UB(116),
    CB(1415, 3),
    CB(369, 3),
    CB(1763, 3),
    UB(121),
    CB(950, 3),
    UB(105),
    UB(109),
    CB(1128, 4),
    CB(550, 3),
    UB(119),
    CB(1179, 3),
    UB(110),
    UB(47),
    UB(40),
    UB(103),
    UB(101),
    UB(110),
    UB(101),
    UB(114),
    CB(126, 3),
    UB(117),
    UB(115),
    CB(2003, 3),
    UB(41),
    CB(82, 8),
    UB(115),
    CB(71, 5),
    UB(112),
    UB(101),
    UB(116),
    UB(105),
    CB(1036, 3),
    CB(48, 12),
    UB(10),
    UB(66),
    UB(80),
    UB(230),
    UB(169),
    UB(159),
    UB(32),
    CB(6, 3),
    UB(156),
    UB(186),
    CB(151, 4),
    UB(80),
    CB(967, 3),
    CB(201, 4),
    UB(98),
    UB(101),
    UB(101),
    CB(1666, 3),
    CB(1215, 12),
    CB(2083, 4),
    UB(114),
    CB(48, 3),
    UB(229),
    UB(158),
    UB(139),
    UB(232),
    UB(182),
    UB(133),
    UB(232),
    UB(129),
    UB(178),
    UB(32),
    CB(11, 7),
    UB(229),
    UB(163),
    UB(176),
    CB(58, 4),
    UB(120),
    CB(1154, 5),
    CB(1887, 3),
    UB(111),
    CB(1515, 3),
    CB(1496, 4),
    CB(71, 4),
    UB(116),
    UB(121),
    UB(112),
    UB(101),
    UB(45),
    UB(66),
    UB(32),
    CB(507, 3),
    UB(114),
    UB(97),
    UB(115),
    CB(119, 3),
    CB(1213, 3),
    UB(66),
    UB(230),
    UB(160),
    UB(188),
    UB(32),
    CB(5, 5),
    CB(275, 4),
    UB(32),
    UB(103),
    UB(101),
    UB(50),
    CB(40, 3),
    CB(300, 11),
    UB(233),
    UB(128),
    UB(188),
    CB(29, 3),
    CB(28, 9),
    CB(49, 3),
    UB(231),
    UB(171),
    UB(153),
    UB(32),
    CB(5, 5),
    CB(102, 3),
    UB(122),
    CB(1370, 3),
    CB(546, 5),
    UB(99),
    UB(111),
    UB(108),
    UB(108),
    UB(46),
    UB(41),
    UB(32),
    UB(66),
    UB(105),
    UB(108),
    UB(105),
    CB(967, 3),
    UB(105),
    UB(44),
    CB(2589, 8),
    UB(32),
    UB(118),
    CB(1710, 3),
    UB(111),
    UB(45),
    UB(115),
    CB(2023, 3),
    CB(828, 4),
    UB(119),
    UB(101),
    UB(98),
    UB(115),
    CB(244, 4),
    UB(102),
    CB(931, 3),
    UB(117),
    CB(18, 5),
    UB(115),
    CB(793, 3),
    CB(365, 3),
    UB(100),
    CB(290, 3),
    CB(225, 3),
    CB(1595, 4),
    CB(1383, 5),
    UB(229),
    UB(189),
    UB(136),
    UB(229),
    UB(185),
    UB(149),
    UB(124),
    UB(229),
    UB(188),
    UB(185),
    CB(7, 3),
    UB(91),
    UB(100),
    CB(102, 3),
    UB(32),
    UB(109),
    CB(1227, 4),
    UB(111),
    CB(360, 3),
    UB(108),
    UB(97),
    UB(105),
    UB(100),
    CB(922, 3),
    CB(905, 5),
    CB(95, 5),
    UB(115),
    CB(150, 3),
    CB(250, 3),
    UB(32),
    CB(5, 5),
    CB(150, 3),
    CB(246, 5),
    CB(465, 4),
    UB(45),
    UB(109),
    UB(111),
    UB(100),
    UB(101),
    CB(239, 8),
    CB(740, 9),
    UB(112),
    CB(1482, 3),
    UB(97),
    UB(116),
    CB(2628, 3),
    CB(264, 10),
    CB(135, 3),
    UB(97),
    UB(110),
    CB(1742, 11),
    CB(343, 10),
    UB(124),
    CB(343, 10),
    CB(342, 15),
    CB(342, 7),
    UB(47),
    UB(10),
    UB(67),
    UB(74),
    UB(66),
    UB(32),
    CB(4, 4),
    UB(91),
    UB(67),
    UB(32),
    UB(74),
    UB(32),
    UB(66),
    CB(1479, 15),
    CB(1349, 5),
    UB(100),
    UB(111),
    UB(101),
    UB(115),
    UB(110),
    UB(39),
    UB(116),
    CB(1423, 3),
    CB(1471, 3),
    UB(117),
    UB(112),
    CB(1360, 4),
    CB(189, 4),
    UB(104),
    CB(399, 3),
    CB(63, 3),
    UB(80),
    UB(32),
    CB(3, 3),
    CB(61, 3),
    CB(1759, 4),
    CB(1627, 3),
    UB(105),
    UB(109),
    UB(97),
    UB(103),
    CB(2917, 5),
    CB(822, 3),
    CB(389, 3),
    CB(573, 3),
    UB(114),
    UB(101),
    CB(1589, 3),
    CB(567, 4),
    UB(104),
    UB(105),
    UB(112),
    CB(2538, 3),
    UB(116),
    CB(1467, 3),
    CB(254, 3),
    CB(1231, 3),
    CB(2366, 4),
    CB(889, 3),
    CB(1910, 3),
    CB(1224, 4),
    CB(1849, 3),
    CB(1294, 5),
    UB(40),
    CB(193, 3),
    CB(1223, 4),
    CB(1457, 3),
    CB(114, 3),
    UB(102),
    CB(631, 3),
    CB(1793, 3),
    CB(461, 3),
    CB(1228, 3),
    UB(119),
    CB(2377, 4),
    CB(638, 6),
    CB(3, 3),
    UB(102),
    CB(95, 3),
    UB(97),
    UB(115),
    UB(105),
    UB(122),
    CB(18, 3),
    CB(2539, 6),
    UB(40),
    CB(258, 6),
    CB(503, 3),
    UB(34),
    CB(1400, 3),
    CB(1433, 3),
    UB(110),
    UB(103),
    UB(34),
    CB(889, 3),
    UB(67),
    UB(80),
    UB(229),
    UB(128),
    UB(188),
    CB(165, 3),
    CB(6, 4),
    CB(168, 4),
    CB(1470, 4),
    CB(551, 4),
    CB(1048, 5),
    UB(118),
    UB(97),
    CB(1740, 3),
    CB(82, 5),
    CB(2428, 3),
    UB(101),
    UB(121),
    UB(47),
    UB(98),
    CB(242, 3),
    CB(15, 5),
    CB(728, 3),
    UB(114),
    UB(32),
    UB(98),
    UB(117),
    UB(99),
    UB(107),
    CB(65, 3),
    UB(228),
    UB(189),
    UB(141),
    UB(32),
    CB(5, 5),
    CB(63, 3),
    UB(119),
    UB(101),
    CB(1109, 6),
    UB(110),
    UB(101),
    UB(111),
    UB(108),
    UB(111),
    UB(103),
    UB(105),
    UB(115),
    CB(1687, 3),
    UB(99),
    UB(46),
    CB(2247, 4),
    UB(53),
    CB(1067, 3),
    CB(584, 7),
    UB(109),
    UB(111),
    UB(115),
    UB(116),
    CB(1046, 3),
    CB(1313, 3),
    UB(110),
    CB(2422, 4),
    UB(112),
    UB(111),
    CB(566, 3),
    CB(219, 5),
    UB(101),
    UB(46),
    UB(103),
    UB(46),
    CB(1460, 5),
    CB(1290, 3),
    CB(162, 3),
    UB(32),
    UB(112),
    UB(104),
    UB(111),
    CB(333, 3),
    CB(177, 3),
    CB(39, 3),
    CB(2109, 3),
    CB(3230, 4),
    UB(114),
    UB(115),
    CB(72, 3),
    CB(809, 8),
    CB(2939, 5),
    CB(206, 3),
    UB(97),
    UB(114),
    UB(114),
    UB(121),
    UB(34),
    CB(244, 4),
    UB(34),
    CB(2503, 4),
    UB(101),
    UB(114),
    CB(12, 7),
    CB(2802, 3),
    CB(225, 5),
    UB(231),
    UB(155),
    UB(164),
    UB(32),
    CB(5, 3),
    UB(152),
    CB(160, 4),
    UB(112),
    UB(97),
    UB(110),
    CB(221, 4),
    UB(67),
    UB(32),
    UB(100),
    UB(114),
    CB(431, 4),
    CB(40, 3),
    UB(100),
    UB(101),
    UB(102),
    CB(3065, 3),
    CB(462, 3),
    CB(1009, 3),
    UB(116),
    CB(117, 3),
    CB(25, 6),
    CB(172, 3),
    CB(2291, 4),
    CB(292, 3),
    CB(66, 5),
    UB(190),
    UB(133),
    CB(66, 3),
    UB(189),
    UB(151),
    CB(66, 4),
    UB(76),
    UB(117),
    UB(111),
    CB(66, 4),
    CB(2276, 3),
    UB(107),
    UB(110),
    CB(1497, 3),
    CB(159, 4),
    UB(80),
    CB(1706, 3),
    UB(117),
    UB(103),
    UB(117),
    CB(786, 4),
    UB(115),
    UB(111),
    UB(99),
    UB(99),
    CB(1724, 4),
    UB(108),
    UB(97),
    UB(121),
    CB(7, 3),
    UB(67),
    CB(2411, 3),
    UB(116),
    CB(877, 3),
    UB(111),
    UB(32),
    UB(82),
    CB(3288, 4),
    UB(100),
    UB(111),
    UB(47),
    UB(10),
    UB(68),
    UB(78),
    UB(65),
    UB(233),
    UB(145),
    UB(146),
    UB(229),
    UB(174),
    UB(154),
    UB(32),
    CB(10, 4),
    UB(137),
    UB(180),
    CB(10, 4),
    UB(91),
    UB(68),
    UB(32),
    UB(78),
    CB(1902, 3),
    CB(2126, 3),
    CB(778, 3),
    UB(100),
    CB(2603, 7),
    CB(31, 3),
    UB(32),
    UB(116),
    UB(101),
    UB(115),
    UB(116),
    CB(9, 9),
    CB(24, 3),
    UB(47),
    UB(10),
    UB(69),
    CB(1373, 3),
    UB(32),
    CB(5, 5),
    UB(91),
    UB(69),
    UB(32),
    UB(122),
    UB(97),
    UB(105),
    UB(51),
    CB(42, 3),
    UB(77),
    UB(68),
    UB(77),
    UB(65),
    CB(2386, 3),
    UB(49),
    UB(49),
    UB(72),
    UB(49),
    UB(53),
    UB(78),
    UB(79),
    UB(50),
    CB(177, 3),
    UB(71),
    UB(229),
    UB(143),
    UB(139),
    UB(32),
    CB(5, 5),
    UB(91),
    UB(71),
    CB(427, 4),
    CB(38, 4),
    CB(3040, 3),
    UB(32),
    UB(229),
    UB(159),
    UB(186),
    CB(21, 3),
    CB(2115, 3),
    UB(49),
    CB(22, 6),
    CB(42, 4),
    UB(188),
    UB(166),
    UB(232),
    UB(164),
    UB(178),
    CB(45, 3),
    CB(8, 3),
    UB(163),
    UB(164),
    CB(48, 4),
    UB(120),
    CB(135, 3),
    UB(50),
    UB(32),
    UB(107),
    CB(2140, 5),
    UB(71),
    UB(45),
    UB(115),
    CB(2607, 3),
    CB(121, 4),
    UB(71),
    UB(233),
    UB(187),
    UB(158),
    UB(32),
    UB(71),
    UB(231),
    UB(130),
    UB(185),
    CB(35, 4),
    UB(100),
    CB(35, 3),
    CB(84, 4),
    CB(31, 3),
    UB(112),
    UB(111),
    UB(116),
    UB(47),
    UB(10),
    UB(72),
    UB(230),
    UB(169),
    UB(139),
    UB(32),
    UB(72),
    UB(230),
    UB(161),
    UB(165),
    UB(32),
    UB(91),
    UB(72),
    UB(32),
    UB(113),
    CB(2325, 3),
    CB(290, 4),
    UB(72),
    CB(1371, 3),
    UB(105),
    UB(100),
    UB(103),
    CB(332, 3),
    CB(2583, 11),
    CB(157, 3),
    UB(73),
    UB(80),
    UB(32),
    CB(3, 3),
    UB(91),
    UB(73),
    CB(787, 5),
    CB(3701, 3),
    UB(101),
    CB(1058, 3),
    CB(1632, 3),
    CB(720, 3),
    CB(532, 3),
    CB(1289, 3),
    CB(1516, 3),
    UB(40),
    CB(517, 3),
    CB(2624, 5),
    UB(44),
    UB(32),
    UB(101),
    UB(115),
    UB(112),
    CB(1645, 3),
    UB(105),
    CB(3533, 3),
    CB(582, 5),
    CB(1699, 3),
    UB(102),
    UB(116),
    CB(801, 3),
    CB(1105, 3),
    CB(1434, 3),
    CB(1888, 4),
    CB(541, 10),
    CB(1117, 4),
    CB(575, 3),
    UB(100),
    UB(117),
    CB(180, 3),
    UB(121),
    CB(307, 3),
    UB(114),
    CB(1938, 6),
    UB(97),
    UB(32),
    CB(3139, 8),
    CB(3598, 5),
    CB(59, 9),
    CB(2198, 5),
    CB(802, 3),
    UB(115),
    CB(451, 4),
    UB(97),
    UB(32),
    UB(110),
    CB(3575, 3),
    CB(129, 3),
    UB(100),
    UB(117),
    UB(99),
    UB(116),
    CB(2379, 3),
    UB(117),
    UB(99),
    UB(104),
    CB(95, 5),
    CB(2101, 3),
    UB(110),
    UB(103),
    UB(97),
    UB(32),
    UB(97),
    UB(100),
    UB(97),
    UB(112),
    CB(1548, 5),
    CB(19, 4),
    UB(116),
    UB(118),
    CB(3373, 3),
    CB(3272, 4),
    CB(1840, 5),
    CB(71, 4),
    CB(982, 4),
    CB(522, 5),
    CB(108, 3),
    CB(582, 3),
    UB(111),
    CB(717, 3),
    CB(958, 9),
    UB(32),
    UB(97),
    UB(112),
    UB(112),
    UB(101),
    CB(1313, 6),
    CB(23, 3),
    CB(2854, 3),
    CB(26, 3),
    UB(110),
    CB(3054, 4),
    CB(267, 5),
    UB(229),
    UB(138),
    UB(135),
    CB(270, 3),
    UB(229),
    UB(137),
    CB(1783, 3),
    CB(273, 3),
    UB(32),
    UB(106),
    CB(374, 5),
    CB(1335, 3),
    CB(1029, 4),
    CB(117, 5),
    CB(3501, 6),
    UB(40),
    UB(84),
    UB(86),
    CB(116, 7),
    CB(115, 4),
    CB(2010, 5),
    CB(188, 4),
    CB(146, 3),
    CB(3530, 4),
    CB(2738, 5),
    CB(797, 3),
    UB(32),
    UB(110),
    CB(1346, 3),
    UB(108),
    CB(34, 4),
    CB(1338, 5),
    CB(2169, 5),
    UB(32),
    UB(101),
    UB(116),
    UB(99),
    CB(106, 3),
    UB(74),
    UB(75),
    UB(232),
    UB(163),
    UB(189),
    UB(230),
    UB(156),
    UB(141),
    UB(32),
    UB(74),
    UB(75),
    CB(2471, 3),
    CB(9, 4),
    UB(91),
    UB(74),
    UB(32),
    UB(75),
    CB(2474, 5),
    UB(32),
    UB(102),
    UB(117),
    CB(1008, 5),
    UB(74),
    UB(97),
    CB(797, 3),
    CB(708, 3),
    UB(41),
    UB(32),
    UB(104),
    CB(3871, 3),
    CB(2616, 4),
    UB(111),
    UB(111),
    UB(108),
    UB(32),
    UB(103),
    UB(105),
    UB(114),
    UB(108),
    UB(226),
    UB(128),
    UB(153),
    CB(2307, 4),
    UB(105),
    CB(3549, 4),
    UB(47),
    UB(10),
    UB(75),
    UB(228),
    UB(186),
    UB(186),
    UB(32),
    CB(5, 5),
    UB(91),
    UB(75),
    CB(1160, 3),
    CB(848, 5),
    CB(3001, 9),
    UB(111),
    CB(61, 3),
    CB(844, 3),
    UB(98),
    CB(2557, 4),
    UB(98),
    CB(374, 3),
    CB(11, 4),
    CB(50, 3),
    CB(688, 3),
    CB(5, 5),
    CB(50, 3),
    CB(693, 7),
    UB(107),
    UB(101),
    UB(116),
    UB(97),
    CB(1025, 4),
    UB(32),
    CB(59, 7),
    CB(38, 5),
    UB(150),
    UB(229),
    UB(145),
    UB(189),
    CB(41, 4),
    CB(8, 5),
    UB(91),
    UB(107),
    CB(1924, 3),
    UB(49),
    UB(32),
    CB(37, 3),
    CB(784, 5),
    CB(49, 10),
    UB(67),
    UB(49),
    UB(51),
    UB(72),
    UB(49),
    UB(54),
    UB(67),
    UB(108),
    UB(78),
    UB(79),
    CB(1036, 3),
    CB(62, 9),
    UB(230),
    UB(136),
    UB(191),
    UB(32),
    CB(5, 5),
    CB(100, 3),
    CB(1276, 3),
    UB(103),
    CB(151, 12),
    UB(75),
    UB(84),
    UB(86),
    UB(47),
    CB(4, 3),
    CB(1397, 3),
    UB(111),
    CB(193, 4),
    UB(230),
    UB(155),
    UB(184),
    CB(102, 3),
    UB(185),
    UB(166),
    CB(43, 4),
    UB(115),
    UB(104),
    UB(117),
    CB(2973, 5),
    CB(2826, 7),
    UB(99),
    UB(114),
    UB(97),
    UB(109),
    UB(59),
    CB(2835, 6),
    UB(117),
    CB(2095, 3),
    CB(2270, 15),
    UB(32),
    UB(233),
    UB(189),
    UB(167),
    CB(61, 3),
    CB(2267, 14),
    UB(107),
    UB(104),
    UB(195),
    UB(168),
    CB(561, 3),
    UB(93),
    UB(44),
    CB(1424, 3),
    UB(116),
    UB(46),
    CB(60, 4),
    UB(103),
    UB(110),
    UB(97),
    UB(119),
    CB(523, 3),
    UB(98),
    UB(111),
    UB(111),
    UB(107),
    UB(41),
    CB(888, 5),
    UB(97),
    CB(3330, 3),
    UB(32),
    UB(229),
    UB(149),
    UB(131),
    CB(60, 3),
    UB(124),
    CB(7, 3),
    CB(123, 3),
    UB(91),
    UB(107),
    UB(101),
    UB(110),
    UB(51),
    CB(125, 6),
    CB(145, 4),
    UB(173),
    UB(140),
    CB(188, 3),
    CB(5, 3),
    CB(145, 3),
    UB(103),
    UB(101),
    CB(144, 4),
    UB(107),
    CB(574, 3),
    UB(111),
    CB(2760, 3),
    CB(224, 10),
    UB(231),
    UB(178),
    UB(137),
    UB(32),
    CB(5, 5),
    CB(224, 4),
    CB(61, 3),
    CB(324, 15),
    CB(38, 8),
    UB(183),
    UB(154),
    CB(38, 3),
    UB(186),
    CB(262, 5),
    CB(969, 4),
    CB(314, 4),
    CB(1790, 3),
    UB(100),
    UB(108),
    CB(1089, 4),
    UB(99),
    CB(3092, 3),
    CB(1375, 5),
    CB(18, 12),
    CB(681, 4),
    UB(116),
    CB(59, 7),
    UB(229),
    UB(156),
    UB(150),
    CB(62, 5),
    UB(229),
    UB(155),
    UB(190),
    CB(65, 9),
    CB(2891, 3),
    CB(331, 4),
    CB(51, 15),
    UB(114),
    CB(1014, 3),
    UB(75),
    UB(233),
    UB(135),
    UB(145),
    UB(32),
    CB(5, 5),
    CB(44, 3),
    UB(106),
    UB(105),
    UB(110),
    CB(184, 4),
    CB(238, 4),
    UB(233),
    UB(150),
    UB(139),
    CB(21, 3),
    CB(2015, 3),
    UB(128),
    CB(7, 3),
    UB(91),
    UB(107),
    UB(97),
    CB(3869, 5),
    CB(30, 3),
    UB(47),
    UB(10),
    UB(76),
    UB(231),
    UB(133),
    UB(167),
    UB(32),
    CB(5, 5),
    UB(91),
    UB(76),
    CB(2143, 4),
    CB(2534, 5),
    UB(110),
    UB(117),
    CB(1991, 3),
    UB(112),
    CB(1759, 3),
    UB(117),
    CB(3016, 3),
    CB(369, 6),
    UB(232),
    UB(163),
    UB(184),
    CB(37, 3),
    UB(91),
    UB(108),
    UB(117),
    UB(111),
    CB(3778, 3),
    CB(39, 5),
    CB(161, 3),
    UB(77),
    UB(67),
    UB(32),
    CB(3, 3),
    UB(91),
    UB(77),
    CB(3740, 5),
    CB(432, 5),
    CB(1617, 9),
    CB(4109, 3),
    UB(116),
    UB(114),
    UB(117),
    CB(811, 7),
    CB(1557, 6),
    CB(20, 8),
    UB(108),
    UB(32),
    UB(99),
    UB(121),
    UB(99),
    UB(108),
    CB(1545, 5),
    UB(77),
    UB(86),
    UB(32),
    CB(3, 3),
    CB(65, 3),
    UB(86),
    CB(65, 3),
    UB(100),
    UB(101),
    UB(115),
    UB(105),
    UB(114),
    UB(97),
    CB(2255, 4),
    CB(1136, 3),
    CB(983, 5),
    CB(3206, 4),
    CB(1633, 3),
    CB(1832, 8),
    CB(3021, 5),
    CB(4300, 3),
    CB(2183, 3),
    CB(1797, 4),
    CB(65, 3),
    UB(109),
    UB(117),
    UB(115),
    CB(2667, 4),
    CB(859, 4),
    CB(77, 3),
    UB(229),
    UB(183),
    UB(190),
    UB(32),
    CB(5, 5),
    CB(81, 3),
    CB(253, 7),
    CB(144, 15),
    CB(1234, 4),
    UB(97),
    CB(2438, 3),
    UB(78),
    UB(71),
    UB(32),
    CB(3, 3),
    UB(91),
    UB(78),
    CB(3116, 5),
    CB(1725, 15),
    CB(885, 8),
    UB(32),
    UB(34),
    UB(78),
    UB(71),
    UB(34),
    CB(3918, 4),
    CB(1217, 3),
    CB(1806, 3),
    CB(2803, 3),
    UB(115),
    CB(3152, 7),
    CB(1597, 3),
    CB(2824, 4),
    UB(34),
    CB(2923, 4),
    UB(105),
    UB(108),
    UB(109),
    CB(3154, 5),
    UB(84),
    UB(86),
    CB(3646, 3),
    UB(108),
    UB(111),
    CB(1326, 4),
    CB(873, 4),
    UB(100),
    CB(3324, 3),
    CB(16, 9),
    CB(111, 3),
    CB(3087, 3),
    UB(230),
    UB(174),
    UB(181),
    CB(117, 3),
    CB(9, 7),
    CB(123, 4),
    CB(3101, 6),
    CB(4237, 3),
    CB(2516, 7),
    CB(76, 15),
    CB(60, 9),
    UB(233),
    UB(143),
    UB(161),
    UB(233),
    UB(160),
    UB(173),
    CB(60, 3),
    UB(233),
    UB(149),
    UB(156),
    UB(229),
    UB(164),
    UB(180),
    CB(60, 6),
    CB(224, 3),
    CB(4297, 3),
    UB(116),
    UB(111),
    CB(1065, 6),
    CB(59, 15),
    CB(59, 8),
    UB(228),
    UB(185),
    UB(133),
    UB(32),
    CB(5, 5),
    CB(51, 3),
    CB(3744, 4),
    CB(2289, 4),
    CB(2874, 6),
    UB(108),
    CB(4229, 3),
    CB(4480, 5),
    CB(1547, 3),
    UB(116),
    UB(121),
    UB(109),
    CB(2074, 4),
    UB(121),
    UB(58),
    CB(2025, 4),
    CB(351, 3),
    CB(3011, 3),
    CB(440, 3),
    UB(99),
    CB(1356, 3),
    CB(2261, 4),
    CB(2494, 3),
    CB(4842, 4),
    CB(1496, 5),
    UB(97),
    UB(114),
    UB(98),
    UB(105),
    CB(2499, 3),
    UB(114),
    UB(105),
    CB(3981, 3),
    CB(3603, 5),
    UB(32),
    UB(110),
    UB(117),
    UB(109),
    UB(98),
    CB(3580, 3),
    CB(108, 3),
    UB(230),
    UB(147),
    UB(139),
    UB(32),
    UB(78),
    UB(230),
    UB(140),
    UB(161),
    CB(108, 4),
    CB(2624, 3),
    UB(103),
    CB(109, 4),
    UB(110),
    UB(101),
    UB(117),
    CB(47, 3),
    CB(3685, 3),
    UB(103),
    CB(1391, 3),
    CB(37, 3),
    UB(79),
    UB(75),
    UB(231),
    UB(185),
    UB(131),
    UB(32),
    CB(6, 3),
    UB(187),
    UB(183),
    UB(32),
    UB(91),
    UB(79),
    CB(1261, 3),
    UB(98),
    CB(2857, 7),
    CB(2245, 3),
    UB(100),
    UB(45),
    CB(2663, 4),
    CB(4592, 6),
    UB(79),
    UB(75),
    CB(244, 3),
    CB(40, 3),
    CB(241, 3),
    CB(40, 6),
    CB(238, 5),
    CB(40, 3),
    UB(79),
    UB(75),
    CB(3331, 3),
    CB(4324, 4),
    CB(2015, 3),
    UB(104),
    CB(909, 3),
    UB(114),
    UB(97),
    UB(116),
    CB(187, 5),
    CB(4336, 4),
    UB(116),
    CB(1500, 3),
    CB(30, 5),
    CB(2431, 6),
    UB(104),
    UB(101),
    UB(108),
    UB(112),
    UB(115),
    CB(192, 3),
    CB(2827, 3),
    UB(112),
    CB(3808, 6),
    CB(2174, 3),
    UB(110),
    UB(101),
    UB(97),
    CB(229, 4),
    CB(492, 3),
    CB(598, 3),
    CB(423, 3),
    UB(101),
    CB(3137, 3),
    CB(1748, 3),
    CB(594, 3),
    CB(26, 3),
    CB(4916, 3),
    CB(5252, 3),
    UB(101),
    UB(100),
    CB(509, 3),
    CB(1492, 6),
    UB(121),
    UB(111),
    CB(418, 3),
    CB(142, 3),
    UB(83),
    UB(32),
    CB(3, 3),
    CB(136, 3),
    UB(83),
    CB(363, 4),
    CB(942, 5),
    UB(115),
    UB(111),
    UB(97),
    UB(112),
    UB(32),
    CB(357, 4),
    UB(97),
    CB(1533, 9),
    CB(2458, 3),
    UB(111),
    CB(4868, 3),
    UB(45),
    CB(2866, 4),
    CB(130, 6),
    UB(109),
    CB(3359, 3),
    CB(710, 4),
    CB(1656, 9),
    CB(4571, 3),
    UB(117),
    UB(110),
    CB(1951, 3),
    CB(1129, 3),
    CB(34, 3),
    CB(5176, 4),
    CB(343, 4),
    UB(117),
    UB(100),
    UB(105),
    CB(3780, 3),
    CB(2724, 8),
    CB(15, 4),
    CB(5416, 4),
    CB(119, 3),
    CB(2825, 4),
    UB(133),
    UB(191),
    UB(32),
    CB(8, 8),
    CB(129, 3),
    CB(2831, 6),
    UB(116),
    UB(117),
    CB(1455, 5),
    UB(98),
    UB(111),
    UB(119),
    CB(239, 3),
    UB(103),
    CB(4978, 3),
    UB(111),
    UB(119),
    UB(45),
    CB(9, 3),
    UB(103),
    CB(186, 6),
    UB(47),
    UB(10),
    UB(80),
    CB(1718, 3),
    UB(91),
    CB(4540, 12),
    UB(102),
    UB(101),
    CB(3046, 3),
    CB(2468, 3),
    UB(101),
    UB(115),
    UB(98),
    CB(626, 3),
    CB(4187, 4),
    UB(114),
    UB(101),
    UB(111),
    CB(3228, 4),
    UB(41),
    CB(683, 4),
    CB(2515, 5),
    UB(115),
    UB(104),
    UB(111),
    UB(112),
    CB(58, 3),
    UB(65),
    UB(32),
    CB(3, 3),
    UB(91),
    UB(80),
    UB(32),
    CB(4242, 4),
    CB(5128, 5),
    UB(99),
    CB(500, 3),
    CB(308, 3),
    UB(97),
    UB(116),
    CB(2018, 3),
    CB(470, 3),
    CB(2739, 3),
    CB(2754, 3),
    UB(107),
    CB(5574, 4),
    CB(4015, 4),
    CB(966, 3),
    CB(3932, 3),
    CB(4004, 7),
    CB(48, 11),
    CB(1984, 7),
    CB(89, 3),
    UB(101),
    UB(108),
    CB(933, 3),
    UB(97),
    UB(114),
    CB(1303, 3),
    CB(39, 4),
    CB(3930, 3),
    CB(2430, 3),
    CB(71, 3),
    UB(47),
    UB(115),
    CB(4204, 3),
    CB(252, 3),
    CB(16, 9),
    CB(123, 3),
    UB(233),
    UB(131),
    UB(168),
    CB(126, 3),
    CB(6, 4),
    CB(129, 4),
    CB(2762, 3),
    CB(497, 4),
    CB(67, 5),
    CB(2569, 4),
    UB(102),
    UB(102),
    CB(2091, 7),
    CB(908, 3),
    CB(1669, 3),
    CB(132, 10),
    UB(107),
    CB(3499, 3),
    CB(131, 15),
    CB(131, 15),
    CB(1136, 3),
    CB(168, 4),
    CB(100, 3),
    UB(75),
    UB(32),
    CB(3, 3),
    CB(94, 3),
    UB(75),
    CB(1824, 14),
    CB(4255, 5),
    UB(111),
    UB(110),
    CB(269, 4),
    CB(428, 3),
    CB(2300, 3),
    UB(110),
    UB(103),
    UB(101),
    CB(4432, 7),
    CB(4316, 3),
    UB(100),
    CB(1859, 5),
    CB(8, 3),
    UB(47),
    CB(293, 3),
    UB(119),
    CB(5734, 4),
    UB(47),
    CB(2698, 4),
    CB(774, 3),
    CB(3300, 3),
    CB(85, 3),
    UB(79),
    UB(32),
    CB(3, 3),
    UB(91),
    UB(112),
    CB(3330, 5),
    CB(1284, 13),
    CB(348, 4),
    CB(2904, 4),
    UB(40),
    CB(2059, 6),
    UB(41),
    UB(47),
    CB(1652, 5),
    CB(1697, 5),
    UB(112),
    UB(111),
    CB(1638, 5),
    UB(80),
    UB(79),
    UB(230),
    UB(150),
    UB(135),
    CB(63, 3),
    CB(6, 4),
    CB(66, 4),
    CB(2988, 3),
    CB(1980, 6),
    CB(66, 15),
    CB(2292, 3),
    CB(474, 3),
    CB(2257, 3),
    CB(51, 3),
    UB(85),
    UB(32),
    CB(3, 3),
    CB(196, 3),
    UB(85),
    CB(3680, 4),
    CB(244, 3),
    UB(100),
    UB(101),
    UB(103),
    CB(6173, 4),
    CB(238, 3),
    UB(115),
    UB(117),
    UB(115),
    CB(1460, 3),
    CB(1393, 4),
    CB(639, 5),
    CB(4723, 3),
    CB(3281, 4),
    CB(1966, 3),
    CB(616, 3),
    CB(1224, 3),
    CB(2469, 3),
    UB(114),
    CB(3397, 4),
    CB(664, 3),
    UB(114),
    CB(2347, 6),
    CB(4743, 3),
    CB(3240, 5),
    CB(222, 3),
    UB(114),
    CB(4065, 3),
    UB(115),
    CB(902, 4),
    CB(1388, 13),
    UB(112),
    CB(4569, 4),
    CB(6284, 5),
    UB(117),
    CB(659, 3),
    CB(2514, 5),
    UB(116),
    UB(121),
    CB(1464, 4),
    UB(80),
    UB(85),
    CB(554, 3),
    CB(4, 3),
    CB(136, 4),
    CB(557, 5),
    CB(3166, 10),
    CB(3165, 7),
    UB(57),
    CB(190, 5),
    UB(101),
    UB(120),
    CB(54, 3),
    CB(925, 5),
    CB(3702, 3),
    CB(3661, 5),
    CB(1817, 3),
    UB(98),
    CB(4968, 4),
    CB(210, 3),
    UB(97),
    CB(939, 3),
    CB(183, 3),
    UB(112),
    UB(115),
    UB(121),
    CB(2264, 3),
    CB(61, 4),
    UB(99),
    CB(1067, 3),
    CB(178, 3),
    UB(105),
    CB(5279, 3),
    CB(1593, 7),
    CB(3199, 5),
    UB(110),
    CB(732, 3),
    CB(3062, 5),
    CB(1553, 3),
    CB(3182, 3),
    CB(24, 3),
    UB(119),
    UB(104),
    CB(1378, 4),
    CB(577, 3),
    CB(336, 3),
    CB(1470, 15),
    UB(34),
    CB(259, 3),
    UB(107),
    CB(3124, 3),
    CB(1594, 3),
    CB(603, 3),
    CB(172, 3),
    CB(368, 6),
    CB(1777, 3),
    UB(119),
    UB(117),
    UB(49),
    CB(4671, 3),
    CB(375, 5),
    CB(1877, 4),
    UB(80),
    CB(1874, 5),
    UB(80),
    CB(1868, 7),
    CB(3651, 15),
    CB(379, 6),
    CB(793, 8),
    CB(1674, 4),
    CB(1805, 6),
    UB(47),
    CB(20, 9),
    UB(112),
    CB(640, 3),
    CB(21, 8),
    UB(10),
    UB(80),
    CB(1277, 4),
    UB(80),
    CB(1277, 5),
    UB(80),
    CB(1277, 9),
    CB(546, 3),
    CB(2013, 3),
    CB(1274, 6),
    CB(2758, 3),
    CB(3853, 3),
    UB(109),
    CB(1066, 3),
    CB(1881, 3),
    CB(528, 3),
    CB(82, 3),
    UB(100),
    UB(105),
    UB(103),
    UB(105),
    CB(3861, 4),
    UB(99),
    CB(2578, 3),
    UB(114),
    UB(97),
    CB(340, 4),
    UB(230),
    UB(176),
    UB(145),
    CB(69, 3),
    CB(5, 3),
    CB(69, 3),
    CB(1174, 3),
    CB(2350, 12),
    CB(3722, 3),
    UB(116),
    CB(3640, 3),
    CB(634, 5),
    CB(3575, 4),
    UB(114),
    CB(793, 3),
    UB(105),
    CB(540, 3),
    UB(108),
    UB(108),
    UB(111),
    CB(6149, 3),
    UB(81),
    UB(32),
    CB(5519, 3),
    CB(5514, 4),
    UB(99),
    CB(5650, 3),
    CB(4277, 12),
    UB(40),
    CB(351, 3),
    CB(5061, 3),
    UB(100),
    CB(2624, 3),
    CB(5844, 3),
    CB(897, 4),
    CB(3335, 3),
    CB(796, 3),
    CB(969, 4),
    CB(509, 3),
    UB(119),
    CB(4147, 4),
    UB(115),
    CB(49, 3),
    CB(6643, 4),
    UB(109),
    UB(111),
    CB(5471, 3),
    CB(5500, 3),
    UB(97),
    UB(112),
    UB(105),
    UB(111),
    CB(4697, 3),
    CB(2849, 4),
    UB(108),
    CB(5516, 4),
    UB(97),
    UB(114),
    CB(2615, 3),
    CB(789, 3),
    UB(115),
    CB(2743, 4),
    UB(32),
    UB(226),
    UB(128),
    UB(147),
    CB(82, 5),
    UB(115),
    CB(893, 6),
    CB(1290, 3),
    UB(112),
    CB(2888, 4),
    UB(121),
    CB(1287, 4),
    UB(103),
    UB(101),
    UB(108),
    UB(45),
    CB(75, 7),
    UB(117),
    UB(116),
    UB(104),
    UB(102),
    UB(101),
    CB(1020, 4),
    CB(141, 10),
    CB(2507, 5),
    CB(3770, 3),
    CB(2686, 4),
    UB(81),
    UB(82),
    UB(230),
    UB(137),
    UB(163),
    UB(32),
    CB(6, 6),
    UB(91),
    UB(81),
    UB(32),
    UB(82),
    UB(32),
    UB(107),
    UB(111),
    CB(1006, 5),
    CB(831, 6),
    CB(51, 10),
    UB(81),
    UB(82),
    CB(572, 3),
    CB(4992, 4),
    UB(81),
    UB(229),
    UB(139),
    UB(129),
    UB(32),
    UB(81),
    UB(229),
    UB(138),
    UB(178),
    CB(47, 4),
    CB(1549, 3),
    CB(2963, 5),
    CB(122, 7),
    CB(110, 9),
    CB(39, 4),
    UB(189),
    UB(136),
    CB(39, 3),
    UB(188),
    CB(3346, 3),
    UB(81),
    CB(186, 3),
    CB(323, 6),
    CB(1032, 5),
    CB(180, 4),
    CB(1407, 3),
    CB(154, 10),
    CB(185, 8),
    UB(47),
    UB(102),
    UB(105),
    CB(2882, 3),
    CB(392, 3),
    CB(6117, 4),
    CB(106, 3),
    UB(84),
    UB(32),
    UB(84),
    UB(32),
    UB(91),
    UB(84),
    CB(379, 11),
    CB(6941, 3),
    CB(3193, 3),
    CB(1341, 15),
    CB(1341, 6),
    UB(10),
    UB(84),
    UB(65),
    UB(32),
    CB(3, 3),
    UB(91),
    CB(2836, 3),
    CB(1195, 4),
    CB(3772, 5),
    CB(865, 3),
    CB(24, 3),
    UB(70),
    UB(229),
    UB(141),
    UB(161),
    UB(32),
    CB(6, 6),
    UB(91),
    UB(84),
    UB(32),
    UB(70),
    CB(5211, 3),
    CB(530, 4),
    CB(5247, 3),
    UB(114),
    UB(111),
    UB(83),
    UB(68),
    CB(3217, 4),
    CB(2180, 3),
    UB(84),
    CB(5281, 3),
    UB(32),
    CB(5, 5),
    UB(91),
    CB(901, 3),
    CB(1900, 3),
    UB(121),
    CB(118, 11),
    UB(104),
    UB(97),
    UB(105),
    UB(114),
    CB(6903, 3),
    UB(115),
    CB(3170, 3),
    CB(42, 6),
    UB(232),
    UB(128),
    UB(129),
    UB(229),
    UB(184),
    UB(171),
    CB(48, 5),
    CB(11, 5),
    UB(136),
    CB(54, 9),
    CB(1930, 3),
    CB(2452, 3),
    CB(546, 3),
    CB(1153, 5),
    CB(64, 15),
    CB(64, 6),
    UB(229),
    UB(143),
    UB(176),
    UB(32),
    CB(5, 5),
    CB(141, 3),
    CB(965, 3),
    CB(279, 4),
    UB(114),
    UB(117),
    UB(110),
    UB(119),
    UB(97),
    CB(2894, 4),
    CB(3471, 5),
    CB(4986, 8),
    CB(1250, 4),
    CB(3231, 6),
    CB(6164, 3),
    UB(119),
    UB(97),
    UB(108),
    CB(4172, 3),
    UB(84),
    CB(1663, 3),
    CB(64, 6),
    CB(8, 6),
    CB(67, 3),
    CB(1671, 7),
    CB(73, 15),
    CB(73, 15),
    CB(73, 15),
    CB(73, 4),
    UB(173),
    UB(151),
    UB(229),
    UB(184),
    UB(179),
    CB(73, 3),
    CB(8, 4),
    UB(144),
    CB(73, 4),
    UB(122),
    CB(3307, 3),
    CB(4819, 4),
    CB(2012, 5),
    UB(84),
    UB(45),
    UB(97),
    UB(99),
    CB(5758, 5),
    CB(1155, 3),
    CB(9, 6),
    CB(4075, 6),
    CB(48, 4),
    CB(3856, 4),
    CB(8, 5),
    CB(3856, 4),
    CB(56, 6),
    CB(3854, 6),
    CB(1863, 3),
    CB(727, 3),
    UB(40),
    CB(4691, 3),
    UB(101),
    UB(114),
    UB(119),
    CB(2149, 6),
    UB(84),
    UB(230),
    UB(129),
    UB(164),
    UB(32),
    CB(5, 5),
    CB(171, 4),
    CB(38, 5),
    UB(84),
    CB(4881, 3),
    UB(105),
    CB(2848, 4),
    UB(84),
    UB(232),
    UB(163),
    UB(135),
    UB(32),
    CB(5, 5),
    CB(28, 5),
    CB(306, 4),
    CB(28, 9),
    UB(85),
    UB(80),
    UB(228),
    UB(184),
    UB(187),
    UB(32),
    CB(6, 6),
    UB(91),
    CB(1382, 3),
    CB(6708, 4),
    CB(438, 4),
    CB(1051, 15),
    UB(41),
    CB(4689, 3),
    CB(7271, 5),
    CB(1227, 3),
    CB(1167, 11),
    CB(21, 6),
    CB(2031, 4),
    CB(3561, 6),
    CB(4594, 4),
    CB(5803, 5),
    CB(1277, 4),
    CB(7210, 5),
    CB(2016, 6),
    CB(77, 8),
    CB(1044, 5),
    UB(110),
    CB(230, 3),
    CB(7443, 4),
    UB(91),
    UB(97),
    UB(52),
    CB(1724, 3),
    UB(53),
    CB(114, 6),
    CB(2704, 15),
    CB(2704, 10),
    UB(227),
    UB(129),
    UB(134),
    UB(239),
    UB(189),
    UB(144),
    CB(159, 3),
    UB(44),
    UB(32),
    UB(34),
    UB(117),
    UB(112),
    UB(117),
    UB(110),
    UB(117),
    CB(185, 3),
    CB(1421, 4),
    UB(85),
    UB(83),
    UB(66),
    UB(230),
    UB(137),
    UB(139),
    UB(230),
    UB(140),
    UB(135),
    UB(32),
    CB(10, 10),
    CB(193, 3),
    UB(83),
    CB(5528, 3),
    CB(391, 3),
    CB(6294, 3),
    CB(3667, 3),
    CB(201, 4),
    CB(30, 3),
    UB(32),
    UB(102),
    CB(5854, 3),
    CB(7738, 3),
    CB(4433, 4),
    CB(57, 5),
    UB(232),
    UB(168),
    UB(152),
    UB(230),
    UB(134),
    UB(182),
    UB(230),
    UB(163),
    UB(146),
    CB(60, 4),
    UB(232),
    UB(174),
    UB(176),
    UB(229),
    UB(191),
    UB(134),
    CB(13, 4),
    CB(63, 7),
    UB(106),
    CB(360, 3),
    UB(121),
    CB(4, 3),
    CB(4708, 4),
    CB(328, 4),
    CB(66, 15),
    CB(66, 3),
    UB(229),
    UB(135),
    UB(184),
    UB(229),
    UB(133),
    UB(167),
    CB(415, 4),
    CB(11, 5),
    UB(134),
    UB(133),
    CB(418, 5),
    UB(85),
    CB(1366, 3),
    UB(49),
    CB(1464, 3),
    CB(423, 9),
    CB(261, 4),
    CB(4767, 4),
    CB(1784, 3),
    CB(845, 3),
    CB(4229, 3),
    UB(101),
    UB(102),
    UB(32),
    UB(40),
    CB(2964, 3),
    CB(2322, 5),
    CB(443, 10),
    UB(85),
    CB(612, 3),
    UB(230),
    UB(158),
    UB(149),
    CB(76, 3),
    CB(8, 6),
    CB(73, 3),
    CB(620, 6),
    CB(6954, 4),
    CB(195, 4),
    CB(2638, 3),
    CB(3919, 4),
    UB(112),
    CB(5680, 3),
    UB(111),
    UB(119),
    CB(48, 7),
    UB(177),
    UB(160),
    CB(48, 6),
    CB(8, 3),
    CB(48, 9),
    CB(1227, 3),
    CB(1343, 6),
    CB(6322, 4),
    CB(4768, 3),
    CB(1657, 3),
    UB(116),
    UB(32),
    CB(1409, 3),
    UB(112),
    UB(47),
    CB(2016, 3),
    UB(102),
    UB(45),
    UB(112),
    UB(105),
    CB(5129, 4),
    UB(85),
    UB(229),
    UB(189),
    UB(162),
    UB(232),
    UB(189),
    UB(137),
    UB(229),
    UB(189),
    UB(142),
    CB(65, 3),
    CB(11, 4),
    UB(172),
    UB(229),
    UB(188),
    UB(175),
    CB(116, 12),
    CB(2969, 3),
    UB(51),
    UB(32),
    CB(3687, 3),
    CB(551, 4),
    UB(85),
    UB(45),
    CB(6336, 4),
    CB(53, 3),
    CB(4795, 4),
    CB(5, 3),
    CB(4795, 3),
    UB(85),
    CB(4795, 8),
    CB(279, 15),
    CB(37, 5),
    UB(190),
    CB(37, 4),
    CB(1633, 3),
    UB(85),
    CB(3040, 3),
    CB(1199, 5),
    CB(37, 4),
    UB(107),
    UB(101),
    CB(1866, 3),
    CB(4391, 8),
    CB(4158, 3),
    UB(99),
    CB(5524, 3),
    CB(1885, 3),
    UB(116),
    CB(2578, 5),
    CB(4449, 7),
    CB(490, 4),
    CB(4156, 7),
    CB(375, 3),
    UB(107),
    CB(4586, 5),
    UB(86),
    UB(67),
    UB(82),
    UB(32),
    CB(4, 4),
    UB(91),
    UB(86),
    CB(6367, 3),
    UB(82),
    CB(5681, 4),
    CB(612, 5),
    UB(99),
    UB(108),
    CB(5280, 3),
    CB(558, 15),
    UB(34),
    CB(27, 5),
    UB(99),
    CB(2394, 3),
    CB(6187, 3),
    UB(101),
    CB(2816, 3),
    CB(2806, 3),
    CB(353, 3),
    CB(552, 4),
    UB(86),
    UB(230),
    UB(186),
    UB(157),
    UB(32),
    UB(86),
    UB(230),
    UB(178),
    UB(159),
    CB(72, 4),
    UB(103),
    CB(2178, 4),
    UB(32),
    UB(47),
    CB(327, 3),
    CB(424, 3),
    UB(99),
    UB(107),
    CB(112, 5),
    CB(2103, 5),
    UB(114),
    UB(101),
    UB(118),
    CB(5321, 3),
    CB(4492, 6),
    CB(2360, 4),
    UB(118),
    CB(2167, 4),
    UB(100),
    UB(195),
    UB(169),
    CB(2195, 4),
    UB(101),
    UB(116),
    UB(195),
    UB(169),
    UB(47),
    UB(103),
    UB(117),
    UB(108),
    UB(108),
    CB(6329, 3),
    UB(88),
    UB(79),
    UB(233),
    UB(134),
    UB(172),
    UB(32),
    CB(6, 3),
    UB(133),
    UB(177),
    UB(32),
    UB(91),
    UB(88),
    UB(32),
    UB(79),
    CB(4908, 5),
    CB(550, 5),
    UB(88),
    UB(79),
    CB(6283, 3),
    CB(6310, 3),
    CB(2164, 3),
    CB(1382, 3),
    UB(105),
    UB(99),
    CB(6056, 3),
    UB(101),
    UB(97),
    CB(1409, 4),
    CB(23, 6),
    CB(233, 3),
    UB(118),
    CB(1388, 4),
    CB(7502, 5),
    UB(72),
    CB(959, 4),
    UB(75),
    CB(5, 4),
    CB(13, 3),
    CB(115, 4),
    UB(49),
    UB(57),
    UB(56),
    UB(48),
    CB(2756, 3),
    UB(88),
    UB(229),
    UB(133),
    UB(137),
    UB(32),
    CB(5, 5),
    CB(92, 3),
    CB(7619, 4),
    CB(3111, 5),
    UB(88),
    UB(45),
    UB(114),
    UB(97),
    CB(123, 3),
    UB(99),
    UB(111),
    CB(8069, 3),
    CB(4, 3),
    UB(91),
    UB(99),
    CB(1282, 3),
    UB(115),
    CB(931, 15),
    CB(931, 5),
    CB(30, 3),
    CB(5104, 4),
    CB(2514, 5),
    CB(11, 10),
    CB(1297, 5),
    CB(5648, 4),
    UB(97),
    CB(98, 3),
    UB(105),
    CB(6797, 5),
    CB(69, 3),
    UB(105),
    CB(1349, 3),
    CB(69, 4),
    UB(73),
    CB(3618, 3),
    UB(97),
    CB(1958, 4),
    UB(47),
    UB(10),
    UB(109),
    UB(117),
    CB(2418, 3),
    CB(4, 3),
    UB(91),
    UB(109),
    UB(32),
    UB(117),
    UB(32),
    UB(97),
    CB(1605, 5),
    UB(110),
    UB(111),
    UB(109),
    CB(3655, 4),
    UB(119),
    UB(97),
    CB(1548, 3),
    CB(5827, 6),
    CB(1624, 5),
    UB(107),
    UB(105),
    UB(115),
    CB(4929, 4),
    UB(119),
    UB(32),
    UB(119),
    CB(7305, 3),
    CB(138, 15),
    CB(2120, 6),
    CB(3052, 7),
    CB(1908, 3),
    CB(2396, 13),
    UB(232),
    UB(144),
    UB(172),
    UB(124),
    UB(228),
    UB(184),
    UB(135),
    UB(91),
    CB(607, 3),
    CB(3915, 5),
    CB(450, 5),
    CB(5, 5),
    UB(91),
    UB(119),
    CB(214, 3),
    CB(5381, 3),
    CB(1585, 4),
    CB(1368, 3),
    CB(81, 14),
    CB(6487, 12),
    UB(230),
    UB(136),
    UB(145),
    UB(231),
    UB(154),
    UB(132),
    UB(91),
    UB(119),
    CB(1534, 3),
    UB(100),
    UB(101),
    UB(53),
    CB(69, 8),
    UB(229),
    UB(167),
    UB(144),
    CB(72, 5),
    CB(8, 4),
    CB(75, 8),
    CB(412, 3),
    UB(101),
    CB(1665, 5),
    UB(121),
    CB(7157, 3),
    CB(6148, 3),
    CB(2330, 3),
    CB(1215, 4),
    CB(91, 15),
    CB(8246, 7),
    CB(91, 10),
    CB(67, 3),
    CB(94, 8),
    CB(66, 6),
    CB(99, 3),
    UB(207),
    UB(128),
    UB(230),
    UB(151),
    UB(165),
    UB(32),
    CB(6, 6),
    UB(91),
    UB(80),
    CB(6832, 3),
    UB(32),
    UB(114),
    CB(5727, 5),
    UB(87),
    UB(111),
    UB(114),
    UB(108),
    UB(100),
    UB(32),
    UB(80),
    UB(105),
    UB(32),
    UB(68),
    UB(97),
    CB(6837, 3),
    CB(3317, 3),
    CB(5218, 3),
    CB(6600, 3),
    CB(7215, 12),
    CB(3675, 10),
    CB(2295, 4),
    CB(5983, 3),
    CB(3066, 4),
    CB(75, 3),
    CB(2690, 4),
    UB(77),
    UB(97),
    CB(4997, 3),
    UB(32),
    UB(49),
    CB(7705, 3),
    UB(97),
    CB(8, 3),
    UB(121),
    CB(1039, 3),
    UB(47),
    UB(10),
    UB(226),
    UB(150),
    UB(161),
    UB(32),
    CB(4, 4),
    CB(6413, 3),
    CB(602, 7),
    CB(2911, 13),
    UB(99),
    CB(4876, 3),
    UB(47),
    UB(97),
    UB(119),
    CB(7829, 6),
    CB(3782, 9),
    CB(93, 4),
    UB(108),
    CB(130, 6),
    CB(2678, 4),
    CB(3448, 4),
    CB(794, 3),
    CB(4902, 3),
    CB(134, 4),
    UB(228),
    UB(184),
    UB(141),
    UB(228),
    UB(184),
    UB(128),
    UB(230),
    UB(168),
    UB(163),
    CB(379, 3),
    CB(10, 5),
    UB(160),
    UB(183),
    UB(91),
    CB(3176, 3),
    CB(8096, 5),
    CB(7728, 3),
    CB(100, 3),
    UB(41),
    UB(47),
    CB(5325, 6),
    UB(119),
    CB(921, 3),
    CB(8, 4),
    CB(937, 3),
    UB(227),
    UB(132),
    UB(133),
    UB(227),
    UB(132),
    UB(167),
    UB(227),
    UB(132),
    UB(164),
    UB(203),
    UB(139),
    CB(148, 13),
    CB(4773, 6),
    CB(537, 7),
    UB(112),
    UB(101),
    UB(119),
    UB(33),
    CB(537, 13),
    UB(98),
    CB(806, 3),
    CB(346, 3),
    CB(2142, 3),
    CB(8848, 7),
    CB(5955, 4),
    UB(117),
    UB(110),
    CB(3077, 12),
    CB(67, 3),
    UB(52),
    CB(2702, 3),
    CB(83, 9),
    CB(2789, 4),
    CB(84, 4),
    UB(117),
    UB(112),
    UB(116),
    CB(2995, 4),
    UB(59),
    UB(32),
    UB(111),
    UB(98),
    CB(5731, 4),
    CB(2948, 3),
    CB(4863, 5),
    UB(97),
    UB(119),
    UB(107),
    UB(119),
    CB(2105, 3),
    CB(3963, 3),
    CB(207, 3),
    CB(839, 3),
    CB(2567, 3),
    UB(115),
    UB(101),
    UB(108),
    CB(347, 3),
    CB(4206, 5),
    UB(115),
    CB(2446, 3),
    CB(4891, 15),
    CB(4884, 15),
    CB(94, 3),
    CB(4881, 3),
    CB(223, 15),
    CB(223, 4),
    UB(141),
    CB(223, 5),
    UB(165),
    CB(4079, 3),
    CB(3315, 3),
    CB(6976, 4),
    CB(322, 4),
    CB(7559, 3),
    UB(99),
    UB(101),
    CB(5473, 5),
    CB(1952, 3),
    UB(122),
    UB(105),
    CB(323, 5),
    CB(511, 3),
    UB(226),
    UB(151),
    UB(139),
    UB(32),
    CB(4, 4),
    UB(91),
    CB(8050, 5),
    CB(1498, 4),
    CB(5461, 9),
    CB(1241, 5),
    CB(966, 3),
    CB(128, 6),
    CB(1251, 7),
    UB(117),
    CB(195, 4),
    UB(116),
    CB(2711, 4),
    CB(2080, 6),
    CB(6437, 5),
    CB(6053, 5),
    CB(2678, 6),
    UB(34),
    UB(88),
    UB(34),
    CB(52, 4),
    CB(9427, 7),
    UB(41),
    CB(6922, 12),
    UB(227),
    UB(128),
    UB(135),
    CB(102, 7),
    CB(119, 3),
    UB(186),
    UB(174),
    UB(32),
    CB(4, 4),
    UB(91),
    CB(1429, 3),
    CB(118, 4),
    UB(34),
    UB(98),
    UB(97),
    CB(7536, 3),
    UB(111),
    UB(34),
    CB(1492, 3),
    CB(8977, 3),
    CB(83, 3),
    CB(1341, 11),
    CB(6565, 11),
    UB(40),
    UB(75),
    CB(469, 3),
    UB(120),
    UB(105),
    CB(38, 9),
    UB(49),
    UB(49),
    UB(56),
    CB(196, 3),
    UB(227),
    UB(128),
    UB(133),
    CB(93, 3),
    CB(4373, 3),
    UB(120),
    UB(120),
    CB(7614, 4),
    CB(6944, 3),
    CB(680, 7),
    CB(3753, 4),
    CB(2124, 3),
    CB(200, 4),
    CB(341, 3),
    CB(4347, 9),
    CB(2989, 4),
    CB(6557, 4),
    CB(8487, 4),
    CB(8538, 3),
    CB(95, 8),
    CB(74, 5),
    UB(135),
    CB(167, 4),
    CB(270, 10),
    UB(122),
    UB(101),
    UB(114),
    CB(4745, 3),
    UB(227),
    UB(128),
    UB(161),
    CB(23, 3),
    CB(466, 3),
    CB(8418, 6),
    CB(4388, 3),
    CB(340, 4),
    UB(32),
    UB(49),
    CB(166, 4),
    UB(83),
    UB(117),
    UB(122),
    CB(1038, 3),
    CB(4408, 4),
    CB(20, 5),
    CB(7986, 7),
    UB(232),
    UB(152),
    UB(135),
    UB(229),
    UB(183),
    UB(158),
    UB(231),
    UB(162),
    UB(188),
    UB(229),
    UB(173),
    UB(144),
    UB(124),
    UB(232),
    UB(139),
    UB(143),
    CB(13, 4),
    UB(160),
    UB(129),
    CB(13, 3),
    UB(91),
    UB(83),
    CB(1865, 3),
    CB(50, 4),
    CB(5494, 3),
    UB(97),
    CB(1994, 3),
    UB(105),
    UB(53),
    CB(270, 3),
    UB(227),
    UB(128),
    UB(162),
    CB(96, 3),
    UB(162),
    CB(8801, 5),
    CB(96, 11),
    UB(50),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 14),
    UB(163),
    CB(96, 3),
    CB(2971, 3),
    CB(8675, 4),
    CB(97, 11),
    UB(51),
    CB(97, 15),
    CB(97, 15),
    CB(97, 15),
    CB(97, 15),
    CB(97, 14),
    UB(164),
    CB(97, 3),
    CB(2089, 3),
    CB(8715, 3),
    CB(96, 11),
    UB(52),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 14),
    UB(165),
    CB(96, 3),
    CB(1185, 3),
    CB(8732, 3),
    CB(96, 11),
    UB(53),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 14),
    UB(166),
    CB(96, 3),
    CB(5805, 3),
    CB(8688, 7),
    CB(77, 8),
    UB(54),
    CB(97, 15),
    CB(97, 15),
    CB(97, 15),
    CB(97, 15),
    CB(97, 14),
    UB(167),
    CB(97, 3),
    CB(5524, 3),
    UB(113),
    CB(578, 13),
    UB(55),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 14),
    UB(168),
    CB(96, 3),
    CB(4458, 3),
    CB(8968, 6),
    CB(76, 8),
    UB(56),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 15),
    CB(96, 14),
    UB(169),
    CB(96, 3),
    UB(169),
    CB(8987, 6),
    CB(97, 11),
    UB(57),
    CB(97, 15),
    CB(97, 15),
    CB(97, 15),
    CB(97, 15),
    CB(97, 14),
    UB(184),
    CB(97, 3),
    UB(184),
    CB(578, 3),
    CB(2538, 6),
    CB(868, 9),
    UB(48),
    CB(98, 15),
    CB(98, 15),
    CB(98, 15),
    CB(98, 15),
    CB(98, 14),
    UB(187),
    CB(98, 3),
    CB(3083, 3),
    CB(1062, 15),
    CB(1062, 15),
    CB(1062, 15),
    CB(1062, 15),
    CB(1062, 6),
    CB(1601, 10),
    CB(1613, 12),
    CB(90, 5),
    UB(32),
    CB(4, 4),
    CB(8, 7),
    CB(1761, 15),
    CB(1761, 14),
    CB(1586, 7),
    CB(1701, 5),
    CB(1774, 15),
    CB(1774, 15),
    CB(1774, 15),
    CB(1774, 15),
    CB(1774, 15),
    UB(10),
    UB(227),
    UB(141),
    CB(231, 3),
    CB(4, 3),
    CB(231, 7),
    UB(229),
    UB(185),
    UB(179),
    UB(230),
    UB(136),
    UB(144),
    UB(91),
    UB(80),
    CB(2886, 7),
    CB(4874, 3),
    CB(350, 3),
    CB(1582, 11),
    CB(1491, 3),
    CB(27, 3),
    CB(9256, 4),
    CB(225, 8),
    CB(67, 4),
    UB(188),
    CB(67, 3),
    CB(7851, 3),
    CB(67, 6),
    UB(230),
    UB(152),
    UB(173),
    UB(229),
    UB(146),
    UB(140),
    UB(91),
    UB(90),
    CB(8117, 5),
    CB(9959, 3),
    CB(64, 15),
    CB(64, 15),
    CB(64, 5),
    UB(189),
    CB(64, 3),
    CB(6750, 3),
    CB(131, 7),
    UB(164),
    UB(167),
    UB(230),
    UB(173),
    UB(163),
    UB(91),
    UB(68),
    CB(3348, 3),
    CB(10017, 8),
    CB(65, 15),
    CB(65, 15),
    CB(65, 3),
    UB(190),
    CB(65, 3),
    CB(2925, 3),
    CB(129, 8),
    UB(142),
    UB(230),
    UB(178),
    UB(187),
    UB(91),
    UB(77),
    CB(3014, 7),
    CB(1123, 4),
    CB(65, 15),
    CB(65, 15),
    UB(10),
    UB(227),
    UB(144),
    UB(132),
    UB(32),
    CB(4, 4),
    UB(91),
    UB(107),
    UB(117),
    UB(97),
    CB(3247, 6),
    UB(109),
    UB(112),
    CB(1887, 3),
    CB(7356, 5),
    CB(1624, 15),
    CB(10099, 6),
    UB(109),
    UB(105),
    UB(114),
    UB(114),
    CB(8182, 4),
    CB(7269, 8),
    UB(229),
    UB(164),
    UB(130),
    CB(1691, 3),
    CB(3430, 3),
    CB(76, 4),
    CB(1630, 3),
    CB(4, 3),
    CB(1148, 7),
    CB(2264, 4),
    UB(97),
    CB(8975, 14),
    UB(228),
    UB(186),
    UB(148),
    CB(29, 5),
    CB(44, 4),
    UB(134),
    CB(44, 3),
    UB(134),
    CB(1577, 4),
    CB(3295, 5),
    CB(120, 15),
    CB(120, 15),
    UB(32),
    UB(230),
    UB(174),
    UB(183),
    CB(42, 4),
    CB(4803, 4),
    UB(227),
    UB(144),
    UB(140),
    CB(58, 3),
    CB(6814, 3),
    CB(4220, 6),
    CB(9069, 12),
    UB(174),
    UB(131),
    CB(21, 5),
    CB(36, 4),
    UB(150),
    CB(36, 3),
    CB(9435, 3),
    UB(120),
    UB(105),
    CB(8806, 5),
    CB(1953, 8),
    CB(20, 3),
    CB(10544, 3),
    UB(91),
    UB(88),
    CB(22, 3),
    CB(10506, 4),
    CB(42, 6),
    CB(18, 3),
    CB(25, 7),
    CB(2930, 3),
    CB(26, 8),
    CB(2837, 4),
    CB(7769, 3),
    CB(2744, 3),
    CB(198, 6),
    CB(560, 4),
    UB(144),
    UB(156),
    CB(40, 3),
    CB(6039, 3),
    CB(5044, 3),
    CB(34, 5),
    CB(217, 12),
    UB(187),
    UB(135),
    CB(23, 7),
    CB(40, 4),
    CB(1796, 3),
    CB(4, 3),
    UB(91),
    UB(110),
    CB(9273, 6),
    CB(264, 15),
    CB(2661, 5),
    UB(135),
    UB(166),
    CB(30, 6),
    CB(46, 4),
    CB(1553, 3),
    CB(4, 3),
    CB(1264, 3),
    CB(85, 5),
    CB(46, 15),
    CB(46, 5),
    UB(177),
    UB(130),
    CB(30, 6),
    CB(46, 4),
    UB(171),
    CB(46, 3),
    UB(171),
    CB(217, 4),
    CB(10572, 4),
    CB(48, 3),
    UB(111),
    CB(2684, 3),
    CB(260, 12),
    UB(135),
    UB(182),
    CB(28, 8),
    CB(46, 4),
    UB(176),
    CB(46, 3),
    CB(4281, 3),
    CB(3543, 3),
    CB(138, 4),
    CB(44, 15),
    UB(228),
    UB(191),
    UB(161),
    CB(26, 6),
    CB(42, 4),
    UB(186),
    CB(42, 3),
    CB(7493, 3),
    CB(1036, 3),
    CB(2673, 6),
    CB(44, 15),
    UB(231),
    UB(156),
    UB(190),
    UB(124),
    UB(228),
    UB(188),
    UB(151),
    CB(32, 8),
    CB(50, 3),
    UB(145),
    UB(138),
    UB(32),
    CB(4, 4),
    CB(407, 3),
    CB(47, 4),
    CB(354, 8),
    UB(232),
    UB(167),
    UB(163),
    CB(22, 3),
    CB(376, 4),
    CB(3904, 5),
    CB(41, 5),
    UB(179),
    CB(41, 3),
    CB(2090, 3),
    CB(1127, 4),
    CB(2763, 5),
    CB(91, 3),
    CB(4701, 3),
    UB(101),
    UB(97),
    CB(8402, 3),
    UB(102),
    UB(117),
    UB(108),
    UB(59),
    CB(3436, 4),
    CB(2945, 3),
    CB(42, 4),
    UB(186),
    CB(148, 3),
    CB(83, 3),
    UB(106),
    CB(3640, 6),
    CB(131, 15),
    CB(27, 3),
    CB(26, 6),
    CB(42, 3),
    UB(146),
    CB(84, 3),
    CB(4, 3),
    CB(1670, 3),
    CB(5235, 7),
    CB(44, 15),
    UB(229),
    UB(133),
    UB(169),
    CB(1019, 3),
    UB(164),
    CB(32, 8),
    CB(50, 4),
    CB(1334, 3),
    CB(4, 3),
    UB(91),
    UB(115),
    UB(117),
    CB(176, 5),
    CB(359, 15),
    CB(9344, 5),
    UB(129),
    UB(130),
    CB(30, 6),
    CB(46, 4),
    UB(186),
    UB(32),
    UB(231),
    UB(189),
    CB(7714, 3),
    CB(2511, 3),
    CB(95, 15),
    CB(270, 6),
    UB(189),
    CB(712, 3),
    CB(90, 8),
    UB(147),
    UB(130),
    UB(32),
    UB(229),
    UB(175),
    CB(224, 3),
    CB(5066, 7),
    CB(43, 15),
    CB(27, 3),
    CB(26, 6),
    CB(42, 3),
    UB(148),
    CB(941, 3),
    CB(4, 3),
    CB(1563, 3),
    CB(662, 5),
    UB(34),
    CB(3613, 3),
    UB(108),
    CB(2505, 15),
    CB(761, 15),
    CB(2505, 15),
    CB(2283, 4),
    UB(54),
    CB(651, 4),
    UB(149),
    UB(129),
    UB(32),
    UB(229),
    UB(141),
    CB(6928, 3),
    UB(113),
    UB(117),
    UB(101),
    CB(116, 15),
    CB(116, 5),
    UB(141),
    UB(187),
    UB(124),
    CB(31, 3),
    CB(30, 6),
    CB(46, 4),
    UB(145),
    UB(32),
    UB(229),
    UB(142),
    CB(1779, 3),
    UB(99),
    CB(2627, 6),
    CB(46, 15),
    UB(229),
    UB(187),
    UB(154),
    UB(124),
    CB(31, 3),
    CB(30, 6),
    CB(46, 4),
    UB(152),
    UB(32),
    UB(229),
    UB(143),
    UB(130),
    CB(46, 3),
    CB(2307, 6),
    CB(42, 12),
    UB(143),
    UB(131),
    UB(124),
    CB(27, 3),
    CB(26, 6),
    CB(42, 4),
    CB(2156, 3),
    CB(4, 3),
    CB(1674, 3),
    UB(101),
    CB(43, 5),
    CB(89, 15),
    UB(229),
    UB(145),
    UB(187),
    CB(27, 7),
    CB(44, 6),
    UB(228),
    UB(187),
    CB(44, 3),
    UB(121),
    CB(4497, 5),
    CB(42, 15),
    CB(26, 3),
    CB(25, 5),
    CB(40, 4),
    UB(175),
    CB(84, 3),
    CB(4236, 3),
    UB(110),
    CB(217, 15),
    CB(40, 5),
    UB(232),
    UB(168),
    UB(165),
    UB(124),
    UB(232),
    CB(1035, 3),
    CB(29, 4),
    CB(44, 4),
    CB(1473, 3),
    CB(4, 3),
    CB(6228, 4),
    CB(85, 4),
    CB(123, 12),
    UB(146),
    UB(133),
    CB(22, 6),
    CB(3189, 11),
    CB(4487, 3),
    CB(54, 5),
    UB(151),
    UB(130),
    UB(32),
    CB(4, 4),
    CB(155, 5),
    CB(477, 5),
    CB(743, 13),
    UB(129),
    CB(24, 8),
    UB(47),
    CB(3211, 5),
    CB(5591, 3),
    CB(5873, 4),
    CB(3908, 4),
    UB(101),
    UB(120),
    CB(7904, 5),
    CB(11, 4),
    UB(119),
    UB(97),
    CB(10860, 4),
    CB(8089, 4),
    CB(5038, 3),
    CB(3663, 3),
    CB(8728, 5),
    UB(67),
    CB(68, 3),
    CB(3226, 5),
    CB(417, 4),
    UB(152),
    UB(154),
    UB(32),
    UB(227),
    UB(152),
    UB(142),
    UB(32),
    UB(91),
    CB(3139, 3),
    CB(4938, 5),
    CB(7642, 3),
    CB(1862, 3),
    UB(114),
    UB(121),
    CB(1764, 3),
    CB(3365, 5),
    CB(93, 3),
    CB(10809, 4),
    CB(6507, 4),
    UB(114),
    UB(111),
    UB(119),
    CB(10948, 5),
    UB(114),
    UB(111),
    CB(3579, 4),
    UB(227),
    UB(152),
    UB(173),
    UB(32),
    UB(229),
    UB(157),
    CB(731, 3),
    CB(7824, 6),
    CB(212, 12),
    UB(157),
    UB(179),
    CB(21, 5),
    CB(36, 4),
    UB(181),
    CB(94, 3),
    CB(7499, 3),
    CB(6698, 6),
    CB(1938, 6),
    CB(575, 3),
    CB(10808, 4),
    CB(7120, 3),
    CB(10722, 4),
    CB(132, 4),
    UB(153),
    UB(141),
    UB(32),
    CB(4, 4),
    UB(91),
    UB(100),
    UB(117),
    CB(6562, 6),
    CB(39, 15),
    CB(39, 9),
    CB(2514, 3),
    CB(4, 3),
    CB(1324, 8),
    CB(39, 15),
    CB(39, 9),
    UB(154),
    CB(365, 3),
    CB(4, 3),
    CB(9136, 4),
    CB(1362, 12),
    UB(154),
    UB(187),
    UB(229),
    UB(167),
    UB(166),
    UB(124),
    CB(7, 4),
    UB(165),
    UB(184),
    CB(9164, 5),
    CB(4365, 4),
    CB(498, 5),
    CB(26, 5),
    CB(33, 5),
    UB(165),
    CB(888, 3),
    CB(27, 10),
    CB(10229, 14),
    UB(155),
    UB(158),
    CB(31, 3),
    UB(124),
    UB(233),
    UB(184),
    UB(161),
    CB(64, 15),
    UB(10),
    UB(227),
    UB(155),
    CB(424, 3),
    CB(4, 3),
    CB(1321, 4),
    CB(323, 4),
    CB(4256, 3),
    UB(99),
    UB(101),
    CB(1072, 3),
    UB(47),
    UB(102),
    UB(114),
    CB(11005, 3),
    CB(7667, 5),
    CB(10455, 6),
    CB(43, 4),
    UB(131),
    CB(43, 3),
    UB(131),
    CB(857, 9),
    CB(1340, 12),
    UB(189),
    UB(148),
    UB(124),
    UB(230),
    UB(180),
    UB(129),
    CB(26, 6),
    UB(47),
    UB(40),
    CB(9710, 4),
    CB(3554, 3),
    CB(190, 8),
    UB(103),
    CB(4788, 3),
    UB(110),
    CB(227, 10),
    UB(157),
    CB(1804, 3),
    CB(4, 3),
    CB(778, 4),
    CB(4830, 5),
    CB(638, 15),
    UB(231),
    UB(180),
    UB(148),
    UB(124),
    UB(231),
    UB(186),
    UB(175),
    CB(31, 7),
    CB(48, 4),
    CB(3332, 3),
    CB(4, 3),
    CB(48, 15),
    CB(220, 10),
    UB(182),
    UB(137),
    UB(124),
    UB(233),
    UB(185),
    UB(145),
    CB(48, 11),
    UB(155),
    CB(1700, 3),
    CB(7375, 3),
    UB(115),
    CB(1065, 15),
    CB(1726, 7),
    UB(191),
    CB(25, 5),
    CB(40, 4),
    UB(160),
    UB(32),
    UB(229),
    UB(134),
    CB(812, 3),
    CB(8814, 4),
    CB(88, 15),
    CB(42, 5),
    UB(134),
    UB(165),
    CB(27, 7),
    CB(44, 4),
    UB(161),
    UB(32),
    UB(230),
    UB(156),
    UB(128),
    CB(1374, 3),
    CB(1240, 6),
    CB(251, 12),
    UB(156),
    UB(128),
    CB(22, 6),
    CB(38, 4),
    CB(561, 3),
    CB(4, 3),
    UB(91),
    CB(11110, 6),
    CB(212, 12),
    UB(164),
    UB(153),
    UB(124),
    UB(231),
    UB(162),
    UB(141),
    CB(25, 5),
    CB(40, 11),
    UB(100),
    CB(328, 5),
    CB(9968, 4),
    UB(98),
    CB(6907, 4),
    CB(693, 3),
    CB(131, 15),
    UB(190),
    UB(151),
    CB(36, 5),
    CB(310, 4),
    UB(158),
    UB(142),
    UB(32),
    CB(4, 4),
    CB(2897, 3),
    CB(746, 5),
    CB(1846, 3),
    CB(9539, 4),
    CB(4121, 3),
    CB(4641, 3),
    UB(59),
    CB(5368, 3),
    UB(111),
    CB(20, 11),
    CB(6748, 4),
    CB(23, 5),
    CB(828, 4),
    CB(6618, 3),
    CB(63, 5),
    CB(66, 7),
    CB(69, 8),
    CB(5117, 3),
    CB(2577, 5),
    UB(98),
    UB(97),
    CB(6956, 3),
    CB(6696, 3),
    UB(107),
    CB(75, 3),
    CB(8151, 3),
  ];
}

@lrhn
Copy link
Member

lrhn commented Apr 15, 2024

One issue with your code is in the lines:

decompressed.setRange(
          index,
          index + block.length,
          decompressed.getRange(
            index - block.offset,
            index - block.offset + block.length,
          ),
        );

If I change those to:

decompressed.setRange(
          index,
          index + block.length,
          decompressed
          index - block.offset,
        );

and avoid creating an extra Iterable per operation (which may not even be detected as being backed by a typed-data array), I get a ~5x speed-up.

Still not as fast as the copy loop, but at least in the same ballpark (well, at least when JIT'ed, still only half the speed of the loop when compiled to exe).

There is an overhead of using setRange. For example, it checks whether the source and target ranges are in the same list, and are overlapping, and if so, it copies either forwards or backwards to avoid clobbering source before it's been read.
When it gets going on the copying, that can still be fast, but for a lot of 15-byte copies, the overhead will be visible.

@Mr-Pepe
Copy link

Mr-Pepe commented Apr 16, 2024

Right, I wasn't making the best use of setRange. Thank you for the hint :)

The performance of the for-loop is currently fine for me. I was just surprised that it was so much faster than setRange, started googling and found this issue. Good to hear that setRange has been optimized since 2018 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-vm Use area-vm for VM related issues, including code coverage, and the AOT and JIT backends. library-typed-data type-enhancement A request for a change that isn't a bug
Projects
None yet
Development

No branches or pull requests

7 participants