github.com/janelia-flyem/dvid@v1.0.0/datatype/labelarray/mutate_test.go (about)

     1  package labelarray
     2  
     3  import (
     4  	"bytes"
     5  	"compress/gzip"
     6  	"encoding/binary"
     7  	"encoding/json"
     8  	"fmt"
     9  	"io"
    10  	"io/ioutil"
    11  	"math/rand"
    12  	"net/http"
    13  	"reflect"
    14  	"runtime"
    15  	"sync"
    16  	"testing"
    17  	"time"
    18  
    19  	"github.com/janelia-flyem/dvid/datastore"
    20  	"github.com/janelia-flyem/dvid/datatype/common/downres"
    21  	"github.com/janelia-flyem/dvid/datatype/common/labels"
    22  	"github.com/janelia-flyem/dvid/dvid"
    23  	"github.com/janelia-flyem/dvid/server"
    24  
    25  	lz4 "github.com/janelia-flyem/go/golz4-updated"
    26  )
    27  
    28  type testBody struct {
    29  	label        uint64
    30  	offset, size dvid.Point3d // these are just to give ROI of voxelSpans
    31  	blockSpans   dvid.Spans
    32  	voxelSpans   dvid.Spans // in DVID coordinates, not relative coordinates
    33  }
    34  
    35  var emptyBody = testBody{
    36  	label:      0,
    37  	offset:     dvid.Point3d{},
    38  	size:       dvid.Point3d{},
    39  	blockSpans: dvid.Spans{},
    40  	voxelSpans: dvid.Spans{},
    41  }
    42  
    43  func checkSparsevolsCoarse(t *testing.T, encoding []byte) {
    44  	length := len(encoding)
    45  	var i int
    46  	for label := uint64(1); label <= 3; label++ {
    47  		if i+28 >= length {
    48  			t.Fatalf("Expected label %d but only %d bytes remain in encoding\n", label, len(encoding[i:]))
    49  		}
    50  		gotLabel := binary.LittleEndian.Uint64(encoding[i : i+8])
    51  		if gotLabel != label {
    52  			t.Errorf("Expected label %d, got label %d in returned coarse sparsevols\n", label, gotLabel)
    53  		}
    54  		i += 8
    55  		var spans dvid.Spans
    56  		if err := spans.UnmarshalBinary(encoding[i:]); err != nil {
    57  			t.Errorf("Error in decoding coarse sparse volume: %v\n", err)
    58  			return
    59  		}
    60  		i += 4 + len(spans)*16
    61  		b := bodies[label-1]
    62  		if !reflect.DeepEqual(spans, b.blockSpans) {
    63  			_, fn, line, _ := runtime.Caller(1)
    64  			t.Errorf("Expected coarse spans for label %d:\n%s\nGot spans [%s:%d]:\n%s\n", b.label, b.blockSpans, fn, line, spans)
    65  		}
    66  	}
    67  }
    68  
    69  // Makes sure the coarse sparse volume encoding matches the body.
    70  func (b testBody) checkCoarse(t *testing.T, encoding []byte) {
    71  	// Get to the  # spans and RLE in encoding
    72  	spansEncoding := encoding[8:]
    73  	var spans dvid.Spans
    74  	if err := spans.UnmarshalBinary(spansEncoding); err != nil {
    75  		t.Errorf("Error in decoding coarse sparse volume: %v\n", err)
    76  		return
    77  	}
    78  
    79  	// Check those spans match the body voxels.
    80  	if !reflect.DeepEqual(spans, b.blockSpans) {
    81  		_, fn, line, _ := runtime.Caller(1)
    82  		t.Errorf("Expected coarse spans for label %d:\n%s\nGot spans [%s:%d]:\n%s\n", b.label, b.blockSpans, fn, line, spans)
    83  	}
    84  }
    85  
    86  // Makes sure the sparse volume encoding matches the actual body voxels.
    87  func (b testBody) checkSparseVol(t *testing.T, encoding []byte, bounds dvid.OptionalBounds) {
    88  	if len(encoding) < 12 {
    89  		t.Fatalf("Bad encoded sparsevol received.  Only %d bytes\n", len(encoding))
    90  	}
    91  
    92  	// Get to the  # spans and RLE in encoding
    93  	spansEncoding := encoding[8:]
    94  	var spans dvid.Spans
    95  	if err := spans.UnmarshalBinary(spansEncoding); err != nil {
    96  		t.Fatalf("Error in decoding sparse volume: %v\n", err)
    97  	}
    98  
    99  	// Create potentially bounded spans
   100  	expected := dvid.Spans{}
   101  	if bounds.IsSet() {
   102  		for _, span := range b.voxelSpans {
   103  			if bounds.OutsideY(span[1]) || bounds.OutsideZ(span[0]) {
   104  				continue
   105  			}
   106  			expected = append(expected, span)
   107  		}
   108  	} else {
   109  		expected = b.voxelSpans
   110  	}
   111  
   112  	// Check those spans match the body voxels.
   113  	gotNorm := spans.Normalize()
   114  	expectNorm := expected.Normalize()
   115  	if !reflect.DeepEqual(gotNorm, expectNorm) {
   116  		for _, got := range gotNorm {
   117  			bad := true
   118  			for _, expect := range expectNorm {
   119  				if reflect.DeepEqual(got, expect) {
   120  					bad = false
   121  				}
   122  			}
   123  			if bad {
   124  				fmt.Printf("Got unexpected span: %s\n", got)
   125  			}
   126  		}
   127  		for _, expect := range expectNorm {
   128  			bad := true
   129  			for _, got := range gotNorm {
   130  				if reflect.DeepEqual(got, expect) {
   131  					bad = false
   132  				}
   133  			}
   134  			if bad {
   135  				fmt.Printf("Never got expected span: %s\n", expect)
   136  			}
   137  		}
   138  		_, fn, line, _ := runtime.Caller(1)
   139  		t.Fatalf("Expected %d fine spans for label %d [%s:%d]:\n%s\nGot %d spans:\n%s\nAfter Norm:%s\n", len(expectNorm), b.label, fn, line, expectNorm, len(spans), spans, gotNorm)
   140  	}
   141  }
   142  
   143  // Makes sure the sparse volume encoding matches a downres of actual body voxels.
   144  func (b testBody) checkScaledSparseVol(t *testing.T, encoding []byte, scale uint8, bounds dvid.OptionalBounds) {
   145  	if len(encoding) < 12 {
   146  		t.Fatalf("Bad encoded sparsevol received.  Only %d bytes\n", len(encoding))
   147  	}
   148  
   149  	// Make down-res volume of body
   150  	vol := newTestVolume(128, 128, 128)
   151  	vol.addBody(b, 1)
   152  	vol.downres(scale)
   153  
   154  	// Get to the  # spans and RLE in encoding
   155  	spansEncoding := encoding[8:]
   156  	var spans dvid.Spans
   157  	if err := spans.UnmarshalBinary(spansEncoding); err != nil {
   158  		t.Fatalf("Error in decoding sparse volume: %v\n", err)
   159  	}
   160  
   161  	// Check those spans are within the body voxels.
   162  	for _, span := range spans {
   163  		z, y, x0, x1 := span.Unpack()
   164  		if x1 >= vol.size[0] || y >= vol.size[1] || z >= vol.size[2] {
   165  			t.Fatalf("Span %s is outside bound of scale %d volume of size %s\n", span, scale, vol.size)
   166  		}
   167  		pos := z*vol.size[0]*vol.size[1] + y*vol.size[0] + x0
   168  		for x := x0; x <= x1; x++ {
   169  			label := binary.LittleEndian.Uint64(vol.data[pos*8 : pos*8+8])
   170  			if label != 1 {
   171  				t.Fatalf("Received body at scale %d has voxel at (%d,%d,%d) but that voxel is label %d, not in body %d\n", scale, x, y, z, label, b.label)
   172  				return
   173  			}
   174  			pos++
   175  		}
   176  	}
   177  }
   178  
   179  // checks use of binary blocks format
   180  func (b testBody) checkBinarySparseVol(t *testing.T, r io.Reader) {
   181  	binBlocks, err := labels.ReceiveBinaryBlocks(r)
   182  	if err != nil {
   183  		_, fn, line, _ := runtime.Caller(1)
   184  		t.Fatalf("Error trying to decode binary blocks for body %d [%s:%d]: %v\n", b.label, fn, line, err)
   185  	}
   186  
   187  	expected := newTestVolume(128, 128, 128)
   188  	expected.addBody(b, 1)
   189  
   190  	got := newTestVolume(128, 128, 128)
   191  	got.addBlocks(t, binBlocks, 1)
   192  
   193  	if err := expected.equals(got); err != nil {
   194  		_, fn, line, _ := runtime.Caller(1)
   195  		t.Fatalf("error getting binary blocks for body %d [%s:%d]: %v\n", b.label, fn, line, err)
   196  	}
   197  }
   198  
   199  // checks use of binary blocks format + scaling
   200  func (b testBody) checkScaledBinarySparseVol(t *testing.T, r io.Reader, scale uint8) {
   201  	binBlocks, err := labels.ReceiveBinaryBlocks(r)
   202  	if err != nil {
   203  		t.Fatalf("Error trying to decode binary blocks for body %d: %v\n", b.label, err)
   204  	}
   205  
   206  	expected := newTestVolume(128, 128, 128)
   207  	expected.addBody(b, 1)
   208  	expected.downres(scale)
   209  
   210  	n := int32(128 >> scale)
   211  	got := newTestVolume(n, n, n)
   212  	got.addBlocks(t, binBlocks, 1)
   213  
   214  	if err := expected.equals(got); err != nil {
   215  		_, fn, line, _ := runtime.Caller(1)
   216  		t.Fatalf("error getting binary blocks for body %d, scale %d [%s:%d]: %v\n", b.label, scale, fn, line, err)
   217  	}
   218  }
   219  
   220  // Sees if the given block span has any of this test body label in it.
   221  func (b testBody) isDeleted(t *testing.T, encoding []byte, bspan dvid.Span) bool {
   222  	// Get to the  # spans and RLE in encoding
   223  	spansEncoding := encoding[8:]
   224  	var spans dvid.Spans
   225  	if err := spans.UnmarshalBinary(spansEncoding); err != nil {
   226  		t.Fatalf("Error in decoding sparse volume: %v\n", err)
   227  		return false
   228  	}
   229  
   230  	// Iterate true spans to see if any are in the blocks given.
   231  	for _, span := range spans {
   232  		bx0 := span[2] / 32
   233  		bx1 := span[3] / 32
   234  		by := span[1] / 32
   235  		bz := span[0] / 32
   236  
   237  		within_x := (bx0 >= bspan[2] && bx0 <= bspan[3]) || (bx1 >= bspan[2] && bx1 <= bspan[3])
   238  		if bz == bspan[0] && by == bspan[1] && within_x {
   239  			return false
   240  		}
   241  	}
   242  	return true
   243  }
   244  
   245  func checkSpans(t *testing.T, encoding []byte, minx, maxx int32) {
   246  	// Get to the  # spans and RLE in encoding
   247  	spansEncoding := encoding[8:]
   248  	var spans dvid.Spans
   249  	if err := spans.UnmarshalBinary(spansEncoding); err != nil {
   250  		t.Errorf("Error in decoding coarse sparse volume: %v\n", err)
   251  		return
   252  	}
   253  	for _, span := range spans {
   254  		if span[2] < minx {
   255  			t.Errorf("Found span violating min x %d: %s\n", minx, span)
   256  			return
   257  		}
   258  		if span[3] > maxx {
   259  			t.Errorf("Found span violating max x %d: %s\n", maxx, span)
   260  		}
   261  	}
   262  }
   263  
   264  // Sets voxels in body to given label.
   265  func (v *testVolume) addBody(body testBody, label uint64) {
   266  	nx := v.size[0]
   267  	nxy := nx * v.size[1]
   268  	for _, span := range body.voxelSpans {
   269  		z, y, x0, x1 := span.Unpack()
   270  		p := (z*nxy + y*nx) * 8
   271  		for i := p + x0*8; i <= p+x1*8; i += 8 {
   272  			binary.LittleEndian.PutUint64(v.data[i:i+8], label)
   273  		}
   274  	}
   275  }
   276  
   277  // Returns true if all voxels in test volume for given body has label.
   278  func (v *testVolume) isLabel(label uint64, body *testBody) bool {
   279  	nx := v.size[0]
   280  	nxy := nx * v.size[1]
   281  	for _, span := range body.voxelSpans {
   282  		z, y, x0, x1 := span.Unpack()
   283  		p := (z*nxy + y*nx) * 8
   284  		for i := p + x0*8; i <= p+x1*8; i += 8 {
   285  			curLabel := binary.LittleEndian.Uint64(v.data[i : i+8])
   286  			if curLabel != label {
   287  				return false
   288  			}
   289  		}
   290  	}
   291  	return true
   292  }
   293  
   294  // Returns true if any voxel in test volume has given label.
   295  func (v *testVolume) hasLabel(label uint64, body *testBody) bool {
   296  	nx := v.size[0]
   297  	nxy := nx * v.size[1]
   298  	for _, span := range body.voxelSpans {
   299  		z, y, x0, x1 := span.Unpack()
   300  		p := (z*nxy + y*nx) * 8
   301  		for i := p + x0*8; i <= p+x1*8; i += 8 {
   302  			curLabel := binary.LittleEndian.Uint64(v.data[i : i+8])
   303  			if curLabel == label {
   304  				return true
   305  			}
   306  		}
   307  	}
   308  	return false
   309  }
   310  
   311  func createLabelTestVolume(t *testing.T, uuid dvid.UUID, name string) *testVolume {
   312  	// Setup test label blocks that are non-intersecting.
   313  	volume := newTestVolume(128, 128, 128)
   314  	volume.addBody(body1, 1)
   315  	volume.addBody(body2, 2)
   316  	volume.addBody(body3, 3)
   317  	volume.addBody(body4, 4)
   318  
   319  	// Send data over HTTP to populate a data instance
   320  	volume.put(t, uuid, name)
   321  	return volume
   322  }
   323  
   324  func createLabelTest2Volume(t *testing.T, uuid dvid.UUID, name string) *testVolume {
   325  	// Setup test label blocks that are non-intersecting.
   326  	volume := newTestVolume(128, 128, 128)
   327  	volume.addBody(body6, 6)
   328  	volume.addBody(body7, 7)
   329  
   330  	// Send data over HTTP to populate a data instance using mutable flag
   331  	volume.putMutable(t, uuid, name)
   332  	return volume
   333  }
   334  
   335  func TestSparseVolumes(t *testing.T) {
   336  	if err := server.OpenTest(); err != nil {
   337  		t.Fatalf("can't open test server: %v\n", err)
   338  	}
   339  	defer server.CloseTest()
   340  
   341  	// Create testbed volume and data instances
   342  	uuid, _ := initTestRepo()
   343  	var config dvid.Config
   344  	config.Set("MaxDownresLevel", "2")
   345  	config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks
   346  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
   347  	labelVol := createLabelTestVolume(t, uuid, "labels")
   348  
   349  	gotVol := newTestVolume(128, 128, 128)
   350  	gotVol.get(t, uuid, "labels")
   351  	if err := gotVol.equals(labelVol); err != nil {
   352  		t.Fatalf("Couldn't get back simple 128x128x128 label volume that was written: %v\n", err)
   353  	}
   354  
   355  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   356  		t.Fatalf("Error blocking on labels updating: %v\n", err)
   357  	}
   358  	if err := downres.BlockOnUpdating(uuid, "labels"); err != nil {
   359  		t.Fatalf("Error blocking on update for labels: %v\n", err)
   360  	}
   361  	time.Sleep(1 * time.Second)
   362  
   363  	dataservice, err := datastore.GetDataByUUIDName(uuid, "labels")
   364  	if err != nil {
   365  		t.Fatalf("couldn't get labels data instance from datastore: %v\n", err)
   366  	}
   367  	labels, ok := dataservice.(*Data)
   368  	if !ok {
   369  		t.Fatalf("Returned data instance for 'labels' instance was not labelarray.Data!\n")
   370  	}
   371  	if labels.MaxRepoLabel != 4 {
   372  		t.Errorf("Expected max repo label to be 4, got %d\n", labels.MaxRepoLabel)
   373  	}
   374  	v, err := datastore.VersionFromUUID(uuid)
   375  	if err != nil {
   376  		t.Errorf("couldn't get version id from uuid %s: %v\n", uuid, err)
   377  	}
   378  	if len(labels.MaxLabel) != 1 || labels.MaxLabel[v] != 4 {
   379  		t.Errorf("bad MaxLabels: %v\n", labels.MaxLabel)
   380  	}
   381  	maxLabelResp := server.TestHTTP(t, "GET", fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid), nil)
   382  	if string(maxLabelResp) != `{"maxlabel": 4}` {
   383  		t.Errorf("bad response to maxlabel endpoint: %s\n", string(maxLabelResp))
   384  	}
   385  
   386  	badReqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/0", server.WebAPIPath, uuid)
   387  	server.TestBadHTTP(t, "GET", badReqStr, nil)
   388  
   389  	for _, label := range []uint64{1, 2, 3, 4} {
   390  		// Get the coarse sparse volumes for each label and make sure they are correct.
   391  		reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol-coarse/%d", server.WebAPIPath, uuid, label)
   392  		encoding := server.TestHTTP(t, "GET", reqStr, nil)
   393  		bodies[label-1].checkCoarse(t, encoding)
   394  	}
   395  
   396  	reqStr := fmt.Sprintf("%snode/%s/labels/sparsevols-coarse/1/3", server.WebAPIPath, uuid)
   397  	encoding := server.TestHTTP(t, "GET", reqStr, nil)
   398  	checkSparsevolsCoarse(t, encoding)
   399  
   400  	for _, label := range []uint64{1, 2, 3, 4} {
   401  		// Check fast HEAD requests
   402  		reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label)
   403  		resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil)
   404  		if resp.Code != http.StatusOK {
   405  			t.Errorf("HEAD on %s did not return OK.  Status = %d\n", reqStr, resp.Code)
   406  		}
   407  
   408  		// Check full sparse volumes
   409  		encoding = server.TestHTTP(t, "GET", reqStr, nil)
   410  		lenEncoding := len(encoding)
   411  		bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{})
   412  
   413  		// check one downres
   414  		encoding = server.TestHTTP(t, "GET", reqStr+"?scale=1", nil)
   415  		bodies[label-1].checkScaledSparseVol(t, encoding, 1, dvid.OptionalBounds{})
   416  
   417  		// check two downres
   418  		encoding = server.TestHTTP(t, "GET", reqStr+"?scale=2", nil)
   419  		bodies[label-1].checkScaledSparseVol(t, encoding, 2, dvid.OptionalBounds{})
   420  
   421  		// Check with lz4 compression
   422  		uncompressed := make([]byte, lenEncoding)
   423  		compressed := server.TestHTTP(t, "GET", reqStr+"?compression=lz4", nil)
   424  		if err := lz4.Uncompress(compressed, uncompressed); err != nil {
   425  			t.Fatalf("error uncompressing lz4 for sparsevol %d GET: %v\n", label, err)
   426  		}
   427  		bodies[label-1].checkSparseVol(t, uncompressed, dvid.OptionalBounds{})
   428  
   429  		// Check with gzip compression
   430  		compressed = server.TestHTTP(t, "GET", reqStr+"?compression=gzip", nil)
   431  		b := bytes.NewBuffer(compressed)
   432  		var err error
   433  		r, err := gzip.NewReader(b)
   434  		if err != nil {
   435  			t.Fatalf("error creating gzip reader: %v\n", err)
   436  		}
   437  		var buffer bytes.Buffer
   438  		_, err = io.Copy(&buffer, r)
   439  		if err != nil {
   440  			t.Fatalf("error copying gzip data: %v\n", err)
   441  		}
   442  		err = r.Close()
   443  		if err != nil {
   444  			t.Fatalf("error closing gzip: %v\n", err)
   445  		}
   446  		encoding = buffer.Bytes()
   447  		bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{})
   448  
   449  		// // check sparse vol + scaling using binary blocks compression
   450  		// reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?format=blocks", server.WebAPIPath, uuid, label)
   451  		// resp = server.TestHTTPResponse(t, "GET", reqStr, nil)
   452  		// bodies[label-1].checkBinarySparseVol(t, resp.Body)
   453  
   454  		// resp = server.TestHTTPResponse(t, "GET", reqStr+"?scale=1", nil)
   455  		// bodies[label-1].checkScaledBinarySparseVol(t, resp.Body, 1)
   456  
   457  		// resp = server.TestHTTPResponse(t, "GET", reqStr+"?scale=2", nil)
   458  		// bodies[label-1].checkScaledBinarySparseVol(t, resp.Body, 2)
   459  
   460  		// Check Y/Z restriction
   461  		reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?miny=30&maxy=50&minz=20&maxz=40", server.WebAPIPath, uuid, label)
   462  		if label != 4 {
   463  			encoding = server.TestHTTP(t, "GET", reqStr, nil)
   464  			var bound dvid.OptionalBounds
   465  			bound.SetMinY(30)
   466  			bound.SetMaxY(50)
   467  			bound.SetMinZ(20)
   468  			bound.SetMaxZ(40)
   469  			bodies[label-1].checkSparseVol(t, encoding, bound)
   470  		} else {
   471  			server.TestBadHTTP(t, "GET", reqStr, nil) // Should be not found
   472  		}
   473  
   474  		// Check X restriction
   475  		minx := int32(20)
   476  		maxx := int32(47)
   477  		reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?minx=%d&maxx=%d", server.WebAPIPath, uuid, label, minx, maxx)
   478  		if label != 4 {
   479  			encoding = server.TestHTTP(t, "GET", reqStr, nil)
   480  			checkSpans(t, encoding, minx, maxx)
   481  		} else {
   482  			server.TestBadHTTP(t, "GET", reqStr, nil) // Should be not found
   483  		}
   484  	}
   485  
   486  	reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol-size/1", server.WebAPIPath, uuid)
   487  	sizeResp := server.TestHTTP(t, "GET", reqStr, nil)
   488  	if string(sizeResp) != `{"numblocks": 3, "minvoxel": [0, 32, 0], "maxvoxel": [31, 63, 95]}` {
   489  		t.Errorf("bad response to sparsevol-size endpoint: %s\n", string(sizeResp))
   490  	}
   491  
   492  	// Make sure non-existent bodies return proper HEAD responses.
   493  	headReq := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 10)
   494  	resp := server.TestHTTPResponse(t, "HEAD", headReq, nil)
   495  	if resp.Code != http.StatusNoContent {
   496  		t.Errorf("HEAD on %s did not return 204 (No Content).  Status = %d\n", headReq, resp.Code)
   497  	}
   498  }
   499  
   500  func Test16x16x16SparseVolumes(t *testing.T) {
   501  	if err := server.OpenTest(); err != nil {
   502  		t.Fatalf("can't open test server: %v\n", err)
   503  	}
   504  	defer server.CloseTest()
   505  
   506  	// Create testbed volume and data instances
   507  	uuid, _ := initTestRepo()
   508  	var config dvid.Config
   509  	config.Set("BlockSize", "16,16,16") // Since RLE encoding spans blocks now, should work for smaller block size.
   510  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
   511  	labelVol := createLabelTestVolume(t, uuid, "labels")
   512  
   513  	gotVol := newTestVolume(128, 128, 128)
   514  	gotVol.get(t, uuid, "labels")
   515  	if err := gotVol.equals(labelVol); err != nil {
   516  		t.Fatalf("Couldn't get back simple 128x128x128 label volume that was written: %v\n", err)
   517  	}
   518  
   519  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   520  		t.Fatalf("Error blocking on labels updating: %v\n", err)
   521  	}
   522  	time.Sleep(1 * time.Second)
   523  
   524  	for _, label := range []uint64{1, 2, 3, 4} {
   525  		// Check fast HEAD requests
   526  		reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label)
   527  		resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil)
   528  		if resp.Code != http.StatusOK {
   529  			t.Errorf("HEAD on %s did not return OK.  Status = %d\n", reqStr, resp.Code)
   530  		}
   531  
   532  		// Check full sparse volumes
   533  		encoding := server.TestHTTP(t, "GET", reqStr, nil)
   534  		fmt.Printf("Got %d bytes back from %s\n", len(encoding), reqStr)
   535  		bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{})
   536  
   537  		// Check with lz4 compression
   538  		compressed := server.TestHTTP(t, "GET", reqStr+"?compression=lz4", nil)
   539  		if err := lz4.Uncompress(compressed, encoding); err != nil {
   540  			t.Fatalf("error uncompressing lz4: %v\n", err)
   541  		}
   542  		bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{})
   543  
   544  		// Check with gzip compression
   545  		compressed = server.TestHTTP(t, "GET", reqStr+"?compression=gzip", nil)
   546  		b := bytes.NewBuffer(compressed)
   547  		var err error
   548  		r, err := gzip.NewReader(b)
   549  		if err != nil {
   550  			t.Fatalf("error creating gzip reader: %v\n", err)
   551  		}
   552  		var buffer bytes.Buffer
   553  		_, err = io.Copy(&buffer, r)
   554  		if err != nil {
   555  			t.Fatalf("error copying gzip data: %v\n", err)
   556  		}
   557  		err = r.Close()
   558  		if err != nil {
   559  			t.Fatalf("error closing gzip: %v\n", err)
   560  		}
   561  		encoding = buffer.Bytes()
   562  		bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{})
   563  
   564  		// Check Y/Z restriction
   565  		reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?miny=30&maxy=50&minz=20&maxz=40", server.WebAPIPath, uuid, label)
   566  		if label != 4 {
   567  			encoding = server.TestHTTP(t, "GET", reqStr, nil)
   568  			var bound dvid.OptionalBounds
   569  			bound.SetMinY(30)
   570  			bound.SetMaxY(50)
   571  			bound.SetMinZ(20)
   572  			bound.SetMaxZ(40)
   573  			bodies[label-1].checkSparseVol(t, encoding, bound)
   574  		} else {
   575  			server.TestBadHTTP(t, "GET", reqStr, nil) // Should be not found
   576  		}
   577  
   578  		// Check X restriction
   579  		minx := int32(20)
   580  		maxx := int32(47)
   581  		reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?minx=%d&maxx=%d", server.WebAPIPath, uuid, label, minx, maxx)
   582  		if label != 4 {
   583  			encoding = server.TestHTTP(t, "GET", reqStr, nil)
   584  			checkSpans(t, encoding, minx, maxx)
   585  		} else {
   586  			server.TestBadHTTP(t, "GET", reqStr, nil) // Should be not found
   587  		}
   588  	}
   589  
   590  	// Make sure non-existent bodies return proper HEAD responses.
   591  	headReq := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 10)
   592  	resp := server.TestHTTPResponse(t, "HEAD", headReq, nil)
   593  	if resp.Code != http.StatusNoContent {
   594  		t.Errorf("HEAD on %s did not return 204 (No Content).  Status = %d\n", headReq, resp.Code)
   595  	}
   596  }
   597  
   598  func TestMergeLabels(t *testing.T) {
   599  	if err := server.OpenTest(); err != nil {
   600  		t.Fatalf("can't open test server: %v\n", err)
   601  	}
   602  	defer server.CloseTest()
   603  
   604  	// Create testbed volume and data instances
   605  	uuid, _ := initTestRepo()
   606  	var config dvid.Config
   607  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
   608  
   609  	expected := createLabelTestVolume(t, uuid, "labels")
   610  	expected.addBody(body3, 2)
   611  
   612  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   613  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
   614  	}
   615  
   616  	// Make sure max label is consistent
   617  	reqStr := fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid)
   618  	r := server.TestHTTP(t, "GET", reqStr, nil)
   619  	jsonVal := make(map[string]uint64)
   620  	if err := json.Unmarshal(r, &jsonVal); err != nil {
   621  		t.Errorf("Unable to get maxlabel from server.  Instead got: %v\n", jsonVal)
   622  	}
   623  	maxlabel, ok := jsonVal["maxlabel"]
   624  	if !ok {
   625  		t.Errorf("The maxlabel query did not yield max label.  Instead got: %v\n", jsonVal)
   626  	}
   627  	if maxlabel != 4 {
   628  		t.Errorf("Expected max label to be 4, instead got %d\n", maxlabel)
   629  	}
   630  
   631  	// Test merge of 3 into 2
   632  	testMerge := mergeJSON(`[2, 3]`)
   633  	testMerge.send(t, uuid, "labels")
   634  
   635  	// Make sure label 3 sparsevol has been removed.
   636  	reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 3)
   637  	server.TestBadHTTP(t, "GET", reqStr, nil)
   638  
   639  	// Make sure label changes are correct after completion
   640  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   641  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
   642  	}
   643  
   644  	retrieved := newTestVolume(128, 128, 128)
   645  	retrieved.get(t, uuid, "labels")
   646  	if len(retrieved.data) != 8*128*128*128 {
   647  		t.Errorf("Retrieved labelvol volume is incorrect size\n")
   648  	}
   649  	if !retrieved.isLabel(2, &body2) {
   650  		t.Errorf("Expected label 2 original voxels to remain.  Instead some were removed.\n")
   651  	}
   652  	if retrieved.hasLabel(3, &body3) {
   653  		t.Errorf("Found label 3 when all label 3 should have been merged into label 2!\n")
   654  	}
   655  	if !retrieved.isLabel(2, &body3) {
   656  		t.Errorf("Incomplete merging.  Label 2 should have taken over full extent of label 3\n")
   657  	}
   658  	if err := retrieved.equals(expected); err != nil {
   659  		t.Errorf("Merged label volume: %v\n", err)
   660  	}
   661  }
   662  
   663  func TestSplitCoarseLabel(t *testing.T) {
   664  	if err := server.OpenTest(); err != nil {
   665  		t.Fatalf("can't open test server: %v\n", err)
   666  	}
   667  	defer server.CloseTest()
   668  
   669  	// Create testbed volume and data instances
   670  	uuid, _ := initTestRepo()
   671  	var config dvid.Config
   672  	config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks
   673  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
   674  
   675  	// Post label volume and setup expected volume after split of block coords (2, 1, 1) and (2, 1, 2)
   676  	expected := createLabelTestVolume(t, uuid, "labels")
   677  	fromLabel := uint64(4)
   678  	toLabel := uint64(5)
   679  	nx := expected.size[0]
   680  	nxy := nx * expected.size[1]
   681  	var x, y, z int32
   682  	for z = 0; z < 128; z++ {
   683  		bz := z / 32
   684  		if bz != 1 && bz != 2 {
   685  			continue
   686  		}
   687  		for y = 0; y < 128; y++ {
   688  			by := y / 32
   689  			if by != 1 {
   690  				continue
   691  			}
   692  			for x = 0; x < 128; x++ {
   693  				bx := x / 32
   694  				if (bz == 1 && bx == 2) || (bz == 2 && bx == 2) {
   695  					i := (z*nxy + y*nx + x) * 8
   696  					label := binary.LittleEndian.Uint64(expected.data[i : i+8])
   697  					if label == fromLabel {
   698  						binary.LittleEndian.PutUint64(expected.data[i:i+8], toLabel)
   699  					}
   700  				}
   701  			}
   702  		}
   703  	}
   704  
   705  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   706  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
   707  	}
   708  
   709  	// Make sure sparsevol for original body 4 is correct
   710  	reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 4)
   711  	encoding := server.TestHTTP(t, "GET", reqStr, nil)
   712  	fmt.Printf("Checking original body 4 is correct\n")
   713  	body4.checkSparseVol(t, encoding, dvid.OptionalBounds{})
   714  
   715  	// Create the encoding for split area in block coordinates.
   716  	rles := dvid.RLEs{
   717  		dvid.NewRLE(dvid.Point3d{2, 1, 1}, 1),
   718  		dvid.NewRLE(dvid.Point3d{2, 1, 2}, 1),
   719  	}
   720  	buf := new(bytes.Buffer)
   721  	buf.WriteByte(dvid.EncodingBinary)
   722  	binary.Write(buf, binary.LittleEndian, uint8(3))  // # of dimensions
   723  	binary.Write(buf, binary.LittleEndian, byte(0))   // dimension of run (X = 0)
   724  	buf.WriteByte(byte(0))                            // reserved for later
   725  	binary.Write(buf, binary.LittleEndian, uint32(0)) // Placeholder for # voxels
   726  	binary.Write(buf, binary.LittleEndian, uint32(2)) // Placeholder for # spans
   727  	rleBytes, err := rles.MarshalBinary()
   728  	if err != nil {
   729  		t.Errorf("Unable to serialize RLEs: %v\n", err)
   730  	}
   731  	buf.Write(rleBytes)
   732  
   733  	// Submit the coarse split
   734  	reqStr = fmt.Sprintf("%snode/%s/labels/split-coarse/%d", server.WebAPIPath, uuid, 4)
   735  	r := server.TestHTTP(t, "POST", reqStr, buf)
   736  	jsonVal := make(map[string]uint64)
   737  	if err := json.Unmarshal(r, &jsonVal); err != nil {
   738  		t.Errorf("Unable to get new label from split.  Instead got: %v\n", jsonVal)
   739  	}
   740  	newlabel, ok := jsonVal["label"]
   741  	if !ok {
   742  		t.Errorf("The split request did not yield label value.  Instead got: %v\n", jsonVal)
   743  	}
   744  	if newlabel != 5 {
   745  		t.Errorf("Expected split label to be 5, instead got %d\n", newlabel)
   746  	}
   747  
   748  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   749  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
   750  	}
   751  	maxLabelResp := server.TestHTTP(t, "GET", fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid), nil)
   752  	if string(maxLabelResp) != `{"maxlabel": 5}` {
   753  		t.Errorf("bad response to maxlabel endpoint: %s\n", string(maxLabelResp))
   754  	}
   755  
   756  	// Make sure labels are correct
   757  	retrieved := newTestVolume(128, 128, 128)
   758  	retrieved.get(t, uuid, "labels")
   759  	if len(retrieved.data) != 8*128*128*128 {
   760  		t.Errorf("Retrieved post-split volume is incorrect size\n")
   761  	}
   762  	if err := retrieved.equals(expected); err != nil {
   763  		t.Errorf("Split label volume not equal to expected volume: %v\n", err)
   764  	}
   765  
   766  	// make sure the sparse volume for new label is correct
   767  	reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol-coarse/%d", server.WebAPIPath, uuid, toLabel)
   768  	encoding = server.TestHTTP(t, "GET", reqStr, nil)
   769  	if len(encoding) != len(rleBytes)+12 {
   770  		t.Errorf("expected %d bytes from GET /sparsevol-coarse, got %d bytes\n", len(rleBytes)+12, len(encoding))
   771  	}
   772  	if len(encoding) < 12 {
   773  		t.Fatalf("bad sparsevol-coarse encoding.  Expected at least 12 bytes, got %d\n", len(encoding))
   774  	}
   775  	numSpans := binary.LittleEndian.Uint32(encoding[8:12])
   776  	if numSpans != 2 {
   777  		t.Errorf("Expected 2 blocks, got %d blocks after split coarse.\n", numSpans)
   778  	}
   779  	coarseRLEs := new(dvid.RLEs)
   780  	if err := coarseRLEs.UnmarshalBinary(encoding[12:]); err != nil {
   781  		t.Fatalf("error unmarshaling coarse sparsevolume: %v\n", err)
   782  	}
   783  	if len(*coarseRLEs) != 2 {
   784  		t.Fatalf("expected 2 blocks in sparsevol after split, got: %v\n", *coarseRLEs)
   785  	}
   786  	expectedRLEs := dvid.RLEs{dvid.NewRLE(dvid.Point3d{2, 1, 1}, 1), dvid.NewRLE(dvid.Point3d{2, 1, 2}, 1)}
   787  	for i, rle := range *coarseRLEs {
   788  		if !rle.StartPt().Equals(expectedRLEs[i].StartPt()) {
   789  			t.Errorf("Bad block %d: expected %s, got %s\n", i, expectedRLEs[i], rle)
   790  		}
   791  	}
   792  }
   793  
   794  func TestSplitCoarseGivenLabel(t *testing.T) {
   795  	if err := server.OpenTest(); err != nil {
   796  		t.Fatalf("can't open test server: %v\n", err)
   797  	}
   798  	defer server.CloseTest()
   799  
   800  	// Create testbed volume and data instances
   801  	uuid, _ := initTestRepo()
   802  	var config dvid.Config
   803  	config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks
   804  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
   805  
   806  	// Post label volume and setup expected volume after split of block coords (2, 1, 1) and (3, 1, 2)
   807  	expected := createLabelTestVolume(t, uuid, "labels")
   808  	fromLabel := uint64(4)
   809  	toLabel := uint64(8127)
   810  	nx := expected.size[0]
   811  	nxy := nx * expected.size[1]
   812  	var x, y, z int32
   813  	for z = 0; z < 128; z++ {
   814  		bz := z / 32
   815  		if bz != 1 && bz != 2 {
   816  			continue
   817  		}
   818  		for y = 0; y < 128; y++ {
   819  			by := y / 32
   820  			if by != 1 {
   821  				continue
   822  			}
   823  			for x = 0; x < 128; x++ {
   824  				bx := x / 32
   825  				if (bz == 1 && bx == 2) || (bz == 2 && bx == 2) {
   826  					i := (z*nxy + y*nx + x) * 8
   827  					label := binary.LittleEndian.Uint64(expected.data[i : i+8])
   828  					if label == fromLabel {
   829  						binary.LittleEndian.PutUint64(expected.data[i:i+8], toLabel)
   830  					}
   831  				}
   832  			}
   833  		}
   834  	}
   835  
   836  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   837  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
   838  	}
   839  
   840  	// Create the encoding for split area in block coordinates.
   841  	rles := dvid.RLEs{
   842  		dvid.NewRLE(dvid.Point3d{2, 1, 1}, 1),
   843  		dvid.NewRLE(dvid.Point3d{2, 1, 2}, 1),
   844  	}
   845  	buf := new(bytes.Buffer)
   846  	buf.WriteByte(dvid.EncodingBinary)
   847  	binary.Write(buf, binary.LittleEndian, uint8(3))  // # of dimensions
   848  	binary.Write(buf, binary.LittleEndian, byte(0))   // dimension of run (X = 0)
   849  	buf.WriteByte(byte(0))                            // reserved for later
   850  	binary.Write(buf, binary.LittleEndian, uint32(0)) // Placeholder for # voxels
   851  	binary.Write(buf, binary.LittleEndian, uint32(2)) // Placeholder for # spans
   852  	rleBytes, err := rles.MarshalBinary()
   853  	if err != nil {
   854  		t.Errorf("Unable to serialize RLEs: %v\n", err)
   855  	}
   856  	buf.Write(rleBytes)
   857  
   858  	// Submit the coarse split
   859  	reqStr := fmt.Sprintf("%snode/%s/labels/split-coarse/%d?splitlabel=8127", server.WebAPIPath, uuid, 4)
   860  	r := server.TestHTTP(t, "POST", reqStr, buf)
   861  	jsonVal := make(map[string]uint64)
   862  	if err := json.Unmarshal(r, &jsonVal); err != nil {
   863  		t.Errorf("Unable to get new label from split.  Instead got: %v\n", jsonVal)
   864  	}
   865  	newlabel, ok := jsonVal["label"]
   866  	if !ok {
   867  		t.Errorf("The split request did not yield label value.  Instead got: %v\n", jsonVal)
   868  	}
   869  	if newlabel != 8127 {
   870  		t.Errorf("Expected split label to be 8127, instead got %d\n", newlabel)
   871  	}
   872  
   873  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   874  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
   875  	}
   876  
   877  	maxLabelResp := server.TestHTTP(t, "GET", fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid), nil)
   878  	if string(maxLabelResp) != `{"maxlabel": 8127}` {
   879  		t.Errorf("bad response to maxlabel endpoint: %s\n", string(maxLabelResp))
   880  	}
   881  
   882  	// Make sure labels are correct
   883  	retrieved := newTestVolume(128, 128, 128)
   884  	retrieved.get(t, uuid, "labels")
   885  	if len(retrieved.data) != 8*128*128*128 {
   886  		t.Errorf("Retrieved post-split volume is incorrect size\n")
   887  	}
   888  	if err := retrieved.equals(expected); err != nil {
   889  		t.Errorf("Split label volume not equal to expected volume: %v\n", err)
   890  	}
   891  
   892  	// make sure the sparse volume for new label is correct
   893  	reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol-coarse/%d", server.WebAPIPath, uuid, toLabel)
   894  	encoding := server.TestHTTP(t, "GET", reqStr, nil)
   895  	if len(encoding) != len(rleBytes)+12 {
   896  		t.Errorf("expected %d bytes from GET /sparsevol-coarse, got %d bytes\n", len(rleBytes)+12, len(encoding))
   897  	}
   898  	if len(encoding) < 12 {
   899  		t.Fatalf("bad sparsevol-coarse encoding.  Expected at least 12 bytes, got %d\n", len(encoding))
   900  	}
   901  	numSpans := binary.LittleEndian.Uint32(encoding[8:12])
   902  	if numSpans != 2 {
   903  		t.Errorf("Expected 2 blocks, got %d blocks after split coarse.\n", numSpans)
   904  	}
   905  	coarseRLEs := new(dvid.RLEs)
   906  	if err := coarseRLEs.UnmarshalBinary(encoding[12:]); err != nil {
   907  		t.Fatalf("error unmarshaling coarse sparsevolume: %v\n", err)
   908  	}
   909  	if len(*coarseRLEs) != 2 {
   910  		t.Fatalf("expected 2 blocks in sparsevol after split, got: %v\n", *coarseRLEs)
   911  	}
   912  	expectedRLEs := dvid.RLEs{dvid.NewRLE(dvid.Point3d{2, 1, 1}, 1), dvid.NewRLE(dvid.Point3d{2, 1, 2}, 1)}
   913  	for i, rle := range *coarseRLEs {
   914  		if !rle.StartPt().Equals(expectedRLEs[i].StartPt()) {
   915  			t.Errorf("Bad block %d: expected %s, got %s\n", i, expectedRLEs[i], rle)
   916  		}
   917  	}
   918  }
   919  
   920  func TestSplitLabel(t *testing.T) {
   921  	if err := server.OpenTest(); err != nil {
   922  		t.Fatalf("can't open test server: %v\n", err)
   923  	}
   924  	defer server.CloseTest()
   925  
   926  	// Create testbed volume and data instances
   927  	uuid, _ := initTestRepo()
   928  	var config dvid.Config
   929  	config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks
   930  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
   931  
   932  	// Post label volume and setup expected volume after split.
   933  	expected := createLabelTestVolume(t, uuid, "labels")
   934  	expected.addBody(bodysplit, 5)
   935  
   936  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   937  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
   938  	}
   939  
   940  	// Make sure sparsevol for original body 4 is correct
   941  	reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 4)
   942  	encoding := server.TestHTTP(t, "GET", reqStr, nil)
   943  	fmt.Printf("Checking original body 4 is correct\n")
   944  	body4.checkSparseVol(t, encoding, dvid.OptionalBounds{})
   945  
   946  	// Create the sparsevol encoding for split area
   947  	numspans := len(bodysplit.voxelSpans)
   948  	rles := make(dvid.RLEs, numspans, numspans)
   949  	for i, span := range bodysplit.voxelSpans {
   950  		start := dvid.Point3d{span[2], span[1], span[0]}
   951  		length := span[3] - span[2] + 1
   952  		rles[i] = dvid.NewRLE(start, length)
   953  	}
   954  
   955  	// Create the split sparse volume binary
   956  	buf := new(bytes.Buffer)
   957  	buf.WriteByte(dvid.EncodingBinary)
   958  	binary.Write(buf, binary.LittleEndian, uint8(3))         // # of dimensions
   959  	binary.Write(buf, binary.LittleEndian, byte(0))          // dimension of run (X = 0)
   960  	buf.WriteByte(byte(0))                                   // reserved for later
   961  	binary.Write(buf, binary.LittleEndian, uint32(0))        // Placeholder for # voxels
   962  	binary.Write(buf, binary.LittleEndian, uint32(numspans)) // Placeholder for # spans
   963  	rleBytes, err := rles.MarshalBinary()
   964  	if err != nil {
   965  		t.Errorf("Unable to serialize RLEs: %v\n", err)
   966  	}
   967  	buf.Write(rleBytes)
   968  
   969  	// Verify the max label is 4
   970  	reqStr = fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid)
   971  	jsonStr := server.TestHTTP(t, "GET", reqStr, nil)
   972  	expectedJSON := `{"maxlabel": 4}`
   973  	if string(jsonStr) != expectedJSON {
   974  		t.Errorf("Expected this JSON returned from maxlabel:\n%s\nGot:\n%s\n", expectedJSON, string(jsonStr))
   975  	}
   976  
   977  	// Submit the split sparsevol for body 4 using RLES "bodysplit"
   978  	reqStr = fmt.Sprintf("%snode/%s/labels/split/%d", server.WebAPIPath, uuid, 4)
   979  	r := server.TestHTTP(t, "POST", reqStr, buf)
   980  	jsonVal := make(map[string]uint64)
   981  	if err := json.Unmarshal(r, &jsonVal); err != nil {
   982  		t.Errorf("Unable to get new label from split.  Instead got: %v\n", jsonVal)
   983  	}
   984  	newlabel, ok := jsonVal["label"]
   985  	if !ok {
   986  		t.Errorf("The split request did not yield label value.  Instead got: %v\n", jsonVal)
   987  	}
   988  	if newlabel != 5 {
   989  		t.Errorf("Expected split label to be 5, instead got %d\n", newlabel)
   990  	}
   991  
   992  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
   993  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
   994  	}
   995  
   996  	retrieved := newTestVolume(128, 128, 128)
   997  	retrieved.get(t, uuid, "labels")
   998  	if len(retrieved.data) != 8*128*128*128 {
   999  		t.Errorf("Retrieved post-split volume is incorrect size\n")
  1000  	}
  1001  	if err := retrieved.equals(expected); err != nil {
  1002  		t.Errorf("Split label volume not equal to expected volume: %v\n", err)
  1003  	}
  1004  
  1005  	// Check split body 5 usine legacy RLEs
  1006  	reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 5)
  1007  	encoding = server.TestHTTP(t, "GET", reqStr, nil)
  1008  	bodysplit.checkSparseVol(t, encoding, dvid.OptionalBounds{})
  1009  
  1010  	// Make sure sparsevol for original body 4 is correct
  1011  	reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 4)
  1012  	encoding = server.TestHTTP(t, "GET", reqStr, nil)
  1013  	bodyleft.checkSparseVol(t, encoding, dvid.OptionalBounds{})
  1014  
  1015  	// Do a merge of two after the split
  1016  	testMerge := mergeJSON(`[4, 5]`)
  1017  	testMerge.send(t, uuid, "labels")
  1018  
  1019  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
  1020  		t.Fatalf("Error blocking on bodies update: %v\n", err)
  1021  	}
  1022  
  1023  	// Make sure we wind up with original body 4
  1024  	reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/4", server.WebAPIPath, uuid)
  1025  	encoding = server.TestHTTP(t, "GET", reqStr, nil)
  1026  	body4.checkSparseVol(t, encoding, dvid.OptionalBounds{})
  1027  }
  1028  
  1029  // Same as TestSplitLabel but now designate the actual split label
  1030  func TestSplitGivenLabel(t *testing.T) {
  1031  	if err := server.OpenTest(); err != nil {
  1032  		t.Fatalf("can't open test server: %v\n", err)
  1033  	}
  1034  	defer server.CloseTest()
  1035  
  1036  	// Create testbed volume and data instances
  1037  	uuid, _ := initTestRepo()
  1038  	var config dvid.Config
  1039  	config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks
  1040  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
  1041  
  1042  	// Post label volume and setup expected volume after split.
  1043  	expected := createLabelTestVolume(t, uuid, "labels")
  1044  	expected.addBody(bodyleft, 4)
  1045  	expected.addBody(bodysplit, 23)
  1046  
  1047  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
  1048  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
  1049  	}
  1050  
  1051  	// Create the sparsevol encoding for split area
  1052  	numspans := len(bodysplit.voxelSpans)
  1053  	rles := make(dvid.RLEs, numspans, numspans)
  1054  	for i, span := range bodysplit.voxelSpans {
  1055  		start := dvid.Point3d{span[2], span[1], span[0]}
  1056  		length := span[3] - span[2] + 1
  1057  		rles[i] = dvid.NewRLE(start, length)
  1058  	}
  1059  
  1060  	// Create the split sparse volume binary
  1061  	buf := new(bytes.Buffer)
  1062  	buf.WriteByte(dvid.EncodingBinary)
  1063  	binary.Write(buf, binary.LittleEndian, uint8(3))         // # of dimensions
  1064  	binary.Write(buf, binary.LittleEndian, byte(0))          // dimension of run (X = 0)
  1065  	buf.WriteByte(byte(0))                                   // reserved for later
  1066  	binary.Write(buf, binary.LittleEndian, uint32(0))        // Placeholder for # voxels
  1067  	binary.Write(buf, binary.LittleEndian, uint32(numspans)) // Placeholder for # spans
  1068  	rleBytes, err := rles.MarshalBinary()
  1069  	if err != nil {
  1070  		t.Errorf("Unable to serialize RLEs: %v\n", err)
  1071  	}
  1072  	buf.Write(rleBytes)
  1073  
  1074  	// Submit the split sparsevol for body 4a
  1075  	reqStr := fmt.Sprintf("%snode/%s/labels/split/%d?splitlabel=23", server.WebAPIPath, uuid, 4)
  1076  	r := server.TestHTTP(t, "POST", reqStr, buf)
  1077  	jsonVal := make(map[string]uint64)
  1078  	if err := json.Unmarshal(r, &jsonVal); err != nil {
  1079  		t.Errorf("Unable to get new label from split.  Instead got: %v\n", jsonVal)
  1080  	}
  1081  	newlabel, ok := jsonVal["label"]
  1082  	if !ok {
  1083  		t.Errorf("The split request did not yield label value.  Instead got: %v\n", jsonVal)
  1084  	}
  1085  	if newlabel != 23 {
  1086  		t.Errorf("Expected split label to be assigned label 23, instead got %d\n", newlabel)
  1087  	}
  1088  }
  1089  
  1090  func TestMergeSplitLabel(t *testing.T) {
  1091  	if err := server.OpenTest(); err != nil {
  1092  		t.Fatalf("can't open test server: %v\n", err)
  1093  	}
  1094  	defer server.CloseTest()
  1095  
  1096  	// Create testbed volume and data instances
  1097  	uuid, _ := initTestRepo()
  1098  	var config dvid.Config
  1099  	config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks
  1100  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
  1101  
  1102  	// Post standard label 1-4 volume
  1103  	expected := createLabelTestVolume(t, uuid, "labels")
  1104  
  1105  	// Get expected volume if we add label 3 to 4.
  1106  	expected.addBody(body3, 4)
  1107  
  1108  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
  1109  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
  1110  	}
  1111  
  1112  	// Test merge of 3 into 4
  1113  	testMerge := mergeJSON(`[4, 3]`)
  1114  	testMerge.send(t, uuid, "labels")
  1115  
  1116  	// Make sure label changes are correct after completion
  1117  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
  1118  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
  1119  	}
  1120  
  1121  	// Make sure label 3 sparsevol has been removed.
  1122  	reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 3)
  1123  	server.TestBadHTTP(t, "GET", reqStr, nil)
  1124  
  1125  	retrieved := newTestVolume(128, 128, 128)
  1126  	retrieved.get(t, uuid, "labels")
  1127  	if len(retrieved.data) != 8*128*128*128 {
  1128  		t.Errorf("Retrieved labelvol volume is incorrect size\n")
  1129  	}
  1130  	if !retrieved.isLabel(2, &body2) {
  1131  		t.Errorf("Expected label 2 original voxels to remain.  Instead some were removed.\n")
  1132  	}
  1133  	if retrieved.hasLabel(3, &body3) {
  1134  		t.Errorf("Found label 3 when all label 3 should have been merged into label 4!\n")
  1135  	}
  1136  	if !retrieved.isLabel(4, &body3) {
  1137  		t.Errorf("Incomplete merging.  Label 4 should have taken over full extent of label 3\n")
  1138  	}
  1139  	if err := retrieved.equals(expected); err != nil {
  1140  		t.Errorf("Merged label volume not equal to expected merged volume: %v\n", err)
  1141  	}
  1142  
  1143  	// Create the sparsevol encoding for split area of 4
  1144  	numspans := len(bodysplit.voxelSpans)
  1145  	rles := make(dvid.RLEs, numspans, numspans)
  1146  	for i, span := range bodysplit.voxelSpans {
  1147  		start := dvid.Point3d{span[2], span[1], span[0]}
  1148  		length := span[3] - span[2] + 1
  1149  		rles[i] = dvid.NewRLE(start, length)
  1150  	}
  1151  
  1152  	// Create the split sparse volume binary
  1153  	buf := new(bytes.Buffer)
  1154  	buf.WriteByte(dvid.EncodingBinary)
  1155  	binary.Write(buf, binary.LittleEndian, uint8(3))         // # of dimensions
  1156  	binary.Write(buf, binary.LittleEndian, byte(0))          // dimension of run (X = 0)
  1157  	buf.WriteByte(byte(0))                                   // reserved for later
  1158  	binary.Write(buf, binary.LittleEndian, uint32(0))        // Placeholder for # voxels
  1159  	binary.Write(buf, binary.LittleEndian, uint32(numspans)) // Placeholder for # spans
  1160  	rleBytes, err := rles.MarshalBinary()
  1161  	if err != nil {
  1162  		t.Errorf("Unable to serialize RLEs: %v\n", err)
  1163  	}
  1164  	buf.Write(rleBytes)
  1165  
  1166  	// Verify the max label is 4
  1167  	reqStr = fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid)
  1168  	jsonStr := server.TestHTTP(t, "GET", reqStr, nil)
  1169  	expectedJSON := `{"maxlabel": 4}`
  1170  	if string(jsonStr) != expectedJSON {
  1171  		t.Errorf("Expected this JSON returned from maxlabel:\n%s\nGot:\n%s\n", expectedJSON, string(jsonStr))
  1172  	}
  1173  
  1174  	// Submit the split sparsevol for body 4a (-> 5)
  1175  	reqStr = fmt.Sprintf("%snode/%s/labels/split/4", server.WebAPIPath, uuid)
  1176  	r := server.TestHTTP(t, "POST", reqStr, buf)
  1177  	jsonVal := make(map[string]uint64)
  1178  	if err := json.Unmarshal(r, &jsonVal); err != nil {
  1179  		t.Errorf("Unable to get new label from split.  Instead got: %v\n", jsonVal)
  1180  	}
  1181  	newlabel, ok := jsonVal["label"]
  1182  	if !ok {
  1183  		t.Errorf("The split request did not yield label value.  Instead got: %v\n", jsonVal)
  1184  	}
  1185  	if newlabel != 5 {
  1186  		t.Errorf("Expected split label to be 5, instead got %d\n", newlabel)
  1187  	}
  1188  
  1189  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
  1190  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
  1191  	}
  1192  
  1193  	retrieved = newTestVolume(128, 128, 128)
  1194  	retrieved.get(t, uuid, "labels")
  1195  	if len(retrieved.data) != 8*128*128*128 {
  1196  		t.Errorf("Retrieved post-split volume is incorrect size\n")
  1197  	}
  1198  	expected.addBody(bodysplit, 5)
  1199  	if err := retrieved.equals(expected); err != nil {
  1200  		t.Errorf("Split label volume not equal to expected volume: %v\n", err)
  1201  	}
  1202  
  1203  	// Make sure new body 5 is what we sent
  1204  	reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 5)
  1205  	encoding := server.TestHTTP(t, "GET", reqStr, nil)
  1206  	bodysplit.checkSparseVol(t, encoding, dvid.OptionalBounds{})
  1207  }
  1208  
  1209  func TestMultiscaleMergeSplit(t *testing.T) {
  1210  	testConfig := server.TestConfig{CacheSize: map[string]int{"labelarray": 10}}
  1211  	// var testConfig server.TestConfig
  1212  	if err := server.OpenTest(testConfig); err != nil {
  1213  		t.Fatalf("can't open test server: %v\n", err)
  1214  	}
  1215  	defer server.CloseTest()
  1216  
  1217  	// Create testbed volume
  1218  	uuid, _ := initTestRepo()
  1219  	var config dvid.Config
  1220  	config.Set("MaxDownresLevel", "2")
  1221  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
  1222  
  1223  	// Create an easily interpreted label volume with a couple of labels.
  1224  	volume := newTestVolume(128, 128, 128)
  1225  	volume.addSubvol(dvid.Point3d{40, 40, 40}, dvid.Point3d{40, 40, 40}, 1)
  1226  	volume.addSubvol(dvid.Point3d{40, 40, 80}, dvid.Point3d{40, 40, 40}, 2)
  1227  	volume.addSubvol(dvid.Point3d{80, 40, 40}, dvid.Point3d{40, 40, 40}, 13)
  1228  	volume.addSubvol(dvid.Point3d{40, 80, 40}, dvid.Point3d{40, 40, 40}, 209)
  1229  	volume.addSubvol(dvid.Point3d{80, 80, 40}, dvid.Point3d{40, 40, 40}, 311)
  1230  	volume.put(t, uuid, "labels")
  1231  
  1232  	// Verify initial ingest for hi-res
  1233  	if err := downres.BlockOnUpdating(uuid, "labels"); err != nil {
  1234  		t.Fatalf("Error blocking on update for labels: %v\n", err)
  1235  	}
  1236  	hires := newTestVolume(128, 128, 128)
  1237  	hires.get(t, uuid, "labels")
  1238  	hires.verifyLabel(t, 1, 45, 45, 45)
  1239  	hires.verifyLabel(t, 2, 50, 50, 100)
  1240  	hires.verifyLabel(t, 13, 100, 60, 60)
  1241  	hires.verifyLabel(t, 209, 55, 100, 55)
  1242  	hires.verifyLabel(t, 311, 81, 81, 41)
  1243  
  1244  	// Check the first downres: 64^3
  1245  	downres1 := newTestVolume(64, 64, 64)
  1246  	downres1.getScale(t, uuid, "labels", 1)
  1247  	downres1.verifyLabel(t, 0, 35, 34, 2)
  1248  	downres1.verifyLabel(t, 1, 30, 30, 30)
  1249  	downres1.verifyLabel(t, 2, 21, 21, 45)
  1250  	downres1.verifyLabel(t, 13, 45, 21, 36)
  1251  	downres1.verifyLabel(t, 209, 21, 50, 35)
  1252  	downres1.verifyLabel(t, 311, 45, 55, 35)
  1253  	expected1 := newTestVolume(64, 64, 64)
  1254  	expected1.addSubvol(dvid.Point3d{20, 20, 20}, dvid.Point3d{20, 20, 20}, 1)
  1255  	expected1.addSubvol(dvid.Point3d{20, 20, 40}, dvid.Point3d{20, 20, 20}, 2)
  1256  	expected1.addSubvol(dvid.Point3d{40, 20, 20}, dvid.Point3d{20, 20, 20}, 13)
  1257  	expected1.addSubvol(dvid.Point3d{20, 40, 20}, dvid.Point3d{20, 20, 20}, 209)
  1258  	expected1.addSubvol(dvid.Point3d{40, 40, 20}, dvid.Point3d{20, 20, 20}, 311)
  1259  	if err := expected1.equals(downres1); err != nil {
  1260  		t.Errorf("1st downres isn't what is expected: %v\n", err)
  1261  	}
  1262  
  1263  	// Check the second downres to voxel: 32^3
  1264  	downres2 := newTestVolume(32, 32, 32)
  1265  	downres2.getScale(t, uuid, "labels", 2)
  1266  	downres2.verifyLabel(t, 0, 15, 16, 2)
  1267  	expected2 := newTestVolume(32, 32, 32)
  1268  	expected2.addSubvol(dvid.Point3d{10, 10, 10}, dvid.Point3d{10, 10, 10}, 1)
  1269  	expected2.addSubvol(dvid.Point3d{10, 10, 20}, dvid.Point3d{10, 10, 10}, 2)
  1270  	expected2.addSubvol(dvid.Point3d{20, 10, 10}, dvid.Point3d{10, 10, 10}, 13)
  1271  	expected2.addSubvol(dvid.Point3d{10, 20, 10}, dvid.Point3d{10, 10, 10}, 209)
  1272  	expected2.addSubvol(dvid.Point3d{20, 20, 10}, dvid.Point3d{10, 10, 10}, 311)
  1273  	if err := expected2.equals(downres2); err != nil {
  1274  		t.Errorf("2nd downres isn't what is expected: %v\n", err)
  1275  	}
  1276  
  1277  	// Test merge of 2 and 13 into 1
  1278  	testMerge := mergeJSON(`[1, 2, 13]`)
  1279  	testMerge.send(t, uuid, "labels")
  1280  
  1281  	// Make sure labels 2 and 13 sparsevol has been removed.
  1282  	reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/2", server.WebAPIPath, uuid)
  1283  	server.TestBadHTTP(t, "GET", reqStr, nil)
  1284  
  1285  	reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/13", server.WebAPIPath, uuid)
  1286  	server.TestBadHTTP(t, "GET", reqStr, nil)
  1287  
  1288  	// Make sure label changes are correct after completion of merge
  1289  	if err := downres.BlockOnUpdating(uuid, "labels"); err != nil {
  1290  		t.Fatalf("Error blocking on update for labels: %v\n", err)
  1291  	}
  1292  	retrieved := newTestVolume(128, 128, 128)
  1293  	retrieved.get(t, uuid, "labels")
  1294  	merged := newTestVolume(128, 128, 128)
  1295  	merged.addSubvol(dvid.Point3d{40, 40, 40}, dvid.Point3d{40, 40, 40}, 1)
  1296  	merged.addSubvol(dvid.Point3d{40, 40, 80}, dvid.Point3d{40, 40, 40}, 1)
  1297  	merged.addSubvol(dvid.Point3d{80, 40, 40}, dvid.Point3d{40, 40, 40}, 1)
  1298  	merged.addSubvol(dvid.Point3d{40, 80, 40}, dvid.Point3d{40, 40, 40}, 209)
  1299  	merged.addSubvol(dvid.Point3d{80, 80, 40}, dvid.Point3d{40, 40, 40}, 311)
  1300  	if err := merged.equals(retrieved); err != nil {
  1301  		t.Errorf("Merged label volume not equal to expected merged volume: %v\n", err)
  1302  	}
  1303  
  1304  	retrieved1 := newTestVolume(64, 64, 64)
  1305  	retrieved1.getScale(t, uuid, "labels", 1)
  1306  	retrieved1.verifyLabel(t, 0, 35, 34, 2)
  1307  	merged1 := newTestVolume(64, 64, 64)
  1308  	merged1.addSubvol(dvid.Point3d{20, 20, 20}, dvid.Point3d{20, 20, 20}, 1)
  1309  	merged1.addSubvol(dvid.Point3d{20, 20, 40}, dvid.Point3d{20, 20, 20}, 1)
  1310  	merged1.addSubvol(dvid.Point3d{40, 20, 20}, dvid.Point3d{20, 20, 20}, 1)
  1311  	merged1.addSubvol(dvid.Point3d{20, 40, 20}, dvid.Point3d{20, 20, 20}, 209)
  1312  	merged1.addSubvol(dvid.Point3d{40, 40, 20}, dvid.Point3d{20, 20, 20}, 311)
  1313  	if err := retrieved1.equals(merged1); err != nil {
  1314  		t.Errorf("Merged label volume downres #1 not equal to expected merged volume: %v\n", err)
  1315  	}
  1316  
  1317  	retrieved2 := newTestVolume(32, 32, 32)
  1318  	retrieved2.getScale(t, uuid, "labels", 2)
  1319  	merged2 := newTestVolume(32, 32, 32)
  1320  	merged2.addSubvol(dvid.Point3d{10, 10, 10}, dvid.Point3d{10, 10, 10}, 1)
  1321  	merged2.addSubvol(dvid.Point3d{10, 10, 20}, dvid.Point3d{10, 10, 10}, 1)
  1322  	merged2.addSubvol(dvid.Point3d{20, 10, 10}, dvid.Point3d{10, 10, 10}, 1)
  1323  	merged2.addSubvol(dvid.Point3d{10, 20, 10}, dvid.Point3d{10, 10, 10}, 209)
  1324  	merged2.addSubvol(dvid.Point3d{20, 20, 10}, dvid.Point3d{10, 10, 10}, 311)
  1325  	if err := retrieved2.equals(merged2); err != nil {
  1326  		t.Errorf("Merged label volume downres #2 not equal to expected merged volume: %v\n", err)
  1327  	}
  1328  
  1329  	// Create the sparsevol encoding for split area that used to be body 13
  1330  	numspans := 40 * 40
  1331  	rles := make(dvid.RLEs, numspans, numspans)
  1332  	length := int32(40)
  1333  	i := 0
  1334  	for z := int32(40); z < 80; z++ {
  1335  		for y := int32(40); y < 80; y++ {
  1336  			start := dvid.Point3d{80, y, z}
  1337  			rles[i] = dvid.NewRLE(start, length)
  1338  			i++
  1339  		}
  1340  	}
  1341  
  1342  	// Create the split sparse volume binary
  1343  	buf := new(bytes.Buffer)
  1344  	buf.WriteByte(dvid.EncodingBinary)
  1345  	binary.Write(buf, binary.LittleEndian, uint8(3))            // # of dimensions
  1346  	binary.Write(buf, binary.LittleEndian, byte(0))             // dimension of run (X = 0)
  1347  	buf.WriteByte(byte(0))                                      // reserved for later
  1348  	binary.Write(buf, binary.LittleEndian, uint32(numspans*40)) // Placeholder for # voxels
  1349  	binary.Write(buf, binary.LittleEndian, uint32(numspans))    // Placeholder for # spans
  1350  	rleBytes, err := rles.MarshalBinary()
  1351  	if err != nil {
  1352  		t.Errorf("Unable to serialize RLEs: %v\n", err)
  1353  	}
  1354  	buf.Write(rleBytes)
  1355  
  1356  	// Submit the split sparsevol and assign to label 28
  1357  	reqStr = fmt.Sprintf("%snode/%s/labels/split/1?splitlabel=28", server.WebAPIPath, uuid)
  1358  	r := server.TestHTTP(t, "POST", reqStr, buf)
  1359  	jsonVal := make(map[string]uint64)
  1360  	if err := json.Unmarshal(r, &jsonVal); err != nil {
  1361  		t.Errorf("Unable to get new label from split.  Instead got: %v\n", jsonVal)
  1362  	}
  1363  
  1364  	// Test all the multiscales for correct split volume.
  1365  
  1366  	// Make sure label changes are correct after completion of merge
  1367  	if err := downres.BlockOnUpdating(uuid, "labels"); err != nil {
  1368  		t.Fatalf("Error blocking on sync of split of labels: %v\n", err)
  1369  	}
  1370  	retrieved.get(t, uuid, "labels")
  1371  	split := newTestVolume(128, 128, 128)
  1372  	split.addSubvol(dvid.Point3d{40, 40, 40}, dvid.Point3d{40, 40, 40}, 1)
  1373  	split.addSubvol(dvid.Point3d{40, 40, 80}, dvid.Point3d{40, 40, 40}, 1)
  1374  	split.addSubvol(dvid.Point3d{80, 40, 40}, dvid.Point3d{40, 40, 40}, 28)
  1375  	split.addSubvol(dvid.Point3d{40, 80, 40}, dvid.Point3d{40, 40, 40}, 209)
  1376  	split.addSubvol(dvid.Point3d{80, 80, 40}, dvid.Point3d{40, 40, 40}, 311)
  1377  	if err := retrieved.equals(split); err != nil {
  1378  		t.Errorf("Split label volume not equal to expected split volume: %v\n", err)
  1379  	}
  1380  
  1381  	retrieved1.getScale(t, uuid, "labels", 1)
  1382  	retrieved1.verifyLabel(t, 0, 35, 34, 2)
  1383  	split1 := newTestVolume(64, 64, 64)
  1384  	split1.addSubvol(dvid.Point3d{20, 20, 20}, dvid.Point3d{20, 20, 20}, 1)
  1385  	split1.addSubvol(dvid.Point3d{20, 20, 40}, dvid.Point3d{20, 20, 20}, 1)
  1386  	split1.addSubvol(dvid.Point3d{40, 20, 20}, dvid.Point3d{20, 20, 20}, 28)
  1387  	split1.addSubvol(dvid.Point3d{20, 40, 20}, dvid.Point3d{20, 20, 20}, 209)
  1388  	split1.addSubvol(dvid.Point3d{40, 40, 20}, dvid.Point3d{20, 20, 20}, 311)
  1389  	split1.verifyLabel(t, 0, 35, 34, 2)
  1390  	if err := retrieved1.equals(split1); err != nil {
  1391  		t.Errorf("Split label volume downres #1 not equal to expected split volume: %v\n", err)
  1392  	}
  1393  
  1394  	retrieved2.getScale(t, uuid, "labels", 2)
  1395  	split2 := newTestVolume(32, 32, 32)
  1396  	split2.addSubvol(dvid.Point3d{10, 10, 10}, dvid.Point3d{10, 10, 10}, 1)
  1397  	split2.addSubvol(dvid.Point3d{10, 10, 20}, dvid.Point3d{10, 10, 10}, 1)
  1398  	split2.addSubvol(dvid.Point3d{20, 10, 10}, dvid.Point3d{10, 10, 10}, 28)
  1399  	split2.addSubvol(dvid.Point3d{10, 20, 10}, dvid.Point3d{10, 10, 10}, 209)
  1400  	split2.addSubvol(dvid.Point3d{20, 20, 10}, dvid.Point3d{10, 10, 10}, 311)
  1401  	if err := retrieved2.equals(split2); err != nil {
  1402  		t.Errorf("Split label volume downres #2 not equal to expected split volume: %v\n", err)
  1403  	}
  1404  }
  1405  
  1406  // Test that mutable labelarray POST will accurately remove prior bodies.
  1407  func TestMutableLabelblkPOST(t *testing.T) {
  1408  	testConfig := server.TestConfig{CacheSize: map[string]int{"labelarray": 10}}
  1409  	// var testConfig server.TestConfig
  1410  	if err := server.OpenTest(testConfig); err != nil {
  1411  		t.Fatalf("can't open test server: %v\n", err)
  1412  	}
  1413  	defer server.CloseTest()
  1414  
  1415  	// Create testbed volume and data instances
  1416  	uuid, _ := initTestRepo()
  1417  	var config dvid.Config
  1418  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
  1419  
  1420  	// Post labels 1-4
  1421  	createLabelTestVolume(t, uuid, "labels")
  1422  
  1423  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
  1424  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
  1425  	}
  1426  
  1427  	// Make sure we have labels 1-4 sparsevol
  1428  	for _, label := range []uint64{1, 2, 3, 4} {
  1429  		// Check fast HEAD requests
  1430  		reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label)
  1431  		resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil)
  1432  		if resp.Code != http.StatusOK {
  1433  			t.Errorf("HEAD on %s did not return OK.  Status = %d\n", reqStr, resp.Code)
  1434  		}
  1435  
  1436  		// Check full sparse volumes
  1437  		encoding := server.TestHTTP(t, "GET", reqStr, nil)
  1438  		bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{})
  1439  	}
  1440  
  1441  	// Post labels 6-7
  1442  	createLabelTest2Volume(t, uuid, "labels")
  1443  
  1444  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
  1445  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
  1446  	}
  1447  
  1448  	// Make sure that labels 1-4 have no more sparse vol.
  1449  	for _, label := range []uint64{1, 2, 3, 4} {
  1450  		// Check full sparse volumes aren't retrievable anymore
  1451  		reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label)
  1452  		server.TestBadHTTP(t, "GET", reqStr, nil)
  1453  
  1454  		// Make sure non-existent bodies return proper HEAD responses.
  1455  		resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil)
  1456  		if resp.Code != http.StatusNoContent {
  1457  			t.Errorf("HEAD on %s did not return 204 (No Content).  Status = %d\n", reqStr, resp.Code)
  1458  		}
  1459  	}
  1460  
  1461  	// Make sure labels 6-7 are available as sparse vol.
  1462  	for _, label := range []uint64{6, 7} {
  1463  		// Check fast HEAD requests
  1464  		reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label)
  1465  		resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil)
  1466  		if resp.Code != http.StatusOK {
  1467  			t.Errorf("HEAD on %s did not return OK.  Status = %d\n", reqStr, resp.Code)
  1468  		}
  1469  
  1470  		// Check full sparse volumes
  1471  		encoding := server.TestHTTP(t, "GET", reqStr, nil)
  1472  		bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{})
  1473  	}
  1474  }
  1475  
  1476  func TestConcurrentMutations(t *testing.T) {
  1477  	testConfig := server.TestConfig{CacheSize: map[string]int{"labelarray": 10}}
  1478  	// var testConfig server.TestConfig
  1479  	if err := server.OpenTest(testConfig); err != nil {
  1480  		t.Fatalf("can't open test server: %v\n", err)
  1481  	}
  1482  	defer server.CloseTest()
  1483  
  1484  	// Create testbed volume and data instances
  1485  	uuid, _ := initTestRepo()
  1486  	var config dvid.Config // use native 64^3 blocks
  1487  	server.CreateTestInstance(t, uuid, "labelarray", "labels", config)
  1488  
  1489  	// Make three parallel bodies that are within same blocks to test handling of concurrent
  1490  	// ops on same blocks.
  1491  	tbody1 := testBody{ // 72 x 4 x 4 horizontal bar
  1492  		label:  1,
  1493  		offset: dvid.Point3d{9, 68, 68},
  1494  		size:   dvid.Point3d{72, 4, 4},
  1495  		blockSpans: []dvid.Span{
  1496  			{1, 1, 0, 1},
  1497  		},
  1498  		voxelSpans: []dvid.Span{
  1499  			{68, 68, 9, 80},
  1500  			{68, 69, 9, 80},
  1501  			{68, 70, 9, 80},
  1502  			{68, 71, 9, 80},
  1503  			{69, 68, 9, 80},
  1504  			{69, 69, 9, 80},
  1505  			{69, 70, 9, 80},
  1506  			{69, 71, 9, 80},
  1507  			{70, 68, 9, 80},
  1508  			{70, 69, 9, 80},
  1509  			{70, 70, 9, 80},
  1510  			{70, 71, 9, 80},
  1511  			{71, 68, 9, 80},
  1512  			{71, 69, 9, 80},
  1513  			{71, 70, 9, 80},
  1514  			{71, 71, 9, 80},
  1515  		},
  1516  	}
  1517  	tbody2 := testBody{ // 72 x 4 x 4 horizontal bar
  1518  		label:  2,
  1519  		offset: dvid.Point3d{9, 68, 72},
  1520  		size:   dvid.Point3d{72, 4, 4},
  1521  		blockSpans: []dvid.Span{
  1522  			{1, 1, 0, 1},
  1523  		},
  1524  		voxelSpans: []dvid.Span{
  1525  			{72, 68, 9, 80},
  1526  			{72, 69, 9, 80},
  1527  			{72, 70, 9, 80},
  1528  			{72, 71, 9, 80},
  1529  			{73, 68, 9, 80},
  1530  			{73, 69, 9, 80},
  1531  			{73, 70, 9, 80},
  1532  			{73, 71, 9, 80},
  1533  			{74, 68, 9, 80},
  1534  			{74, 69, 9, 80},
  1535  			{74, 70, 9, 80},
  1536  			{74, 71, 9, 80},
  1537  			{75, 68, 9, 80},
  1538  			{75, 69, 9, 80},
  1539  			{75, 70, 9, 80},
  1540  			{75, 71, 9, 80},
  1541  		},
  1542  	}
  1543  	tbody3 := testBody{ // 72 x 4 x 4 horizontal bar
  1544  		label:  3,
  1545  		offset: dvid.Point3d{9, 68, 76},
  1546  		size:   dvid.Point3d{72, 4, 4},
  1547  		blockSpans: []dvid.Span{
  1548  			{1, 1, 0, 1},
  1549  		},
  1550  		voxelSpans: []dvid.Span{
  1551  			{76, 68, 9, 80},
  1552  			{76, 69, 9, 80},
  1553  			{76, 70, 9, 80},
  1554  			{76, 71, 9, 80},
  1555  			{77, 68, 9, 80},
  1556  			{77, 69, 9, 80},
  1557  			{77, 70, 9, 80},
  1558  			{77, 71, 9, 80},
  1559  			{78, 68, 9, 80},
  1560  			{78, 69, 9, 80},
  1561  			{78, 70, 9, 80},
  1562  			{78, 71, 9, 80},
  1563  			{79, 68, 9, 80},
  1564  			{79, 69, 9, 80},
  1565  			{79, 70, 9, 80},
  1566  			{79, 71, 9, 80},
  1567  		},
  1568  	}
  1569  	testbodies := [3]testBody{tbody1, tbody2, tbody3}
  1570  
  1571  	tvol := newTestVolume(192, 128, 128)
  1572  	tvol.addBody(tbody1, 1)
  1573  	tvol.addBody(tbody2, 2)
  1574  	tvol.addBody(tbody3, 3)
  1575  	tvol.put(t, uuid, "labels")
  1576  
  1577  	if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil {
  1578  		t.Fatalf("Error blocking on sync of labels: %v\n", err)
  1579  	}
  1580  
  1581  	retrieved := newTestVolume(192, 128, 128)
  1582  	retrieved.get(t, uuid, "labels")
  1583  	if len(retrieved.data) != 8*192*128*128 {
  1584  		t.Errorf("Retrieved labelvol volume is incorrect size\n")
  1585  	}
  1586  	if err := retrieved.equals(tvol); err != nil {
  1587  		t.Errorf("Initial put not working: %v\n", err)
  1588  	}
  1589  
  1590  	// Run concurrent split/merge ops on each body where split is random location in X.
  1591  	wg := new(sync.WaitGroup)
  1592  	wg.Add(3)
  1593  	go func() {
  1594  		for n := 0; n < 30; n++ {
  1595  			tbody1.splitmerge(t, uuid, "labels")
  1596  		}
  1597  		wg.Done()
  1598  	}()
  1599  	go func() {
  1600  		for n := 0; n < 30; n++ {
  1601  			tbody2.splitmerge(t, uuid, "labels")
  1602  		}
  1603  		wg.Done()
  1604  	}()
  1605  	go func() {
  1606  		for n := 0; n < 30; n++ {
  1607  			tbody3.splitmerge(t, uuid, "labels")
  1608  		}
  1609  		wg.Done()
  1610  	}()
  1611  	wg.Wait()
  1612  
  1613  	retrieved2 := newTestVolume(192, 128, 128)
  1614  	retrieved2.get(t, uuid, "labels")
  1615  	if len(retrieved2.data) != 8*192*128*128 {
  1616  		t.Errorf("Retrieved labelvol volume is incorrect size\n")
  1617  	}
  1618  	if err := retrieved2.equals(tvol); err != nil {
  1619  		t.Errorf("Concurrent split/merge producing bad result: %v\n", err)
  1620  	}
  1621  
  1622  	reqStr := fmt.Sprintf("%snode/%s/labels/sparsevols-coarse/1/3", server.WebAPIPath, uuid)
  1623  	encoding := server.TestHTTP(t, "GET", reqStr, nil)
  1624  	var i int
  1625  	for label := uint64(1); label <= 3; label++ {
  1626  		if i+28 > len(encoding) {
  1627  			t.Fatalf("Expected label %d but only %d bytes remain in encoding\n", label, len(encoding[i:]))
  1628  		}
  1629  		gotLabel := binary.LittleEndian.Uint64(encoding[i : i+8])
  1630  		if gotLabel != label {
  1631  			t.Errorf("Expected label %d, got label %d in returned coarse sparsevols\n", label, gotLabel)
  1632  		}
  1633  		i += 8
  1634  		var spans dvid.Spans
  1635  		if err := spans.UnmarshalBinary(encoding[i:]); err != nil {
  1636  			t.Errorf("Error in decoding coarse sparse volume: %v\n", err)
  1637  			return
  1638  		}
  1639  		i += 4 + len(spans)*16
  1640  		b := testbodies[label-1]
  1641  		if !reflect.DeepEqual(spans, b.blockSpans) {
  1642  			t.Errorf("Expected coarse spans for label %d:\n%s\nGot spans:\n%s\n", b.label, b.blockSpans, spans)
  1643  		}
  1644  	}
  1645  }
  1646  
  1647  func (b testBody) splitmerge(t *testing.T, uuid dvid.UUID, name dvid.InstanceName) {
  1648  	var rles dvid.RLEs
  1649  	var y, z, length int32
  1650  	length = 15
  1651  	startx := int32(rand.Intn(int(b.offset[0] + b.size[0] - length)))
  1652  	for z = 0; z < 4; z++ {
  1653  		for y = 0; y < 4; y++ {
  1654  			pos := dvid.Point3d{startx, b.offset[1] + y, b.offset[2] + z}
  1655  			rles = append(rles, dvid.NewRLE(pos, length))
  1656  		}
  1657  	}
  1658  	dvid.Infof("Starting split for label %d at x = %d ...\n", b.label, startx)
  1659  
  1660  	buf := new(bytes.Buffer)
  1661  	buf.WriteByte(dvid.EncodingBinary)
  1662  	binary.Write(buf, binary.LittleEndian, uint8(3))   // # of dimensions
  1663  	binary.Write(buf, binary.LittleEndian, byte(0))    // dimension of run (X = 0)
  1664  	buf.WriteByte(byte(0))                             // reserved for later
  1665  	binary.Write(buf, binary.LittleEndian, uint32(0))  // Placeholder for # voxels
  1666  	binary.Write(buf, binary.LittleEndian, uint32(16)) // Placeholder for # spans
  1667  	rleBytes, err := rles.MarshalBinary()
  1668  	if err != nil {
  1669  		t.Errorf("Unable to serialize RLEs: %v\n", err)
  1670  	}
  1671  	buf.Write(rleBytes)
  1672  	splitBytes := buf.Bytes()
  1673  
  1674  	var newlabel uint64
  1675  	reqStr := fmt.Sprintf("%snode/%s/%s/split/%d", server.WebAPIPath, uuid, name, b.label)
  1676  	tries := 0
  1677  	notDone := true
  1678  	for notDone {
  1679  		tries++
  1680  		dvid.Infof("Trying split %d of label %d ...\n", tries, b.label)
  1681  		resp := server.TestHTTPResponse(t, "POST", reqStr, bytes.NewBuffer(splitBytes))
  1682  		var retbytes []byte
  1683  		if resp.Body != nil {
  1684  			retbytes, err = ioutil.ReadAll(resp.Body)
  1685  			if err != nil {
  1686  				t.Fatalf("could not read response body for split %d of label %d: %v\n", tries, b.label, err)
  1687  			}
  1688  		}
  1689  		switch resp.Code {
  1690  		case http.StatusOK:
  1691  			jsonVal := make(map[string]uint64)
  1692  			if err := json.Unmarshal(retbytes, &jsonVal); err != nil {
  1693  				t.Fatalf("Unable to get new label from split.  Instead got: %v\n", jsonVal)
  1694  			}
  1695  			var ok bool
  1696  			newlabel, ok = jsonVal["label"]
  1697  			if !ok {
  1698  				t.Fatalf("The split request did not yield label value.  Instead got: %v\n", jsonVal)
  1699  			}
  1700  			notDone = false
  1701  		case http.StatusBadRequest:
  1702  			dvid.Infof("Bad split response.  Waiting...\n")
  1703  			time.Sleep(10 * time.Millisecond)
  1704  			buf.Reset()
  1705  		default:
  1706  			var retstr string
  1707  			if retbytes != nil {
  1708  				retstr = string(retbytes)
  1709  			}
  1710  			t.Fatalf("Error in response to split, status code %d: %s\n", resp.Code, retstr)
  1711  		}
  1712  	}
  1713  
  1714  	// Merge them back.
  1715  	testMerge := fmt.Sprintf(`[%d, %d]`, b.label, newlabel)
  1716  	reqStr = fmt.Sprintf("%snode/%s/%s/merge", server.WebAPIPath, uuid, name)
  1717  	dvid.Infof("Starting merge for label %d -> %d\n", newlabel, b.label)
  1718  	tries = 0
  1719  	notDone = true
  1720  	for notDone {
  1721  		tries++
  1722  		dvid.Infof("Trying merge %d for label %d -> %d ...\n", tries, newlabel, b.label)
  1723  		resp := server.TestHTTPResponse(t, "POST", reqStr, bytes.NewBufferString(testMerge))
  1724  		switch resp.Code {
  1725  		case http.StatusOK:
  1726  			notDone = false
  1727  		case http.StatusBadRequest:
  1728  			dvid.Infof("Bad merge response.  Waiting...\n")
  1729  			time.Sleep(10 * time.Millisecond)
  1730  		default:
  1731  			var retstr string
  1732  			if resp.Body != nil {
  1733  				retbytes, err := ioutil.ReadAll(resp.Body)
  1734  				if err != nil {
  1735  					t.Fatalf("Error trying to read response body from request %q: %v\n", reqStr, err)
  1736  					break
  1737  				} else {
  1738  					retstr = string(retbytes)
  1739  				}
  1740  			}
  1741  			t.Fatalf("Error in response to merge, status code %d: %s\n", resp.Code, retstr)
  1742  		}
  1743  	}
  1744  }
  1745  
  1746  var (
  1747  	body1 = testBody{
  1748  		label:  1,
  1749  		offset: dvid.Point3d{10, 40, 10},
  1750  		size:   dvid.Point3d{20, 20, 80},
  1751  		blockSpans: []dvid.Span{
  1752  			{0, 1, 0, 0},
  1753  			{1, 1, 0, 0},
  1754  			{2, 1, 0, 0},
  1755  		},
  1756  		voxelSpans: []dvid.Span{
  1757  			{10, 40, 10, 29}, {10, 41, 10, 29}, {10, 42, 10, 29}, {10, 43, 10, 29}, {10, 44, 10, 29},
  1758  			{10, 45, 10, 29}, {10, 46, 10, 29}, {10, 47, 10, 29}, {10, 48, 10, 29}, {10, 49, 10, 29},
  1759  			{10, 50, 10, 29}, {10, 51, 10, 29}, {10, 52, 10, 29}, {10, 53, 10, 29}, {10, 54, 10, 29},
  1760  			{10, 55, 10, 29}, {10, 56, 10, 29}, {10, 57, 10, 29}, {10, 58, 10, 29}, {10, 59, 10, 29},
  1761  			{11, 40, 10, 29}, {11, 41, 10, 29}, {11, 42, 10, 29}, {11, 43, 10, 29}, {11, 44, 10, 29},
  1762  			{11, 45, 10, 29}, {11, 46, 10, 29}, {11, 47, 10, 29}, {11, 48, 10, 29}, {11, 49, 10, 29},
  1763  			{11, 50, 10, 29}, {11, 51, 10, 29}, {11, 52, 10, 29}, {11, 53, 10, 29}, {11, 54, 10, 29},
  1764  			{11, 55, 10, 29}, {11, 56, 10, 29}, {11, 57, 10, 29}, {11, 58, 10, 29}, {11, 59, 10, 29},
  1765  			{12, 40, 10, 29}, {12, 41, 10, 29}, {12, 42, 10, 29}, {12, 43, 10, 29}, {12, 44, 10, 29},
  1766  			{12, 45, 10, 29}, {12, 46, 10, 29}, {12, 47, 10, 29}, {12, 48, 10, 29}, {12, 49, 10, 29},
  1767  			{12, 50, 10, 29}, {12, 51, 10, 29}, {12, 52, 10, 29}, {12, 53, 10, 29}, {12, 54, 10, 29},
  1768  			{12, 55, 10, 29}, {12, 56, 10, 29}, {12, 57, 10, 29}, {12, 58, 10, 29}, {12, 59, 10, 29},
  1769  			{13, 40, 10, 29}, {13, 41, 10, 29}, {13, 42, 10, 29}, {13, 43, 10, 29}, {13, 44, 10, 29},
  1770  			{13, 45, 10, 29}, {13, 46, 10, 29}, {13, 47, 10, 29}, {13, 48, 10, 29}, {13, 49, 10, 29},
  1771  			{13, 50, 10, 29}, {13, 51, 10, 29}, {13, 52, 10, 29}, {13, 53, 10, 29}, {13, 54, 10, 29},
  1772  			{13, 55, 10, 29}, {13, 56, 10, 29}, {13, 57, 10, 29}, {13, 58, 10, 29}, {13, 59, 10, 29},
  1773  			{14, 40, 10, 29}, {14, 41, 10, 29}, {14, 42, 10, 29}, {14, 43, 10, 29}, {14, 44, 10, 29},
  1774  			{14, 45, 10, 29}, {14, 46, 10, 29}, {14, 47, 10, 29}, {14, 48, 10, 29}, {14, 49, 10, 29},
  1775  			{14, 50, 10, 29}, {14, 51, 10, 29}, {14, 52, 10, 29}, {14, 53, 10, 29}, {14, 54, 10, 29},
  1776  			{14, 55, 10, 29}, {14, 56, 10, 29}, {14, 57, 10, 29}, {14, 58, 10, 29}, {14, 59, 10, 29},
  1777  			{15, 40, 10, 29}, {15, 41, 10, 29}, {15, 42, 10, 29}, {15, 43, 10, 29}, {15, 44, 10, 29},
  1778  			{15, 45, 10, 29}, {15, 46, 10, 29}, {15, 47, 10, 29}, {15, 48, 10, 29}, {15, 49, 10, 29},
  1779  			{15, 50, 10, 29}, {15, 51, 10, 29}, {15, 52, 10, 29}, {15, 53, 10, 29}, {15, 54, 10, 29},
  1780  			{15, 55, 10, 29}, {15, 56, 10, 29}, {15, 57, 10, 29}, {15, 58, 10, 29}, {15, 59, 10, 29},
  1781  			{16, 40, 10, 29}, {16, 41, 10, 29}, {16, 42, 10, 29}, {16, 43, 10, 29}, {16, 44, 10, 29},
  1782  			{16, 45, 10, 29}, {16, 46, 10, 29}, {16, 47, 10, 29}, {16, 48, 10, 29}, {16, 49, 10, 29},
  1783  			{16, 50, 10, 29}, {16, 51, 10, 29}, {16, 52, 10, 29}, {16, 53, 10, 29}, {16, 54, 10, 29},
  1784  			{16, 55, 10, 29}, {16, 56, 10, 29}, {16, 57, 10, 29}, {16, 58, 10, 29}, {16, 59, 10, 29},
  1785  			{17, 40, 10, 29}, {17, 41, 10, 29}, {17, 42, 10, 29}, {17, 43, 10, 29}, {17, 44, 10, 29},
  1786  			{17, 45, 10, 29}, {17, 46, 10, 29}, {17, 47, 10, 29}, {17, 48, 10, 29}, {17, 49, 10, 29},
  1787  			{17, 50, 10, 29}, {17, 51, 10, 29}, {17, 52, 10, 29}, {17, 53, 10, 29}, {17, 54, 10, 29},
  1788  			{17, 55, 10, 29}, {17, 56, 10, 29}, {17, 57, 10, 29}, {17, 58, 10, 29}, {17, 59, 10, 29},
  1789  			{18, 40, 10, 29}, {18, 41, 10, 29}, {18, 42, 10, 29}, {18, 43, 10, 29}, {18, 44, 10, 29},
  1790  			{18, 45, 10, 29}, {18, 46, 10, 29}, {18, 47, 10, 29}, {18, 48, 10, 29}, {18, 49, 10, 29},
  1791  			{18, 50, 10, 29}, {18, 51, 10, 29}, {18, 52, 10, 29}, {18, 53, 10, 29}, {18, 54, 10, 29},
  1792  			{18, 55, 10, 29}, {18, 56, 10, 29}, {18, 57, 10, 29}, {18, 58, 10, 29}, {18, 59, 10, 29},
  1793  			{19, 40, 10, 29}, {19, 41, 10, 29}, {19, 42, 10, 29}, {19, 43, 10, 29}, {19, 44, 10, 29},
  1794  			{19, 45, 10, 29}, {19, 46, 10, 29}, {19, 47, 10, 29}, {19, 48, 10, 29}, {19, 49, 10, 29},
  1795  			{19, 50, 10, 29}, {19, 51, 10, 29}, {19, 52, 10, 29}, {19, 53, 10, 29}, {19, 54, 10, 29},
  1796  			{19, 55, 10, 29}, {19, 56, 10, 29}, {19, 57, 10, 29}, {19, 58, 10, 29}, {19, 59, 10, 29},
  1797  			{20, 40, 10, 29}, {20, 41, 10, 29}, {20, 42, 10, 29}, {20, 43, 10, 29}, {20, 44, 10, 29},
  1798  			{20, 45, 10, 29}, {20, 46, 10, 29}, {20, 47, 10, 29}, {20, 48, 10, 29}, {20, 49, 10, 29},
  1799  			{20, 50, 10, 29}, {20, 51, 10, 29}, {20, 52, 10, 29}, {20, 53, 10, 29}, {20, 54, 10, 29},
  1800  			{20, 55, 10, 29}, {20, 56, 10, 29}, {20, 57, 10, 29}, {20, 58, 10, 29}, {20, 59, 10, 29},
  1801  			{21, 40, 10, 29}, {21, 41, 10, 29}, {21, 42, 10, 29}, {21, 43, 10, 29}, {21, 44, 10, 29},
  1802  			{21, 45, 10, 29}, {21, 46, 10, 29}, {21, 47, 10, 29}, {21, 48, 10, 29}, {21, 49, 10, 29},
  1803  			{21, 50, 10, 29}, {21, 51, 10, 29}, {21, 52, 10, 29}, {21, 53, 10, 29}, {21, 54, 10, 29},
  1804  			{21, 55, 10, 29}, {21, 56, 10, 29}, {21, 57, 10, 29}, {21, 58, 10, 29}, {21, 59, 10, 29},
  1805  			{22, 40, 10, 29}, {22, 41, 10, 29}, {22, 42, 10, 29}, {22, 43, 10, 29}, {22, 44, 10, 29},
  1806  			{22, 45, 10, 29}, {22, 46, 10, 29}, {22, 47, 10, 29}, {22, 48, 10, 29}, {22, 49, 10, 29},
  1807  			{22, 50, 10, 29}, {22, 51, 10, 29}, {22, 52, 10, 29}, {22, 53, 10, 29}, {22, 54, 10, 29},
  1808  			{22, 55, 10, 29}, {22, 56, 10, 29}, {22, 57, 10, 29}, {22, 58, 10, 29}, {22, 59, 10, 29},
  1809  			{23, 40, 10, 29}, {23, 41, 10, 29}, {23, 42, 10, 29}, {23, 43, 10, 29}, {23, 44, 10, 29},
  1810  			{23, 45, 10, 29}, {23, 46, 10, 29}, {23, 47, 10, 29}, {23, 48, 10, 29}, {23, 49, 10, 29},
  1811  			{23, 50, 10, 29}, {23, 51, 10, 29}, {23, 52, 10, 29}, {23, 53, 10, 29}, {23, 54, 10, 29},
  1812  			{23, 55, 10, 29}, {23, 56, 10, 29}, {23, 57, 10, 29}, {23, 58, 10, 29}, {23, 59, 10, 29},
  1813  			{24, 40, 10, 29}, {24, 41, 10, 29}, {24, 42, 10, 29}, {24, 43, 10, 29}, {24, 44, 10, 29},
  1814  			{24, 45, 10, 29}, {24, 46, 10, 29}, {24, 47, 10, 29}, {24, 48, 10, 29}, {24, 49, 10, 29},
  1815  			{24, 50, 10, 29}, {24, 51, 10, 29}, {24, 52, 10, 29}, {24, 53, 10, 29}, {24, 54, 10, 29},
  1816  			{24, 55, 10, 29}, {24, 56, 10, 29}, {24, 57, 10, 29}, {24, 58, 10, 29}, {24, 59, 10, 29},
  1817  			{25, 40, 10, 29}, {25, 41, 10, 29}, {25, 42, 10, 29}, {25, 43, 10, 29}, {25, 44, 10, 29},
  1818  			{25, 45, 10, 29}, {25, 46, 10, 29}, {25, 47, 10, 29}, {25, 48, 10, 29}, {25, 49, 10, 29},
  1819  			{25, 50, 10, 29}, {25, 51, 10, 29}, {25, 52, 10, 29}, {25, 53, 10, 29}, {25, 54, 10, 29},
  1820  			{25, 55, 10, 29}, {25, 56, 10, 29}, {25, 57, 10, 29}, {25, 58, 10, 29}, {25, 59, 10, 29},
  1821  			{26, 40, 10, 29}, {26, 41, 10, 29}, {26, 42, 10, 29}, {26, 43, 10, 29}, {26, 44, 10, 29},
  1822  			{26, 45, 10, 29}, {26, 46, 10, 29}, {26, 47, 10, 29}, {26, 48, 10, 29}, {26, 49, 10, 29},
  1823  			{26, 50, 10, 29}, {26, 51, 10, 29}, {26, 52, 10, 29}, {26, 53, 10, 29}, {26, 54, 10, 29},
  1824  			{26, 55, 10, 29}, {26, 56, 10, 29}, {26, 57, 10, 29}, {26, 58, 10, 29}, {26, 59, 10, 29},
  1825  			{27, 40, 10, 29}, {27, 41, 10, 29}, {27, 42, 10, 29}, {27, 43, 10, 29}, {27, 44, 10, 29},
  1826  			{27, 45, 10, 29}, {27, 46, 10, 29}, {27, 47, 10, 29}, {27, 48, 10, 29}, {27, 49, 10, 29},
  1827  			{27, 50, 10, 29}, {27, 51, 10, 29}, {27, 52, 10, 29}, {27, 53, 10, 29}, {27, 54, 10, 29},
  1828  			{27, 55, 10, 29}, {27, 56, 10, 29}, {27, 57, 10, 29}, {27, 58, 10, 29}, {27, 59, 10, 29},
  1829  			{28, 40, 10, 29}, {28, 41, 10, 29}, {28, 42, 10, 29}, {28, 43, 10, 29}, {28, 44, 10, 29},
  1830  			{28, 45, 10, 29}, {28, 46, 10, 29}, {28, 47, 10, 29}, {28, 48, 10, 29}, {28, 49, 10, 29},
  1831  			{28, 50, 10, 29}, {28, 51, 10, 29}, {28, 52, 10, 29}, {28, 53, 10, 29}, {28, 54, 10, 29},
  1832  			{28, 55, 10, 29}, {28, 56, 10, 29}, {28, 57, 10, 29}, {28, 58, 10, 29}, {28, 59, 10, 29},
  1833  			{29, 40, 10, 29}, {29, 41, 10, 29}, {29, 42, 10, 29}, {29, 43, 10, 29}, {29, 44, 10, 29},
  1834  			{29, 45, 10, 29}, {29, 46, 10, 29}, {29, 47, 10, 29}, {29, 48, 10, 29}, {29, 49, 10, 29},
  1835  			{29, 50, 10, 29}, {29, 51, 10, 29}, {29, 52, 10, 29}, {29, 53, 10, 29}, {29, 54, 10, 29},
  1836  			{29, 55, 10, 29}, {29, 56, 10, 29}, {29, 57, 10, 29}, {29, 58, 10, 29}, {29, 59, 10, 29},
  1837  			{30, 40, 10, 29}, {30, 41, 10, 29}, {30, 42, 10, 29}, {30, 43, 10, 29}, {30, 44, 10, 29},
  1838  			{30, 45, 10, 29}, {30, 46, 10, 29}, {30, 47, 10, 29}, {30, 48, 10, 29}, {30, 49, 10, 29},
  1839  			{30, 50, 10, 29}, {30, 51, 10, 29}, {30, 52, 10, 29}, {30, 53, 10, 29}, {30, 54, 10, 29},
  1840  			{30, 55, 10, 29}, {30, 56, 10, 29}, {30, 57, 10, 29}, {30, 58, 10, 29}, {30, 59, 10, 29},
  1841  			{31, 40, 10, 29}, {31, 41, 10, 29}, {31, 42, 10, 29}, {31, 43, 10, 29}, {31, 44, 10, 29},
  1842  			{31, 45, 10, 29}, {31, 46, 10, 29}, {31, 47, 10, 29}, {31, 48, 10, 29}, {31, 49, 10, 29},
  1843  			{31, 50, 10, 29}, {31, 51, 10, 29}, {31, 52, 10, 29}, {31, 53, 10, 29}, {31, 54, 10, 29},
  1844  			{31, 55, 10, 29}, {31, 56, 10, 29}, {31, 57, 10, 29}, {31, 58, 10, 29}, {31, 59, 10, 29},
  1845  			{32, 40, 10, 29}, {32, 41, 10, 29}, {32, 42, 10, 29}, {32, 43, 10, 29}, {32, 44, 10, 29},
  1846  			{32, 45, 10, 29}, {32, 46, 10, 29}, {32, 47, 10, 29}, {32, 48, 10, 29}, {32, 49, 10, 29},
  1847  			{32, 50, 10, 29}, {32, 51, 10, 29}, {32, 52, 10, 29}, {32, 53, 10, 29}, {32, 54, 10, 29},
  1848  			{32, 55, 10, 29}, {32, 56, 10, 29}, {32, 57, 10, 29}, {32, 58, 10, 29}, {32, 59, 10, 29},
  1849  			{33, 40, 10, 29}, {33, 41, 10, 29}, {33, 42, 10, 29}, {33, 43, 10, 29}, {33, 44, 10, 29},
  1850  			{33, 45, 10, 29}, {33, 46, 10, 29}, {33, 47, 10, 29}, {33, 48, 10, 29}, {33, 49, 10, 29},
  1851  			{33, 50, 10, 29}, {33, 51, 10, 29}, {33, 52, 10, 29}, {33, 53, 10, 29}, {33, 54, 10, 29},
  1852  			{33, 55, 10, 29}, {33, 56, 10, 29}, {33, 57, 10, 29}, {33, 58, 10, 29}, {33, 59, 10, 29},
  1853  			{34, 40, 10, 29}, {34, 41, 10, 29}, {34, 42, 10, 29}, {34, 43, 10, 29}, {34, 44, 10, 29},
  1854  			{34, 45, 10, 29}, {34, 46, 10, 29}, {34, 47, 10, 29}, {34, 48, 10, 29}, {34, 49, 10, 29},
  1855  			{34, 50, 10, 29}, {34, 51, 10, 29}, {34, 52, 10, 29}, {34, 53, 10, 29}, {34, 54, 10, 29},
  1856  			{34, 55, 10, 29}, {34, 56, 10, 29}, {34, 57, 10, 29}, {34, 58, 10, 29}, {34, 59, 10, 29},
  1857  			{35, 40, 10, 29}, {35, 41, 10, 29}, {35, 42, 10, 29}, {35, 43, 10, 29}, {35, 44, 10, 29},
  1858  			{35, 45, 10, 29}, {35, 46, 10, 29}, {35, 47, 10, 29}, {35, 48, 10, 29}, {35, 49, 10, 29},
  1859  			{35, 50, 10, 29}, {35, 51, 10, 29}, {35, 52, 10, 29}, {35, 53, 10, 29}, {35, 54, 10, 29},
  1860  			{35, 55, 10, 29}, {35, 56, 10, 29}, {35, 57, 10, 29}, {35, 58, 10, 29}, {35, 59, 10, 29},
  1861  			{36, 40, 10, 29}, {36, 41, 10, 29}, {36, 42, 10, 29}, {36, 43, 10, 29}, {36, 44, 10, 29},
  1862  			{36, 45, 10, 29}, {36, 46, 10, 29}, {36, 47, 10, 29}, {36, 48, 10, 29}, {36, 49, 10, 29},
  1863  			{36, 50, 10, 29}, {36, 51, 10, 29}, {36, 52, 10, 29}, {36, 53, 10, 29}, {36, 54, 10, 29},
  1864  			{36, 55, 10, 29}, {36, 56, 10, 29}, {36, 57, 10, 29}, {36, 58, 10, 29}, {36, 59, 10, 29},
  1865  			{37, 40, 10, 29}, {37, 41, 10, 29}, {37, 42, 10, 29}, {37, 43, 10, 29}, {37, 44, 10, 29},
  1866  			{37, 45, 10, 29}, {37, 46, 10, 29}, {37, 47, 10, 29}, {37, 48, 10, 29}, {37, 49, 10, 29},
  1867  			{37, 50, 10, 29}, {37, 51, 10, 29}, {37, 52, 10, 29}, {37, 53, 10, 29}, {37, 54, 10, 29},
  1868  			{37, 55, 10, 29}, {37, 56, 10, 29}, {37, 57, 10, 29}, {37, 58, 10, 29}, {37, 59, 10, 29},
  1869  			{38, 40, 10, 29}, {38, 41, 10, 29}, {38, 42, 10, 29}, {38, 43, 10, 29}, {38, 44, 10, 29},
  1870  			{38, 45, 10, 29}, {38, 46, 10, 29}, {38, 47, 10, 29}, {38, 48, 10, 29}, {38, 49, 10, 29},
  1871  			{38, 50, 10, 29}, {38, 51, 10, 29}, {38, 52, 10, 29}, {38, 53, 10, 29}, {38, 54, 10, 29},
  1872  			{38, 55, 10, 29}, {38, 56, 10, 29}, {38, 57, 10, 29}, {38, 58, 10, 29}, {38, 59, 10, 29},
  1873  			{39, 40, 10, 29}, {39, 41, 10, 29}, {39, 42, 10, 29}, {39, 43, 10, 29}, {39, 44, 10, 29},
  1874  			{39, 45, 10, 29}, {39, 46, 10, 29}, {39, 47, 10, 29}, {39, 48, 10, 29}, {39, 49, 10, 29},
  1875  			{39, 50, 10, 29}, {39, 51, 10, 29}, {39, 52, 10, 29}, {39, 53, 10, 29}, {39, 54, 10, 29},
  1876  			{39, 55, 10, 29}, {39, 56, 10, 29}, {39, 57, 10, 29}, {39, 58, 10, 29}, {39, 59, 10, 29},
  1877  			{40, 40, 10, 29}, {40, 41, 10, 29}, {40, 42, 10, 29}, {40, 43, 10, 29}, {40, 44, 10, 29},
  1878  			{40, 45, 10, 29}, {40, 46, 10, 29}, {40, 47, 10, 29}, {40, 48, 10, 29}, {40, 49, 10, 29},
  1879  			{40, 50, 10, 29}, {40, 51, 10, 29}, {40, 52, 10, 29}, {40, 53, 10, 29}, {40, 54, 10, 29},
  1880  			{40, 55, 10, 29}, {40, 56, 10, 29}, {40, 57, 10, 29}, {40, 58, 10, 29}, {40, 59, 10, 29},
  1881  			{41, 40, 10, 29}, {41, 41, 10, 29}, {41, 42, 10, 29}, {41, 43, 10, 29}, {41, 44, 10, 29},
  1882  			{41, 45, 10, 29}, {41, 46, 10, 29}, {41, 47, 10, 29}, {41, 48, 10, 29}, {41, 49, 10, 29},
  1883  			{41, 50, 10, 29}, {41, 51, 10, 29}, {41, 52, 10, 29}, {41, 53, 10, 29}, {41, 54, 10, 29},
  1884  			{41, 55, 10, 29}, {41, 56, 10, 29}, {41, 57, 10, 29}, {41, 58, 10, 29}, {41, 59, 10, 29},
  1885  			{42, 40, 10, 29}, {42, 41, 10, 29}, {42, 42, 10, 29}, {42, 43, 10, 29}, {42, 44, 10, 29},
  1886  			{42, 45, 10, 29}, {42, 46, 10, 29}, {42, 47, 10, 29}, {42, 48, 10, 29}, {42, 49, 10, 29},
  1887  			{42, 50, 10, 29}, {42, 51, 10, 29}, {42, 52, 10, 29}, {42, 53, 10, 29}, {42, 54, 10, 29},
  1888  			{42, 55, 10, 29}, {42, 56, 10, 29}, {42, 57, 10, 29}, {42, 58, 10, 29}, {42, 59, 10, 29},
  1889  			{43, 40, 10, 29}, {43, 41, 10, 29}, {43, 42, 10, 29}, {43, 43, 10, 29}, {43, 44, 10, 29},
  1890  			{43, 45, 10, 29}, {43, 46, 10, 29}, {43, 47, 10, 29}, {43, 48, 10, 29}, {43, 49, 10, 29},
  1891  			{43, 50, 10, 29}, {43, 51, 10, 29}, {43, 52, 10, 29}, {43, 53, 10, 29}, {43, 54, 10, 29},
  1892  			{43, 55, 10, 29}, {43, 56, 10, 29}, {43, 57, 10, 29}, {43, 58, 10, 29}, {43, 59, 10, 29},
  1893  			{44, 40, 10, 29}, {44, 41, 10, 29}, {44, 42, 10, 29}, {44, 43, 10, 29}, {44, 44, 10, 29},
  1894  			{44, 45, 10, 29}, {44, 46, 10, 29}, {44, 47, 10, 29}, {44, 48, 10, 29}, {44, 49, 10, 29},
  1895  			{44, 50, 10, 29}, {44, 51, 10, 29}, {44, 52, 10, 29}, {44, 53, 10, 29}, {44, 54, 10, 29},
  1896  			{44, 55, 10, 29}, {44, 56, 10, 29}, {44, 57, 10, 29}, {44, 58, 10, 29}, {44, 59, 10, 29},
  1897  			{45, 40, 10, 29}, {45, 41, 10, 29}, {45, 42, 10, 29}, {45, 43, 10, 29}, {45, 44, 10, 29},
  1898  			{45, 45, 10, 29}, {45, 46, 10, 29}, {45, 47, 10, 29}, {45, 48, 10, 29}, {45, 49, 10, 29},
  1899  			{45, 50, 10, 29}, {45, 51, 10, 29}, {45, 52, 10, 29}, {45, 53, 10, 29}, {45, 54, 10, 29},
  1900  			{45, 55, 10, 29}, {45, 56, 10, 29}, {45, 57, 10, 29}, {45, 58, 10, 29}, {45, 59, 10, 29},
  1901  			{46, 40, 10, 29}, {46, 41, 10, 29}, {46, 42, 10, 29}, {46, 43, 10, 29}, {46, 44, 10, 29},
  1902  			{46, 45, 10, 29}, {46, 46, 10, 29}, {46, 47, 10, 29}, {46, 48, 10, 29}, {46, 49, 10, 29},
  1903  			{46, 50, 10, 29}, {46, 51, 10, 29}, {46, 52, 10, 29}, {46, 53, 10, 29}, {46, 54, 10, 29},
  1904  			{46, 55, 10, 29}, {46, 56, 10, 29}, {46, 57, 10, 29}, {46, 58, 10, 29}, {46, 59, 10, 29},
  1905  			{47, 40, 10, 29}, {47, 41, 10, 29}, {47, 42, 10, 29}, {47, 43, 10, 29}, {47, 44, 10, 29},
  1906  			{47, 45, 10, 29}, {47, 46, 10, 29}, {47, 47, 10, 29}, {47, 48, 10, 29}, {47, 49, 10, 29},
  1907  			{47, 50, 10, 29}, {47, 51, 10, 29}, {47, 52, 10, 29}, {47, 53, 10, 29}, {47, 54, 10, 29},
  1908  			{47, 55, 10, 29}, {47, 56, 10, 29}, {47, 57, 10, 29}, {47, 58, 10, 29}, {47, 59, 10, 29},
  1909  			{48, 40, 10, 29}, {48, 41, 10, 29}, {48, 42, 10, 29}, {48, 43, 10, 29}, {48, 44, 10, 29},
  1910  			{48, 45, 10, 29}, {48, 46, 10, 29}, {48, 47, 10, 29}, {48, 48, 10, 29}, {48, 49, 10, 29},
  1911  			{48, 50, 10, 29}, {48, 51, 10, 29}, {48, 52, 10, 29}, {48, 53, 10, 29}, {48, 54, 10, 29},
  1912  			{48, 55, 10, 29}, {48, 56, 10, 29}, {48, 57, 10, 29}, {48, 58, 10, 29}, {48, 59, 10, 29},
  1913  			{49, 40, 10, 29}, {49, 41, 10, 29}, {49, 42, 10, 29}, {49, 43, 10, 29}, {49, 44, 10, 29},
  1914  			{49, 45, 10, 29}, {49, 46, 10, 29}, {49, 47, 10, 29}, {49, 48, 10, 29}, {49, 49, 10, 29},
  1915  			{49, 50, 10, 29}, {49, 51, 10, 29}, {49, 52, 10, 29}, {49, 53, 10, 29}, {49, 54, 10, 29},
  1916  			{49, 55, 10, 29}, {49, 56, 10, 29}, {49, 57, 10, 29}, {49, 58, 10, 29}, {49, 59, 10, 29},
  1917  			{50, 40, 10, 29}, {50, 41, 10, 29}, {50, 42, 10, 29}, {50, 43, 10, 29}, {50, 44, 10, 29},
  1918  			{50, 45, 10, 29}, {50, 46, 10, 29}, {50, 47, 10, 29}, {50, 48, 10, 29}, {50, 49, 10, 29},
  1919  			{50, 50, 10, 29}, {50, 51, 10, 29}, {50, 52, 10, 29}, {50, 53, 10, 29}, {50, 54, 10, 29},
  1920  			{50, 55, 10, 29}, {50, 56, 10, 29}, {50, 57, 10, 29}, {50, 58, 10, 29}, {50, 59, 10, 29},
  1921  			{51, 40, 10, 29}, {51, 41, 10, 29}, {51, 42, 10, 29}, {51, 43, 10, 29}, {51, 44, 10, 29},
  1922  			{51, 45, 10, 29}, {51, 46, 10, 29}, {51, 47, 10, 29}, {51, 48, 10, 29}, {51, 49, 10, 29},
  1923  			{51, 50, 10, 29}, {51, 51, 10, 29}, {51, 52, 10, 29}, {51, 53, 10, 29}, {51, 54, 10, 29},
  1924  			{51, 55, 10, 29}, {51, 56, 10, 29}, {51, 57, 10, 29}, {51, 58, 10, 29}, {51, 59, 10, 29},
  1925  			{52, 40, 10, 29}, {52, 41, 10, 29}, {52, 42, 10, 29}, {52, 43, 10, 29}, {52, 44, 10, 29},
  1926  			{52, 45, 10, 29}, {52, 46, 10, 29}, {52, 47, 10, 29}, {52, 48, 10, 29}, {52, 49, 10, 29},
  1927  			{52, 50, 10, 29}, {52, 51, 10, 29}, {52, 52, 10, 29}, {52, 53, 10, 29}, {52, 54, 10, 29},
  1928  			{52, 55, 10, 29}, {52, 56, 10, 29}, {52, 57, 10, 29}, {52, 58, 10, 29}, {52, 59, 10, 29},
  1929  			{53, 40, 10, 29}, {53, 41, 10, 29}, {53, 42, 10, 29}, {53, 43, 10, 29}, {53, 44, 10, 29},
  1930  			{53, 45, 10, 29}, {53, 46, 10, 29}, {53, 47, 10, 29}, {53, 48, 10, 29}, {53, 49, 10, 29},
  1931  			{53, 50, 10, 29}, {53, 51, 10, 29}, {53, 52, 10, 29}, {53, 53, 10, 29}, {53, 54, 10, 29},
  1932  			{53, 55, 10, 29}, {53, 56, 10, 29}, {53, 57, 10, 29}, {53, 58, 10, 29}, {53, 59, 10, 29},
  1933  			{54, 40, 10, 29}, {54, 41, 10, 29}, {54, 42, 10, 29}, {54, 43, 10, 29}, {54, 44, 10, 29},
  1934  			{54, 45, 10, 29}, {54, 46, 10, 29}, {54, 47, 10, 29}, {54, 48, 10, 29}, {54, 49, 10, 29},
  1935  			{54, 50, 10, 29}, {54, 51, 10, 29}, {54, 52, 10, 29}, {54, 53, 10, 29}, {54, 54, 10, 29},
  1936  			{54, 55, 10, 29}, {54, 56, 10, 29}, {54, 57, 10, 29}, {54, 58, 10, 29}, {54, 59, 10, 29},
  1937  			{55, 40, 10, 29}, {55, 41, 10, 29}, {55, 42, 10, 29}, {55, 43, 10, 29}, {55, 44, 10, 29},
  1938  			{55, 45, 10, 29}, {55, 46, 10, 29}, {55, 47, 10, 29}, {55, 48, 10, 29}, {55, 49, 10, 29},
  1939  			{55, 50, 10, 29}, {55, 51, 10, 29}, {55, 52, 10, 29}, {55, 53, 10, 29}, {55, 54, 10, 29},
  1940  			{55, 55, 10, 29}, {55, 56, 10, 29}, {55, 57, 10, 29}, {55, 58, 10, 29}, {55, 59, 10, 29},
  1941  			{56, 40, 10, 29}, {56, 41, 10, 29}, {56, 42, 10, 29}, {56, 43, 10, 29}, {56, 44, 10, 29},
  1942  			{56, 45, 10, 29}, {56, 46, 10, 29}, {56, 47, 10, 29}, {56, 48, 10, 29}, {56, 49, 10, 29},
  1943  			{56, 50, 10, 29}, {56, 51, 10, 29}, {56, 52, 10, 29}, {56, 53, 10, 29}, {56, 54, 10, 29},
  1944  			{56, 55, 10, 29}, {56, 56, 10, 29}, {56, 57, 10, 29}, {56, 58, 10, 29}, {56, 59, 10, 29},
  1945  			{57, 40, 10, 29}, {57, 41, 10, 29}, {57, 42, 10, 29}, {57, 43, 10, 29}, {57, 44, 10, 29},
  1946  			{57, 45, 10, 29}, {57, 46, 10, 29}, {57, 47, 10, 29}, {57, 48, 10, 29}, {57, 49, 10, 29},
  1947  			{57, 50, 10, 29}, {57, 51, 10, 29}, {57, 52, 10, 29}, {57, 53, 10, 29}, {57, 54, 10, 29},
  1948  			{57, 55, 10, 29}, {57, 56, 10, 29}, {57, 57, 10, 29}, {57, 58, 10, 29}, {57, 59, 10, 29},
  1949  			{58, 40, 10, 29}, {58, 41, 10, 29}, {58, 42, 10, 29}, {58, 43, 10, 29}, {58, 44, 10, 29},
  1950  			{58, 45, 10, 29}, {58, 46, 10, 29}, {58, 47, 10, 29}, {58, 48, 10, 29}, {58, 49, 10, 29},
  1951  			{58, 50, 10, 29}, {58, 51, 10, 29}, {58, 52, 10, 29}, {58, 53, 10, 29}, {58, 54, 10, 29},
  1952  			{58, 55, 10, 29}, {58, 56, 10, 29}, {58, 57, 10, 29}, {58, 58, 10, 29}, {58, 59, 10, 29},
  1953  			{59, 40, 10, 29}, {59, 41, 10, 29}, {59, 42, 10, 29}, {59, 43, 10, 29}, {59, 44, 10, 29},
  1954  			{59, 45, 10, 29}, {59, 46, 10, 29}, {59, 47, 10, 29}, {59, 48, 10, 29}, {59, 49, 10, 29},
  1955  			{59, 50, 10, 29}, {59, 51, 10, 29}, {59, 52, 10, 29}, {59, 53, 10, 29}, {59, 54, 10, 29},
  1956  			{59, 55, 10, 29}, {59, 56, 10, 29}, {59, 57, 10, 29}, {59, 58, 10, 29}, {59, 59, 10, 29},
  1957  			{60, 40, 10, 29}, {60, 41, 10, 29}, {60, 42, 10, 29}, {60, 43, 10, 29}, {60, 44, 10, 29},
  1958  			{60, 45, 10, 29}, {60, 46, 10, 29}, {60, 47, 10, 29}, {60, 48, 10, 29}, {60, 49, 10, 29},
  1959  			{60, 50, 10, 29}, {60, 51, 10, 29}, {60, 52, 10, 29}, {60, 53, 10, 29}, {60, 54, 10, 29},
  1960  			{60, 55, 10, 29}, {60, 56, 10, 29}, {60, 57, 10, 29}, {60, 58, 10, 29}, {60, 59, 10, 29},
  1961  			{61, 40, 10, 29}, {61, 41, 10, 29}, {61, 42, 10, 29}, {61, 43, 10, 29}, {61, 44, 10, 29},
  1962  			{61, 45, 10, 29}, {61, 46, 10, 29}, {61, 47, 10, 29}, {61, 48, 10, 29}, {61, 49, 10, 29},
  1963  			{61, 50, 10, 29}, {61, 51, 10, 29}, {61, 52, 10, 29}, {61, 53, 10, 29}, {61, 54, 10, 29},
  1964  			{61, 55, 10, 29}, {61, 56, 10, 29}, {61, 57, 10, 29}, {61, 58, 10, 29}, {61, 59, 10, 29},
  1965  			{62, 40, 10, 29}, {62, 41, 10, 29}, {62, 42, 10, 29}, {62, 43, 10, 29}, {62, 44, 10, 29},
  1966  			{62, 45, 10, 29}, {62, 46, 10, 29}, {62, 47, 10, 29}, {62, 48, 10, 29}, {62, 49, 10, 29},
  1967  			{62, 50, 10, 29}, {62, 51, 10, 29}, {62, 52, 10, 29}, {62, 53, 10, 29}, {62, 54, 10, 29},
  1968  			{62, 55, 10, 29}, {62, 56, 10, 29}, {62, 57, 10, 29}, {62, 58, 10, 29}, {62, 59, 10, 29},
  1969  			{63, 40, 10, 29}, {63, 41, 10, 29}, {63, 42, 10, 29}, {63, 43, 10, 29}, {63, 44, 10, 29},
  1970  			{63, 45, 10, 29}, {63, 46, 10, 29}, {63, 47, 10, 29}, {63, 48, 10, 29}, {63, 49, 10, 29},
  1971  			{63, 50, 10, 29}, {63, 51, 10, 29}, {63, 52, 10, 29}, {63, 53, 10, 29}, {63, 54, 10, 29},
  1972  			{63, 55, 10, 29}, {63, 56, 10, 29}, {63, 57, 10, 29}, {63, 58, 10, 29}, {63, 59, 10, 29},
  1973  			{64, 40, 10, 29}, {64, 41, 10, 29}, {64, 42, 10, 29}, {64, 43, 10, 29}, {64, 44, 10, 29},
  1974  			{64, 45, 10, 29}, {64, 46, 10, 29}, {64, 47, 10, 29}, {64, 48, 10, 29}, {64, 49, 10, 29},
  1975  			{64, 50, 10, 29}, {64, 51, 10, 29}, {64, 52, 10, 29}, {64, 53, 10, 29}, {64, 54, 10, 29},
  1976  			{64, 55, 10, 29}, {64, 56, 10, 29}, {64, 57, 10, 29}, {64, 58, 10, 29}, {64, 59, 10, 29},
  1977  			{65, 40, 10, 29}, {65, 41, 10, 29}, {65, 42, 10, 29}, {65, 43, 10, 29}, {65, 44, 10, 29},
  1978  			{65, 45, 10, 29}, {65, 46, 10, 29}, {65, 47, 10, 29}, {65, 48, 10, 29}, {65, 49, 10, 29},
  1979  			{65, 50, 10, 29}, {65, 51, 10, 29}, {65, 52, 10, 29}, {65, 53, 10, 29}, {65, 54, 10, 29},
  1980  			{65, 55, 10, 29}, {65, 56, 10, 29}, {65, 57, 10, 29}, {65, 58, 10, 29}, {65, 59, 10, 29},
  1981  			{66, 40, 10, 29}, {66, 41, 10, 29}, {66, 42, 10, 29}, {66, 43, 10, 29}, {66, 44, 10, 29},
  1982  			{66, 45, 10, 29}, {66, 46, 10, 29}, {66, 47, 10, 29}, {66, 48, 10, 29}, {66, 49, 10, 29},
  1983  			{66, 50, 10, 29}, {66, 51, 10, 29}, {66, 52, 10, 29}, {66, 53, 10, 29}, {66, 54, 10, 29},
  1984  			{66, 55, 10, 29}, {66, 56, 10, 29}, {66, 57, 10, 29}, {66, 58, 10, 29}, {66, 59, 10, 29},
  1985  			{67, 40, 10, 29}, {67, 41, 10, 29}, {67, 42, 10, 29}, {67, 43, 10, 29}, {67, 44, 10, 29},
  1986  			{67, 45, 10, 29}, {67, 46, 10, 29}, {67, 47, 10, 29}, {67, 48, 10, 29}, {67, 49, 10, 29},
  1987  			{67, 50, 10, 29}, {67, 51, 10, 29}, {67, 52, 10, 29}, {67, 53, 10, 29}, {67, 54, 10, 29},
  1988  			{67, 55, 10, 29}, {67, 56, 10, 29}, {67, 57, 10, 29}, {67, 58, 10, 29}, {67, 59, 10, 29},
  1989  			{68, 40, 10, 29}, {68, 41, 10, 29}, {68, 42, 10, 29}, {68, 43, 10, 29}, {68, 44, 10, 29},
  1990  			{68, 45, 10, 29}, {68, 46, 10, 29}, {68, 47, 10, 29}, {68, 48, 10, 29}, {68, 49, 10, 29},
  1991  			{68, 50, 10, 29}, {68, 51, 10, 29}, {68, 52, 10, 29}, {68, 53, 10, 29}, {68, 54, 10, 29},
  1992  			{68, 55, 10, 29}, {68, 56, 10, 29}, {68, 57, 10, 29}, {68, 58, 10, 29}, {68, 59, 10, 29},
  1993  			{69, 40, 10, 29}, {69, 41, 10, 29}, {69, 42, 10, 29}, {69, 43, 10, 29}, {69, 44, 10, 29},
  1994  			{69, 45, 10, 29}, {69, 46, 10, 29}, {69, 47, 10, 29}, {69, 48, 10, 29}, {69, 49, 10, 29},
  1995  			{69, 50, 10, 29}, {69, 51, 10, 29}, {69, 52, 10, 29}, {69, 53, 10, 29}, {69, 54, 10, 29},
  1996  			{69, 55, 10, 29}, {69, 56, 10, 29}, {69, 57, 10, 29}, {69, 58, 10, 29}, {69, 59, 10, 29},
  1997  			{70, 40, 10, 29}, {70, 41, 10, 29}, {70, 42, 10, 29}, {70, 43, 10, 29}, {70, 44, 10, 29},
  1998  			{70, 45, 10, 29}, {70, 46, 10, 29}, {70, 47, 10, 29}, {70, 48, 10, 29}, {70, 49, 10, 29},
  1999  			{70, 50, 10, 29}, {70, 51, 10, 29}, {70, 52, 10, 29}, {70, 53, 10, 29}, {70, 54, 10, 29},
  2000  			{70, 55, 10, 29}, {70, 56, 10, 29}, {70, 57, 10, 29}, {70, 58, 10, 29}, {70, 59, 10, 29},
  2001  			{71, 40, 10, 29}, {71, 41, 10, 29}, {71, 42, 10, 29}, {71, 43, 10, 29}, {71, 44, 10, 29},
  2002  			{71, 45, 10, 29}, {71, 46, 10, 29}, {71, 47, 10, 29}, {71, 48, 10, 29}, {71, 49, 10, 29},
  2003  			{71, 50, 10, 29}, {71, 51, 10, 29}, {71, 52, 10, 29}, {71, 53, 10, 29}, {71, 54, 10, 29},
  2004  			{71, 55, 10, 29}, {71, 56, 10, 29}, {71, 57, 10, 29}, {71, 58, 10, 29}, {71, 59, 10, 29},
  2005  			{72, 40, 10, 29}, {72, 41, 10, 29}, {72, 42, 10, 29}, {72, 43, 10, 29}, {72, 44, 10, 29},
  2006  			{72, 45, 10, 29}, {72, 46, 10, 29}, {72, 47, 10, 29}, {72, 48, 10, 29}, {72, 49, 10, 29},
  2007  			{72, 50, 10, 29}, {72, 51, 10, 29}, {72, 52, 10, 29}, {72, 53, 10, 29}, {72, 54, 10, 29},
  2008  			{72, 55, 10, 29}, {72, 56, 10, 29}, {72, 57, 10, 29}, {72, 58, 10, 29}, {72, 59, 10, 29},
  2009  			{73, 40, 10, 29}, {73, 41, 10, 29}, {73, 42, 10, 29}, {73, 43, 10, 29}, {73, 44, 10, 29},
  2010  			{73, 45, 10, 29}, {73, 46, 10, 29}, {73, 47, 10, 29}, {73, 48, 10, 29}, {73, 49, 10, 29},
  2011  			{73, 50, 10, 29}, {73, 51, 10, 29}, {73, 52, 10, 29}, {73, 53, 10, 29}, {73, 54, 10, 29},
  2012  			{73, 55, 10, 29}, {73, 56, 10, 29}, {73, 57, 10, 29}, {73, 58, 10, 29}, {73, 59, 10, 29},
  2013  			{74, 40, 10, 29}, {74, 41, 10, 29}, {74, 42, 10, 29}, {74, 43, 10, 29}, {74, 44, 10, 29},
  2014  			{74, 45, 10, 29}, {74, 46, 10, 29}, {74, 47, 10, 29}, {74, 48, 10, 29}, {74, 49, 10, 29},
  2015  			{74, 50, 10, 29}, {74, 51, 10, 29}, {74, 52, 10, 29}, {74, 53, 10, 29}, {74, 54, 10, 29},
  2016  			{74, 55, 10, 29}, {74, 56, 10, 29}, {74, 57, 10, 29}, {74, 58, 10, 29}, {74, 59, 10, 29},
  2017  			{75, 40, 10, 29}, {75, 41, 10, 29}, {75, 42, 10, 29}, {75, 43, 10, 29}, {75, 44, 10, 29},
  2018  			{75, 45, 10, 29}, {75, 46, 10, 29}, {75, 47, 10, 29}, {75, 48, 10, 29}, {75, 49, 10, 29},
  2019  			{75, 50, 10, 29}, {75, 51, 10, 29}, {75, 52, 10, 29}, {75, 53, 10, 29}, {75, 54, 10, 29},
  2020  			{75, 55, 10, 29}, {75, 56, 10, 29}, {75, 57, 10, 29}, {75, 58, 10, 29}, {75, 59, 10, 29},
  2021  			{76, 40, 10, 29}, {76, 41, 10, 29}, {76, 42, 10, 29}, {76, 43, 10, 29}, {76, 44, 10, 29},
  2022  			{76, 45, 10, 29}, {76, 46, 10, 29}, {76, 47, 10, 29}, {76, 48, 10, 29}, {76, 49, 10, 29},
  2023  			{76, 50, 10, 29}, {76, 51, 10, 29}, {76, 52, 10, 29}, {76, 53, 10, 29}, {76, 54, 10, 29},
  2024  			{76, 55, 10, 29}, {76, 56, 10, 29}, {76, 57, 10, 29}, {76, 58, 10, 29}, {76, 59, 10, 29},
  2025  			{77, 40, 10, 29}, {77, 41, 10, 29}, {77, 42, 10, 29}, {77, 43, 10, 29}, {77, 44, 10, 29},
  2026  			{77, 45, 10, 29}, {77, 46, 10, 29}, {77, 47, 10, 29}, {77, 48, 10, 29}, {77, 49, 10, 29},
  2027  			{77, 50, 10, 29}, {77, 51, 10, 29}, {77, 52, 10, 29}, {77, 53, 10, 29}, {77, 54, 10, 29},
  2028  			{77, 55, 10, 29}, {77, 56, 10, 29}, {77, 57, 10, 29}, {77, 58, 10, 29}, {77, 59, 10, 29},
  2029  			{78, 40, 10, 29}, {78, 41, 10, 29}, {78, 42, 10, 29}, {78, 43, 10, 29}, {78, 44, 10, 29},
  2030  			{78, 45, 10, 29}, {78, 46, 10, 29}, {78, 47, 10, 29}, {78, 48, 10, 29}, {78, 49, 10, 29},
  2031  			{78, 50, 10, 29}, {78, 51, 10, 29}, {78, 52, 10, 29}, {78, 53, 10, 29}, {78, 54, 10, 29},
  2032  			{78, 55, 10, 29}, {78, 56, 10, 29}, {78, 57, 10, 29}, {78, 58, 10, 29}, {78, 59, 10, 29},
  2033  			{79, 40, 10, 29}, {79, 41, 10, 29}, {79, 42, 10, 29}, {79, 43, 10, 29}, {79, 44, 10, 29},
  2034  			{79, 45, 10, 29}, {79, 46, 10, 29}, {79, 47, 10, 29}, {79, 48, 10, 29}, {79, 49, 10, 29},
  2035  			{79, 50, 10, 29}, {79, 51, 10, 29}, {79, 52, 10, 29}, {79, 53, 10, 29}, {79, 54, 10, 29},
  2036  			{79, 55, 10, 29}, {79, 56, 10, 29}, {79, 57, 10, 29}, {79, 58, 10, 29}, {79, 59, 10, 29},
  2037  			{80, 40, 10, 29}, {80, 41, 10, 29}, {80, 42, 10, 29}, {80, 43, 10, 29}, {80, 44, 10, 29},
  2038  			{80, 45, 10, 29}, {80, 46, 10, 29}, {80, 47, 10, 29}, {80, 48, 10, 29}, {80, 49, 10, 29},
  2039  			{80, 50, 10, 29}, {80, 51, 10, 29}, {80, 52, 10, 29}, {80, 53, 10, 29}, {80, 54, 10, 29},
  2040  			{80, 55, 10, 29}, {80, 56, 10, 29}, {80, 57, 10, 29}, {80, 58, 10, 29}, {80, 59, 10, 29},
  2041  			{81, 40, 10, 29}, {81, 41, 10, 29}, {81, 42, 10, 29}, {81, 43, 10, 29}, {81, 44, 10, 29},
  2042  			{81, 45, 10, 29}, {81, 46, 10, 29}, {81, 47, 10, 29}, {81, 48, 10, 29}, {81, 49, 10, 29},
  2043  			{81, 50, 10, 29}, {81, 51, 10, 29}, {81, 52, 10, 29}, {81, 53, 10, 29}, {81, 54, 10, 29},
  2044  			{81, 55, 10, 29}, {81, 56, 10, 29}, {81, 57, 10, 29}, {81, 58, 10, 29}, {81, 59, 10, 29},
  2045  			{82, 40, 10, 29}, {82, 41, 10, 29}, {82, 42, 10, 29}, {82, 43, 10, 29}, {82, 44, 10, 29},
  2046  			{82, 45, 10, 29}, {82, 46, 10, 29}, {82, 47, 10, 29}, {82, 48, 10, 29}, {82, 49, 10, 29},
  2047  			{82, 50, 10, 29}, {82, 51, 10, 29}, {82, 52, 10, 29}, {82, 53, 10, 29}, {82, 54, 10, 29},
  2048  			{82, 55, 10, 29}, {82, 56, 10, 29}, {82, 57, 10, 29}, {82, 58, 10, 29}, {82, 59, 10, 29},
  2049  			{83, 40, 10, 29}, {83, 41, 10, 29}, {83, 42, 10, 29}, {83, 43, 10, 29}, {83, 44, 10, 29},
  2050  			{83, 45, 10, 29}, {83, 46, 10, 29}, {83, 47, 10, 29}, {83, 48, 10, 29}, {83, 49, 10, 29},
  2051  			{83, 50, 10, 29}, {83, 51, 10, 29}, {83, 52, 10, 29}, {83, 53, 10, 29}, {83, 54, 10, 29},
  2052  			{83, 55, 10, 29}, {83, 56, 10, 29}, {83, 57, 10, 29}, {83, 58, 10, 29}, {83, 59, 10, 29},
  2053  			{84, 40, 10, 29}, {84, 41, 10, 29}, {84, 42, 10, 29}, {84, 43, 10, 29}, {84, 44, 10, 29},
  2054  			{84, 45, 10, 29}, {84, 46, 10, 29}, {84, 47, 10, 29}, {84, 48, 10, 29}, {84, 49, 10, 29},
  2055  			{84, 50, 10, 29}, {84, 51, 10, 29}, {84, 52, 10, 29}, {84, 53, 10, 29}, {84, 54, 10, 29},
  2056  			{84, 55, 10, 29}, {84, 56, 10, 29}, {84, 57, 10, 29}, {84, 58, 10, 29}, {84, 59, 10, 29},
  2057  			{85, 40, 10, 29}, {85, 41, 10, 29}, {85, 42, 10, 29}, {85, 43, 10, 29}, {85, 44, 10, 29},
  2058  			{85, 45, 10, 29}, {85, 46, 10, 29}, {85, 47, 10, 29}, {85, 48, 10, 29}, {85, 49, 10, 29},
  2059  			{85, 50, 10, 29}, {85, 51, 10, 29}, {85, 52, 10, 29}, {85, 53, 10, 29}, {85, 54, 10, 29},
  2060  			{85, 55, 10, 29}, {85, 56, 10, 29}, {85, 57, 10, 29}, {85, 58, 10, 29}, {85, 59, 10, 29},
  2061  			{86, 40, 10, 29}, {86, 41, 10, 29}, {86, 42, 10, 29}, {86, 43, 10, 29}, {86, 44, 10, 29},
  2062  			{86, 45, 10, 29}, {86, 46, 10, 29}, {86, 47, 10, 29}, {86, 48, 10, 29}, {86, 49, 10, 29},
  2063  			{86, 50, 10, 29}, {86, 51, 10, 29}, {86, 52, 10, 29}, {86, 53, 10, 29}, {86, 54, 10, 29},
  2064  			{86, 55, 10, 29}, {86, 56, 10, 29}, {86, 57, 10, 29}, {86, 58, 10, 29}, {86, 59, 10, 29},
  2065  			{87, 40, 10, 29}, {87, 41, 10, 29}, {87, 42, 10, 29}, {87, 43, 10, 29}, {87, 44, 10, 29},
  2066  			{87, 45, 10, 29}, {87, 46, 10, 29}, {87, 47, 10, 29}, {87, 48, 10, 29}, {87, 49, 10, 29},
  2067  			{87, 50, 10, 29}, {87, 51, 10, 29}, {87, 52, 10, 29}, {87, 53, 10, 29}, {87, 54, 10, 29},
  2068  			{87, 55, 10, 29}, {87, 56, 10, 29}, {87, 57, 10, 29}, {87, 58, 10, 29}, {87, 59, 10, 29},
  2069  			{88, 40, 10, 29}, {88, 41, 10, 29}, {88, 42, 10, 29}, {88, 43, 10, 29}, {88, 44, 10, 29},
  2070  			{88, 45, 10, 29}, {88, 46, 10, 29}, {88, 47, 10, 29}, {88, 48, 10, 29}, {88, 49, 10, 29},
  2071  			{88, 50, 10, 29}, {88, 51, 10, 29}, {88, 52, 10, 29}, {88, 53, 10, 29}, {88, 54, 10, 29},
  2072  			{88, 55, 10, 29}, {88, 56, 10, 29}, {88, 57, 10, 29}, {88, 58, 10, 29}, {88, 59, 10, 29},
  2073  			{89, 40, 10, 29}, {89, 41, 10, 29}, {89, 42, 10, 29}, {89, 43, 10, 29}, {89, 44, 10, 29},
  2074  			{89, 45, 10, 29}, {89, 46, 10, 29}, {89, 47, 10, 29}, {89, 48, 10, 29}, {89, 49, 10, 29},
  2075  			{89, 50, 10, 29}, {89, 51, 10, 29}, {89, 52, 10, 29}, {89, 53, 10, 29}, {89, 54, 10, 29},
  2076  			{89, 55, 10, 29}, {89, 56, 10, 29}, {89, 57, 10, 29}, {89, 58, 10, 29}, {89, 59, 10, 29},
  2077  		},
  2078  	}
  2079  	body2 = testBody{
  2080  		label:  2,
  2081  		offset: dvid.Point3d{30, 20, 40},
  2082  		size:   dvid.Point3d{50, 50, 20},
  2083  		blockSpans: []dvid.Span{
  2084  			{1, 0, 0, 2},
  2085  			{1, 1, 0, 2},
  2086  			{1, 2, 0, 2},
  2087  		},
  2088  		voxelSpans: []dvid.Span{
  2089  			{40, 20, 30, 31}, {40, 21, 30, 31}, {40, 22, 30, 31}, {40, 23, 30, 31}, {40, 24, 30, 31},
  2090  			{40, 25, 30, 31}, {40, 26, 30, 31}, {40, 27, 30, 31}, {40, 28, 30, 31}, {40, 29, 30, 31},
  2091  			{40, 30, 30, 31}, {40, 31, 30, 31}, {41, 20, 30, 31}, {41, 21, 30, 31}, {41, 22, 30, 31},
  2092  			{41, 23, 30, 31}, {41, 24, 30, 31}, {41, 25, 30, 31}, {41, 26, 30, 31}, {41, 27, 30, 31},
  2093  			{41, 28, 30, 31}, {41, 29, 30, 31}, {41, 30, 30, 31}, {41, 31, 30, 31}, {42, 20, 30, 31},
  2094  			{42, 21, 30, 31}, {42, 22, 30, 31}, {42, 23, 30, 31}, {42, 24, 30, 31}, {42, 25, 30, 31},
  2095  			{42, 26, 30, 31}, {42, 27, 30, 31}, {42, 28, 30, 31}, {42, 29, 30, 31}, {42, 30, 30, 31},
  2096  			{42, 31, 30, 31}, {43, 20, 30, 31}, {43, 21, 30, 31}, {43, 22, 30, 31}, {43, 23, 30, 31},
  2097  			{43, 24, 30, 31}, {43, 25, 30, 31}, {43, 26, 30, 31}, {43, 27, 30, 31}, {43, 28, 30, 31},
  2098  			{43, 29, 30, 31}, {43, 30, 30, 31}, {43, 31, 30, 31}, {44, 20, 30, 31}, {44, 21, 30, 31},
  2099  			{44, 22, 30, 31}, {44, 23, 30, 31}, {44, 24, 30, 31}, {44, 25, 30, 31}, {44, 26, 30, 31},
  2100  			{44, 27, 30, 31}, {44, 28, 30, 31}, {44, 29, 30, 31}, {44, 30, 30, 31}, {44, 31, 30, 31},
  2101  			{45, 20, 30, 31}, {45, 21, 30, 31}, {45, 22, 30, 31}, {45, 23, 30, 31}, {45, 24, 30, 31},
  2102  			{45, 25, 30, 31}, {45, 26, 30, 31}, {45, 27, 30, 31}, {45, 28, 30, 31}, {45, 29, 30, 31},
  2103  			{45, 30, 30, 31}, {45, 31, 30, 31}, {46, 20, 30, 31}, {46, 21, 30, 31}, {46, 22, 30, 31},
  2104  			{46, 23, 30, 31}, {46, 24, 30, 31}, {46, 25, 30, 31}, {46, 26, 30, 31}, {46, 27, 30, 31},
  2105  			{46, 28, 30, 31}, {46, 29, 30, 31}, {46, 30, 30, 31}, {46, 31, 30, 31}, {47, 20, 30, 31},
  2106  			{47, 21, 30, 31}, {47, 22, 30, 31}, {47, 23, 30, 31}, {47, 24, 30, 31}, {47, 25, 30, 31},
  2107  			{47, 26, 30, 31}, {47, 27, 30, 31}, {47, 28, 30, 31}, {47, 29, 30, 31}, {47, 30, 30, 31},
  2108  			{47, 31, 30, 31}, {48, 20, 30, 31}, {48, 21, 30, 31}, {48, 22, 30, 31}, {48, 23, 30, 31},
  2109  			{48, 24, 30, 31}, {48, 25, 30, 31}, {48, 26, 30, 31}, {48, 27, 30, 31}, {48, 28, 30, 31},
  2110  			{48, 29, 30, 31}, {48, 30, 30, 31}, {48, 31, 30, 31}, {49, 20, 30, 31}, {49, 21, 30, 31},
  2111  			{49, 22, 30, 31}, {49, 23, 30, 31}, {49, 24, 30, 31}, {49, 25, 30, 31}, {49, 26, 30, 31},
  2112  			{49, 27, 30, 31}, {49, 28, 30, 31}, {49, 29, 30, 31}, {49, 30, 30, 31}, {49, 31, 30, 31},
  2113  			{50, 20, 30, 31}, {50, 21, 30, 31}, {50, 22, 30, 31}, {50, 23, 30, 31}, {50, 24, 30, 31},
  2114  			{50, 25, 30, 31}, {50, 26, 30, 31}, {50, 27, 30, 31}, {50, 28, 30, 31}, {50, 29, 30, 31},
  2115  			{50, 30, 30, 31}, {50, 31, 30, 31}, {51, 20, 30, 31}, {51, 21, 30, 31}, {51, 22, 30, 31},
  2116  			{51, 23, 30, 31}, {51, 24, 30, 31}, {51, 25, 30, 31}, {51, 26, 30, 31}, {51, 27, 30, 31},
  2117  			{51, 28, 30, 31}, {51, 29, 30, 31}, {51, 30, 30, 31}, {51, 31, 30, 31}, {52, 20, 30, 31},
  2118  			{52, 21, 30, 31}, {52, 22, 30, 31}, {52, 23, 30, 31}, {52, 24, 30, 31}, {52, 25, 30, 31},
  2119  			{52, 26, 30, 31}, {52, 27, 30, 31}, {52, 28, 30, 31}, {52, 29, 30, 31}, {52, 30, 30, 31},
  2120  			{52, 31, 30, 31}, {53, 20, 30, 31}, {53, 21, 30, 31}, {53, 22, 30, 31}, {53, 23, 30, 31},
  2121  			{53, 24, 30, 31}, {53, 25, 30, 31}, {53, 26, 30, 31}, {53, 27, 30, 31}, {53, 28, 30, 31},
  2122  			{53, 29, 30, 31}, {53, 30, 30, 31}, {53, 31, 30, 31}, {54, 20, 30, 31}, {54, 21, 30, 31},
  2123  			{54, 22, 30, 31}, {54, 23, 30, 31}, {54, 24, 30, 31}, {54, 25, 30, 31}, {54, 26, 30, 31},
  2124  			{54, 27, 30, 31}, {54, 28, 30, 31}, {54, 29, 30, 31}, {54, 30, 30, 31}, {54, 31, 30, 31},
  2125  			{55, 20, 30, 31}, {55, 21, 30, 31}, {55, 22, 30, 31}, {55, 23, 30, 31}, {55, 24, 30, 31},
  2126  			{55, 25, 30, 31}, {55, 26, 30, 31}, {55, 27, 30, 31}, {55, 28, 30, 31}, {55, 29, 30, 31},
  2127  			{55, 30, 30, 31}, {55, 31, 30, 31}, {56, 20, 30, 31}, {56, 21, 30, 31}, {56, 22, 30, 31},
  2128  			{56, 23, 30, 31}, {56, 24, 30, 31}, {56, 25, 30, 31}, {56, 26, 30, 31}, {56, 27, 30, 31},
  2129  			{56, 28, 30, 31}, {56, 29, 30, 31}, {56, 30, 30, 31}, {56, 31, 30, 31}, {57, 20, 30, 31},
  2130  			{57, 21, 30, 31}, {57, 22, 30, 31}, {57, 23, 30, 31}, {57, 24, 30, 31}, {57, 25, 30, 31},
  2131  			{57, 26, 30, 31}, {57, 27, 30, 31}, {57, 28, 30, 31}, {57, 29, 30, 31}, {57, 30, 30, 31},
  2132  			{57, 31, 30, 31}, {58, 20, 30, 31}, {58, 21, 30, 31}, {58, 22, 30, 31}, {58, 23, 30, 31},
  2133  			{58, 24, 30, 31}, {58, 25, 30, 31}, {58, 26, 30, 31}, {58, 27, 30, 31}, {58, 28, 30, 31},
  2134  			{58, 29, 30, 31}, {58, 30, 30, 31}, {58, 31, 30, 31}, {59, 20, 30, 31}, {59, 21, 30, 31},
  2135  			{59, 22, 30, 31}, {59, 23, 30, 31}, {59, 24, 30, 31}, {59, 25, 30, 31}, {59, 26, 30, 31},
  2136  			{59, 27, 30, 31}, {59, 28, 30, 31}, {59, 29, 30, 31}, {59, 30, 30, 31}, {59, 31, 30, 31},
  2137  			{40, 20, 32, 63}, {40, 21, 32, 63}, {40, 22, 32, 63}, {40, 23, 32, 63}, {40, 24, 32, 63},
  2138  			{40, 25, 32, 63}, {40, 26, 32, 63}, {40, 27, 32, 63}, {40, 28, 32, 63}, {40, 29, 32, 63},
  2139  			{40, 30, 32, 63}, {40, 31, 32, 63}, {41, 20, 32, 63}, {41, 21, 32, 63}, {41, 22, 32, 63},
  2140  			{41, 23, 32, 63}, {41, 24, 32, 63}, {41, 25, 32, 63}, {41, 26, 32, 63}, {41, 27, 32, 63},
  2141  			{41, 28, 32, 63}, {41, 29, 32, 63}, {41, 30, 32, 63}, {41, 31, 32, 63}, {42, 20, 32, 63},
  2142  			{42, 21, 32, 63}, {42, 22, 32, 63}, {42, 23, 32, 63}, {42, 24, 32, 63}, {42, 25, 32, 63},
  2143  			{42, 26, 32, 63}, {42, 27, 32, 63}, {42, 28, 32, 63}, {42, 29, 32, 63}, {42, 30, 32, 63},
  2144  			{42, 31, 32, 63}, {43, 20, 32, 63}, {43, 21, 32, 63}, {43, 22, 32, 63}, {43, 23, 32, 63},
  2145  			{43, 24, 32, 63}, {43, 25, 32, 63}, {43, 26, 32, 63}, {43, 27, 32, 63}, {43, 28, 32, 63},
  2146  			{43, 29, 32, 63}, {43, 30, 32, 63}, {43, 31, 32, 63}, {44, 20, 32, 63}, {44, 21, 32, 63},
  2147  			{44, 22, 32, 63}, {44, 23, 32, 63}, {44, 24, 32, 63}, {44, 25, 32, 63}, {44, 26, 32, 63},
  2148  			{44, 27, 32, 63}, {44, 28, 32, 63}, {44, 29, 32, 63}, {44, 30, 32, 63}, {44, 31, 32, 63},
  2149  			{45, 20, 32, 63}, {45, 21, 32, 63}, {45, 22, 32, 63}, {45, 23, 32, 63}, {45, 24, 32, 63},
  2150  			{45, 25, 32, 63}, {45, 26, 32, 63}, {45, 27, 32, 63}, {45, 28, 32, 63}, {45, 29, 32, 63},
  2151  			{45, 30, 32, 63}, {45, 31, 32, 63}, {46, 20, 32, 63}, {46, 21, 32, 63}, {46, 22, 32, 63},
  2152  			{46, 23, 32, 63}, {46, 24, 32, 63}, {46, 25, 32, 63}, {46, 26, 32, 63}, {46, 27, 32, 63},
  2153  			{46, 28, 32, 63}, {46, 29, 32, 63}, {46, 30, 32, 63}, {46, 31, 32, 63}, {47, 20, 32, 63},
  2154  			{47, 21, 32, 63}, {47, 22, 32, 63}, {47, 23, 32, 63}, {47, 24, 32, 63}, {47, 25, 32, 63},
  2155  			{47, 26, 32, 63}, {47, 27, 32, 63}, {47, 28, 32, 63}, {47, 29, 32, 63}, {47, 30, 32, 63},
  2156  			{47, 31, 32, 63}, {48, 20, 32, 63}, {48, 21, 32, 63}, {48, 22, 32, 63}, {48, 23, 32, 63},
  2157  			{48, 24, 32, 63}, {48, 25, 32, 63}, {48, 26, 32, 63}, {48, 27, 32, 63}, {48, 28, 32, 63},
  2158  			{48, 29, 32, 63}, {48, 30, 32, 63}, {48, 31, 32, 63}, {49, 20, 32, 63}, {49, 21, 32, 63},
  2159  			{49, 22, 32, 63}, {49, 23, 32, 63}, {49, 24, 32, 63}, {49, 25, 32, 63}, {49, 26, 32, 63},
  2160  			{49, 27, 32, 63}, {49, 28, 32, 63}, {49, 29, 32, 63}, {49, 30, 32, 63}, {49, 31, 32, 63},
  2161  			{50, 20, 32, 63}, {50, 21, 32, 63}, {50, 22, 32, 63}, {50, 23, 32, 63}, {50, 24, 32, 63},
  2162  			{50, 25, 32, 63}, {50, 26, 32, 63}, {50, 27, 32, 63}, {50, 28, 32, 63}, {50, 29, 32, 63},
  2163  			{50, 30, 32, 63}, {50, 31, 32, 63}, {51, 20, 32, 63}, {51, 21, 32, 63}, {51, 22, 32, 63},
  2164  			{51, 23, 32, 63}, {51, 24, 32, 63}, {51, 25, 32, 63}, {51, 26, 32, 63}, {51, 27, 32, 63},
  2165  			{51, 28, 32, 63}, {51, 29, 32, 63}, {51, 30, 32, 63}, {51, 31, 32, 63}, {52, 20, 32, 63},
  2166  			{52, 21, 32, 63}, {52, 22, 32, 63}, {52, 23, 32, 63}, {52, 24, 32, 63}, {52, 25, 32, 63},
  2167  			{52, 26, 32, 63}, {52, 27, 32, 63}, {52, 28, 32, 63}, {52, 29, 32, 63}, {52, 30, 32, 63},
  2168  			{52, 31, 32, 63}, {53, 20, 32, 63}, {53, 21, 32, 63}, {53, 22, 32, 63}, {53, 23, 32, 63},
  2169  			{53, 24, 32, 63}, {53, 25, 32, 63}, {53, 26, 32, 63}, {53, 27, 32, 63}, {53, 28, 32, 63},
  2170  			{53, 29, 32, 63}, {53, 30, 32, 63}, {53, 31, 32, 63}, {54, 20, 32, 63}, {54, 21, 32, 63},
  2171  			{54, 22, 32, 63}, {54, 23, 32, 63}, {54, 24, 32, 63}, {54, 25, 32, 63}, {54, 26, 32, 63},
  2172  			{54, 27, 32, 63}, {54, 28, 32, 63}, {54, 29, 32, 63}, {54, 30, 32, 63}, {54, 31, 32, 63},
  2173  			{55, 20, 32, 63}, {55, 21, 32, 63}, {55, 22, 32, 63}, {55, 23, 32, 63}, {55, 24, 32, 63},
  2174  			{55, 25, 32, 63}, {55, 26, 32, 63}, {55, 27, 32, 63}, {55, 28, 32, 63}, {55, 29, 32, 63},
  2175  			{55, 30, 32, 63}, {55, 31, 32, 63}, {56, 20, 32, 63}, {56, 21, 32, 63}, {56, 22, 32, 63},
  2176  			{56, 23, 32, 63}, {56, 24, 32, 63}, {56, 25, 32, 63}, {56, 26, 32, 63}, {56, 27, 32, 63},
  2177  			{56, 28, 32, 63}, {56, 29, 32, 63}, {56, 30, 32, 63}, {56, 31, 32, 63}, {57, 20, 32, 63},
  2178  			{57, 21, 32, 63}, {57, 22, 32, 63}, {57, 23, 32, 63}, {57, 24, 32, 63}, {57, 25, 32, 63},
  2179  			{57, 26, 32, 63}, {57, 27, 32, 63}, {57, 28, 32, 63}, {57, 29, 32, 63}, {57, 30, 32, 63},
  2180  			{57, 31, 32, 63}, {58, 20, 32, 63}, {58, 21, 32, 63}, {58, 22, 32, 63}, {58, 23, 32, 63},
  2181  			{58, 24, 32, 63}, {58, 25, 32, 63}, {58, 26, 32, 63}, {58, 27, 32, 63}, {58, 28, 32, 63},
  2182  			{58, 29, 32, 63}, {58, 30, 32, 63}, {58, 31, 32, 63}, {59, 20, 32, 63}, {59, 21, 32, 63},
  2183  			{59, 22, 32, 63}, {59, 23, 32, 63}, {59, 24, 32, 63}, {59, 25, 32, 63}, {59, 26, 32, 63},
  2184  			{59, 27, 32, 63}, {59, 28, 32, 63}, {59, 29, 32, 63}, {59, 30, 32, 63}, {59, 31, 32, 63},
  2185  			{40, 20, 64, 79}, {40, 21, 64, 79}, {40, 22, 64, 79}, {40, 23, 64, 79}, {40, 24, 64, 79},
  2186  			{40, 25, 64, 79}, {40, 26, 64, 79}, {40, 27, 64, 79}, {40, 28, 64, 79}, {40, 29, 64, 79},
  2187  			{40, 30, 64, 79}, {40, 31, 64, 79}, {41, 20, 64, 79}, {41, 21, 64, 79}, {41, 22, 64, 79},
  2188  			{41, 23, 64, 79}, {41, 24, 64, 79}, {41, 25, 64, 79}, {41, 26, 64, 79}, {41, 27, 64, 79},
  2189  			{41, 28, 64, 79}, {41, 29, 64, 79}, {41, 30, 64, 79}, {41, 31, 64, 79}, {42, 20, 64, 79},
  2190  			{42, 21, 64, 79}, {42, 22, 64, 79}, {42, 23, 64, 79}, {42, 24, 64, 79}, {42, 25, 64, 79},
  2191  			{42, 26, 64, 79}, {42, 27, 64, 79}, {42, 28, 64, 79}, {42, 29, 64, 79}, {42, 30, 64, 79},
  2192  			{42, 31, 64, 79}, {43, 20, 64, 79}, {43, 21, 64, 79}, {43, 22, 64, 79}, {43, 23, 64, 79},
  2193  			{43, 24, 64, 79}, {43, 25, 64, 79}, {43, 26, 64, 79}, {43, 27, 64, 79}, {43, 28, 64, 79},
  2194  			{43, 29, 64, 79}, {43, 30, 64, 79}, {43, 31, 64, 79}, {44, 20, 64, 79}, {44, 21, 64, 79},
  2195  			{44, 22, 64, 79}, {44, 23, 64, 79}, {44, 24, 64, 79}, {44, 25, 64, 79}, {44, 26, 64, 79},
  2196  			{44, 27, 64, 79}, {44, 28, 64, 79}, {44, 29, 64, 79}, {44, 30, 64, 79}, {44, 31, 64, 79},
  2197  			{45, 20, 64, 79}, {45, 21, 64, 79}, {45, 22, 64, 79}, {45, 23, 64, 79}, {45, 24, 64, 79},
  2198  			{45, 25, 64, 79}, {45, 26, 64, 79}, {45, 27, 64, 79}, {45, 28, 64, 79}, {45, 29, 64, 79},
  2199  			{45, 30, 64, 79}, {45, 31, 64, 79}, {46, 20, 64, 79}, {46, 21, 64, 79}, {46, 22, 64, 79},
  2200  			{46, 23, 64, 79}, {46, 24, 64, 79}, {46, 25, 64, 79}, {46, 26, 64, 79}, {46, 27, 64, 79},
  2201  			{46, 28, 64, 79}, {46, 29, 64, 79}, {46, 30, 64, 79}, {46, 31, 64, 79}, {47, 20, 64, 79},
  2202  			{47, 21, 64, 79}, {47, 22, 64, 79}, {47, 23, 64, 79}, {47, 24, 64, 79}, {47, 25, 64, 79},
  2203  			{47, 26, 64, 79}, {47, 27, 64, 79}, {47, 28, 64, 79}, {47, 29, 64, 79}, {47, 30, 64, 79},
  2204  			{47, 31, 64, 79}, {48, 20, 64, 79}, {48, 21, 64, 79}, {48, 22, 64, 79}, {48, 23, 64, 79},
  2205  			{48, 24, 64, 79}, {48, 25, 64, 79}, {48, 26, 64, 79}, {48, 27, 64, 79}, {48, 28, 64, 79},
  2206  			{48, 29, 64, 79}, {48, 30, 64, 79}, {48, 31, 64, 79}, {49, 20, 64, 79}, {49, 21, 64, 79},
  2207  			{49, 22, 64, 79}, {49, 23, 64, 79}, {49, 24, 64, 79}, {49, 25, 64, 79}, {49, 26, 64, 79},
  2208  			{49, 27, 64, 79}, {49, 28, 64, 79}, {49, 29, 64, 79}, {49, 30, 64, 79}, {49, 31, 64, 79},
  2209  			{50, 20, 64, 79}, {50, 21, 64, 79}, {50, 22, 64, 79}, {50, 23, 64, 79}, {50, 24, 64, 79},
  2210  			{50, 25, 64, 79}, {50, 26, 64, 79}, {50, 27, 64, 79}, {50, 28, 64, 79}, {50, 29, 64, 79},
  2211  			{50, 30, 64, 79}, {50, 31, 64, 79}, {51, 20, 64, 79}, {51, 21, 64, 79}, {51, 22, 64, 79},
  2212  			{51, 23, 64, 79}, {51, 24, 64, 79}, {51, 25, 64, 79}, {51, 26, 64, 79}, {51, 27, 64, 79},
  2213  			{51, 28, 64, 79}, {51, 29, 64, 79}, {51, 30, 64, 79}, {51, 31, 64, 79}, {52, 20, 64, 79},
  2214  			{52, 21, 64, 79}, {52, 22, 64, 79}, {52, 23, 64, 79}, {52, 24, 64, 79}, {52, 25, 64, 79},
  2215  			{52, 26, 64, 79}, {52, 27, 64, 79}, {52, 28, 64, 79}, {52, 29, 64, 79}, {52, 30, 64, 79},
  2216  			{52, 31, 64, 79}, {53, 20, 64, 79}, {53, 21, 64, 79}, {53, 22, 64, 79}, {53, 23, 64, 79},
  2217  			{53, 24, 64, 79}, {53, 25, 64, 79}, {53, 26, 64, 79}, {53, 27, 64, 79}, {53, 28, 64, 79},
  2218  			{53, 29, 64, 79}, {53, 30, 64, 79}, {53, 31, 64, 79}, {54, 20, 64, 79}, {54, 21, 64, 79},
  2219  			{54, 22, 64, 79}, {54, 23, 64, 79}, {54, 24, 64, 79}, {54, 25, 64, 79}, {54, 26, 64, 79},
  2220  			{54, 27, 64, 79}, {54, 28, 64, 79}, {54, 29, 64, 79}, {54, 30, 64, 79}, {54, 31, 64, 79},
  2221  			{55, 20, 64, 79}, {55, 21, 64, 79}, {55, 22, 64, 79}, {55, 23, 64, 79}, {55, 24, 64, 79},
  2222  			{55, 25, 64, 79}, {55, 26, 64, 79}, {55, 27, 64, 79}, {55, 28, 64, 79}, {55, 29, 64, 79},
  2223  			{55, 30, 64, 79}, {55, 31, 64, 79}, {56, 20, 64, 79}, {56, 21, 64, 79}, {56, 22, 64, 79},
  2224  			{56, 23, 64, 79}, {56, 24, 64, 79}, {56, 25, 64, 79}, {56, 26, 64, 79}, {56, 27, 64, 79},
  2225  			{56, 28, 64, 79}, {56, 29, 64, 79}, {56, 30, 64, 79}, {56, 31, 64, 79}, {57, 20, 64, 79},
  2226  			{57, 21, 64, 79}, {57, 22, 64, 79}, {57, 23, 64, 79}, {57, 24, 64, 79}, {57, 25, 64, 79},
  2227  			{57, 26, 64, 79}, {57, 27, 64, 79}, {57, 28, 64, 79}, {57, 29, 64, 79}, {57, 30, 64, 79},
  2228  			{57, 31, 64, 79}, {58, 20, 64, 79}, {58, 21, 64, 79}, {58, 22, 64, 79}, {58, 23, 64, 79},
  2229  			{58, 24, 64, 79}, {58, 25, 64, 79}, {58, 26, 64, 79}, {58, 27, 64, 79}, {58, 28, 64, 79},
  2230  			{58, 29, 64, 79}, {58, 30, 64, 79}, {58, 31, 64, 79}, {59, 20, 64, 79}, {59, 21, 64, 79},
  2231  			{59, 22, 64, 79}, {59, 23, 64, 79}, {59, 24, 64, 79}, {59, 25, 64, 79}, {59, 26, 64, 79},
  2232  			{59, 27, 64, 79}, {59, 28, 64, 79}, {59, 29, 64, 79}, {59, 30, 64, 79}, {59, 31, 64, 79},
  2233  			{40, 32, 30, 31}, {40, 33, 30, 31}, {40, 34, 30, 31}, {40, 35, 30, 31}, {40, 36, 30, 31},
  2234  			{40, 37, 30, 31}, {40, 38, 30, 31}, {40, 39, 30, 31}, {40, 40, 30, 31}, {40, 41, 30, 31},
  2235  			{40, 42, 30, 31}, {40, 43, 30, 31}, {40, 44, 30, 31}, {40, 45, 30, 31}, {40, 46, 30, 31},
  2236  			{40, 47, 30, 31}, {40, 48, 30, 31}, {40, 49, 30, 31}, {40, 50, 30, 31}, {40, 51, 30, 31},
  2237  			{40, 52, 30, 31}, {40, 53, 30, 31}, {40, 54, 30, 31}, {40, 55, 30, 31}, {40, 56, 30, 31},
  2238  			{40, 57, 30, 31}, {40, 58, 30, 31}, {40, 59, 30, 31}, {40, 60, 30, 31}, {40, 61, 30, 31},
  2239  			{40, 62, 30, 31}, {40, 63, 30, 31}, {41, 32, 30, 31}, {41, 33, 30, 31}, {41, 34, 30, 31},
  2240  			{41, 35, 30, 31}, {41, 36, 30, 31}, {41, 37, 30, 31}, {41, 38, 30, 31}, {41, 39, 30, 31},
  2241  			{41, 40, 30, 31}, {41, 41, 30, 31}, {41, 42, 30, 31}, {41, 43, 30, 31}, {41, 44, 30, 31},
  2242  			{41, 45, 30, 31}, {41, 46, 30, 31}, {41, 47, 30, 31}, {41, 48, 30, 31}, {41, 49, 30, 31},
  2243  			{41, 50, 30, 31}, {41, 51, 30, 31}, {41, 52, 30, 31}, {41, 53, 30, 31}, {41, 54, 30, 31},
  2244  			{41, 55, 30, 31}, {41, 56, 30, 31}, {41, 57, 30, 31}, {41, 58, 30, 31}, {41, 59, 30, 31},
  2245  			{41, 60, 30, 31}, {41, 61, 30, 31}, {41, 62, 30, 31}, {41, 63, 30, 31}, {42, 32, 30, 31},
  2246  			{42, 33, 30, 31}, {42, 34, 30, 31}, {42, 35, 30, 31}, {42, 36, 30, 31}, {42, 37, 30, 31},
  2247  			{42, 38, 30, 31}, {42, 39, 30, 31}, {42, 40, 30, 31}, {42, 41, 30, 31}, {42, 42, 30, 31},
  2248  			{42, 43, 30, 31}, {42, 44, 30, 31}, {42, 45, 30, 31}, {42, 46, 30, 31}, {42, 47, 30, 31},
  2249  			{42, 48, 30, 31}, {42, 49, 30, 31}, {42, 50, 30, 31}, {42, 51, 30, 31}, {42, 52, 30, 31},
  2250  			{42, 53, 30, 31}, {42, 54, 30, 31}, {42, 55, 30, 31}, {42, 56, 30, 31}, {42, 57, 30, 31},
  2251  			{42, 58, 30, 31}, {42, 59, 30, 31}, {42, 60, 30, 31}, {42, 61, 30, 31}, {42, 62, 30, 31},
  2252  			{42, 63, 30, 31}, {43, 32, 30, 31}, {43, 33, 30, 31}, {43, 34, 30, 31}, {43, 35, 30, 31},
  2253  			{43, 36, 30, 31}, {43, 37, 30, 31}, {43, 38, 30, 31}, {43, 39, 30, 31}, {43, 40, 30, 31},
  2254  			{43, 41, 30, 31}, {43, 42, 30, 31}, {43, 43, 30, 31}, {43, 44, 30, 31}, {43, 45, 30, 31},
  2255  			{43, 46, 30, 31}, {43, 47, 30, 31}, {43, 48, 30, 31}, {43, 49, 30, 31}, {43, 50, 30, 31},
  2256  			{43, 51, 30, 31}, {43, 52, 30, 31}, {43, 53, 30, 31}, {43, 54, 30, 31}, {43, 55, 30, 31},
  2257  			{43, 56, 30, 31}, {43, 57, 30, 31}, {43, 58, 30, 31}, {43, 59, 30, 31}, {43, 60, 30, 31},
  2258  			{43, 61, 30, 31}, {43, 62, 30, 31}, {43, 63, 30, 31}, {44, 32, 30, 31}, {44, 33, 30, 31},
  2259  			{44, 34, 30, 31}, {44, 35, 30, 31}, {44, 36, 30, 31}, {44, 37, 30, 31}, {44, 38, 30, 31},
  2260  			{44, 39, 30, 31}, {44, 40, 30, 31}, {44, 41, 30, 31}, {44, 42, 30, 31}, {44, 43, 30, 31},
  2261  			{44, 44, 30, 31}, {44, 45, 30, 31}, {44, 46, 30, 31}, {44, 47, 30, 31}, {44, 48, 30, 31},
  2262  			{44, 49, 30, 31}, {44, 50, 30, 31}, {44, 51, 30, 31}, {44, 52, 30, 31}, {44, 53, 30, 31},
  2263  			{44, 54, 30, 31}, {44, 55, 30, 31}, {44, 56, 30, 31}, {44, 57, 30, 31}, {44, 58, 30, 31},
  2264  			{44, 59, 30, 31}, {44, 60, 30, 31}, {44, 61, 30, 31}, {44, 62, 30, 31}, {44, 63, 30, 31},
  2265  			{45, 32, 30, 31}, {45, 33, 30, 31}, {45, 34, 30, 31}, {45, 35, 30, 31}, {45, 36, 30, 31},
  2266  			{45, 37, 30, 31}, {45, 38, 30, 31}, {45, 39, 30, 31}, {45, 40, 30, 31}, {45, 41, 30, 31},
  2267  			{45, 42, 30, 31}, {45, 43, 30, 31}, {45, 44, 30, 31}, {45, 45, 30, 31}, {45, 46, 30, 31},
  2268  			{45, 47, 30, 31}, {45, 48, 30, 31}, {45, 49, 30, 31}, {45, 50, 30, 31}, {45, 51, 30, 31},
  2269  			{45, 52, 30, 31}, {45, 53, 30, 31}, {45, 54, 30, 31}, {45, 55, 30, 31}, {45, 56, 30, 31},
  2270  			{45, 57, 30, 31}, {45, 58, 30, 31}, {45, 59, 30, 31}, {45, 60, 30, 31}, {45, 61, 30, 31},
  2271  			{45, 62, 30, 31}, {45, 63, 30, 31}, {46, 32, 30, 31}, {46, 33, 30, 31}, {46, 34, 30, 31},
  2272  			{46, 35, 30, 31}, {46, 36, 30, 31}, {46, 37, 30, 31}, {46, 38, 30, 31}, {46, 39, 30, 31},
  2273  			{46, 40, 30, 31}, {46, 41, 30, 31}, {46, 42, 30, 31}, {46, 43, 30, 31}, {46, 44, 30, 31},
  2274  			{46, 45, 30, 31}, {46, 46, 30, 31}, {46, 47, 30, 31}, {46, 48, 30, 31}, {46, 49, 30, 31},
  2275  			{46, 50, 30, 31}, {46, 51, 30, 31}, {46, 52, 30, 31}, {46, 53, 30, 31}, {46, 54, 30, 31},
  2276  			{46, 55, 30, 31}, {46, 56, 30, 31}, {46, 57, 30, 31}, {46, 58, 30, 31}, {46, 59, 30, 31},
  2277  			{46, 60, 30, 31}, {46, 61, 30, 31}, {46, 62, 30, 31}, {46, 63, 30, 31}, {47, 32, 30, 31},
  2278  			{47, 33, 30, 31}, {47, 34, 30, 31}, {47, 35, 30, 31}, {47, 36, 30, 31}, {47, 37, 30, 31},
  2279  			{47, 38, 30, 31}, {47, 39, 30, 31}, {47, 40, 30, 31}, {47, 41, 30, 31}, {47, 42, 30, 31},
  2280  			{47, 43, 30, 31}, {47, 44, 30, 31}, {47, 45, 30, 31}, {47, 46, 30, 31}, {47, 47, 30, 31},
  2281  			{47, 48, 30, 31}, {47, 49, 30, 31}, {47, 50, 30, 31}, {47, 51, 30, 31}, {47, 52, 30, 31},
  2282  			{47, 53, 30, 31}, {47, 54, 30, 31}, {47, 55, 30, 31}, {47, 56, 30, 31}, {47, 57, 30, 31},
  2283  			{47, 58, 30, 31}, {47, 59, 30, 31}, {47, 60, 30, 31}, {47, 61, 30, 31}, {47, 62, 30, 31},
  2284  			{47, 63, 30, 31}, {48, 32, 30, 31}, {48, 33, 30, 31}, {48, 34, 30, 31}, {48, 35, 30, 31},
  2285  			{48, 36, 30, 31}, {48, 37, 30, 31}, {48, 38, 30, 31}, {48, 39, 30, 31}, {48, 40, 30, 31},
  2286  			{48, 41, 30, 31}, {48, 42, 30, 31}, {48, 43, 30, 31}, {48, 44, 30, 31}, {48, 45, 30, 31},
  2287  			{48, 46, 30, 31}, {48, 47, 30, 31}, {48, 48, 30, 31}, {48, 49, 30, 31}, {48, 50, 30, 31},
  2288  			{48, 51, 30, 31}, {48, 52, 30, 31}, {48, 53, 30, 31}, {48, 54, 30, 31}, {48, 55, 30, 31},
  2289  			{48, 56, 30, 31}, {48, 57, 30, 31}, {48, 58, 30, 31}, {48, 59, 30, 31}, {48, 60, 30, 31},
  2290  			{48, 61, 30, 31}, {48, 62, 30, 31}, {48, 63, 30, 31}, {49, 32, 30, 31}, {49, 33, 30, 31},
  2291  			{49, 34, 30, 31}, {49, 35, 30, 31}, {49, 36, 30, 31}, {49, 37, 30, 31}, {49, 38, 30, 31},
  2292  			{49, 39, 30, 31}, {49, 40, 30, 31}, {49, 41, 30, 31}, {49, 42, 30, 31}, {49, 43, 30, 31},
  2293  			{49, 44, 30, 31}, {49, 45, 30, 31}, {49, 46, 30, 31}, {49, 47, 30, 31}, {49, 48, 30, 31},
  2294  			{49, 49, 30, 31}, {49, 50, 30, 31}, {49, 51, 30, 31}, {49, 52, 30, 31}, {49, 53, 30, 31},
  2295  			{49, 54, 30, 31}, {49, 55, 30, 31}, {49, 56, 30, 31}, {49, 57, 30, 31}, {49, 58, 30, 31},
  2296  			{49, 59, 30, 31}, {49, 60, 30, 31}, {49, 61, 30, 31}, {49, 62, 30, 31}, {49, 63, 30, 31},
  2297  			{50, 32, 30, 31}, {50, 33, 30, 31}, {50, 34, 30, 31}, {50, 35, 30, 31}, {50, 36, 30, 31},
  2298  			{50, 37, 30, 31}, {50, 38, 30, 31}, {50, 39, 30, 31}, {50, 40, 30, 31}, {50, 41, 30, 31},
  2299  			{50, 42, 30, 31}, {50, 43, 30, 31}, {50, 44, 30, 31}, {50, 45, 30, 31}, {50, 46, 30, 31},
  2300  			{50, 47, 30, 31}, {50, 48, 30, 31}, {50, 49, 30, 31}, {50, 50, 30, 31}, {50, 51, 30, 31},
  2301  			{50, 52, 30, 31}, {50, 53, 30, 31}, {50, 54, 30, 31}, {50, 55, 30, 31}, {50, 56, 30, 31},
  2302  			{50, 57, 30, 31}, {50, 58, 30, 31}, {50, 59, 30, 31}, {50, 60, 30, 31}, {50, 61, 30, 31},
  2303  			{50, 62, 30, 31}, {50, 63, 30, 31}, {51, 32, 30, 31}, {51, 33, 30, 31}, {51, 34, 30, 31},
  2304  			{51, 35, 30, 31}, {51, 36, 30, 31}, {51, 37, 30, 31}, {51, 38, 30, 31}, {51, 39, 30, 31},
  2305  			{51, 40, 30, 31}, {51, 41, 30, 31}, {51, 42, 30, 31}, {51, 43, 30, 31}, {51, 44, 30, 31},
  2306  			{51, 45, 30, 31}, {51, 46, 30, 31}, {51, 47, 30, 31}, {51, 48, 30, 31}, {51, 49, 30, 31},
  2307  			{51, 50, 30, 31}, {51, 51, 30, 31}, {51, 52, 30, 31}, {51, 53, 30, 31}, {51, 54, 30, 31},
  2308  			{51, 55, 30, 31}, {51, 56, 30, 31}, {51, 57, 30, 31}, {51, 58, 30, 31}, {51, 59, 30, 31},
  2309  			{51, 60, 30, 31}, {51, 61, 30, 31}, {51, 62, 30, 31}, {51, 63, 30, 31}, {52, 32, 30, 31},
  2310  			{52, 33, 30, 31}, {52, 34, 30, 31}, {52, 35, 30, 31}, {52, 36, 30, 31}, {52, 37, 30, 31},
  2311  			{52, 38, 30, 31}, {52, 39, 30, 31}, {52, 40, 30, 31}, {52, 41, 30, 31}, {52, 42, 30, 31},
  2312  			{52, 43, 30, 31}, {52, 44, 30, 31}, {52, 45, 30, 31}, {52, 46, 30, 31}, {52, 47, 30, 31},
  2313  			{52, 48, 30, 31}, {52, 49, 30, 31}, {52, 50, 30, 31}, {52, 51, 30, 31}, {52, 52, 30, 31},
  2314  			{52, 53, 30, 31}, {52, 54, 30, 31}, {52, 55, 30, 31}, {52, 56, 30, 31}, {52, 57, 30, 31},
  2315  			{52, 58, 30, 31}, {52, 59, 30, 31}, {52, 60, 30, 31}, {52, 61, 30, 31}, {52, 62, 30, 31},
  2316  			{52, 63, 30, 31}, {53, 32, 30, 31}, {53, 33, 30, 31}, {53, 34, 30, 31}, {53, 35, 30, 31},
  2317  			{53, 36, 30, 31}, {53, 37, 30, 31}, {53, 38, 30, 31}, {53, 39, 30, 31}, {53, 40, 30, 31},
  2318  			{53, 41, 30, 31}, {53, 42, 30, 31}, {53, 43, 30, 31}, {53, 44, 30, 31}, {53, 45, 30, 31},
  2319  			{53, 46, 30, 31}, {53, 47, 30, 31}, {53, 48, 30, 31}, {53, 49, 30, 31}, {53, 50, 30, 31},
  2320  			{53, 51, 30, 31}, {53, 52, 30, 31}, {53, 53, 30, 31}, {53, 54, 30, 31}, {53, 55, 30, 31},
  2321  			{53, 56, 30, 31}, {53, 57, 30, 31}, {53, 58, 30, 31}, {53, 59, 30, 31}, {53, 60, 30, 31},
  2322  			{53, 61, 30, 31}, {53, 62, 30, 31}, {53, 63, 30, 31}, {54, 32, 30, 31}, {54, 33, 30, 31},
  2323  			{54, 34, 30, 31}, {54, 35, 30, 31}, {54, 36, 30, 31}, {54, 37, 30, 31}, {54, 38, 30, 31},
  2324  			{54, 39, 30, 31}, {54, 40, 30, 31}, {54, 41, 30, 31}, {54, 42, 30, 31}, {54, 43, 30, 31},
  2325  			{54, 44, 30, 31}, {54, 45, 30, 31}, {54, 46, 30, 31}, {54, 47, 30, 31}, {54, 48, 30, 31},
  2326  			{54, 49, 30, 31}, {54, 50, 30, 31}, {54, 51, 30, 31}, {54, 52, 30, 31}, {54, 53, 30, 31},
  2327  			{54, 54, 30, 31}, {54, 55, 30, 31}, {54, 56, 30, 31}, {54, 57, 30, 31}, {54, 58, 30, 31},
  2328  			{54, 59, 30, 31}, {54, 60, 30, 31}, {54, 61, 30, 31}, {54, 62, 30, 31}, {54, 63, 30, 31},
  2329  			{55, 32, 30, 31}, {55, 33, 30, 31}, {55, 34, 30, 31}, {55, 35, 30, 31}, {55, 36, 30, 31},
  2330  			{55, 37, 30, 31}, {55, 38, 30, 31}, {55, 39, 30, 31}, {55, 40, 30, 31}, {55, 41, 30, 31},
  2331  			{55, 42, 30, 31}, {55, 43, 30, 31}, {55, 44, 30, 31}, {55, 45, 30, 31}, {55, 46, 30, 31},
  2332  			{55, 47, 30, 31}, {55, 48, 30, 31}, {55, 49, 30, 31}, {55, 50, 30, 31}, {55, 51, 30, 31},
  2333  			{55, 52, 30, 31}, {55, 53, 30, 31}, {55, 54, 30, 31}, {55, 55, 30, 31}, {55, 56, 30, 31},
  2334  			{55, 57, 30, 31}, {55, 58, 30, 31}, {55, 59, 30, 31}, {55, 60, 30, 31}, {55, 61, 30, 31},
  2335  			{55, 62, 30, 31}, {55, 63, 30, 31}, {56, 32, 30, 31}, {56, 33, 30, 31}, {56, 34, 30, 31},
  2336  			{56, 35, 30, 31}, {56, 36, 30, 31}, {56, 37, 30, 31}, {56, 38, 30, 31}, {56, 39, 30, 31},
  2337  			{56, 40, 30, 31}, {56, 41, 30, 31}, {56, 42, 30, 31}, {56, 43, 30, 31}, {56, 44, 30, 31},
  2338  			{56, 45, 30, 31}, {56, 46, 30, 31}, {56, 47, 30, 31}, {56, 48, 30, 31}, {56, 49, 30, 31},
  2339  			{56, 50, 30, 31}, {56, 51, 30, 31}, {56, 52, 30, 31}, {56, 53, 30, 31}, {56, 54, 30, 31},
  2340  			{56, 55, 30, 31}, {56, 56, 30, 31}, {56, 57, 30, 31}, {56, 58, 30, 31}, {56, 59, 30, 31},
  2341  			{56, 60, 30, 31}, {56, 61, 30, 31}, {56, 62, 30, 31}, {56, 63, 30, 31}, {57, 32, 30, 31},
  2342  			{57, 33, 30, 31}, {57, 34, 30, 31}, {57, 35, 30, 31}, {57, 36, 30, 31}, {57, 37, 30, 31},
  2343  			{57, 38, 30, 31}, {57, 39, 30, 31}, {57, 40, 30, 31}, {57, 41, 30, 31}, {57, 42, 30, 31},
  2344  			{57, 43, 30, 31}, {57, 44, 30, 31}, {57, 45, 30, 31}, {57, 46, 30, 31}, {57, 47, 30, 31},
  2345  			{57, 48, 30, 31}, {57, 49, 30, 31}, {57, 50, 30, 31}, {57, 51, 30, 31}, {57, 52, 30, 31},
  2346  			{57, 53, 30, 31}, {57, 54, 30, 31}, {57, 55, 30, 31}, {57, 56, 30, 31}, {57, 57, 30, 31},
  2347  			{57, 58, 30, 31}, {57, 59, 30, 31}, {57, 60, 30, 31}, {57, 61, 30, 31}, {57, 62, 30, 31},
  2348  			{57, 63, 30, 31}, {58, 32, 30, 31}, {58, 33, 30, 31}, {58, 34, 30, 31}, {58, 35, 30, 31},
  2349  			{58, 36, 30, 31}, {58, 37, 30, 31}, {58, 38, 30, 31}, {58, 39, 30, 31}, {58, 40, 30, 31},
  2350  			{58, 41, 30, 31}, {58, 42, 30, 31}, {58, 43, 30, 31}, {58, 44, 30, 31}, {58, 45, 30, 31},
  2351  			{58, 46, 30, 31}, {58, 47, 30, 31}, {58, 48, 30, 31}, {58, 49, 30, 31}, {58, 50, 30, 31},
  2352  			{58, 51, 30, 31}, {58, 52, 30, 31}, {58, 53, 30, 31}, {58, 54, 30, 31}, {58, 55, 30, 31},
  2353  			{58, 56, 30, 31}, {58, 57, 30, 31}, {58, 58, 30, 31}, {58, 59, 30, 31}, {58, 60, 30, 31},
  2354  			{58, 61, 30, 31}, {58, 62, 30, 31}, {58, 63, 30, 31}, {59, 32, 30, 31}, {59, 33, 30, 31},
  2355  			{59, 34, 30, 31}, {59, 35, 30, 31}, {59, 36, 30, 31}, {59, 37, 30, 31}, {59, 38, 30, 31},
  2356  			{59, 39, 30, 31}, {59, 40, 30, 31}, {59, 41, 30, 31}, {59, 42, 30, 31}, {59, 43, 30, 31},
  2357  			{59, 44, 30, 31}, {59, 45, 30, 31}, {59, 46, 30, 31}, {59, 47, 30, 31}, {59, 48, 30, 31},
  2358  			{59, 49, 30, 31}, {59, 50, 30, 31}, {59, 51, 30, 31}, {59, 52, 30, 31}, {59, 53, 30, 31},
  2359  			{59, 54, 30, 31}, {59, 55, 30, 31}, {59, 56, 30, 31}, {59, 57, 30, 31}, {59, 58, 30, 31},
  2360  			{59, 59, 30, 31}, {59, 60, 30, 31}, {59, 61, 30, 31}, {59, 62, 30, 31}, {59, 63, 30, 31},
  2361  			{40, 32, 32, 63}, {40, 33, 32, 63}, {40, 34, 32, 63}, {40, 35, 32, 63}, {40, 36, 32, 63},
  2362  			{40, 37, 32, 63}, {40, 38, 32, 63}, {40, 39, 32, 63}, {40, 40, 32, 63}, {40, 41, 32, 63},
  2363  			{40, 42, 32, 63}, {40, 43, 32, 63}, {40, 44, 32, 63}, {40, 45, 32, 63}, {40, 46, 32, 63},
  2364  			{40, 47, 32, 63}, {40, 48, 32, 63}, {40, 49, 32, 63}, {40, 50, 32, 63}, {40, 51, 32, 63},
  2365  			{40, 52, 32, 63}, {40, 53, 32, 63}, {40, 54, 32, 63}, {40, 55, 32, 63}, {40, 56, 32, 63},
  2366  			{40, 57, 32, 63}, {40, 58, 32, 63}, {40, 59, 32, 63}, {40, 60, 32, 63}, {40, 61, 32, 63},
  2367  			{40, 62, 32, 63}, {40, 63, 32, 63}, {41, 32, 32, 63}, {41, 33, 32, 63}, {41, 34, 32, 63},
  2368  			{41, 35, 32, 63}, {41, 36, 32, 63}, {41, 37, 32, 63}, {41, 38, 32, 63}, {41, 39, 32, 63},
  2369  			{41, 40, 32, 63}, {41, 41, 32, 63}, {41, 42, 32, 63}, {41, 43, 32, 63}, {41, 44, 32, 63},
  2370  			{41, 45, 32, 63}, {41, 46, 32, 63}, {41, 47, 32, 63}, {41, 48, 32, 63}, {41, 49, 32, 63},
  2371  			{41, 50, 32, 63}, {41, 51, 32, 63}, {41, 52, 32, 63}, {41, 53, 32, 63}, {41, 54, 32, 63},
  2372  			{41, 55, 32, 63}, {41, 56, 32, 63}, {41, 57, 32, 63}, {41, 58, 32, 63}, {41, 59, 32, 63},
  2373  			{41, 60, 32, 63}, {41, 61, 32, 63}, {41, 62, 32, 63}, {41, 63, 32, 63}, {42, 32, 32, 63},
  2374  			{42, 33, 32, 63}, {42, 34, 32, 63}, {42, 35, 32, 63}, {42, 36, 32, 63}, {42, 37, 32, 63},
  2375  			{42, 38, 32, 63}, {42, 39, 32, 63}, {42, 40, 32, 63}, {42, 41, 32, 63}, {42, 42, 32, 63},
  2376  			{42, 43, 32, 63}, {42, 44, 32, 63}, {42, 45, 32, 63}, {42, 46, 32, 63}, {42, 47, 32, 63},
  2377  			{42, 48, 32, 63}, {42, 49, 32, 63}, {42, 50, 32, 63}, {42, 51, 32, 63}, {42, 52, 32, 63},
  2378  			{42, 53, 32, 63}, {42, 54, 32, 63}, {42, 55, 32, 63}, {42, 56, 32, 63}, {42, 57, 32, 63},
  2379  			{42, 58, 32, 63}, {42, 59, 32, 63}, {42, 60, 32, 63}, {42, 61, 32, 63}, {42, 62, 32, 63},
  2380  			{42, 63, 32, 63}, {43, 32, 32, 63}, {43, 33, 32, 63}, {43, 34, 32, 63}, {43, 35, 32, 63},
  2381  			{43, 36, 32, 63}, {43, 37, 32, 63}, {43, 38, 32, 63}, {43, 39, 32, 63}, {43, 40, 32, 63},
  2382  			{43, 41, 32, 63}, {43, 42, 32, 63}, {43, 43, 32, 63}, {43, 44, 32, 63}, {43, 45, 32, 63},
  2383  			{43, 46, 32, 63}, {43, 47, 32, 63}, {43, 48, 32, 63}, {43, 49, 32, 63}, {43, 50, 32, 63},
  2384  			{43, 51, 32, 63}, {43, 52, 32, 63}, {43, 53, 32, 63}, {43, 54, 32, 63}, {43, 55, 32, 63},
  2385  			{43, 56, 32, 63}, {43, 57, 32, 63}, {43, 58, 32, 63}, {43, 59, 32, 63}, {43, 60, 32, 63},
  2386  			{43, 61, 32, 63}, {43, 62, 32, 63}, {43, 63, 32, 63}, {44, 32, 32, 63}, {44, 33, 32, 63},
  2387  			{44, 34, 32, 63}, {44, 35, 32, 63}, {44, 36, 32, 63}, {44, 37, 32, 63}, {44, 38, 32, 63},
  2388  			{44, 39, 32, 63}, {44, 40, 32, 63}, {44, 41, 32, 63}, {44, 42, 32, 63}, {44, 43, 32, 63},
  2389  			{44, 44, 32, 63}, {44, 45, 32, 63}, {44, 46, 32, 63}, {44, 47, 32, 63}, {44, 48, 32, 63},
  2390  			{44, 49, 32, 63}, {44, 50, 32, 63}, {44, 51, 32, 63}, {44, 52, 32, 63}, {44, 53, 32, 63},
  2391  			{44, 54, 32, 63}, {44, 55, 32, 63}, {44, 56, 32, 63}, {44, 57, 32, 63}, {44, 58, 32, 63},
  2392  			{44, 59, 32, 63}, {44, 60, 32, 63}, {44, 61, 32, 63}, {44, 62, 32, 63}, {44, 63, 32, 63},
  2393  			{45, 32, 32, 63}, {45, 33, 32, 63}, {45, 34, 32, 63}, {45, 35, 32, 63}, {45, 36, 32, 63},
  2394  			{45, 37, 32, 63}, {45, 38, 32, 63}, {45, 39, 32, 63}, {45, 40, 32, 63}, {45, 41, 32, 63},
  2395  			{45, 42, 32, 63}, {45, 43, 32, 63}, {45, 44, 32, 63}, {45, 45, 32, 63}, {45, 46, 32, 63},
  2396  			{45, 47, 32, 63}, {45, 48, 32, 63}, {45, 49, 32, 63}, {45, 50, 32, 63}, {45, 51, 32, 63},
  2397  			{45, 52, 32, 63}, {45, 53, 32, 63}, {45, 54, 32, 63}, {45, 55, 32, 63}, {45, 56, 32, 63},
  2398  			{45, 57, 32, 63}, {45, 58, 32, 63}, {45, 59, 32, 63}, {45, 60, 32, 63}, {45, 61, 32, 63},
  2399  			{45, 62, 32, 63}, {45, 63, 32, 63}, {46, 32, 32, 63}, {46, 33, 32, 63}, {46, 34, 32, 63},
  2400  			{46, 35, 32, 63}, {46, 36, 32, 63}, {46, 37, 32, 63}, {46, 38, 32, 63}, {46, 39, 32, 63},
  2401  			{46, 40, 32, 63}, {46, 41, 32, 63}, {46, 42, 32, 63}, {46, 43, 32, 63}, {46, 44, 32, 63},
  2402  			{46, 45, 32, 63}, {46, 46, 32, 63}, {46, 47, 32, 63}, {46, 48, 32, 63}, {46, 49, 32, 63},
  2403  			{46, 50, 32, 63}, {46, 51, 32, 63}, {46, 52, 32, 63}, {46, 53, 32, 63}, {46, 54, 32, 63},
  2404  			{46, 55, 32, 63}, {46, 56, 32, 63}, {46, 57, 32, 63}, {46, 58, 32, 63}, {46, 59, 32, 63},
  2405  			{46, 60, 32, 63}, {46, 61, 32, 63}, {46, 62, 32, 63}, {46, 63, 32, 63}, {47, 32, 32, 63},
  2406  			{47, 33, 32, 63}, {47, 34, 32, 63}, {47, 35, 32, 63}, {47, 36, 32, 63}, {47, 37, 32, 63},
  2407  			{47, 38, 32, 63}, {47, 39, 32, 63}, {47, 40, 32, 63}, {47, 41, 32, 63}, {47, 42, 32, 63},
  2408  			{47, 43, 32, 63}, {47, 44, 32, 63}, {47, 45, 32, 63}, {47, 46, 32, 63}, {47, 47, 32, 63},
  2409  			{47, 48, 32, 63}, {47, 49, 32, 63}, {47, 50, 32, 63}, {47, 51, 32, 63}, {47, 52, 32, 63},
  2410  			{47, 53, 32, 63}, {47, 54, 32, 63}, {47, 55, 32, 63}, {47, 56, 32, 63}, {47, 57, 32, 63},
  2411  			{47, 58, 32, 63}, {47, 59, 32, 63}, {47, 60, 32, 63}, {47, 61, 32, 63}, {47, 62, 32, 63},
  2412  			{47, 63, 32, 63}, {48, 32, 32, 63}, {48, 33, 32, 63}, {48, 34, 32, 63}, {48, 35, 32, 63},
  2413  			{48, 36, 32, 63}, {48, 37, 32, 63}, {48, 38, 32, 63}, {48, 39, 32, 63}, {48, 40, 32, 63},
  2414  			{48, 41, 32, 63}, {48, 42, 32, 63}, {48, 43, 32, 63}, {48, 44, 32, 63}, {48, 45, 32, 63},
  2415  			{48, 46, 32, 63}, {48, 47, 32, 63}, {48, 48, 32, 63}, {48, 49, 32, 63}, {48, 50, 32, 63},
  2416  			{48, 51, 32, 63}, {48, 52, 32, 63}, {48, 53, 32, 63}, {48, 54, 32, 63}, {48, 55, 32, 63},
  2417  			{48, 56, 32, 63}, {48, 57, 32, 63}, {48, 58, 32, 63}, {48, 59, 32, 63}, {48, 60, 32, 63},
  2418  			{48, 61, 32, 63}, {48, 62, 32, 63}, {48, 63, 32, 63}, {49, 32, 32, 63}, {49, 33, 32, 63},
  2419  			{49, 34, 32, 63}, {49, 35, 32, 63}, {49, 36, 32, 63}, {49, 37, 32, 63}, {49, 38, 32, 63},
  2420  			{49, 39, 32, 63}, {49, 40, 32, 63}, {49, 41, 32, 63}, {49, 42, 32, 63}, {49, 43, 32, 63},
  2421  			{49, 44, 32, 63}, {49, 45, 32, 63}, {49, 46, 32, 63}, {49, 47, 32, 63}, {49, 48, 32, 63},
  2422  			{49, 49, 32, 63}, {49, 50, 32, 63}, {49, 51, 32, 63}, {49, 52, 32, 63}, {49, 53, 32, 63},
  2423  			{49, 54, 32, 63}, {49, 55, 32, 63}, {49, 56, 32, 63}, {49, 57, 32, 63}, {49, 58, 32, 63},
  2424  			{49, 59, 32, 63}, {49, 60, 32, 63}, {49, 61, 32, 63}, {49, 62, 32, 63}, {49, 63, 32, 63},
  2425  			{50, 32, 32, 63}, {50, 33, 32, 63}, {50, 34, 32, 63}, {50, 35, 32, 63}, {50, 36, 32, 63},
  2426  			{50, 37, 32, 63}, {50, 38, 32, 63}, {50, 39, 32, 63}, {50, 40, 32, 63}, {50, 41, 32, 63},
  2427  			{50, 42, 32, 63}, {50, 43, 32, 63}, {50, 44, 32, 63}, {50, 45, 32, 63}, {50, 46, 32, 63},
  2428  			{50, 47, 32, 63}, {50, 48, 32, 63}, {50, 49, 32, 63}, {50, 50, 32, 63}, {50, 51, 32, 63},
  2429  			{50, 52, 32, 63}, {50, 53, 32, 63}, {50, 54, 32, 63}, {50, 55, 32, 63}, {50, 56, 32, 63},
  2430  			{50, 57, 32, 63}, {50, 58, 32, 63}, {50, 59, 32, 63}, {50, 60, 32, 63}, {50, 61, 32, 63},
  2431  			{50, 62, 32, 63}, {50, 63, 32, 63}, {51, 32, 32, 63}, {51, 33, 32, 63}, {51, 34, 32, 63},
  2432  			{51, 35, 32, 63}, {51, 36, 32, 63}, {51, 37, 32, 63}, {51, 38, 32, 63}, {51, 39, 32, 63},
  2433  			{51, 40, 32, 63}, {51, 41, 32, 63}, {51, 42, 32, 63}, {51, 43, 32, 63}, {51, 44, 32, 63},
  2434  			{51, 45, 32, 63}, {51, 46, 32, 63}, {51, 47, 32, 63}, {51, 48, 32, 63}, {51, 49, 32, 63},
  2435  			{51, 50, 32, 63}, {51, 51, 32, 63}, {51, 52, 32, 63}, {51, 53, 32, 63}, {51, 54, 32, 63},
  2436  			{51, 55, 32, 63}, {51, 56, 32, 63}, {51, 57, 32, 63}, {51, 58, 32, 63}, {51, 59, 32, 63},
  2437  			{51, 60, 32, 63}, {51, 61, 32, 63}, {51, 62, 32, 63}, {51, 63, 32, 63}, {52, 32, 32, 63},
  2438  			{52, 33, 32, 63}, {52, 34, 32, 63}, {52, 35, 32, 63}, {52, 36, 32, 63}, {52, 37, 32, 63},
  2439  			{52, 38, 32, 63}, {52, 39, 32, 63}, {52, 40, 32, 63}, {52, 41, 32, 63}, {52, 42, 32, 63},
  2440  			{52, 43, 32, 63}, {52, 44, 32, 63}, {52, 45, 32, 63}, {52, 46, 32, 63}, {52, 47, 32, 63},
  2441  			{52, 48, 32, 63}, {52, 49, 32, 63}, {52, 50, 32, 63}, {52, 51, 32, 63}, {52, 52, 32, 63},
  2442  			{52, 53, 32, 63}, {52, 54, 32, 63}, {52, 55, 32, 63}, {52, 56, 32, 63}, {52, 57, 32, 63},
  2443  			{52, 58, 32, 63}, {52, 59, 32, 63}, {52, 60, 32, 63}, {52, 61, 32, 63}, {52, 62, 32, 63},
  2444  			{52, 63, 32, 63}, {53, 32, 32, 63}, {53, 33, 32, 63}, {53, 34, 32, 63}, {53, 35, 32, 63},
  2445  			{53, 36, 32, 63}, {53, 37, 32, 63}, {53, 38, 32, 63}, {53, 39, 32, 63}, {53, 40, 32, 63},
  2446  			{53, 41, 32, 63}, {53, 42, 32, 63}, {53, 43, 32, 63}, {53, 44, 32, 63}, {53, 45, 32, 63},
  2447  			{53, 46, 32, 63}, {53, 47, 32, 63}, {53, 48, 32, 63}, {53, 49, 32, 63}, {53, 50, 32, 63},
  2448  			{53, 51, 32, 63}, {53, 52, 32, 63}, {53, 53, 32, 63}, {53, 54, 32, 63}, {53, 55, 32, 63},
  2449  			{53, 56, 32, 63}, {53, 57, 32, 63}, {53, 58, 32, 63}, {53, 59, 32, 63}, {53, 60, 32, 63},
  2450  			{53, 61, 32, 63}, {53, 62, 32, 63}, {53, 63, 32, 63}, {54, 32, 32, 63}, {54, 33, 32, 63},
  2451  			{54, 34, 32, 63}, {54, 35, 32, 63}, {54, 36, 32, 63}, {54, 37, 32, 63}, {54, 38, 32, 63},
  2452  			{54, 39, 32, 63}, {54, 40, 32, 63}, {54, 41, 32, 63}, {54, 42, 32, 63}, {54, 43, 32, 63},
  2453  			{54, 44, 32, 63}, {54, 45, 32, 63}, {54, 46, 32, 63}, {54, 47, 32, 63}, {54, 48, 32, 63},
  2454  			{54, 49, 32, 63}, {54, 50, 32, 63}, {54, 51, 32, 63}, {54, 52, 32, 63}, {54, 53, 32, 63},
  2455  			{54, 54, 32, 63}, {54, 55, 32, 63}, {54, 56, 32, 63}, {54, 57, 32, 63}, {54, 58, 32, 63},
  2456  			{54, 59, 32, 63}, {54, 60, 32, 63}, {54, 61, 32, 63}, {54, 62, 32, 63}, {54, 63, 32, 63},
  2457  			{55, 32, 32, 63}, {55, 33, 32, 63}, {55, 34, 32, 63}, {55, 35, 32, 63}, {55, 36, 32, 63},
  2458  			{55, 37, 32, 63}, {55, 38, 32, 63}, {55, 39, 32, 63}, {55, 40, 32, 63}, {55, 41, 32, 63},
  2459  			{55, 42, 32, 63}, {55, 43, 32, 63}, {55, 44, 32, 63}, {55, 45, 32, 63}, {55, 46, 32, 63},
  2460  			{55, 47, 32, 63}, {55, 48, 32, 63}, {55, 49, 32, 63}, {55, 50, 32, 63}, {55, 51, 32, 63},
  2461  			{55, 52, 32, 63}, {55, 53, 32, 63}, {55, 54, 32, 63}, {55, 55, 32, 63}, {55, 56, 32, 63},
  2462  			{55, 57, 32, 63}, {55, 58, 32, 63}, {55, 59, 32, 63}, {55, 60, 32, 63}, {55, 61, 32, 63},
  2463  			{55, 62, 32, 63}, {55, 63, 32, 63}, {56, 32, 32, 63}, {56, 33, 32, 63}, {56, 34, 32, 63},
  2464  			{56, 35, 32, 63}, {56, 36, 32, 63}, {56, 37, 32, 63}, {56, 38, 32, 63}, {56, 39, 32, 63},
  2465  			{56, 40, 32, 63}, {56, 41, 32, 63}, {56, 42, 32, 63}, {56, 43, 32, 63}, {56, 44, 32, 63},
  2466  			{56, 45, 32, 63}, {56, 46, 32, 63}, {56, 47, 32, 63}, {56, 48, 32, 63}, {56, 49, 32, 63},
  2467  			{56, 50, 32, 63}, {56, 51, 32, 63}, {56, 52, 32, 63}, {56, 53, 32, 63}, {56, 54, 32, 63},
  2468  			{56, 55, 32, 63}, {56, 56, 32, 63}, {56, 57, 32, 63}, {56, 58, 32, 63}, {56, 59, 32, 63},
  2469  			{56, 60, 32, 63}, {56, 61, 32, 63}, {56, 62, 32, 63}, {56, 63, 32, 63}, {57, 32, 32, 63},
  2470  			{57, 33, 32, 63}, {57, 34, 32, 63}, {57, 35, 32, 63}, {57, 36, 32, 63}, {57, 37, 32, 63},
  2471  			{57, 38, 32, 63}, {57, 39, 32, 63}, {57, 40, 32, 63}, {57, 41, 32, 63}, {57, 42, 32, 63},
  2472  			{57, 43, 32, 63}, {57, 44, 32, 63}, {57, 45, 32, 63}, {57, 46, 32, 63}, {57, 47, 32, 63},
  2473  			{57, 48, 32, 63}, {57, 49, 32, 63}, {57, 50, 32, 63}, {57, 51, 32, 63}, {57, 52, 32, 63},
  2474  			{57, 53, 32, 63}, {57, 54, 32, 63}, {57, 55, 32, 63}, {57, 56, 32, 63}, {57, 57, 32, 63},
  2475  			{57, 58, 32, 63}, {57, 59, 32, 63}, {57, 60, 32, 63}, {57, 61, 32, 63}, {57, 62, 32, 63},
  2476  			{57, 63, 32, 63}, {58, 32, 32, 63}, {58, 33, 32, 63}, {58, 34, 32, 63}, {58, 35, 32, 63},
  2477  			{58, 36, 32, 63}, {58, 37, 32, 63}, {58, 38, 32, 63}, {58, 39, 32, 63}, {58, 40, 32, 63},
  2478  			{58, 41, 32, 63}, {58, 42, 32, 63}, {58, 43, 32, 63}, {58, 44, 32, 63}, {58, 45, 32, 63},
  2479  			{58, 46, 32, 63}, {58, 47, 32, 63}, {58, 48, 32, 63}, {58, 49, 32, 63}, {58, 50, 32, 63},
  2480  			{58, 51, 32, 63}, {58, 52, 32, 63}, {58, 53, 32, 63}, {58, 54, 32, 63}, {58, 55, 32, 63},
  2481  			{58, 56, 32, 63}, {58, 57, 32, 63}, {58, 58, 32, 63}, {58, 59, 32, 63}, {58, 60, 32, 63},
  2482  			{58, 61, 32, 63}, {58, 62, 32, 63}, {58, 63, 32, 63}, {59, 32, 32, 63}, {59, 33, 32, 63},
  2483  			{59, 34, 32, 63}, {59, 35, 32, 63}, {59, 36, 32, 63}, {59, 37, 32, 63}, {59, 38, 32, 63},
  2484  			{59, 39, 32, 63}, {59, 40, 32, 63}, {59, 41, 32, 63}, {59, 42, 32, 63}, {59, 43, 32, 63},
  2485  			{59, 44, 32, 63}, {59, 45, 32, 63}, {59, 46, 32, 63}, {59, 47, 32, 63}, {59, 48, 32, 63},
  2486  			{59, 49, 32, 63}, {59, 50, 32, 63}, {59, 51, 32, 63}, {59, 52, 32, 63}, {59, 53, 32, 63},
  2487  			{59, 54, 32, 63}, {59, 55, 32, 63}, {59, 56, 32, 63}, {59, 57, 32, 63}, {59, 58, 32, 63},
  2488  			{59, 59, 32, 63}, {59, 60, 32, 63}, {59, 61, 32, 63}, {59, 62, 32, 63}, {59, 63, 32, 63},
  2489  			{40, 32, 64, 79}, {40, 33, 64, 79}, {40, 34, 64, 79}, {40, 35, 64, 79}, {40, 36, 64, 79},
  2490  			{40, 37, 64, 79}, {40, 38, 64, 79}, {40, 39, 64, 79}, {40, 40, 64, 79}, {40, 41, 64, 79},
  2491  			{40, 42, 64, 79}, {40, 43, 64, 79}, {40, 44, 64, 79}, {40, 45, 64, 79}, {40, 46, 64, 79},
  2492  			{40, 47, 64, 79}, {40, 48, 64, 79}, {40, 49, 64, 79}, {40, 50, 64, 79}, {40, 51, 64, 79},
  2493  			{40, 52, 64, 79}, {40, 53, 64, 79}, {40, 54, 64, 79}, {40, 55, 64, 79}, {40, 56, 64, 79},
  2494  			{40, 57, 64, 79}, {40, 58, 64, 79}, {40, 59, 64, 79}, {40, 60, 64, 79}, {40, 61, 64, 79},
  2495  			{40, 62, 64, 79}, {40, 63, 64, 79}, {41, 32, 64, 79}, {41, 33, 64, 79}, {41, 34, 64, 79},
  2496  			{41, 35, 64, 79}, {41, 36, 64, 79}, {41, 37, 64, 79}, {41, 38, 64, 79}, {41, 39, 64, 79},
  2497  			{41, 40, 64, 79}, {41, 41, 64, 79}, {41, 42, 64, 79}, {41, 43, 64, 79}, {41, 44, 64, 79},
  2498  			{41, 45, 64, 79}, {41, 46, 64, 79}, {41, 47, 64, 79}, {41, 48, 64, 79}, {41, 49, 64, 79},
  2499  			{41, 50, 64, 79}, {41, 51, 64, 79}, {41, 52, 64, 79}, {41, 53, 64, 79}, {41, 54, 64, 79},
  2500  			{41, 55, 64, 79}, {41, 56, 64, 79}, {41, 57, 64, 79}, {41, 58, 64, 79}, {41, 59, 64, 79},
  2501  			{41, 60, 64, 79}, {41, 61, 64, 79}, {41, 62, 64, 79}, {41, 63, 64, 79}, {42, 32, 64, 79},
  2502  			{42, 33, 64, 79}, {42, 34, 64, 79}, {42, 35, 64, 79}, {42, 36, 64, 79}, {42, 37, 64, 79},
  2503  			{42, 38, 64, 79}, {42, 39, 64, 79}, {42, 40, 64, 79}, {42, 41, 64, 79}, {42, 42, 64, 79},
  2504  			{42, 43, 64, 79}, {42, 44, 64, 79}, {42, 45, 64, 79}, {42, 46, 64, 79}, {42, 47, 64, 79},
  2505  			{42, 48, 64, 79}, {42, 49, 64, 79}, {42, 50, 64, 79}, {42, 51, 64, 79}, {42, 52, 64, 79},
  2506  			{42, 53, 64, 79}, {42, 54, 64, 79}, {42, 55, 64, 79}, {42, 56, 64, 79}, {42, 57, 64, 79},
  2507  			{42, 58, 64, 79}, {42, 59, 64, 79}, {42, 60, 64, 79}, {42, 61, 64, 79}, {42, 62, 64, 79},
  2508  			{42, 63, 64, 79}, {43, 32, 64, 79}, {43, 33, 64, 79}, {43, 34, 64, 79}, {43, 35, 64, 79},
  2509  			{43, 36, 64, 79}, {43, 37, 64, 79}, {43, 38, 64, 79}, {43, 39, 64, 79}, {43, 40, 64, 79},
  2510  			{43, 41, 64, 79}, {43, 42, 64, 79}, {43, 43, 64, 79}, {43, 44, 64, 79}, {43, 45, 64, 79},
  2511  			{43, 46, 64, 79}, {43, 47, 64, 79}, {43, 48, 64, 79}, {43, 49, 64, 79}, {43, 50, 64, 79},
  2512  			{43, 51, 64, 79}, {43, 52, 64, 79}, {43, 53, 64, 79}, {43, 54, 64, 79}, {43, 55, 64, 79},
  2513  			{43, 56, 64, 79}, {43, 57, 64, 79}, {43, 58, 64, 79}, {43, 59, 64, 79}, {43, 60, 64, 79},
  2514  			{43, 61, 64, 79}, {43, 62, 64, 79}, {43, 63, 64, 79}, {44, 32, 64, 79}, {44, 33, 64, 79},
  2515  			{44, 34, 64, 79}, {44, 35, 64, 79}, {44, 36, 64, 79}, {44, 37, 64, 79}, {44, 38, 64, 79},
  2516  			{44, 39, 64, 79}, {44, 40, 64, 79}, {44, 41, 64, 79}, {44, 42, 64, 79}, {44, 43, 64, 79},
  2517  			{44, 44, 64, 79}, {44, 45, 64, 79}, {44, 46, 64, 79}, {44, 47, 64, 79}, {44, 48, 64, 79},
  2518  			{44, 49, 64, 79}, {44, 50, 64, 79}, {44, 51, 64, 79}, {44, 52, 64, 79}, {44, 53, 64, 79},
  2519  			{44, 54, 64, 79}, {44, 55, 64, 79}, {44, 56, 64, 79}, {44, 57, 64, 79}, {44, 58, 64, 79},
  2520  			{44, 59, 64, 79}, {44, 60, 64, 79}, {44, 61, 64, 79}, {44, 62, 64, 79}, {44, 63, 64, 79},
  2521  			{45, 32, 64, 79}, {45, 33, 64, 79}, {45, 34, 64, 79}, {45, 35, 64, 79}, {45, 36, 64, 79},
  2522  			{45, 37, 64, 79}, {45, 38, 64, 79}, {45, 39, 64, 79}, {45, 40, 64, 79}, {45, 41, 64, 79},
  2523  			{45, 42, 64, 79}, {45, 43, 64, 79}, {45, 44, 64, 79}, {45, 45, 64, 79}, {45, 46, 64, 79},
  2524  			{45, 47, 64, 79}, {45, 48, 64, 79}, {45, 49, 64, 79}, {45, 50, 64, 79}, {45, 51, 64, 79},
  2525  			{45, 52, 64, 79}, {45, 53, 64, 79}, {45, 54, 64, 79}, {45, 55, 64, 79}, {45, 56, 64, 79},
  2526  			{45, 57, 64, 79}, {45, 58, 64, 79}, {45, 59, 64, 79}, {45, 60, 64, 79}, {45, 61, 64, 79},
  2527  			{45, 62, 64, 79}, {45, 63, 64, 79}, {46, 32, 64, 79}, {46, 33, 64, 79}, {46, 34, 64, 79},
  2528  			{46, 35, 64, 79}, {46, 36, 64, 79}, {46, 37, 64, 79}, {46, 38, 64, 79}, {46, 39, 64, 79},
  2529  			{46, 40, 64, 79}, {46, 41, 64, 79}, {46, 42, 64, 79}, {46, 43, 64, 79}, {46, 44, 64, 79},
  2530  			{46, 45, 64, 79}, {46, 46, 64, 79}, {46, 47, 64, 79}, {46, 48, 64, 79}, {46, 49, 64, 79},
  2531  			{46, 50, 64, 79}, {46, 51, 64, 79}, {46, 52, 64, 79}, {46, 53, 64, 79}, {46, 54, 64, 79},
  2532  			{46, 55, 64, 79}, {46, 56, 64, 79}, {46, 57, 64, 79}, {46, 58, 64, 79}, {46, 59, 64, 79},
  2533  			{46, 60, 64, 79}, {46, 61, 64, 79}, {46, 62, 64, 79}, {46, 63, 64, 79}, {47, 32, 64, 79},
  2534  			{47, 33, 64, 79}, {47, 34, 64, 79}, {47, 35, 64, 79}, {47, 36, 64, 79}, {47, 37, 64, 79},
  2535  			{47, 38, 64, 79}, {47, 39, 64, 79}, {47, 40, 64, 79}, {47, 41, 64, 79}, {47, 42, 64, 79},
  2536  			{47, 43, 64, 79}, {47, 44, 64, 79}, {47, 45, 64, 79}, {47, 46, 64, 79}, {47, 47, 64, 79},
  2537  			{47, 48, 64, 79}, {47, 49, 64, 79}, {47, 50, 64, 79}, {47, 51, 64, 79}, {47, 52, 64, 79},
  2538  			{47, 53, 64, 79}, {47, 54, 64, 79}, {47, 55, 64, 79}, {47, 56, 64, 79}, {47, 57, 64, 79},
  2539  			{47, 58, 64, 79}, {47, 59, 64, 79}, {47, 60, 64, 79}, {47, 61, 64, 79}, {47, 62, 64, 79},
  2540  			{47, 63, 64, 79}, {48, 32, 64, 79}, {48, 33, 64, 79}, {48, 34, 64, 79}, {48, 35, 64, 79},
  2541  			{48, 36, 64, 79}, {48, 37, 64, 79}, {48, 38, 64, 79}, {48, 39, 64, 79}, {48, 40, 64, 79},
  2542  			{48, 41, 64, 79}, {48, 42, 64, 79}, {48, 43, 64, 79}, {48, 44, 64, 79}, {48, 45, 64, 79},
  2543  			{48, 46, 64, 79}, {48, 47, 64, 79}, {48, 48, 64, 79}, {48, 49, 64, 79}, {48, 50, 64, 79},
  2544  			{48, 51, 64, 79}, {48, 52, 64, 79}, {48, 53, 64, 79}, {48, 54, 64, 79}, {48, 55, 64, 79},
  2545  			{48, 56, 64, 79}, {48, 57, 64, 79}, {48, 58, 64, 79}, {48, 59, 64, 79}, {48, 60, 64, 79},
  2546  			{48, 61, 64, 79}, {48, 62, 64, 79}, {48, 63, 64, 79}, {49, 32, 64, 79}, {49, 33, 64, 79},
  2547  			{49, 34, 64, 79}, {49, 35, 64, 79}, {49, 36, 64, 79}, {49, 37, 64, 79}, {49, 38, 64, 79},
  2548  			{49, 39, 64, 79}, {49, 40, 64, 79}, {49, 41, 64, 79}, {49, 42, 64, 79}, {49, 43, 64, 79},
  2549  			{49, 44, 64, 79}, {49, 45, 64, 79}, {49, 46, 64, 79}, {49, 47, 64, 79}, {49, 48, 64, 79},
  2550  			{49, 49, 64, 79}, {49, 50, 64, 79}, {49, 51, 64, 79}, {49, 52, 64, 79}, {49, 53, 64, 79},
  2551  			{49, 54, 64, 79}, {49, 55, 64, 79}, {49, 56, 64, 79}, {49, 57, 64, 79}, {49, 58, 64, 79},
  2552  			{49, 59, 64, 79}, {49, 60, 64, 79}, {49, 61, 64, 79}, {49, 62, 64, 79}, {49, 63, 64, 79},
  2553  			{50, 32, 64, 79}, {50, 33, 64, 79}, {50, 34, 64, 79}, {50, 35, 64, 79}, {50, 36, 64, 79},
  2554  			{50, 37, 64, 79}, {50, 38, 64, 79}, {50, 39, 64, 79}, {50, 40, 64, 79}, {50, 41, 64, 79},
  2555  			{50, 42, 64, 79}, {50, 43, 64, 79}, {50, 44, 64, 79}, {50, 45, 64, 79}, {50, 46, 64, 79},
  2556  			{50, 47, 64, 79}, {50, 48, 64, 79}, {50, 49, 64, 79}, {50, 50, 64, 79}, {50, 51, 64, 79},
  2557  			{50, 52, 64, 79}, {50, 53, 64, 79}, {50, 54, 64, 79}, {50, 55, 64, 79}, {50, 56, 64, 79},
  2558  			{50, 57, 64, 79}, {50, 58, 64, 79}, {50, 59, 64, 79}, {50, 60, 64, 79}, {50, 61, 64, 79},
  2559  			{50, 62, 64, 79}, {50, 63, 64, 79}, {51, 32, 64, 79}, {51, 33, 64, 79}, {51, 34, 64, 79},
  2560  			{51, 35, 64, 79}, {51, 36, 64, 79}, {51, 37, 64, 79}, {51, 38, 64, 79}, {51, 39, 64, 79},
  2561  			{51, 40, 64, 79}, {51, 41, 64, 79}, {51, 42, 64, 79}, {51, 43, 64, 79}, {51, 44, 64, 79},
  2562  			{51, 45, 64, 79}, {51, 46, 64, 79}, {51, 47, 64, 79}, {51, 48, 64, 79}, {51, 49, 64, 79},
  2563  			{51, 50, 64, 79}, {51, 51, 64, 79}, {51, 52, 64, 79}, {51, 53, 64, 79}, {51, 54, 64, 79},
  2564  			{51, 55, 64, 79}, {51, 56, 64, 79}, {51, 57, 64, 79}, {51, 58, 64, 79}, {51, 59, 64, 79},
  2565  			{51, 60, 64, 79}, {51, 61, 64, 79}, {51, 62, 64, 79}, {51, 63, 64, 79}, {52, 32, 64, 79},
  2566  			{52, 33, 64, 79}, {52, 34, 64, 79}, {52, 35, 64, 79}, {52, 36, 64, 79}, {52, 37, 64, 79},
  2567  			{52, 38, 64, 79}, {52, 39, 64, 79}, {52, 40, 64, 79}, {52, 41, 64, 79}, {52, 42, 64, 79},
  2568  			{52, 43, 64, 79}, {52, 44, 64, 79}, {52, 45, 64, 79}, {52, 46, 64, 79}, {52, 47, 64, 79},
  2569  			{52, 48, 64, 79}, {52, 49, 64, 79}, {52, 50, 64, 79}, {52, 51, 64, 79}, {52, 52, 64, 79},
  2570  			{52, 53, 64, 79}, {52, 54, 64, 79}, {52, 55, 64, 79}, {52, 56, 64, 79}, {52, 57, 64, 79},
  2571  			{52, 58, 64, 79}, {52, 59, 64, 79}, {52, 60, 64, 79}, {52, 61, 64, 79}, {52, 62, 64, 79},
  2572  			{52, 63, 64, 79}, {53, 32, 64, 79}, {53, 33, 64, 79}, {53, 34, 64, 79}, {53, 35, 64, 79},
  2573  			{53, 36, 64, 79}, {53, 37, 64, 79}, {53, 38, 64, 79}, {53, 39, 64, 79}, {53, 40, 64, 79},
  2574  			{53, 41, 64, 79}, {53, 42, 64, 79}, {53, 43, 64, 79}, {53, 44, 64, 79}, {53, 45, 64, 79},
  2575  			{53, 46, 64, 79}, {53, 47, 64, 79}, {53, 48, 64, 79}, {53, 49, 64, 79}, {53, 50, 64, 79},
  2576  			{53, 51, 64, 79}, {53, 52, 64, 79}, {53, 53, 64, 79}, {53, 54, 64, 79}, {53, 55, 64, 79},
  2577  			{53, 56, 64, 79}, {53, 57, 64, 79}, {53, 58, 64, 79}, {53, 59, 64, 79}, {53, 60, 64, 79},
  2578  			{53, 61, 64, 79}, {53, 62, 64, 79}, {53, 63, 64, 79}, {54, 32, 64, 79}, {54, 33, 64, 79},
  2579  			{54, 34, 64, 79}, {54, 35, 64, 79}, {54, 36, 64, 79}, {54, 37, 64, 79}, {54, 38, 64, 79},
  2580  			{54, 39, 64, 79}, {54, 40, 64, 79}, {54, 41, 64, 79}, {54, 42, 64, 79}, {54, 43, 64, 79},
  2581  			{54, 44, 64, 79}, {54, 45, 64, 79}, {54, 46, 64, 79}, {54, 47, 64, 79}, {54, 48, 64, 79},
  2582  			{54, 49, 64, 79}, {54, 50, 64, 79}, {54, 51, 64, 79}, {54, 52, 64, 79}, {54, 53, 64, 79},
  2583  			{54, 54, 64, 79}, {54, 55, 64, 79}, {54, 56, 64, 79}, {54, 57, 64, 79}, {54, 58, 64, 79},
  2584  			{54, 59, 64, 79}, {54, 60, 64, 79}, {54, 61, 64, 79}, {54, 62, 64, 79}, {54, 63, 64, 79},
  2585  			{55, 32, 64, 79}, {55, 33, 64, 79}, {55, 34, 64, 79}, {55, 35, 64, 79}, {55, 36, 64, 79},
  2586  			{55, 37, 64, 79}, {55, 38, 64, 79}, {55, 39, 64, 79}, {55, 40, 64, 79}, {55, 41, 64, 79},
  2587  			{55, 42, 64, 79}, {55, 43, 64, 79}, {55, 44, 64, 79}, {55, 45, 64, 79}, {55, 46, 64, 79},
  2588  			{55, 47, 64, 79}, {55, 48, 64, 79}, {55, 49, 64, 79}, {55, 50, 64, 79}, {55, 51, 64, 79},
  2589  			{55, 52, 64, 79}, {55, 53, 64, 79}, {55, 54, 64, 79}, {55, 55, 64, 79}, {55, 56, 64, 79},
  2590  			{55, 57, 64, 79}, {55, 58, 64, 79}, {55, 59, 64, 79}, {55, 60, 64, 79}, {55, 61, 64, 79},
  2591  			{55, 62, 64, 79}, {55, 63, 64, 79}, {56, 32, 64, 79}, {56, 33, 64, 79}, {56, 34, 64, 79},
  2592  			{56, 35, 64, 79}, {56, 36, 64, 79}, {56, 37, 64, 79}, {56, 38, 64, 79}, {56, 39, 64, 79},
  2593  			{56, 40, 64, 79}, {56, 41, 64, 79}, {56, 42, 64, 79}, {56, 43, 64, 79}, {56, 44, 64, 79},
  2594  			{56, 45, 64, 79}, {56, 46, 64, 79}, {56, 47, 64, 79}, {56, 48, 64, 79}, {56, 49, 64, 79},
  2595  			{56, 50, 64, 79}, {56, 51, 64, 79}, {56, 52, 64, 79}, {56, 53, 64, 79}, {56, 54, 64, 79},
  2596  			{56, 55, 64, 79}, {56, 56, 64, 79}, {56, 57, 64, 79}, {56, 58, 64, 79}, {56, 59, 64, 79},
  2597  			{56, 60, 64, 79}, {56, 61, 64, 79}, {56, 62, 64, 79}, {56, 63, 64, 79}, {57, 32, 64, 79},
  2598  			{57, 33, 64, 79}, {57, 34, 64, 79}, {57, 35, 64, 79}, {57, 36, 64, 79}, {57, 37, 64, 79},
  2599  			{57, 38, 64, 79}, {57, 39, 64, 79}, {57, 40, 64, 79}, {57, 41, 64, 79}, {57, 42, 64, 79},
  2600  			{57, 43, 64, 79}, {57, 44, 64, 79}, {57, 45, 64, 79}, {57, 46, 64, 79}, {57, 47, 64, 79},
  2601  			{57, 48, 64, 79}, {57, 49, 64, 79}, {57, 50, 64, 79}, {57, 51, 64, 79}, {57, 52, 64, 79},
  2602  			{57, 53, 64, 79}, {57, 54, 64, 79}, {57, 55, 64, 79}, {57, 56, 64, 79}, {57, 57, 64, 79},
  2603  			{57, 58, 64, 79}, {57, 59, 64, 79}, {57, 60, 64, 79}, {57, 61, 64, 79}, {57, 62, 64, 79},
  2604  			{57, 63, 64, 79}, {58, 32, 64, 79}, {58, 33, 64, 79}, {58, 34, 64, 79}, {58, 35, 64, 79},
  2605  			{58, 36, 64, 79}, {58, 37, 64, 79}, {58, 38, 64, 79}, {58, 39, 64, 79}, {58, 40, 64, 79},
  2606  			{58, 41, 64, 79}, {58, 42, 64, 79}, {58, 43, 64, 79}, {58, 44, 64, 79}, {58, 45, 64, 79},
  2607  			{58, 46, 64, 79}, {58, 47, 64, 79}, {58, 48, 64, 79}, {58, 49, 64, 79}, {58, 50, 64, 79},
  2608  			{58, 51, 64, 79}, {58, 52, 64, 79}, {58, 53, 64, 79}, {58, 54, 64, 79}, {58, 55, 64, 79},
  2609  			{58, 56, 64, 79}, {58, 57, 64, 79}, {58, 58, 64, 79}, {58, 59, 64, 79}, {58, 60, 64, 79},
  2610  			{58, 61, 64, 79}, {58, 62, 64, 79}, {58, 63, 64, 79}, {59, 32, 64, 79}, {59, 33, 64, 79},
  2611  			{59, 34, 64, 79}, {59, 35, 64, 79}, {59, 36, 64, 79}, {59, 37, 64, 79}, {59, 38, 64, 79},
  2612  			{59, 39, 64, 79}, {59, 40, 64, 79}, {59, 41, 64, 79}, {59, 42, 64, 79}, {59, 43, 64, 79},
  2613  			{59, 44, 64, 79}, {59, 45, 64, 79}, {59, 46, 64, 79}, {59, 47, 64, 79}, {59, 48, 64, 79},
  2614  			{59, 49, 64, 79}, {59, 50, 64, 79}, {59, 51, 64, 79}, {59, 52, 64, 79}, {59, 53, 64, 79},
  2615  			{59, 54, 64, 79}, {59, 55, 64, 79}, {59, 56, 64, 79}, {59, 57, 64, 79}, {59, 58, 64, 79},
  2616  			{59, 59, 64, 79}, {59, 60, 64, 79}, {59, 61, 64, 79}, {59, 62, 64, 79}, {59, 63, 64, 79},
  2617  			{40, 64, 30, 31}, {40, 65, 30, 31}, {40, 66, 30, 31}, {40, 67, 30, 31}, {40, 68, 30, 31},
  2618  			{40, 69, 30, 31}, {41, 64, 30, 31}, {41, 65, 30, 31}, {41, 66, 30, 31}, {41, 67, 30, 31},
  2619  			{41, 68, 30, 31}, {41, 69, 30, 31}, {42, 64, 30, 31}, {42, 65, 30, 31}, {42, 66, 30, 31},
  2620  			{42, 67, 30, 31}, {42, 68, 30, 31}, {42, 69, 30, 31}, {43, 64, 30, 31}, {43, 65, 30, 31},
  2621  			{43, 66, 30, 31}, {43, 67, 30, 31}, {43, 68, 30, 31}, {43, 69, 30, 31}, {44, 64, 30, 31},
  2622  			{44, 65, 30, 31}, {44, 66, 30, 31}, {44, 67, 30, 31}, {44, 68, 30, 31}, {44, 69, 30, 31},
  2623  			{45, 64, 30, 31}, {45, 65, 30, 31}, {45, 66, 30, 31}, {45, 67, 30, 31}, {45, 68, 30, 31},
  2624  			{45, 69, 30, 31}, {46, 64, 30, 31}, {46, 65, 30, 31}, {46, 66, 30, 31}, {46, 67, 30, 31},
  2625  			{46, 68, 30, 31}, {46, 69, 30, 31}, {47, 64, 30, 31}, {47, 65, 30, 31}, {47, 66, 30, 31},
  2626  			{47, 67, 30, 31}, {47, 68, 30, 31}, {47, 69, 30, 31}, {48, 64, 30, 31}, {48, 65, 30, 31},
  2627  			{48, 66, 30, 31}, {48, 67, 30, 31}, {48, 68, 30, 31}, {48, 69, 30, 31}, {49, 64, 30, 31},
  2628  			{49, 65, 30, 31}, {49, 66, 30, 31}, {49, 67, 30, 31}, {49, 68, 30, 31}, {49, 69, 30, 31},
  2629  			{50, 64, 30, 31}, {50, 65, 30, 31}, {50, 66, 30, 31}, {50, 67, 30, 31}, {50, 68, 30, 31},
  2630  			{50, 69, 30, 31}, {51, 64, 30, 31}, {51, 65, 30, 31}, {51, 66, 30, 31}, {51, 67, 30, 31},
  2631  			{51, 68, 30, 31}, {51, 69, 30, 31}, {52, 64, 30, 31}, {52, 65, 30, 31}, {52, 66, 30, 31},
  2632  			{52, 67, 30, 31}, {52, 68, 30, 31}, {52, 69, 30, 31}, {53, 64, 30, 31}, {53, 65, 30, 31},
  2633  			{53, 66, 30, 31}, {53, 67, 30, 31}, {53, 68, 30, 31}, {53, 69, 30, 31}, {54, 64, 30, 31},
  2634  			{54, 65, 30, 31}, {54, 66, 30, 31}, {54, 67, 30, 31}, {54, 68, 30, 31}, {54, 69, 30, 31},
  2635  			{55, 64, 30, 31}, {55, 65, 30, 31}, {55, 66, 30, 31}, {55, 67, 30, 31}, {55, 68, 30, 31},
  2636  			{55, 69, 30, 31}, {56, 64, 30, 31}, {56, 65, 30, 31}, {56, 66, 30, 31}, {56, 67, 30, 31},
  2637  			{56, 68, 30, 31}, {56, 69, 30, 31}, {57, 64, 30, 31}, {57, 65, 30, 31}, {57, 66, 30, 31},
  2638  			{57, 67, 30, 31}, {57, 68, 30, 31}, {57, 69, 30, 31}, {58, 64, 30, 31}, {58, 65, 30, 31},
  2639  			{58, 66, 30, 31}, {58, 67, 30, 31}, {58, 68, 30, 31}, {58, 69, 30, 31}, {59, 64, 30, 31},
  2640  			{59, 65, 30, 31}, {59, 66, 30, 31}, {59, 67, 30, 31}, {59, 68, 30, 31}, {59, 69, 30, 31},
  2641  			{40, 64, 32, 63}, {40, 65, 32, 63}, {40, 66, 32, 63}, {40, 67, 32, 63}, {40, 68, 32, 63},
  2642  			{40, 69, 32, 63}, {41, 64, 32, 63}, {41, 65, 32, 63}, {41, 66, 32, 63}, {41, 67, 32, 63},
  2643  			{41, 68, 32, 63}, {41, 69, 32, 63}, {42, 64, 32, 63}, {42, 65, 32, 63}, {42, 66, 32, 63},
  2644  			{42, 67, 32, 63}, {42, 68, 32, 63}, {42, 69, 32, 63}, {43, 64, 32, 63}, {43, 65, 32, 63},
  2645  			{43, 66, 32, 63}, {43, 67, 32, 63}, {43, 68, 32, 63}, {43, 69, 32, 63}, {44, 64, 32, 63},
  2646  			{44, 65, 32, 63}, {44, 66, 32, 63}, {44, 67, 32, 63}, {44, 68, 32, 63}, {44, 69, 32, 63},
  2647  			{45, 64, 32, 63}, {45, 65, 32, 63}, {45, 66, 32, 63}, {45, 67, 32, 63}, {45, 68, 32, 63},
  2648  			{45, 69, 32, 63}, {46, 64, 32, 63}, {46, 65, 32, 63}, {46, 66, 32, 63}, {46, 67, 32, 63},
  2649  			{46, 68, 32, 63}, {46, 69, 32, 63}, {47, 64, 32, 63}, {47, 65, 32, 63}, {47, 66, 32, 63},
  2650  			{47, 67, 32, 63}, {47, 68, 32, 63}, {47, 69, 32, 63}, {48, 64, 32, 63}, {48, 65, 32, 63},
  2651  			{48, 66, 32, 63}, {48, 67, 32, 63}, {48, 68, 32, 63}, {48, 69, 32, 63}, {49, 64, 32, 63},
  2652  			{49, 65, 32, 63}, {49, 66, 32, 63}, {49, 67, 32, 63}, {49, 68, 32, 63}, {49, 69, 32, 63},
  2653  			{50, 64, 32, 63}, {50, 65, 32, 63}, {50, 66, 32, 63}, {50, 67, 32, 63}, {50, 68, 32, 63},
  2654  			{50, 69, 32, 63}, {51, 64, 32, 63}, {51, 65, 32, 63}, {51, 66, 32, 63}, {51, 67, 32, 63},
  2655  			{51, 68, 32, 63}, {51, 69, 32, 63}, {52, 64, 32, 63}, {52, 65, 32, 63}, {52, 66, 32, 63},
  2656  			{52, 67, 32, 63}, {52, 68, 32, 63}, {52, 69, 32, 63}, {53, 64, 32, 63}, {53, 65, 32, 63},
  2657  			{53, 66, 32, 63}, {53, 67, 32, 63}, {53, 68, 32, 63}, {53, 69, 32, 63}, {54, 64, 32, 63},
  2658  			{54, 65, 32, 63}, {54, 66, 32, 63}, {54, 67, 32, 63}, {54, 68, 32, 63}, {54, 69, 32, 63},
  2659  			{55, 64, 32, 63}, {55, 65, 32, 63}, {55, 66, 32, 63}, {55, 67, 32, 63}, {55, 68, 32, 63},
  2660  			{55, 69, 32, 63}, {56, 64, 32, 63}, {56, 65, 32, 63}, {56, 66, 32, 63}, {56, 67, 32, 63},
  2661  			{56, 68, 32, 63}, {56, 69, 32, 63}, {57, 64, 32, 63}, {57, 65, 32, 63}, {57, 66, 32, 63},
  2662  			{57, 67, 32, 63}, {57, 68, 32, 63}, {57, 69, 32, 63}, {58, 64, 32, 63}, {58, 65, 32, 63},
  2663  			{58, 66, 32, 63}, {58, 67, 32, 63}, {58, 68, 32, 63}, {58, 69, 32, 63}, {59, 64, 32, 63},
  2664  			{59, 65, 32, 63}, {59, 66, 32, 63}, {59, 67, 32, 63}, {59, 68, 32, 63}, {59, 69, 32, 63},
  2665  			{40, 64, 64, 79}, {40, 65, 64, 79}, {40, 66, 64, 79}, {40, 67, 64, 79}, {40, 68, 64, 79},
  2666  			{40, 69, 64, 79}, {41, 64, 64, 79}, {41, 65, 64, 79}, {41, 66, 64, 79}, {41, 67, 64, 79},
  2667  			{41, 68, 64, 79}, {41, 69, 64, 79}, {42, 64, 64, 79}, {42, 65, 64, 79}, {42, 66, 64, 79},
  2668  			{42, 67, 64, 79}, {42, 68, 64, 79}, {42, 69, 64, 79}, {43, 64, 64, 79}, {43, 65, 64, 79},
  2669  			{43, 66, 64, 79}, {43, 67, 64, 79}, {43, 68, 64, 79}, {43, 69, 64, 79}, {44, 64, 64, 79},
  2670  			{44, 65, 64, 79}, {44, 66, 64, 79}, {44, 67, 64, 79}, {44, 68, 64, 79}, {44, 69, 64, 79},
  2671  			{45, 64, 64, 79}, {45, 65, 64, 79}, {45, 66, 64, 79}, {45, 67, 64, 79}, {45, 68, 64, 79},
  2672  			{45, 69, 64, 79}, {46, 64, 64, 79}, {46, 65, 64, 79}, {46, 66, 64, 79}, {46, 67, 64, 79},
  2673  			{46, 68, 64, 79}, {46, 69, 64, 79}, {47, 64, 64, 79}, {47, 65, 64, 79}, {47, 66, 64, 79},
  2674  			{47, 67, 64, 79}, {47, 68, 64, 79}, {47, 69, 64, 79}, {48, 64, 64, 79}, {48, 65, 64, 79},
  2675  			{48, 66, 64, 79}, {48, 67, 64, 79}, {48, 68, 64, 79}, {48, 69, 64, 79}, {49, 64, 64, 79},
  2676  			{49, 65, 64, 79}, {49, 66, 64, 79}, {49, 67, 64, 79}, {49, 68, 64, 79}, {49, 69, 64, 79},
  2677  			{50, 64, 64, 79}, {50, 65, 64, 79}, {50, 66, 64, 79}, {50, 67, 64, 79}, {50, 68, 64, 79},
  2678  			{50, 69, 64, 79}, {51, 64, 64, 79}, {51, 65, 64, 79}, {51, 66, 64, 79}, {51, 67, 64, 79},
  2679  			{51, 68, 64, 79}, {51, 69, 64, 79}, {52, 64, 64, 79}, {52, 65, 64, 79}, {52, 66, 64, 79},
  2680  			{52, 67, 64, 79}, {52, 68, 64, 79}, {52, 69, 64, 79}, {53, 64, 64, 79}, {53, 65, 64, 79},
  2681  			{53, 66, 64, 79}, {53, 67, 64, 79}, {53, 68, 64, 79}, {53, 69, 64, 79}, {54, 64, 64, 79},
  2682  			{54, 65, 64, 79}, {54, 66, 64, 79}, {54, 67, 64, 79}, {54, 68, 64, 79}, {54, 69, 64, 79},
  2683  			{55, 64, 64, 79}, {55, 65, 64, 79}, {55, 66, 64, 79}, {55, 67, 64, 79}, {55, 68, 64, 79},
  2684  			{55, 69, 64, 79}, {56, 64, 64, 79}, {56, 65, 64, 79}, {56, 66, 64, 79}, {56, 67, 64, 79},
  2685  			{56, 68, 64, 79}, {56, 69, 64, 79}, {57, 64, 64, 79}, {57, 65, 64, 79}, {57, 66, 64, 79},
  2686  			{57, 67, 64, 79}, {57, 68, 64, 79}, {57, 69, 64, 79}, {58, 64, 64, 79}, {58, 65, 64, 79},
  2687  			{58, 66, 64, 79}, {58, 67, 64, 79}, {58, 68, 64, 79}, {58, 69, 64, 79}, {59, 64, 64, 79},
  2688  			{59, 65, 64, 79}, {59, 66, 64, 79}, {59, 67, 64, 79}, {59, 68, 64, 79}, {59, 69, 64, 79},
  2689  		},
  2690  	}
  2691  	body3 = testBody{
  2692  		label:  3,
  2693  		offset: dvid.Point3d{40, 40, 10},
  2694  		size:   dvid.Point3d{20, 20, 30},
  2695  		blockSpans: []dvid.Span{
  2696  			{0, 1, 1, 1},
  2697  			{1, 1, 1, 1},
  2698  		},
  2699  		voxelSpans: []dvid.Span{
  2700  			{10, 40, 40, 59}, {10, 41, 40, 59}, {10, 42, 40, 59}, {10, 43, 40, 59}, {10, 44, 40, 59},
  2701  			{10, 45, 40, 59}, {10, 46, 40, 59}, {10, 47, 40, 59}, {10, 48, 40, 59}, {10, 49, 40, 59},
  2702  			{10, 50, 40, 59}, {10, 51, 40, 59}, {10, 52, 40, 59}, {10, 53, 40, 59}, {10, 54, 40, 59},
  2703  			{10, 55, 40, 59}, {10, 56, 40, 59}, {10, 57, 40, 59}, {10, 58, 40, 59}, {10, 59, 40, 59},
  2704  			{11, 40, 40, 59}, {11, 41, 40, 59}, {11, 42, 40, 59}, {11, 43, 40, 59}, {11, 44, 40, 59},
  2705  			{11, 45, 40, 59}, {11, 46, 40, 59}, {11, 47, 40, 59}, {11, 48, 40, 59}, {11, 49, 40, 59},
  2706  			{11, 50, 40, 59}, {11, 51, 40, 59}, {11, 52, 40, 59}, {11, 53, 40, 59}, {11, 54, 40, 59},
  2707  			{11, 55, 40, 59}, {11, 56, 40, 59}, {11, 57, 40, 59}, {11, 58, 40, 59}, {11, 59, 40, 59},
  2708  			{12, 40, 40, 59}, {12, 41, 40, 59}, {12, 42, 40, 59}, {12, 43, 40, 59}, {12, 44, 40, 59},
  2709  			{12, 45, 40, 59}, {12, 46, 40, 59}, {12, 47, 40, 59}, {12, 48, 40, 59}, {12, 49, 40, 59},
  2710  			{12, 50, 40, 59}, {12, 51, 40, 59}, {12, 52, 40, 59}, {12, 53, 40, 59}, {12, 54, 40, 59},
  2711  			{12, 55, 40, 59}, {12, 56, 40, 59}, {12, 57, 40, 59}, {12, 58, 40, 59}, {12, 59, 40, 59},
  2712  			{13, 40, 40, 59}, {13, 41, 40, 59}, {13, 42, 40, 59}, {13, 43, 40, 59}, {13, 44, 40, 59},
  2713  			{13, 45, 40, 59}, {13, 46, 40, 59}, {13, 47, 40, 59}, {13, 48, 40, 59}, {13, 49, 40, 59},
  2714  			{13, 50, 40, 59}, {13, 51, 40, 59}, {13, 52, 40, 59}, {13, 53, 40, 59}, {13, 54, 40, 59},
  2715  			{13, 55, 40, 59}, {13, 56, 40, 59}, {13, 57, 40, 59}, {13, 58, 40, 59}, {13, 59, 40, 59},
  2716  			{14, 40, 40, 59}, {14, 41, 40, 59}, {14, 42, 40, 59}, {14, 43, 40, 59}, {14, 44, 40, 59},
  2717  			{14, 45, 40, 59}, {14, 46, 40, 59}, {14, 47, 40, 59}, {14, 48, 40, 59}, {14, 49, 40, 59},
  2718  			{14, 50, 40, 59}, {14, 51, 40, 59}, {14, 52, 40, 59}, {14, 53, 40, 59}, {14, 54, 40, 59},
  2719  			{14, 55, 40, 59}, {14, 56, 40, 59}, {14, 57, 40, 59}, {14, 58, 40, 59}, {14, 59, 40, 59},
  2720  			{15, 40, 40, 59}, {15, 41, 40, 59}, {15, 42, 40, 59}, {15, 43, 40, 59}, {15, 44, 40, 59},
  2721  			{15, 45, 40, 59}, {15, 46, 40, 59}, {15, 47, 40, 59}, {15, 48, 40, 59}, {15, 49, 40, 59},
  2722  			{15, 50, 40, 59}, {15, 51, 40, 59}, {15, 52, 40, 59}, {15, 53, 40, 59}, {15, 54, 40, 59},
  2723  			{15, 55, 40, 59}, {15, 56, 40, 59}, {15, 57, 40, 59}, {15, 58, 40, 59}, {15, 59, 40, 59},
  2724  			{16, 40, 40, 59}, {16, 41, 40, 59}, {16, 42, 40, 59}, {16, 43, 40, 59}, {16, 44, 40, 59},
  2725  			{16, 45, 40, 59}, {16, 46, 40, 59}, {16, 47, 40, 59}, {16, 48, 40, 59}, {16, 49, 40, 59},
  2726  			{16, 50, 40, 59}, {16, 51, 40, 59}, {16, 52, 40, 59}, {16, 53, 40, 59}, {16, 54, 40, 59},
  2727  			{16, 55, 40, 59}, {16, 56, 40, 59}, {16, 57, 40, 59}, {16, 58, 40, 59}, {16, 59, 40, 59},
  2728  			{17, 40, 40, 59}, {17, 41, 40, 59}, {17, 42, 40, 59}, {17, 43, 40, 59}, {17, 44, 40, 59},
  2729  			{17, 45, 40, 59}, {17, 46, 40, 59}, {17, 47, 40, 59}, {17, 48, 40, 59}, {17, 49, 40, 59},
  2730  			{17, 50, 40, 59}, {17, 51, 40, 59}, {17, 52, 40, 59}, {17, 53, 40, 59}, {17, 54, 40, 59},
  2731  			{17, 55, 40, 59}, {17, 56, 40, 59}, {17, 57, 40, 59}, {17, 58, 40, 59}, {17, 59, 40, 59},
  2732  			{18, 40, 40, 59}, {18, 41, 40, 59}, {18, 42, 40, 59}, {18, 43, 40, 59}, {18, 44, 40, 59},
  2733  			{18, 45, 40, 59}, {18, 46, 40, 59}, {18, 47, 40, 59}, {18, 48, 40, 59}, {18, 49, 40, 59},
  2734  			{18, 50, 40, 59}, {18, 51, 40, 59}, {18, 52, 40, 59}, {18, 53, 40, 59}, {18, 54, 40, 59},
  2735  			{18, 55, 40, 59}, {18, 56, 40, 59}, {18, 57, 40, 59}, {18, 58, 40, 59}, {18, 59, 40, 59},
  2736  			{19, 40, 40, 59}, {19, 41, 40, 59}, {19, 42, 40, 59}, {19, 43, 40, 59}, {19, 44, 40, 59},
  2737  			{19, 45, 40, 59}, {19, 46, 40, 59}, {19, 47, 40, 59}, {19, 48, 40, 59}, {19, 49, 40, 59},
  2738  			{19, 50, 40, 59}, {19, 51, 40, 59}, {19, 52, 40, 59}, {19, 53, 40, 59}, {19, 54, 40, 59},
  2739  			{19, 55, 40, 59}, {19, 56, 40, 59}, {19, 57, 40, 59}, {19, 58, 40, 59}, {19, 59, 40, 59},
  2740  			{20, 40, 40, 59}, {20, 41, 40, 59}, {20, 42, 40, 59}, {20, 43, 40, 59}, {20, 44, 40, 59},
  2741  			{20, 45, 40, 59}, {20, 46, 40, 59}, {20, 47, 40, 59}, {20, 48, 40, 59}, {20, 49, 40, 59},
  2742  			{20, 50, 40, 59}, {20, 51, 40, 59}, {20, 52, 40, 59}, {20, 53, 40, 59}, {20, 54, 40, 59},
  2743  			{20, 55, 40, 59}, {20, 56, 40, 59}, {20, 57, 40, 59}, {20, 58, 40, 59}, {20, 59, 40, 59},
  2744  			{21, 40, 40, 59}, {21, 41, 40, 59}, {21, 42, 40, 59}, {21, 43, 40, 59}, {21, 44, 40, 59},
  2745  			{21, 45, 40, 59}, {21, 46, 40, 59}, {21, 47, 40, 59}, {21, 48, 40, 59}, {21, 49, 40, 59},
  2746  			{21, 50, 40, 59}, {21, 51, 40, 59}, {21, 52, 40, 59}, {21, 53, 40, 59}, {21, 54, 40, 59},
  2747  			{21, 55, 40, 59}, {21, 56, 40, 59}, {21, 57, 40, 59}, {21, 58, 40, 59}, {21, 59, 40, 59},
  2748  			{22, 40, 40, 59}, {22, 41, 40, 59}, {22, 42, 40, 59}, {22, 43, 40, 59}, {22, 44, 40, 59},
  2749  			{22, 45, 40, 59}, {22, 46, 40, 59}, {22, 47, 40, 59}, {22, 48, 40, 59}, {22, 49, 40, 59},
  2750  			{22, 50, 40, 59}, {22, 51, 40, 59}, {22, 52, 40, 59}, {22, 53, 40, 59}, {22, 54, 40, 59},
  2751  			{22, 55, 40, 59}, {22, 56, 40, 59}, {22, 57, 40, 59}, {22, 58, 40, 59}, {22, 59, 40, 59},
  2752  			{23, 40, 40, 59}, {23, 41, 40, 59}, {23, 42, 40, 59}, {23, 43, 40, 59}, {23, 44, 40, 59},
  2753  			{23, 45, 40, 59}, {23, 46, 40, 59}, {23, 47, 40, 59}, {23, 48, 40, 59}, {23, 49, 40, 59},
  2754  			{23, 50, 40, 59}, {23, 51, 40, 59}, {23, 52, 40, 59}, {23, 53, 40, 59}, {23, 54, 40, 59},
  2755  			{23, 55, 40, 59}, {23, 56, 40, 59}, {23, 57, 40, 59}, {23, 58, 40, 59}, {23, 59, 40, 59},
  2756  			{24, 40, 40, 59}, {24, 41, 40, 59}, {24, 42, 40, 59}, {24, 43, 40, 59}, {24, 44, 40, 59},
  2757  			{24, 45, 40, 59}, {24, 46, 40, 59}, {24, 47, 40, 59}, {24, 48, 40, 59}, {24, 49, 40, 59},
  2758  			{24, 50, 40, 59}, {24, 51, 40, 59}, {24, 52, 40, 59}, {24, 53, 40, 59}, {24, 54, 40, 59},
  2759  			{24, 55, 40, 59}, {24, 56, 40, 59}, {24, 57, 40, 59}, {24, 58, 40, 59}, {24, 59, 40, 59},
  2760  			{25, 40, 40, 59}, {25, 41, 40, 59}, {25, 42, 40, 59}, {25, 43, 40, 59}, {25, 44, 40, 59},
  2761  			{25, 45, 40, 59}, {25, 46, 40, 59}, {25, 47, 40, 59}, {25, 48, 40, 59}, {25, 49, 40, 59},
  2762  			{25, 50, 40, 59}, {25, 51, 40, 59}, {25, 52, 40, 59}, {25, 53, 40, 59}, {25, 54, 40, 59},
  2763  			{25, 55, 40, 59}, {25, 56, 40, 59}, {25, 57, 40, 59}, {25, 58, 40, 59}, {25, 59, 40, 59},
  2764  			{26, 40, 40, 59}, {26, 41, 40, 59}, {26, 42, 40, 59}, {26, 43, 40, 59}, {26, 44, 40, 59},
  2765  			{26, 45, 40, 59}, {26, 46, 40, 59}, {26, 47, 40, 59}, {26, 48, 40, 59}, {26, 49, 40, 59},
  2766  			{26, 50, 40, 59}, {26, 51, 40, 59}, {26, 52, 40, 59}, {26, 53, 40, 59}, {26, 54, 40, 59},
  2767  			{26, 55, 40, 59}, {26, 56, 40, 59}, {26, 57, 40, 59}, {26, 58, 40, 59}, {26, 59, 40, 59},
  2768  			{27, 40, 40, 59}, {27, 41, 40, 59}, {27, 42, 40, 59}, {27, 43, 40, 59}, {27, 44, 40, 59},
  2769  			{27, 45, 40, 59}, {27, 46, 40, 59}, {27, 47, 40, 59}, {27, 48, 40, 59}, {27, 49, 40, 59},
  2770  			{27, 50, 40, 59}, {27, 51, 40, 59}, {27, 52, 40, 59}, {27, 53, 40, 59}, {27, 54, 40, 59},
  2771  			{27, 55, 40, 59}, {27, 56, 40, 59}, {27, 57, 40, 59}, {27, 58, 40, 59}, {27, 59, 40, 59},
  2772  			{28, 40, 40, 59}, {28, 41, 40, 59}, {28, 42, 40, 59}, {28, 43, 40, 59}, {28, 44, 40, 59},
  2773  			{28, 45, 40, 59}, {28, 46, 40, 59}, {28, 47, 40, 59}, {28, 48, 40, 59}, {28, 49, 40, 59},
  2774  			{28, 50, 40, 59}, {28, 51, 40, 59}, {28, 52, 40, 59}, {28, 53, 40, 59}, {28, 54, 40, 59},
  2775  			{28, 55, 40, 59}, {28, 56, 40, 59}, {28, 57, 40, 59}, {28, 58, 40, 59}, {28, 59, 40, 59},
  2776  			{29, 40, 40, 59}, {29, 41, 40, 59}, {29, 42, 40, 59}, {29, 43, 40, 59}, {29, 44, 40, 59},
  2777  			{29, 45, 40, 59}, {29, 46, 40, 59}, {29, 47, 40, 59}, {29, 48, 40, 59}, {29, 49, 40, 59},
  2778  			{29, 50, 40, 59}, {29, 51, 40, 59}, {29, 52, 40, 59}, {29, 53, 40, 59}, {29, 54, 40, 59},
  2779  			{29, 55, 40, 59}, {29, 56, 40, 59}, {29, 57, 40, 59}, {29, 58, 40, 59}, {29, 59, 40, 59},
  2780  			{30, 40, 40, 59}, {30, 41, 40, 59}, {30, 42, 40, 59}, {30, 43, 40, 59}, {30, 44, 40, 59},
  2781  			{30, 45, 40, 59}, {30, 46, 40, 59}, {30, 47, 40, 59}, {30, 48, 40, 59}, {30, 49, 40, 59},
  2782  			{30, 50, 40, 59}, {30, 51, 40, 59}, {30, 52, 40, 59}, {30, 53, 40, 59}, {30, 54, 40, 59},
  2783  			{30, 55, 40, 59}, {30, 56, 40, 59}, {30, 57, 40, 59}, {30, 58, 40, 59}, {30, 59, 40, 59},
  2784  			{31, 40, 40, 59}, {31, 41, 40, 59}, {31, 42, 40, 59}, {31, 43, 40, 59}, {31, 44, 40, 59},
  2785  			{31, 45, 40, 59}, {31, 46, 40, 59}, {31, 47, 40, 59}, {31, 48, 40, 59}, {31, 49, 40, 59},
  2786  			{31, 50, 40, 59}, {31, 51, 40, 59}, {31, 52, 40, 59}, {31, 53, 40, 59}, {31, 54, 40, 59},
  2787  			{31, 55, 40, 59}, {31, 56, 40, 59}, {31, 57, 40, 59}, {31, 58, 40, 59}, {31, 59, 40, 59},
  2788  			{32, 40, 40, 59}, {32, 41, 40, 59}, {32, 42, 40, 59}, {32, 43, 40, 59}, {32, 44, 40, 59},
  2789  			{32, 45, 40, 59}, {32, 46, 40, 59}, {32, 47, 40, 59}, {32, 48, 40, 59}, {32, 49, 40, 59},
  2790  			{32, 50, 40, 59}, {32, 51, 40, 59}, {32, 52, 40, 59}, {32, 53, 40, 59}, {32, 54, 40, 59},
  2791  			{32, 55, 40, 59}, {32, 56, 40, 59}, {32, 57, 40, 59}, {32, 58, 40, 59}, {32, 59, 40, 59},
  2792  			{33, 40, 40, 59}, {33, 41, 40, 59}, {33, 42, 40, 59}, {33, 43, 40, 59}, {33, 44, 40, 59},
  2793  			{33, 45, 40, 59}, {33, 46, 40, 59}, {33, 47, 40, 59}, {33, 48, 40, 59}, {33, 49, 40, 59},
  2794  			{33, 50, 40, 59}, {33, 51, 40, 59}, {33, 52, 40, 59}, {33, 53, 40, 59}, {33, 54, 40, 59},
  2795  			{33, 55, 40, 59}, {33, 56, 40, 59}, {33, 57, 40, 59}, {33, 58, 40, 59}, {33, 59, 40, 59},
  2796  			{34, 40, 40, 59}, {34, 41, 40, 59}, {34, 42, 40, 59}, {34, 43, 40, 59}, {34, 44, 40, 59},
  2797  			{34, 45, 40, 59}, {34, 46, 40, 59}, {34, 47, 40, 59}, {34, 48, 40, 59}, {34, 49, 40, 59},
  2798  			{34, 50, 40, 59}, {34, 51, 40, 59}, {34, 52, 40, 59}, {34, 53, 40, 59}, {34, 54, 40, 59},
  2799  			{34, 55, 40, 59}, {34, 56, 40, 59}, {34, 57, 40, 59}, {34, 58, 40, 59}, {34, 59, 40, 59},
  2800  			{35, 40, 40, 59}, {35, 41, 40, 59}, {35, 42, 40, 59}, {35, 43, 40, 59}, {35, 44, 40, 59},
  2801  			{35, 45, 40, 59}, {35, 46, 40, 59}, {35, 47, 40, 59}, {35, 48, 40, 59}, {35, 49, 40, 59},
  2802  			{35, 50, 40, 59}, {35, 51, 40, 59}, {35, 52, 40, 59}, {35, 53, 40, 59}, {35, 54, 40, 59},
  2803  			{35, 55, 40, 59}, {35, 56, 40, 59}, {35, 57, 40, 59}, {35, 58, 40, 59}, {35, 59, 40, 59},
  2804  			{36, 40, 40, 59}, {36, 41, 40, 59}, {36, 42, 40, 59}, {36, 43, 40, 59}, {36, 44, 40, 59},
  2805  			{36, 45, 40, 59}, {36, 46, 40, 59}, {36, 47, 40, 59}, {36, 48, 40, 59}, {36, 49, 40, 59},
  2806  			{36, 50, 40, 59}, {36, 51, 40, 59}, {36, 52, 40, 59}, {36, 53, 40, 59}, {36, 54, 40, 59},
  2807  			{36, 55, 40, 59}, {36, 56, 40, 59}, {36, 57, 40, 59}, {36, 58, 40, 59}, {36, 59, 40, 59},
  2808  			{37, 40, 40, 59}, {37, 41, 40, 59}, {37, 42, 40, 59}, {37, 43, 40, 59}, {37, 44, 40, 59},
  2809  			{37, 45, 40, 59}, {37, 46, 40, 59}, {37, 47, 40, 59}, {37, 48, 40, 59}, {37, 49, 40, 59},
  2810  			{37, 50, 40, 59}, {37, 51, 40, 59}, {37, 52, 40, 59}, {37, 53, 40, 59}, {37, 54, 40, 59},
  2811  			{37, 55, 40, 59}, {37, 56, 40, 59}, {37, 57, 40, 59}, {37, 58, 40, 59}, {37, 59, 40, 59},
  2812  			{38, 40, 40, 59}, {38, 41, 40, 59}, {38, 42, 40, 59}, {38, 43, 40, 59}, {38, 44, 40, 59},
  2813  			{38, 45, 40, 59}, {38, 46, 40, 59}, {38, 47, 40, 59}, {38, 48, 40, 59}, {38, 49, 40, 59},
  2814  			{38, 50, 40, 59}, {38, 51, 40, 59}, {38, 52, 40, 59}, {38, 53, 40, 59}, {38, 54, 40, 59},
  2815  			{38, 55, 40, 59}, {38, 56, 40, 59}, {38, 57, 40, 59}, {38, 58, 40, 59}, {38, 59, 40, 59},
  2816  			{39, 40, 40, 59}, {39, 41, 40, 59}, {39, 42, 40, 59}, {39, 43, 40, 59}, {39, 44, 40, 59},
  2817  			{39, 45, 40, 59}, {39, 46, 40, 59}, {39, 47, 40, 59}, {39, 48, 40, 59}, {39, 49, 40, 59},
  2818  			{39, 50, 40, 59}, {39, 51, 40, 59}, {39, 52, 40, 59}, {39, 53, 40, 59}, {39, 54, 40, 59},
  2819  			{39, 55, 40, 59}, {39, 56, 40, 59}, {39, 57, 40, 59}, {39, 58, 40, 59}, {39, 59, 40, 59},
  2820  		},
  2821  	}
  2822  	body4 = testBody{
  2823  		label:  4,
  2824  		offset: dvid.Point3d{75, 40, 60},
  2825  		size:   dvid.Point3d{20, 20, 30},
  2826  		blockSpans: []dvid.Span{
  2827  			{1, 1, 2, 2},
  2828  			{2, 1, 2, 2},
  2829  		},
  2830  		voxelSpans: []dvid.Span{
  2831  			{60, 40, 75, 94}, {60, 41, 75, 94}, {60, 42, 75, 94}, {60, 43, 75, 94}, {60, 44, 75, 94},
  2832  			{60, 45, 75, 94}, {60, 46, 75, 94}, {60, 47, 75, 94}, {60, 48, 75, 94}, {60, 49, 75, 94},
  2833  			{60, 50, 75, 94}, {60, 51, 75, 94}, {60, 52, 75, 94}, {60, 53, 75, 94}, {60, 54, 75, 94},
  2834  			{60, 55, 75, 94}, {60, 56, 75, 94}, {60, 57, 75, 94}, {60, 58, 75, 94}, {60, 59, 75, 94},
  2835  			{61, 40, 75, 94}, {61, 41, 75, 94}, {61, 42, 75, 94}, {61, 43, 75, 94}, {61, 44, 75, 94},
  2836  			{61, 45, 75, 94}, {61, 46, 75, 94}, {61, 47, 75, 94}, {61, 48, 75, 94}, {61, 49, 75, 94},
  2837  			{61, 50, 75, 94}, {61, 51, 75, 94}, {61, 52, 75, 94}, {61, 53, 75, 94}, {61, 54, 75, 94},
  2838  			{61, 55, 75, 94}, {61, 56, 75, 94}, {61, 57, 75, 94}, {61, 58, 75, 94}, {61, 59, 75, 94},
  2839  			{62, 40, 75, 94}, {62, 41, 75, 94}, {62, 42, 75, 94}, {62, 43, 75, 94}, {62, 44, 75, 94},
  2840  			{62, 45, 75, 94}, {62, 46, 75, 94}, {62, 47, 75, 94}, {62, 48, 75, 94}, {62, 49, 75, 94},
  2841  			{62, 50, 75, 94}, {62, 51, 75, 94}, {62, 52, 75, 94}, {62, 53, 75, 94}, {62, 54, 75, 94},
  2842  			{62, 55, 75, 94}, {62, 56, 75, 94}, {62, 57, 75, 94}, {62, 58, 75, 94}, {62, 59, 75, 94},
  2843  			{63, 40, 75, 94}, {63, 41, 75, 94}, {63, 42, 75, 94}, {63, 43, 75, 94}, {63, 44, 75, 94},
  2844  			{63, 45, 75, 94}, {63, 46, 75, 94}, {63, 47, 75, 94}, {63, 48, 75, 94}, {63, 49, 75, 94},
  2845  			{63, 50, 75, 94}, {63, 51, 75, 94}, {63, 52, 75, 94}, {63, 53, 75, 94}, {63, 54, 75, 94},
  2846  			{63, 55, 75, 94}, {63, 56, 75, 94}, {63, 57, 75, 94}, {63, 58, 75, 94}, {63, 59, 75, 94},
  2847  			{64, 40, 75, 94}, {64, 41, 75, 94}, {64, 42, 75, 94}, {64, 43, 75, 94}, {64, 44, 75, 94},
  2848  			{64, 45, 75, 94}, {64, 46, 75, 94}, {64, 47, 75, 94}, {64, 48, 75, 94}, {64, 49, 75, 94},
  2849  			{64, 50, 75, 94}, {64, 51, 75, 94}, {64, 52, 75, 94}, {64, 53, 75, 94}, {64, 54, 75, 94},
  2850  			{64, 55, 75, 94}, {64, 56, 75, 94}, {64, 57, 75, 94}, {64, 58, 75, 94}, {64, 59, 75, 94},
  2851  			{65, 40, 75, 94}, {65, 41, 75, 94}, {65, 42, 75, 94}, {65, 43, 75, 94}, {65, 44, 75, 94},
  2852  			{65, 45, 75, 94}, {65, 46, 75, 94}, {65, 47, 75, 94}, {65, 48, 75, 94}, {65, 49, 75, 94},
  2853  			{65, 50, 75, 94}, {65, 51, 75, 94}, {65, 52, 75, 94}, {65, 53, 75, 94}, {65, 54, 75, 94},
  2854  			{65, 55, 75, 94}, {65, 56, 75, 94}, {65, 57, 75, 94}, {65, 58, 75, 94}, {65, 59, 75, 94},
  2855  			{66, 40, 75, 94}, {66, 41, 75, 94}, {66, 42, 75, 94}, {66, 43, 75, 94}, {66, 44, 75, 94},
  2856  			{66, 45, 75, 94}, {66, 46, 75, 94}, {66, 47, 75, 94}, {66, 48, 75, 94}, {66, 49, 75, 94},
  2857  			{66, 50, 75, 94}, {66, 51, 75, 94}, {66, 52, 75, 94}, {66, 53, 75, 94}, {66, 54, 75, 94},
  2858  			{66, 55, 75, 94}, {66, 56, 75, 94}, {66, 57, 75, 94}, {66, 58, 75, 94}, {66, 59, 75, 94},
  2859  			{67, 40, 75, 94}, {67, 41, 75, 94}, {67, 42, 75, 94}, {67, 43, 75, 94}, {67, 44, 75, 94},
  2860  			{67, 45, 75, 94}, {67, 46, 75, 94}, {67, 47, 75, 94}, {67, 48, 75, 94}, {67, 49, 75, 94},
  2861  			{67, 50, 75, 94}, {67, 51, 75, 94}, {67, 52, 75, 94}, {67, 53, 75, 94}, {67, 54, 75, 94},
  2862  			{67, 55, 75, 94}, {67, 56, 75, 94}, {67, 57, 75, 94}, {67, 58, 75, 94}, {67, 59, 75, 94},
  2863  			{68, 40, 75, 94}, {68, 41, 75, 94}, {68, 42, 75, 94}, {68, 43, 75, 94}, {68, 44, 75, 94},
  2864  			{68, 45, 75, 94}, {68, 46, 75, 94}, {68, 47, 75, 94}, {68, 48, 75, 94}, {68, 49, 75, 94},
  2865  			{68, 50, 75, 94}, {68, 51, 75, 94}, {68, 52, 75, 94}, {68, 53, 75, 94}, {68, 54, 75, 94},
  2866  			{68, 55, 75, 94}, {68, 56, 75, 94}, {68, 57, 75, 94}, {68, 58, 75, 94}, {68, 59, 75, 94},
  2867  			{69, 40, 75, 94}, {69, 41, 75, 94}, {69, 42, 75, 94}, {69, 43, 75, 94}, {69, 44, 75, 94},
  2868  			{69, 45, 75, 94}, {69, 46, 75, 94}, {69, 47, 75, 94}, {69, 48, 75, 94}, {69, 49, 75, 94},
  2869  			{69, 50, 75, 94}, {69, 51, 75, 94}, {69, 52, 75, 94}, {69, 53, 75, 94}, {69, 54, 75, 94},
  2870  			{69, 55, 75, 94}, {69, 56, 75, 94}, {69, 57, 75, 94}, {69, 58, 75, 94}, {69, 59, 75, 94},
  2871  			{70, 40, 75, 94}, {70, 41, 75, 94}, {70, 42, 75, 94}, {70, 43, 75, 94}, {70, 44, 75, 94},
  2872  			{70, 45, 75, 94}, {70, 46, 75, 94}, {70, 47, 75, 94}, {70, 48, 75, 94}, {70, 49, 75, 94},
  2873  			{70, 50, 75, 94}, {70, 51, 75, 94}, {70, 52, 75, 94}, {70, 53, 75, 94}, {70, 54, 75, 94},
  2874  			{70, 55, 75, 94}, {70, 56, 75, 94}, {70, 57, 75, 94}, {70, 58, 75, 94}, {70, 59, 75, 94},
  2875  			{71, 40, 75, 94}, {71, 41, 75, 94}, {71, 42, 75, 94}, {71, 43, 75, 94}, {71, 44, 75, 94},
  2876  			{71, 45, 75, 94}, {71, 46, 75, 94}, {71, 47, 75, 94}, {71, 48, 75, 94}, {71, 49, 75, 94},
  2877  			{71, 50, 75, 94}, {71, 51, 75, 94}, {71, 52, 75, 94}, {71, 53, 75, 94}, {71, 54, 75, 94},
  2878  			{71, 55, 75, 94}, {71, 56, 75, 94}, {71, 57, 75, 94}, {71, 58, 75, 94}, {71, 59, 75, 94},
  2879  			{72, 40, 75, 94}, {72, 41, 75, 94}, {72, 42, 75, 94}, {72, 43, 75, 94}, {72, 44, 75, 94},
  2880  			{72, 45, 75, 94}, {72, 46, 75, 94}, {72, 47, 75, 94}, {72, 48, 75, 94}, {72, 49, 75, 94},
  2881  			{72, 50, 75, 94}, {72, 51, 75, 94}, {72, 52, 75, 94}, {72, 53, 75, 94}, {72, 54, 75, 94},
  2882  			{72, 55, 75, 94}, {72, 56, 75, 94}, {72, 57, 75, 94}, {72, 58, 75, 94}, {72, 59, 75, 94},
  2883  			{73, 40, 75, 94}, {73, 41, 75, 94}, {73, 42, 75, 94}, {73, 43, 75, 94}, {73, 44, 75, 94},
  2884  			{73, 45, 75, 94}, {73, 46, 75, 94}, {73, 47, 75, 94}, {73, 48, 75, 94}, {73, 49, 75, 94},
  2885  			{73, 50, 75, 94}, {73, 51, 75, 94}, {73, 52, 75, 94}, {73, 53, 75, 94}, {73, 54, 75, 94},
  2886  			{73, 55, 75, 94}, {73, 56, 75, 94}, {73, 57, 75, 94}, {73, 58, 75, 94}, {73, 59, 75, 94},
  2887  			{74, 40, 75, 94}, {74, 41, 75, 94}, {74, 42, 75, 94}, {74, 43, 75, 94}, {74, 44, 75, 94},
  2888  			{74, 45, 75, 94}, {74, 46, 75, 94}, {74, 47, 75, 94}, {74, 48, 75, 94}, {74, 49, 75, 94},
  2889  			{74, 50, 75, 94}, {74, 51, 75, 94}, {74, 52, 75, 94}, {74, 53, 75, 94}, {74, 54, 75, 94},
  2890  			{74, 55, 75, 94}, {74, 56, 75, 94}, {74, 57, 75, 94}, {74, 58, 75, 94}, {74, 59, 75, 94},
  2891  			{75, 40, 75, 94}, {75, 41, 75, 94}, {75, 42, 75, 94}, {75, 43, 75, 94}, {75, 44, 75, 94},
  2892  			{75, 45, 75, 94}, {75, 46, 75, 94}, {75, 47, 75, 94}, {75, 48, 75, 94}, {75, 49, 75, 94},
  2893  			{75, 50, 75, 94}, {75, 51, 75, 94}, {75, 52, 75, 94}, {75, 53, 75, 94}, {75, 54, 75, 94},
  2894  			{75, 55, 75, 94}, {75, 56, 75, 94}, {75, 57, 75, 94}, {75, 58, 75, 94}, {75, 59, 75, 94},
  2895  			{76, 40, 75, 94}, {76, 41, 75, 94}, {76, 42, 75, 94}, {76, 43, 75, 94}, {76, 44, 75, 94},
  2896  			{76, 45, 75, 94}, {76, 46, 75, 94}, {76, 47, 75, 94}, {76, 48, 75, 94}, {76, 49, 75, 94},
  2897  			{76, 50, 75, 94}, {76, 51, 75, 94}, {76, 52, 75, 94}, {76, 53, 75, 94}, {76, 54, 75, 94},
  2898  			{76, 55, 75, 94}, {76, 56, 75, 94}, {76, 57, 75, 94}, {76, 58, 75, 94}, {76, 59, 75, 94},
  2899  			{77, 40, 75, 94}, {77, 41, 75, 94}, {77, 42, 75, 94}, {77, 43, 75, 94}, {77, 44, 75, 94},
  2900  			{77, 45, 75, 94}, {77, 46, 75, 94}, {77, 47, 75, 94}, {77, 48, 75, 94}, {77, 49, 75, 94},
  2901  			{77, 50, 75, 94}, {77, 51, 75, 94}, {77, 52, 75, 94}, {77, 53, 75, 94}, {77, 54, 75, 94},
  2902  			{77, 55, 75, 94}, {77, 56, 75, 94}, {77, 57, 75, 94}, {77, 58, 75, 94}, {77, 59, 75, 94},
  2903  			{78, 40, 75, 94}, {78, 41, 75, 94}, {78, 42, 75, 94}, {78, 43, 75, 94}, {78, 44, 75, 94},
  2904  			{78, 45, 75, 94}, {78, 46, 75, 94}, {78, 47, 75, 94}, {78, 48, 75, 94}, {78, 49, 75, 94},
  2905  			{78, 50, 75, 94}, {78, 51, 75, 94}, {78, 52, 75, 94}, {78, 53, 75, 94}, {78, 54, 75, 94},
  2906  			{78, 55, 75, 94}, {78, 56, 75, 94}, {78, 57, 75, 94}, {78, 58, 75, 94}, {78, 59, 75, 94},
  2907  			{79, 40, 75, 94}, {79, 41, 75, 94}, {79, 42, 75, 94}, {79, 43, 75, 94}, {79, 44, 75, 94},
  2908  			{79, 45, 75, 94}, {79, 46, 75, 94}, {79, 47, 75, 94}, {79, 48, 75, 94}, {79, 49, 75, 94},
  2909  			{79, 50, 75, 94}, {79, 51, 75, 94}, {79, 52, 75, 94}, {79, 53, 75, 94}, {79, 54, 75, 94},
  2910  			{79, 55, 75, 94}, {79, 56, 75, 94}, {79, 57, 75, 94}, {79, 58, 75, 94}, {79, 59, 75, 94},
  2911  			{80, 40, 75, 94}, {80, 41, 75, 94}, {80, 42, 75, 94}, {80, 43, 75, 94}, {80, 44, 75, 94},
  2912  			{80, 45, 75, 94}, {80, 46, 75, 94}, {80, 47, 75, 94}, {80, 48, 75, 94}, {80, 49, 75, 94},
  2913  			{80, 50, 75, 94}, {80, 51, 75, 94}, {80, 52, 75, 94}, {80, 53, 75, 94}, {80, 54, 75, 94},
  2914  			{80, 55, 75, 94}, {80, 56, 75, 94}, {80, 57, 75, 94}, {80, 58, 75, 94}, {80, 59, 75, 94},
  2915  			{81, 40, 75, 94}, {81, 41, 75, 94}, {81, 42, 75, 94}, {81, 43, 75, 94}, {81, 44, 75, 94},
  2916  			{81, 45, 75, 94}, {81, 46, 75, 94}, {81, 47, 75, 94}, {81, 48, 75, 94}, {81, 49, 75, 94},
  2917  			{81, 50, 75, 94}, {81, 51, 75, 94}, {81, 52, 75, 94}, {81, 53, 75, 94}, {81, 54, 75, 94},
  2918  			{81, 55, 75, 94}, {81, 56, 75, 94}, {81, 57, 75, 94}, {81, 58, 75, 94}, {81, 59, 75, 94},
  2919  			{82, 40, 75, 94}, {82, 41, 75, 94}, {82, 42, 75, 94}, {82, 43, 75, 94}, {82, 44, 75, 94},
  2920  			{82, 45, 75, 94}, {82, 46, 75, 94}, {82, 47, 75, 94}, {82, 48, 75, 94}, {82, 49, 75, 94},
  2921  			{82, 50, 75, 94}, {82, 51, 75, 94}, {82, 52, 75, 94}, {82, 53, 75, 94}, {82, 54, 75, 94},
  2922  			{82, 55, 75, 94}, {82, 56, 75, 94}, {82, 57, 75, 94}, {82, 58, 75, 94}, {82, 59, 75, 94},
  2923  			{83, 40, 75, 94}, {83, 41, 75, 94}, {83, 42, 75, 94}, {83, 43, 75, 94}, {83, 44, 75, 94},
  2924  			{83, 45, 75, 94}, {83, 46, 75, 94}, {83, 47, 75, 94}, {83, 48, 75, 94}, {83, 49, 75, 94},
  2925  			{83, 50, 75, 94}, {83, 51, 75, 94}, {83, 52, 75, 94}, {83, 53, 75, 94}, {83, 54, 75, 94},
  2926  			{83, 55, 75, 94}, {83, 56, 75, 94}, {83, 57, 75, 94}, {83, 58, 75, 94}, {83, 59, 75, 94},
  2927  			{84, 40, 75, 94}, {84, 41, 75, 94}, {84, 42, 75, 94}, {84, 43, 75, 94}, {84, 44, 75, 94},
  2928  			{84, 45, 75, 94}, {84, 46, 75, 94}, {84, 47, 75, 94}, {84, 48, 75, 94}, {84, 49, 75, 94},
  2929  			{84, 50, 75, 94}, {84, 51, 75, 94}, {84, 52, 75, 94}, {84, 53, 75, 94}, {84, 54, 75, 94},
  2930  			{84, 55, 75, 94}, {84, 56, 75, 94}, {84, 57, 75, 94}, {84, 58, 75, 94}, {84, 59, 75, 94},
  2931  			{85, 40, 75, 94}, {85, 41, 75, 94}, {85, 42, 75, 94}, {85, 43, 75, 94}, {85, 44, 75, 94},
  2932  			{85, 45, 75, 94}, {85, 46, 75, 94}, {85, 47, 75, 94}, {85, 48, 75, 94}, {85, 49, 75, 94},
  2933  			{85, 50, 75, 94}, {85, 51, 75, 94}, {85, 52, 75, 94}, {85, 53, 75, 94}, {85, 54, 75, 94},
  2934  			{85, 55, 75, 94}, {85, 56, 75, 94}, {85, 57, 75, 94}, {85, 58, 75, 94}, {85, 59, 75, 94},
  2935  			{86, 40, 75, 94}, {86, 41, 75, 94}, {86, 42, 75, 94}, {86, 43, 75, 94}, {86, 44, 75, 94},
  2936  			{86, 45, 75, 94}, {86, 46, 75, 94}, {86, 47, 75, 94}, {86, 48, 75, 94}, {86, 49, 75, 94},
  2937  			{86, 50, 75, 94}, {86, 51, 75, 94}, {86, 52, 75, 94}, {86, 53, 75, 94}, {86, 54, 75, 94},
  2938  			{86, 55, 75, 94}, {86, 56, 75, 94}, {86, 57, 75, 94}, {86, 58, 75, 94}, {86, 59, 75, 94},
  2939  			{87, 40, 75, 94}, {87, 41, 75, 94}, {87, 42, 75, 94}, {87, 43, 75, 94}, {87, 44, 75, 94},
  2940  			{87, 45, 75, 94}, {87, 46, 75, 94}, {87, 47, 75, 94}, {87, 48, 75, 94}, {87, 49, 75, 94},
  2941  			{87, 50, 75, 94}, {87, 51, 75, 94}, {87, 52, 75, 94}, {87, 53, 75, 94}, {87, 54, 75, 94},
  2942  			{87, 55, 75, 94}, {87, 56, 75, 94}, {87, 57, 75, 94}, {87, 58, 75, 94}, {87, 59, 75, 94},
  2943  			{88, 40, 75, 94}, {88, 41, 75, 94}, {88, 42, 75, 94}, {88, 43, 75, 94}, {88, 44, 75, 94},
  2944  			{88, 45, 75, 94}, {88, 46, 75, 94}, {88, 47, 75, 94}, {88, 48, 75, 94}, {88, 49, 75, 94},
  2945  			{88, 50, 75, 94}, {88, 51, 75, 94}, {88, 52, 75, 94}, {88, 53, 75, 94}, {88, 54, 75, 94},
  2946  			{88, 55, 75, 94}, {88, 56, 75, 94}, {88, 57, 75, 94}, {88, 58, 75, 94}, {88, 59, 75, 94},
  2947  			{89, 40, 75, 94}, {89, 41, 75, 94}, {89, 42, 75, 94}, {89, 43, 75, 94}, {89, 44, 75, 94},
  2948  			{89, 45, 75, 94}, {89, 46, 75, 94}, {89, 47, 75, 94}, {89, 48, 75, 94}, {89, 49, 75, 94},
  2949  			{89, 50, 75, 94}, {89, 51, 75, 94}, {89, 52, 75, 94}, {89, 53, 75, 94}, {89, 54, 75, 94},
  2950  			{89, 55, 75, 94}, {89, 56, 75, 94}, {89, 57, 75, 94}, {89, 58, 75, 94}, {89, 59, 75, 94},
  2951  		},
  2952  	}
  2953  	bodyleft = testBody{
  2954  		label:  4,
  2955  		offset: dvid.Point3d{75, 40, 60},
  2956  		size:   dvid.Point3d{20, 20, 21},
  2957  		blockSpans: []dvid.Span{
  2958  			{1, 1, 2, 2},
  2959  			{2, 1, 2, 2},
  2960  		},
  2961  		voxelSpans: []dvid.Span{
  2962  			{60, 40, 75, 94}, {60, 41, 75, 94}, {60, 42, 75, 94}, {60, 43, 75, 94}, {60, 44, 75, 94},
  2963  			{60, 45, 75, 94}, {60, 46, 75, 94}, {60, 47, 75, 94}, {60, 48, 75, 94}, {60, 49, 75, 94},
  2964  			{60, 50, 75, 94}, {60, 51, 75, 94}, {60, 52, 75, 94}, {60, 53, 75, 94}, {60, 54, 75, 94},
  2965  			{60, 55, 75, 94}, {60, 56, 75, 94}, {60, 57, 75, 94}, {60, 58, 75, 94}, {60, 59, 75, 94},
  2966  			{61, 40, 75, 94}, {61, 41, 75, 94}, {61, 42, 75, 94}, {61, 43, 75, 94}, {61, 44, 75, 94},
  2967  			{61, 45, 75, 94}, {61, 46, 75, 94}, {61, 47, 75, 94}, {61, 48, 75, 94}, {61, 49, 75, 94},
  2968  			{61, 50, 75, 94}, {61, 51, 75, 94}, {61, 52, 75, 94}, {61, 53, 75, 94}, {61, 54, 75, 94},
  2969  			{61, 55, 75, 94}, {61, 56, 75, 94}, {61, 57, 75, 94}, {61, 58, 75, 94}, {61, 59, 75, 94},
  2970  			{62, 40, 75, 94}, {62, 41, 75, 94}, {62, 42, 75, 94}, {62, 43, 75, 94}, {62, 44, 75, 94},
  2971  			{62, 45, 75, 94}, {62, 46, 75, 94}, {62, 47, 75, 94}, {62, 48, 75, 94}, {62, 49, 75, 94},
  2972  			{62, 50, 75, 94}, {62, 51, 75, 94}, {62, 52, 75, 94}, {62, 53, 75, 94}, {62, 54, 75, 94},
  2973  			{62, 55, 75, 94}, {62, 56, 75, 94}, {62, 57, 75, 94}, {62, 58, 75, 94}, {62, 59, 75, 94},
  2974  			{63, 40, 75, 94}, {63, 41, 75, 94}, {63, 42, 75, 94}, {63, 43, 75, 94}, {63, 44, 75, 94},
  2975  			{63, 45, 75, 94}, {63, 46, 75, 94}, {63, 47, 75, 94}, {63, 48, 75, 94}, {63, 49, 75, 94},
  2976  			{63, 50, 75, 94}, {63, 51, 75, 94}, {63, 52, 75, 94}, {63, 53, 75, 94}, {63, 54, 75, 94},
  2977  			{63, 55, 75, 94}, {63, 56, 75, 94}, {63, 57, 75, 94}, {63, 58, 75, 94}, {63, 59, 75, 94},
  2978  			{64, 40, 75, 94}, {64, 41, 75, 94}, {64, 42, 75, 94}, {64, 43, 75, 94}, {64, 44, 75, 94},
  2979  			{64, 45, 75, 94}, {64, 46, 75, 94}, {64, 47, 75, 94}, {64, 48, 75, 94}, {64, 49, 75, 94},
  2980  			{64, 50, 75, 94}, {64, 51, 75, 94}, {64, 52, 75, 94}, {64, 53, 75, 94}, {64, 54, 75, 94},
  2981  			{64, 55, 75, 94}, {64, 56, 75, 94}, {64, 57, 75, 94}, {64, 58, 75, 94}, {64, 59, 75, 94},
  2982  			{65, 40, 75, 94}, {65, 41, 75, 94}, {65, 42, 75, 94}, {65, 43, 75, 94}, {65, 44, 75, 94},
  2983  			{65, 45, 75, 94}, {65, 46, 75, 94}, {65, 47, 75, 94}, {65, 48, 75, 94}, {65, 49, 75, 94},
  2984  			{65, 50, 75, 94}, {65, 51, 75, 94}, {65, 52, 75, 94}, {65, 53, 75, 94}, {65, 54, 75, 94},
  2985  			{65, 55, 75, 94}, {65, 56, 75, 94}, {65, 57, 75, 94}, {65, 58, 75, 94}, {65, 59, 75, 94},
  2986  			{66, 40, 75, 94}, {66, 41, 75, 94}, {66, 42, 75, 94}, {66, 43, 75, 94}, {66, 44, 75, 94},
  2987  			{66, 45, 75, 94}, {66, 46, 75, 94}, {66, 47, 75, 94}, {66, 48, 75, 94}, {66, 49, 75, 94},
  2988  			{66, 50, 75, 94}, {66, 51, 75, 94}, {66, 52, 75, 94}, {66, 53, 75, 94}, {66, 54, 75, 94},
  2989  			{66, 55, 75, 94}, {66, 56, 75, 94}, {66, 57, 75, 94}, {66, 58, 75, 94}, {66, 59, 75, 94},
  2990  			{67, 40, 75, 94}, {67, 41, 75, 94}, {67, 42, 75, 94}, {67, 43, 75, 94}, {67, 44, 75, 94},
  2991  			{67, 45, 75, 94}, {67, 46, 75, 94}, {67, 47, 75, 94}, {67, 48, 75, 94}, {67, 49, 75, 94},
  2992  			{67, 50, 75, 94}, {67, 51, 75, 94}, {67, 52, 75, 94}, {67, 53, 75, 94}, {67, 54, 75, 94},
  2993  			{67, 55, 75, 94}, {67, 56, 75, 94}, {67, 57, 75, 94}, {67, 58, 75, 94}, {67, 59, 75, 94},
  2994  			{68, 40, 75, 94}, {68, 41, 75, 94}, {68, 42, 75, 94}, {68, 43, 75, 94}, {68, 44, 75, 94},
  2995  			{68, 45, 75, 94}, {68, 46, 75, 94}, {68, 47, 75, 94}, {68, 48, 75, 94}, {68, 49, 75, 94},
  2996  			{68, 50, 75, 94}, {68, 51, 75, 94}, {68, 52, 75, 94}, {68, 53, 75, 94}, {68, 54, 75, 94},
  2997  			{68, 55, 75, 94}, {68, 56, 75, 94}, {68, 57, 75, 94}, {68, 58, 75, 94}, {68, 59, 75, 94},
  2998  			{69, 40, 75, 94}, {69, 41, 75, 94}, {69, 42, 75, 94}, {69, 43, 75, 94}, {69, 44, 75, 94},
  2999  			{69, 45, 75, 94}, {69, 46, 75, 94}, {69, 47, 75, 94}, {69, 48, 75, 94}, {69, 49, 75, 94},
  3000  			{69, 50, 75, 94}, {69, 51, 75, 94}, {69, 52, 75, 94}, {69, 53, 75, 94}, {69, 54, 75, 94},
  3001  			{69, 55, 75, 94}, {69, 56, 75, 94}, {69, 57, 75, 94}, {69, 58, 75, 94}, {69, 59, 75, 94},
  3002  			{70, 40, 75, 94}, {70, 41, 75, 94}, {70, 42, 75, 94}, {70, 43, 75, 94}, {70, 44, 75, 94},
  3003  			{70, 45, 75, 94}, {70, 46, 75, 94}, {70, 47, 75, 94}, {70, 48, 75, 94}, {70, 49, 75, 94},
  3004  			{70, 50, 75, 94}, {70, 51, 75, 94}, {70, 52, 75, 94}, {70, 53, 75, 94}, {70, 54, 75, 94},
  3005  			{70, 55, 75, 94}, {70, 56, 75, 94}, {70, 57, 75, 94}, {70, 58, 75, 94}, {70, 59, 75, 94},
  3006  			{71, 40, 75, 94}, {71, 41, 75, 94}, {71, 42, 75, 94}, {71, 43, 75, 94}, {71, 44, 75, 94},
  3007  			{71, 45, 75, 94}, {71, 46, 75, 94}, {71, 47, 75, 94}, {71, 48, 75, 94}, {71, 49, 75, 94},
  3008  			{71, 50, 75, 94}, {71, 51, 75, 94}, {71, 52, 75, 94}, {71, 53, 75, 94}, {71, 54, 75, 94},
  3009  			{71, 55, 75, 94}, {71, 56, 75, 94}, {71, 57, 75, 94}, {71, 58, 75, 94}, {71, 59, 75, 94},
  3010  			{72, 40, 75, 94}, {72, 41, 75, 94}, {72, 42, 75, 94}, {72, 43, 75, 94}, {72, 44, 75, 94},
  3011  			{72, 45, 75, 94}, {72, 46, 75, 94}, {72, 47, 75, 94}, {72, 48, 75, 94}, {72, 49, 75, 94},
  3012  			{72, 50, 75, 94}, {72, 51, 75, 94}, {72, 52, 75, 94}, {72, 53, 75, 94}, {72, 54, 75, 94},
  3013  			{72, 55, 75, 94}, {72, 56, 75, 94}, {72, 57, 75, 94}, {72, 58, 75, 94}, {72, 59, 75, 94},
  3014  			{73, 40, 75, 94}, {73, 41, 75, 94}, {73, 42, 75, 94}, {73, 43, 75, 94}, {73, 44, 75, 94},
  3015  			{73, 45, 75, 94}, {73, 46, 75, 94}, {73, 47, 75, 94}, {73, 48, 75, 94}, {73, 49, 75, 94},
  3016  			{73, 50, 75, 94}, {73, 51, 75, 94}, {73, 52, 75, 94}, {73, 53, 75, 94}, {73, 54, 75, 94},
  3017  			{73, 55, 75, 94}, {73, 56, 75, 94}, {73, 57, 75, 94}, {73, 58, 75, 94}, {73, 59, 75, 94},
  3018  			{74, 40, 75, 94}, {74, 41, 75, 94}, {74, 42, 75, 94}, {74, 43, 75, 94}, {74, 44, 75, 94},
  3019  			{74, 45, 75, 94}, {74, 46, 75, 94}, {74, 47, 75, 94}, {74, 48, 75, 94}, {74, 49, 75, 94},
  3020  			{74, 50, 75, 94}, {74, 51, 75, 94}, {74, 52, 75, 94}, {74, 53, 75, 94}, {74, 54, 75, 94},
  3021  			{74, 55, 75, 94}, {74, 56, 75, 94}, {74, 57, 75, 94}, {74, 58, 75, 94}, {74, 59, 75, 94},
  3022  			{75, 40, 75, 94}, {75, 41, 75, 94}, {75, 42, 75, 94}, {75, 43, 75, 94}, {75, 44, 75, 94},
  3023  			{75, 45, 75, 94}, {75, 46, 75, 94}, {75, 47, 75, 94}, {75, 48, 75, 94}, {75, 49, 75, 94},
  3024  			{75, 50, 75, 94}, {75, 51, 75, 94}, {75, 52, 75, 94}, {75, 53, 75, 94}, {75, 54, 75, 94},
  3025  			{75, 55, 75, 94}, {75, 56, 75, 94}, {75, 57, 75, 94}, {75, 58, 75, 94}, {75, 59, 75, 94},
  3026  			{76, 40, 75, 94}, {76, 41, 75, 94}, {76, 42, 75, 94}, {76, 43, 75, 94}, {76, 44, 75, 94},
  3027  			{76, 45, 75, 94}, {76, 46, 75, 94}, {76, 47, 75, 94}, {76, 48, 75, 94}, {76, 49, 75, 94},
  3028  			{76, 50, 75, 94}, {76, 51, 75, 94}, {76, 52, 75, 94}, {76, 53, 75, 94}, {76, 54, 75, 94},
  3029  			{76, 55, 75, 94}, {76, 56, 75, 94}, {76, 57, 75, 94}, {76, 58, 75, 94}, {76, 59, 75, 94},
  3030  			{77, 40, 75, 94}, {77, 41, 75, 94}, {77, 42, 75, 94}, {77, 43, 75, 94}, {77, 44, 75, 94},
  3031  			{77, 45, 75, 94}, {77, 46, 75, 94}, {77, 47, 75, 94}, {77, 48, 75, 94}, {77, 49, 75, 94},
  3032  			{77, 50, 75, 94}, {77, 51, 75, 94}, {77, 52, 75, 94}, {77, 53, 75, 94}, {77, 54, 75, 94},
  3033  			{77, 55, 75, 94}, {77, 56, 75, 94}, {77, 57, 75, 94}, {77, 58, 75, 94}, {77, 59, 75, 94},
  3034  			{78, 40, 75, 94}, {78, 41, 75, 94}, {78, 42, 75, 94}, {78, 43, 75, 94}, {78, 44, 75, 94},
  3035  			{78, 45, 75, 94}, {78, 46, 75, 94}, {78, 47, 75, 94}, {78, 48, 75, 94}, {78, 49, 75, 94},
  3036  			{78, 50, 75, 94}, {78, 51, 75, 94}, {78, 52, 75, 94}, {78, 53, 75, 94}, {78, 54, 75, 94},
  3037  			{78, 55, 75, 94}, {78, 56, 75, 94}, {78, 57, 75, 94}, {78, 58, 75, 94}, {78, 59, 75, 94},
  3038  			{79, 40, 75, 94}, {79, 41, 75, 94}, {79, 42, 75, 94}, {79, 43, 75, 94}, {79, 44, 75, 94},
  3039  			{79, 45, 75, 94}, {79, 46, 75, 94}, {79, 47, 75, 94}, {79, 48, 75, 94}, {79, 49, 75, 94},
  3040  			{79, 50, 75, 94}, {79, 51, 75, 94}, {79, 52, 75, 94}, {79, 53, 75, 94}, {79, 54, 75, 94},
  3041  			{79, 55, 75, 94}, {79, 56, 75, 94}, {79, 57, 75, 94}, {79, 58, 75, 94}, {79, 59, 75, 94},
  3042  			{80, 40, 75, 80}, {80, 40, 87, 89}, {80, 40, 93, 94},
  3043  		},
  3044  	}
  3045  	bodysplit = testBody{
  3046  		label:  5,
  3047  		offset: dvid.Point3d{75, 40, 80},
  3048  		size:   dvid.Point3d{20, 20, 10},
  3049  		blockSpans: []dvid.Span{
  3050  			{2, 1, 2, 2},
  3051  		},
  3052  		voxelSpans: []dvid.Span{
  3053  			{80, 40, 81, 86}, {80, 40, 90, 92}, // These first 2 test splits interleaved in one span.
  3054  			{80, 41, 75, 94}, {80, 42, 75, 94}, {80, 43, 75, 94}, {80, 44, 75, 94},
  3055  			{80, 45, 75, 94}, {80, 46, 75, 94}, {80, 47, 75, 94}, {80, 48, 75, 94}, {80, 49, 75, 94},
  3056  			{80, 50, 75, 94}, {80, 51, 75, 94}, {80, 52, 75, 94}, {80, 53, 75, 94}, {80, 54, 75, 94},
  3057  			{80, 55, 75, 94}, {80, 56, 75, 94}, {80, 57, 75, 94}, {80, 58, 75, 94}, {80, 59, 75, 94},
  3058  			{81, 40, 75, 94}, {81, 41, 75, 94}, {81, 42, 75, 94}, {81, 43, 75, 94}, {81, 44, 75, 94},
  3059  			{81, 45, 75, 94}, {81, 46, 75, 94}, {81, 47, 75, 94}, {81, 48, 75, 94}, {81, 49, 75, 94},
  3060  			{81, 50, 75, 94}, {81, 51, 75, 94}, {81, 52, 75, 94}, {81, 53, 75, 94}, {81, 54, 75, 94},
  3061  			{81, 55, 75, 94}, {81, 56, 75, 94}, {81, 57, 75, 94}, {81, 58, 75, 94}, {81, 59, 75, 94},
  3062  			{82, 40, 75, 94}, {82, 41, 75, 94}, {82, 42, 75, 94}, {82, 43, 75, 94}, {82, 44, 75, 94},
  3063  			{82, 45, 75, 94}, {82, 46, 75, 94}, {82, 47, 75, 94}, {82, 48, 75, 94}, {82, 49, 75, 94},
  3064  			{82, 50, 75, 94}, {82, 51, 75, 94}, {82, 52, 75, 94}, {82, 53, 75, 94}, {82, 54, 75, 94},
  3065  			{82, 55, 75, 94}, {82, 56, 75, 94}, {82, 57, 75, 94}, {82, 58, 75, 94}, {82, 59, 75, 94},
  3066  			{83, 40, 75, 94}, {83, 41, 75, 94}, {83, 42, 75, 94}, {83, 43, 75, 94}, {83, 44, 75, 94},
  3067  			{83, 45, 75, 94}, {83, 46, 75, 94}, {83, 47, 75, 94}, {83, 48, 75, 94}, {83, 49, 75, 94},
  3068  			{83, 50, 75, 94}, {83, 51, 75, 94}, {83, 52, 75, 94}, {83, 53, 75, 94}, {83, 54, 75, 94},
  3069  			{83, 55, 75, 94}, {83, 56, 75, 94}, {83, 57, 75, 94}, {83, 58, 75, 94}, {83, 59, 75, 94},
  3070  			{84, 40, 75, 94}, {84, 41, 75, 94}, {84, 42, 75, 94}, {84, 43, 75, 94}, {84, 44, 75, 94},
  3071  			{84, 45, 75, 94}, {84, 46, 75, 94}, {84, 47, 75, 94}, {84, 48, 75, 94}, {84, 49, 75, 94},
  3072  			{84, 50, 75, 94}, {84, 51, 75, 94}, {84, 52, 75, 94}, {84, 53, 75, 94}, {84, 54, 75, 94},
  3073  			{84, 55, 75, 94}, {84, 56, 75, 94}, {84, 57, 75, 94}, {84, 58, 75, 94}, {84, 59, 75, 94},
  3074  			{85, 40, 75, 94}, {85, 41, 75, 94}, {85, 42, 75, 94}, {85, 43, 75, 94}, {85, 44, 75, 94},
  3075  			{85, 45, 75, 94}, {85, 46, 75, 94}, {85, 47, 75, 94}, {85, 48, 75, 94}, {85, 49, 75, 94},
  3076  			{85, 50, 75, 94}, {85, 51, 75, 94}, {85, 52, 75, 94}, {85, 53, 75, 94}, {85, 54, 75, 94},
  3077  			{85, 55, 75, 94}, {85, 56, 75, 94}, {85, 57, 75, 94}, {85, 58, 75, 94}, {85, 59, 75, 94},
  3078  			{86, 40, 75, 94}, {86, 41, 75, 94}, {86, 42, 75, 94}, {86, 43, 75, 94}, {86, 44, 75, 94},
  3079  			{86, 45, 75, 94}, {86, 46, 75, 94}, {86, 47, 75, 94}, {86, 48, 75, 94}, {86, 49, 75, 94},
  3080  			{86, 50, 75, 94}, {86, 51, 75, 94}, {86, 52, 75, 94}, {86, 53, 75, 94}, {86, 54, 75, 94},
  3081  			{86, 55, 75, 94}, {86, 56, 75, 94}, {86, 57, 75, 94}, {86, 58, 75, 94}, {86, 59, 75, 94},
  3082  			{87, 40, 75, 94}, {87, 41, 75, 94}, {87, 42, 75, 94}, {87, 43, 75, 94}, {87, 44, 75, 94},
  3083  			{87, 45, 75, 94}, {87, 46, 75, 94}, {87, 47, 75, 94}, {87, 48, 75, 94}, {87, 49, 75, 94},
  3084  			{87, 50, 75, 94}, {87, 51, 75, 94}, {87, 52, 75, 94}, {87, 53, 75, 94}, {87, 54, 75, 94},
  3085  			{87, 55, 75, 94}, {87, 56, 75, 94}, {87, 57, 75, 94}, {87, 58, 75, 94}, {87, 59, 75, 94},
  3086  			{88, 40, 75, 94}, {88, 41, 75, 94}, {88, 42, 75, 94}, {88, 43, 75, 94}, {88, 44, 75, 94},
  3087  			{88, 45, 75, 94}, {88, 46, 75, 94}, {88, 47, 75, 94}, {88, 48, 75, 94}, {88, 49, 75, 94},
  3088  			{88, 50, 75, 94}, {88, 51, 75, 94}, {88, 52, 75, 94}, {88, 53, 75, 94}, {88, 54, 75, 94},
  3089  			{88, 55, 75, 94}, {88, 56, 75, 94}, {88, 57, 75, 94}, {88, 58, 75, 94}, {88, 59, 75, 94},
  3090  			{89, 40, 75, 94}, {89, 41, 75, 94}, {89, 42, 75, 94}, {89, 43, 75, 94}, {89, 44, 75, 94},
  3091  			{89, 45, 75, 94}, {89, 46, 75, 94}, {89, 47, 75, 94}, {89, 48, 75, 94}, {89, 49, 75, 94},
  3092  			{89, 50, 75, 94}, {89, 51, 75, 94}, {89, 52, 75, 94}, {89, 53, 75, 94}, {89, 54, 75, 94},
  3093  			{89, 55, 75, 94}, {89, 56, 75, 94}, {89, 57, 75, 94}, {89, 58, 75, 94}, {89, 59, 75, 94},
  3094  		},
  3095  	}
  3096  	body6 = testBody{
  3097  		label:  6,
  3098  		offset: dvid.Point3d{8, 10, 7},
  3099  		size:   dvid.Point3d{52, 50, 10},
  3100  		blockSpans: []dvid.Span{
  3101  			{0, 0, 0, 1},
  3102  			{0, 1, 0, 1},
  3103  		},
  3104  		voxelSpans: []dvid.Span{
  3105  			{8, 11, 9, 31}, {8, 12, 9, 59}, {8, 13, 9, 59}, {8, 14, 9, 59},
  3106  			{8, 15, 19, 59}, {8, 16, 19, 59}, {8, 17, 19, 59}, {8, 18, 19, 59},
  3107  			{8, 19, 29, 59}, {8, 20, 29, 59}, {8, 21, 29, 59}, {8, 22, 29, 59},
  3108  			{8, 23, 39, 59}, {8, 24, 39, 59}, {8, 25, 39, 59}, {8, 26, 39, 59},
  3109  			{8, 23, 39, 59}, {8, 24, 39, 59}, {8, 25, 39, 59}, {8, 26, 39, 59},
  3110  			{8, 27, 39, 59}, {8, 28, 39, 59}, {8, 29, 39, 59}, {8, 30, 39, 59},
  3111  			{8, 31, 39, 59}, {8, 32, 39, 59}, {8, 33, 39, 59}, {8, 34, 39, 59},
  3112  			{8, 35, 39, 59}, {8, 36, 39, 59}, {8, 37, 45, 59}, {8, 38, 39, 59},
  3113  			{8, 39, 39, 59}, {8, 40, 39, 59}, {8, 41, 42, 59}, {8, 42, 39, 56},
  3114  			{8, 43, 39, 59}, {8, 44, 39, 59}, {8, 45, 39, 59}, {8, 46, 39, 50},
  3115  
  3116  			{8, 11, 9, 59}, {8, 12, 9, 59}, {8, 13, 9, 59}, {8, 14, 9, 59},
  3117  			{8, 15, 19, 59}, {8, 16, 19, 59}, {8, 17, 19, 59}, {8, 18, 19, 59},
  3118  			{8, 19, 29, 59}, {8, 20, 29, 59}, {8, 21, 29, 59}, {8, 22, 29, 59},
  3119  			{8, 23, 39, 59}, {8, 24, 39, 59}, {8, 25, 39, 59}, {8, 26, 39, 59},
  3120  			{8, 23, 39, 59}, {8, 24, 39, 59}, {8, 25, 39, 59}, {8, 26, 39, 59},
  3121  			{8, 27, 39, 59}, {8, 28, 39, 59}, {8, 29, 39, 59}, {8, 30, 39, 59},
  3122  			{8, 31, 39, 59}, {8, 32, 39, 59}, {8, 33, 39, 59}, {8, 34, 39, 59},
  3123  			{8, 35, 39, 59}, {8, 36, 39, 59}, {8, 37, 45, 59}, {8, 38, 39, 59},
  3124  			{8, 39, 39, 59}, {8, 40, 39, 59}, {8, 41, 42, 59}, {8, 42, 39, 56},
  3125  			{8, 43, 39, 59}, {8, 44, 39, 59}, {8, 45, 39, 59}, {8, 46, 39, 50},
  3126  
  3127  			{9, 11, 9, 59}, {9, 12, 9, 59}, {9, 13, 9, 59}, {9, 14, 9, 59},
  3128  			{9, 15, 19, 59}, {9, 16, 19, 59}, {9, 17, 19, 59}, {9, 18, 19, 59},
  3129  			{9, 19, 29, 59}, {9, 20, 29, 59}, {9, 21, 29, 59}, {9, 22, 29, 59},
  3130  			{9, 23, 39, 59}, {9, 24, 39, 59}, {9, 25, 39, 59}, {9, 26, 39, 59},
  3131  			{9, 23, 39, 59}, {9, 24, 39, 59}, {9, 25, 39, 59}, {9, 26, 39, 59},
  3132  			{9, 27, 39, 59}, {9, 28, 39, 59}, {9, 29, 39, 59}, {9, 30, 39, 59},
  3133  			{9, 31, 39, 59}, {9, 32, 39, 59}, {9, 33, 39, 59}, {9, 34, 39, 59},
  3134  			{9, 35, 39, 59}, {9, 36, 39, 59}, {9, 37, 45, 59}, {9, 38, 39, 59},
  3135  			{9, 39, 39, 59}, {9, 40, 39, 59}, {9, 41, 42, 59}, {9, 42, 39, 56},
  3136  			{9, 43, 39, 59}, {9, 44, 39, 59}, {9, 45, 39, 59}, {9, 46, 39, 50},
  3137  
  3138  			{10, 11, 9, 59}, {10, 12, 9, 59}, {10, 13, 9, 59}, {10, 14, 9, 59},
  3139  			{10, 15, 19, 59}, {10, 16, 19, 59}, {10, 17, 19, 59}, {10, 18, 19, 59},
  3140  			{10, 19, 29, 59}, {10, 20, 29, 59}, {10, 21, 29, 59}, {10, 22, 29, 59},
  3141  			{10, 23, 39, 59}, {10, 24, 39, 59}, {10, 25, 39, 59}, {10, 26, 39, 59},
  3142  			{10, 23, 39, 59}, {10, 24, 39, 59}, {10, 25, 39, 59}, {10, 26, 39, 59},
  3143  			{10, 27, 39, 59}, {10, 28, 39, 59}, {10, 29, 39, 59}, {10, 30, 39, 59},
  3144  			{10, 31, 39, 59}, {10, 32, 39, 59}, {10, 33, 39, 59}, {10, 34, 39, 59},
  3145  			{10, 35, 39, 59}, {10, 36, 39, 59}, {10, 37, 45, 59}, {10, 38, 39, 59},
  3146  			{10, 39, 39, 59}, {10, 40, 39, 59}, {10, 41, 42, 59}, {10, 42, 39, 56},
  3147  			{10, 43, 39, 59}, {10, 44, 39, 59}, {10, 45, 39, 59}, {10, 46, 39, 50},
  3148  
  3149  			{11, 11, 9, 59}, {11, 12, 9, 59}, {11, 13, 9, 59}, {11, 14, 9, 59},
  3150  			{11, 15, 19, 59}, {11, 16, 19, 59}, {11, 17, 19, 59}, {11, 18, 19, 59},
  3151  			{11, 19, 29, 59}, {11, 20, 29, 59}, {11, 21, 29, 59}, {11, 22, 29, 59},
  3152  			{11, 23, 39, 59}, {11, 24, 39, 59}, {11, 25, 39, 59}, {11, 26, 39, 59},
  3153  			{11, 23, 39, 59}, {11, 24, 39, 59}, {11, 25, 39, 59}, {11, 26, 39, 59},
  3154  			{11, 27, 39, 59}, {11, 28, 39, 59}, {11, 29, 39, 59}, {11, 30, 39, 59},
  3155  			{11, 31, 39, 59}, {11, 32, 39, 59}, {11, 33, 39, 59}, {11, 34, 39, 59},
  3156  			{11, 35, 39, 59}, {11, 36, 39, 59}, {11, 37, 45, 59}, {11, 38, 39, 59},
  3157  			{11, 39, 39, 59}, {11, 40, 39, 59}, {11, 41, 42, 59}, {11, 42, 39, 56},
  3158  			{11, 43, 39, 59}, {11, 44, 39, 59}, {11, 45, 39, 59}, {11, 46, 39, 50},
  3159  
  3160  			{12, 11, 9, 59}, {12, 12, 9, 59}, {12, 13, 9, 59}, {12, 14, 9, 59},
  3161  			{12, 15, 19, 59}, {12, 16, 19, 59}, {12, 17, 19, 59}, {12, 18, 19, 59},
  3162  			{12, 19, 29, 59}, {12, 20, 29, 59}, {12, 21, 29, 59}, {12, 22, 29, 59},
  3163  			{12, 23, 39, 59}, {12, 24, 39, 59}, {12, 25, 39, 59}, {12, 26, 39, 59},
  3164  			{12, 23, 39, 59}, {12, 24, 39, 59}, {12, 25, 39, 59}, {12, 26, 39, 59},
  3165  			{12, 27, 39, 59}, {12, 28, 39, 59}, {12, 29, 39, 59}, {12, 30, 39, 59},
  3166  			{12, 31, 39, 59}, {12, 32, 39, 59}, {12, 33, 39, 59}, {12, 34, 39, 59},
  3167  			{12, 35, 39, 59}, {12, 36, 39, 59}, {12, 37, 45, 59}, {12, 38, 39, 59},
  3168  			{12, 39, 39, 59}, {12, 40, 39, 59}, {12, 41, 42, 59}, {12, 42, 39, 56},
  3169  			{12, 43, 39, 59}, {12, 44, 39, 59}, {12, 45, 39, 59}, {12, 46, 39, 50},
  3170  		},
  3171  	}
  3172  	body7 = testBody{
  3173  		label:  7,
  3174  		offset: dvid.Point3d{68, 10, 7},
  3175  		size:   dvid.Point3d{52, 50, 10},
  3176  		blockSpans: []dvid.Span{
  3177  			{2, 0, 0, 1},
  3178  			{2, 1, 0, 1},
  3179  		},
  3180  		voxelSpans: []dvid.Span{
  3181  			{78, 11, 9, 59}, {78, 12, 9, 59}, {78, 13, 9, 59}, {78, 14, 9, 59},
  3182  			{78, 15, 19, 59}, {78, 16, 19, 59}, {78, 17, 19, 59}, {78, 18, 19, 59},
  3183  			{78, 19, 29, 59}, {78, 20, 29, 59}, {78, 21, 29, 59}, {78, 22, 29, 59},
  3184  			{78, 23, 39, 59}, {78, 24, 39, 59}, {78, 25, 39, 59}, {78, 26, 39, 59},
  3185  			{78, 23, 39, 59}, {78, 24, 39, 59}, {78, 25, 39, 59}, {78, 26, 39, 59},
  3186  			{78, 27, 39, 59}, {78, 28, 39, 59}, {78, 29, 39, 59}, {78, 30, 39, 59},
  3187  			{78, 31, 39, 59}, {78, 32, 39, 59}, {78, 33, 39, 59}, {78, 34, 39, 59},
  3188  			{78, 35, 39, 59}, {78, 36, 39, 59}, {78, 37, 45, 59}, {78, 38, 39, 59},
  3189  			{78, 39, 39, 59}, {78, 40, 39, 59}, {78, 41, 42, 59}, {78, 42, 39, 56},
  3190  			{78, 43, 39, 59}, {78, 44, 39, 59}, {78, 45, 39, 59}, {78, 46, 39, 50},
  3191  
  3192  			{79, 11, 9, 59}, {79, 12, 9, 59}, {79, 13, 9, 59}, {79, 14, 9, 59},
  3193  			{79, 15, 19, 59}, {79, 16, 19, 59}, {79, 17, 19, 59}, {79, 18, 19, 59},
  3194  			{79, 19, 29, 59}, {79, 20, 29, 59}, {79, 21, 29, 59}, {79, 22, 29, 59},
  3195  			{79, 23, 39, 59}, {79, 24, 39, 59}, {79, 25, 39, 59}, {79, 26, 39, 59},
  3196  			{79, 23, 39, 59}, {79, 24, 39, 59}, {79, 25, 39, 59}, {79, 26, 39, 59},
  3197  			{79, 27, 39, 59}, {79, 28, 39, 59}, {79, 29, 39, 59}, {79, 30, 39, 59},
  3198  			{79, 31, 39, 59}, {79, 32, 39, 59}, {79, 33, 39, 59}, {79, 34, 39, 59},
  3199  			{79, 35, 39, 59}, {79, 36, 39, 59}, {79, 37, 45, 59}, {79, 38, 39, 59},
  3200  			{79, 39, 39, 59}, {79, 40, 39, 59}, {79, 41, 42, 59}, {79, 42, 39, 56},
  3201  			{79, 43, 39, 59}, {79, 44, 39, 59}, {79, 45, 39, 59}, {79, 46, 39, 50},
  3202  
  3203  			{80, 11, 9, 59}, {80, 12, 9, 59}, {80, 13, 9, 59}, {80, 14, 9, 59},
  3204  			{80, 15, 19, 59}, {80, 16, 19, 59}, {80, 17, 19, 59}, {80, 18, 19, 59},
  3205  			{80, 19, 29, 59}, {80, 20, 29, 59}, {80, 21, 29, 59}, {80, 22, 29, 59},
  3206  			{80, 23, 39, 59}, {80, 24, 39, 59}, {80, 25, 39, 59}, {80, 26, 39, 59},
  3207  			{80, 23, 39, 59}, {80, 24, 39, 59}, {80, 25, 39, 59}, {80, 26, 39, 59},
  3208  			{80, 27, 39, 59}, {80, 28, 39, 59}, {80, 29, 39, 59}, {80, 30, 39, 59},
  3209  			{80, 31, 39, 59}, {80, 32, 39, 59}, {80, 33, 39, 59}, {80, 34, 39, 59},
  3210  			{80, 35, 39, 59}, {80, 36, 39, 59}, {80, 37, 45, 59}, {80, 38, 39, 59},
  3211  			{80, 39, 39, 59}, {80, 40, 39, 59}, {80, 41, 42, 59}, {80, 42, 39, 56},
  3212  			{80, 43, 39, 59}, {80, 44, 39, 59}, {80, 45, 39, 59}, {80, 46, 39, 50},
  3213  
  3214  			{81, 11, 9, 59}, {81, 12, 9, 59}, {81, 13, 9, 59}, {81, 14, 9, 59},
  3215  			{81, 15, 19, 59}, {81, 16, 19, 59}, {81, 17, 19, 59}, {81, 18, 19, 59},
  3216  			{81, 19, 29, 59}, {81, 20, 29, 59}, {81, 21, 29, 59}, {81, 22, 29, 59},
  3217  			{81, 23, 39, 59}, {81, 24, 39, 59}, {81, 25, 39, 59}, {81, 26, 39, 59},
  3218  			{81, 23, 39, 59}, {81, 24, 39, 59}, {81, 25, 39, 59}, {81, 26, 39, 59},
  3219  			{81, 27, 39, 59}, {81, 28, 39, 59}, {81, 29, 39, 59}, {81, 30, 39, 59},
  3220  			{81, 31, 39, 59}, {81, 32, 39, 59}, {81, 33, 39, 59}, {81, 34, 39, 59},
  3221  			{81, 35, 39, 59}, {81, 36, 39, 59}, {81, 37, 45, 59}, {81, 38, 39, 59},
  3222  			{81, 39, 39, 59}, {81, 40, 39, 59}, {81, 41, 42, 59}, {81, 42, 39, 56},
  3223  			{81, 43, 39, 59}, {81, 44, 39, 59}, {81, 45, 39, 59}, {81, 46, 39, 50},
  3224  
  3225  			{82, 11, 9, 59}, {82, 12, 9, 59}, {82, 13, 9, 59}, {82, 14, 9, 59},
  3226  			{82, 15, 19, 59}, {82, 16, 19, 59}, {82, 17, 19, 59}, {82, 18, 19, 59},
  3227  			{82, 19, 29, 59}, {82, 20, 29, 59}, {82, 21, 29, 59}, {82, 22, 29, 59},
  3228  			{82, 23, 39, 59}, {82, 24, 39, 59}, {82, 25, 39, 59}, {82, 26, 39, 59},
  3229  			{82, 23, 39, 59}, {82, 24, 39, 59}, {82, 25, 39, 59}, {82, 26, 39, 59},
  3230  			{82, 27, 39, 59}, {82, 28, 39, 59}, {82, 29, 39, 59}, {82, 30, 39, 59},
  3231  			{82, 31, 39, 59}, {82, 32, 39, 59}, {82, 33, 39, 59}, {82, 34, 39, 59},
  3232  			{82, 35, 39, 59}, {82, 36, 39, 59}, {82, 37, 45, 59}, {82, 38, 39, 59},
  3233  			{82, 39, 39, 59}, {82, 40, 39, 59}, {82, 41, 42, 59}, {82, 42, 39, 56},
  3234  			{82, 43, 39, 59}, {82, 44, 39, 59}, {82, 45, 39, 59}, {82, 46, 39, 50},
  3235  		},
  3236  	}
  3237  	bodies = []testBody{
  3238  		body1, body2, body3, body4, bodysplit, body6, body7,
  3239  	}
  3240  )