1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    vtkThreadedSynchronizedTemplates3D.cxx
5 
6   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7   All rights reserved.
8   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10      This software is distributed WITHOUT ANY WARRANTY; without even
11      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12      PURPOSE.  See the above copyright notice for more information.
13 
14 =========================================================================*/
15 #include "vtkThreadedSynchronizedTemplates3D.h"
16 
17 #include "vtkCellArray.h"
18 #include "vtkCellData.h"
19 #include "vtkCharArray.h"
20 #include "vtkDoubleArray.h"
21 #include "vtkFloatArray.h"
22 #include "vtkInformation.h"
23 #include "vtkInformationIntegerVectorKey.h"
24 #include "vtkInformationVector.h"
25 #include "vtkIntArray.h"
26 #include "vtkLongArray.h"
27 #include "vtkMath.h"
28 #include "vtkMultiBlockDataSet.h"
29 #include "vtkObjectFactory.h"
30 #include "vtkPointData.h"
31 #include "vtkPolyData.h"
32 #include "vtkPolygonBuilder.h"
33 #include "vtkShortArray.h"
34 #include "vtkSmartPointer.h"
35 #include "vtkStreamingDemandDrivenPipeline.h"
36 #include "vtkStructuredPoints.h"
37 #include "vtkUnsignedCharArray.h"
38 #include "vtkUnsignedIntArray.h"
39 #include "vtkUnsignedLongArray.h"
40 #include "vtkUnsignedShortArray.h"
41 
42 #include <math.h>
43 
44 #include "vtkSMPTools.h"
45 #include "vtkNew.h"
46 #include "vtkExtentTranslator.h"
47 
48 vtkStandardNewMacro(vtkThreadedSynchronizedTemplates3D);
49 
50 //----------------------------------------------------------------------------
51 // Description:
52 // Construct object with initial scalar range (0,1) and single contour value
53 // of 0.0. The ImageRange are set to extract the first k-plane.
vtkThreadedSynchronizedTemplates3D()54 vtkThreadedSynchronizedTemplates3D::vtkThreadedSynchronizedTemplates3D()
55 {
56   this->ContourValues = vtkContourValues::New();
57   this->ComputeNormals = 1;
58   this->ComputeGradients = 0;
59   this->ComputeScalars = 1;
60   this->GenerateTriangles = 1;
61 
62   this->ArrayComponent = 0;
63 
64   // by default process active point scalars
65   this->SetInputArrayToProcess(0,0,0,vtkDataObject::FIELD_ASSOCIATION_POINTS,
66                                vtkDataSetAttributes::SCALARS);
67 }
68 
69 //----------------------------------------------------------------------------
~vtkThreadedSynchronizedTemplates3D()70 vtkThreadedSynchronizedTemplates3D::~vtkThreadedSynchronizedTemplates3D()
71 {
72   this->ContourValues->Delete();
73 }
74 
75 //----------------------------------------------------------------------------
76 // Overload standard modified time function. If contour values are modified,
77 // then this object is modified as well.
GetMTime()78 unsigned long vtkThreadedSynchronizedTemplates3D::GetMTime()
79 {
80   unsigned long mTime=this->Superclass::GetMTime();
81   unsigned long mTime2=this->ContourValues->GetMTime();
82 
83   mTime = ( mTime2 > mTime ? mTime2 : mTime );
84   return mTime;
85 }
86 
87 
88 //----------------------------------------------------------------------------
vtkThreadedSynchronizedTemplates3DInitializeOutput(int * ext,vtkImageData * input,int estimatedNumberOfPieces,vtkPolyData * o,vtkFloatArray * scalars,vtkFloatArray * normals,vtkFloatArray * gradients,vtkDataArray * inScalars)89 static void vtkThreadedSynchronizedTemplates3DInitializeOutput(
90   int *ext,vtkImageData *input, int estimatedNumberOfPieces,
91   vtkPolyData *o, vtkFloatArray *scalars, vtkFloatArray *normals,
92   vtkFloatArray *gradients, vtkDataArray *inScalars)
93 {
94   vtkPoints *newPts;
95   vtkCellArray *newPolys;
96   long estimatedSize;
97 
98   estimatedSize = (int) pow ((double)
99       ((ext[1]-ext[0]+1)*(ext[3]-ext[2]+1)*(ext[5]-ext[4]+1)), .75);
100   if (estimatedSize < 1024)
101     {
102     estimatedSize = 1024;
103     }
104   estimatedSize /= estimatedNumberOfPieces;
105 
106   newPts = vtkPoints::New();
107   newPts->Allocate(estimatedSize,estimatedSize);
108   newPolys = vtkCellArray::New();
109   newPolys->Allocate(newPolys->EstimateSize(estimatedSize,3));
110 
111   o->GetPointData()->CopyAllOn();
112   // It is more efficient to just create the scalar array
113   // rather than redundantly interpolate the scalars.
114   if (input->GetPointData()->GetScalars() == inScalars)
115     {
116     o->GetPointData()->CopyScalarsOff();
117     }
118   else
119     {
120     o->GetPointData()->CopyFieldOff(inScalars->GetName());
121     }
122 
123   if (normals)
124     {
125     normals->SetNumberOfComponents(3);
126     normals->Allocate(3*estimatedSize,3*estimatedSize/2);
127     normals->SetName("Normals");
128     }
129   if (gradients)
130     {
131     gradients->SetNumberOfComponents(3);
132     gradients->Allocate(3*estimatedSize,3*estimatedSize/2);
133     gradients->SetName("Gradients");
134     }
135   if (scalars)
136     {
137     // A temporary name.
138     scalars->SetName("Scalars");
139     }
140 
141   o->GetPointData()->InterpolateAllocate(input->GetPointData(),
142                                          estimatedSize,estimatedSize/2);
143   o->GetCellData()->CopyAllocate(input->GetCellData(),
144                                  estimatedSize,estimatedSize/2);
145 
146   o->SetPoints(newPts);
147   newPts->Delete();
148 
149   o->SetPolys(newPolys);
150   newPolys->Delete();
151 }
152 
153 
154 //----------------------------------------------------------------------------
155 // Calculate the gradient using central difference.
156 template <class T>
vtkSTComputePointGradient(int i,int j,int k,T * s,int * inExt,int xInc,int yInc,int zInc,double * spacing,double n[3])157 void vtkSTComputePointGradient(int i, int j, int k, T *s, int *inExt,
158                                int xInc, int yInc, int zInc,
159                                double *spacing, double n[3])
160 {
161   double sp, sm;
162 
163   // x-direction
164   if ( i == inExt[0] )
165     {
166     sp = *(s+xInc);
167     sm = *s;
168     n[0] = (sp - sm) / spacing[0];
169     }
170   else if ( i == inExt[1] )
171     {
172     sp = *s;
173     sm = *(s-xInc);
174     n[0] = (sp - sm) / spacing[0];
175     }
176   else
177     {
178     sp = *(s+xInc);
179     sm = *(s-xInc);
180     n[0] = 0.5 * (sp - sm) / spacing[0];
181     }
182 
183   // y-direction
184   if ( j == inExt[2] )
185     {
186     sp = *(s+yInc);
187     sm = *s;
188     n[1] = (sp - sm) / spacing[1];
189     }
190   else if ( j == inExt[3] )
191     {
192     sp = *s;
193     sm = *(s-yInc);
194     n[1] = (sp - sm) / spacing[1];
195     }
196   else
197     {
198     sp = *(s+yInc);
199     sm = *(s-yInc);
200     n[1] = 0.5 * (sp - sm) / spacing[1];
201     }
202 
203   // z-direction
204   if ( k == inExt[4] )
205     {
206     sp = *(s+zInc);
207     sm = *s;
208     n[2] = (sp - sm) / spacing[2];
209     }
210   else if ( k == inExt[5] )
211     {
212     sp = *s;
213     sm = *(s-zInc);
214     n[2] = (sp - sm) / spacing[2];
215     }
216   else
217     {
218     sp = *(s+zInc);
219     sm = *(s-zInc);
220     n[2] = 0.5 * (sp - sm) / spacing[2];
221     }
222 }
223 
224 //----------------------------------------------------------------------------
225 #define VTK_CSP3PA(i2,j2,k2,s) \
226 if (NeedGradients) \
227 { \
228   if (!g0) \
229     { \
230     vtkSTComputePointGradient(i, j, k, s0, inExt, xInc, yInc, zInc, spacing, n0); \
231     g0 = 1; \
232     } \
233   vtkSTComputePointGradient(i2, j2, k2, s, inExt, xInc, yInc, zInc, spacing, n1); \
234   for (jj=0; jj<3; jj++) \
235     { \
236     n[jj] = n0[jj] + t * (n1[jj] - n0[jj]); \
237     } \
238   if (ComputeGradients) \
239     { \
240     newGradients->InsertNextTuple(n); \
241     } \
242   if (ComputeNormals) \
243     { \
244     vtkMath::Normalize(n); \
245     n[0] = -n[0]; n[1] = -n[1]; n[2] = -n[2]; \
246     newNormals->InsertNextTuple(n); \
247     }   \
248 } \
249 if (ComputeScalars) \
250 { \
251   newScalars->InsertNextTuple(&value); \
252 }
253 
254 //----------------------------------------------------------------------------
255 //
256 // Contouring filter specialized for images
257 //
258 template <class T>
ContourImage(vtkThreadedSynchronizedTemplates3D * self,int * exExt,vtkImageData * data,vtkPolyData * output,vtkFloatArray * newScalars,vtkFloatArray * newNormals,vtkFloatArray * newGradients,T * ptr,vtkDataArray * inScalars,bool outputTriangles)259 void ContourImage(vtkThreadedSynchronizedTemplates3D *self, int* exExt,
260                   vtkImageData *data, vtkPolyData *output,
261                   vtkFloatArray *newScalars, vtkFloatArray *newNormals,
262                   vtkFloatArray *newGradients, T *ptr,
263                   vtkDataArray *inScalars, bool outputTriangles)
264 {
265   int *inExt = data->GetExtent();
266   int xdim = exExt[1] - exExt[0] + 1;
267   int ydim = exExt[3] - exExt[2] + 1;
268   double *values = self->GetValues();
269   int numContours = self->GetNumberOfContours();
270   T *inPtrX, *inPtrY, *inPtrZ;
271   T *s0, *s1, *s2, *s3;
272   int xMin, xMax, yMin, yMax, zMin, zMax;
273   int xInc, yInc, zInc;
274   double *origin = data->GetOrigin();
275   double *spacing = data->GetSpacing();
276   int *isect1Ptr, *isect2Ptr;
277   double y, z, t;
278   int i, j, k;
279   int zstep, yisectstep;
280   int offsets[12];
281   int ComputeNormals = self->GetComputeNormals();
282   int ComputeGradients = self->GetComputeGradients();
283   int ComputeScalars = self->GetComputeScalars();
284   int NeedGradients = ComputeGradients || ComputeNormals;
285   double n[3], n0[3], n1[3];
286   int jj, g0;
287   int *tablePtr;
288   int idx, vidx;
289   double x[3], xz[3];
290   int v0, v1, v2, v3;
291   vtkIdType ptIds[3];
292   double value;
293   // We need to know the edgePointId's for interpolating attributes.
294   int edgePtId, inCellId, outCellId;
295   vtkPointData *inPD = data->GetPointData();
296   vtkCellData *inCD = data->GetCellData();
297   vtkPointData *outPD = output->GetPointData();
298   vtkCellData *outCD = output->GetCellData();
299   // Use to be arguments
300   vtkPoints *newPts;
301   vtkCellArray *newPolys;
302 
303   ptr += self->GetArrayComponent();
304   vtkPolygonBuilder polyBuilder;
305   vtkSmartPointer<vtkIdList> poly = vtkSmartPointer<vtkIdList>::New();
306 
307   newPts = output->GetPoints();
308   newPolys = output->GetPolys();
309 
310   // this is an exploded execute extent.
311   xMin = exExt[0];
312   xMax = exExt[1];
313   yMin = exExt[2];
314   yMax = exExt[3];
315   zMin = exExt[4];
316   zMax = exExt[5];
317 
318   // increments to move through scalars. Compute these ourself because
319   // we may be contouring an array other than scalars.
320   xInc = inScalars->GetNumberOfComponents();
321   yInc = xInc*(inExt[1]-inExt[0]+1);
322   zInc = yInc*(inExt[3]-inExt[2]+1);
323 
324   // Kens increments, probably to do with edge array
325   zstep = xdim*ydim;
326   yisectstep = xdim*3;
327   // compute offsets probably how to get to the edges in the edge array.
328   offsets[0] = -xdim*3;
329   offsets[1] = -xdim*3 + 1;
330   offsets[2] = -xdim*3 + 2;
331   offsets[3] = -xdim*3 + 4;
332   offsets[4] = -xdim*3 + 5;
333   offsets[5] = 0;
334   offsets[6] = 2;
335   offsets[7] = 5;
336   offsets[8] = (zstep - xdim)*3;
337   offsets[9] = (zstep - xdim)*3 + 1;
338   offsets[10] = (zstep - xdim)*3 + 4;
339   offsets[11] = zstep*3;
340 
341   // allocate storage array
342   int *isect1 = new int [xdim*ydim*3*2];
343   // set impossible edges to -1
344   for (i = 0; i < ydim; i++)
345     {
346     isect1[(i+1)*xdim*3-3] = -1;
347     isect1[(i+1)*xdim*3*2-3] = -1;
348     }
349   for (i = 0; i < xdim; i++)
350     {
351     isect1[((ydim-1)*xdim + i)*3 + 1] = -1;
352     isect1[((ydim-1)*xdim + i)*3*2 + 1] = -1;
353     }
354 
355   // for each contour
356   for (vidx = 0; vidx < numContours; vidx++)
357     {
358     value = values[vidx];
359     inPtrZ = ptr;
360 
361     //==================================================================
362     for (k = zMin; k <= zMax; k++)
363       {
364 //      self->UpdateProgress((double)vidx/numContours +
365 //                           (k-zMin)/((zMax - zMin+1.0)*numContours));
366       z = origin[2] + spacing[2]*k;
367       x[2] = z;
368 
369       // swap the buffers
370       if (k%2)
371         {
372         offsets[8] = (zstep - xdim)*3;
373         offsets[9] = (zstep - xdim)*3 + 1;
374         offsets[10] = (zstep - xdim)*3 + 4;
375         offsets[11] = zstep*3;
376         isect1Ptr = isect1;
377         isect2Ptr = isect1 + xdim*ydim*3;
378         }
379       else
380         {
381         offsets[8] = (-zstep - xdim)*3;
382         offsets[9] = (-zstep - xdim)*3 + 1;
383         offsets[10] = (-zstep - xdim)*3 + 4;
384         offsets[11] = -zstep*3;
385         isect1Ptr = isect1 + xdim*ydim*3;
386         isect2Ptr = isect1;
387         }
388 
389       inPtrY = inPtrZ;
390       for (j = yMin; j <= yMax; j++)
391         {
392         // Should not impact performance here/
393         edgePtId = (xMin-inExt[0])*xInc + (j-inExt[2])*yInc + (k-inExt[4])*zInc;
394         // Increments are different for cells.  Since the cells are not
395         // contoured until the second row of templates, subtract 1 from
396         // i,j,and k.  Note: first cube is formed when i=0, j=1, and k=1.
397         inCellId =
398           (xMin-inExt[0]) + (inExt[1]-inExt[0])*
399           ( (j-inExt[2]-1) + (k-inExt[4]-1)*(inExt[3]-inExt[2]) );
400 
401         y = origin[1] + j*spacing[1];
402         xz[1] = y;
403         s1 = inPtrY;
404         v1 = (*s1 < value ? 0 : 1);
405 
406         inPtrX = inPtrY;
407         for (i = xMin; i <= xMax; i++)
408           {
409           s0 = s1;
410           v0 = v1;
411           // this flag keeps up from computing gradient for grid point 0 twice.
412           g0 = 0;
413           *isect2Ptr = -1;
414           *(isect2Ptr + 1) = -1;
415           *(isect2Ptr + 2) = -1;
416           if (i < xMax)
417             {
418             s1 = (inPtrX + xInc);
419             v1 = (*s1 < value ? 0 : 1);
420             if (v0 ^ v1)
421               {
422               // watch for degenerate points
423               if (*s0 == value)
424                 {
425                 if (i > xMin && *(isect2Ptr-3) > -1)
426                   {
427                   *isect2Ptr = *(isect2Ptr-3);
428                   }
429                 else if (j > yMin && *(isect2Ptr - yisectstep + 1) > -1)
430                   {
431                   *isect2Ptr = *(isect2Ptr - yisectstep + 1);
432                   }
433                 else if (k > zMin && *(isect1Ptr+2) > -1)
434                   {
435                   *isect2Ptr = *(isect1Ptr+2);
436                   }
437                 }
438               else if (*s1 == value)
439                 {
440                 if (j > yMin && *(isect2Ptr - yisectstep +4) > -1)
441                   {
442                   *isect2Ptr = *(isect2Ptr - yisectstep + 4);
443                   }
444                 else if (k > zMin && i < xMax && *(isect1Ptr + 5) > -1)
445                   {
446                   *isect2Ptr = *(isect1Ptr + 5);
447                   }
448                 }
449               // if the edge has not been set yet then it is a new point
450               if (*isect2Ptr == -1)
451                 {
452                 t = (value - (double)(*s0)) / ((double)(*s1) - (double)(*s0));
453                 x[0] = origin[0] + spacing[0]*(i+t);
454                 x[1] = y;
455                 *isect2Ptr = newPts->InsertNextPoint(x);
456                 VTK_CSP3PA(i+1,j,k,s1);
457                 outPD->InterpolateEdge(inPD, *isect2Ptr, edgePtId, edgePtId+1, t);
458                 }
459               }
460             }
461           if (j < yMax)
462             {
463             s2 = (inPtrX + yInc);
464             v2 = (*s2 < value ? 0 : 1);
465             if (v0 ^ v2)
466               {
467               if (*s0 == value)
468                 {
469                 if (*isect2Ptr > -1)
470                   {
471                   *(isect2Ptr + 1) = *isect2Ptr;
472                   }
473                 else if (i > xMin && *(isect2Ptr-3) > -1)
474                   {
475                   *(isect2Ptr + 1) = *(isect2Ptr-3);
476                   }
477                 else if (j > yMin && *(isect2Ptr - yisectstep + 1) > -1)
478                   {
479                   *(isect2Ptr + 1) = *(isect2Ptr - yisectstep + 1);
480                   }
481                 else if (k > zMin && *(isect1Ptr+2) > -1)
482                   {
483                   *(isect2Ptr + 1) = *(isect1Ptr+2);
484                   }
485                 }
486               else if (*s2 == value && k > zMin && *(isect1Ptr + yisectstep + 2) > -1)
487                 {
488                 *(isect2Ptr+1) = *(isect1Ptr + yisectstep + 2);
489                 }
490               // if the edge has not been set yet then it is a new point
491               if (*(isect2Ptr + 1) == -1)
492                 {
493                 t = (value - (double)(*s0)) / ((double)(*s2) - (double)(*s0));
494                 x[0] = origin[0] + spacing[0]*i;
495                 x[1] = y + spacing[1]*t;
496                 *(isect2Ptr + 1) = newPts->InsertNextPoint(x);
497                 VTK_CSP3PA(i,j+1,k,s2);
498                 outPD->InterpolateEdge(inPD, *(isect2Ptr+1), edgePtId, edgePtId+yInc, t);
499                 }
500               }
501             }
502           if (k < zMax)
503             {
504             s3 = (inPtrX + zInc);
505             v3 = (*s3 < value ? 0 : 1);
506             if (v0 ^ v3)
507               {
508               if (*s0 == value)
509                 {
510                 if (*isect2Ptr > -1)
511                   {
512                   *(isect2Ptr + 2) = *isect2Ptr;
513                   }
514                 else if (*(isect2Ptr+1) > -1)
515                   {
516                   *(isect2Ptr + 2) = *(isect2Ptr+1);
517                   }
518                 else if (i > xMin && *(isect2Ptr-3) > -1)
519                   {
520                   *(isect2Ptr + 2) = *(isect2Ptr-3);
521                   }
522                 else if (j > yMin && *(isect2Ptr - yisectstep + 1) > -1)
523                   {
524                   *(isect2Ptr + 2) = *(isect2Ptr - yisectstep + 1);
525                   }
526                 else if (k > zMin && *(isect1Ptr+2) > -1)
527                   {
528                   *(isect2Ptr + 2) = *(isect1Ptr+2);
529                   }
530                 }
531               if (*(isect2Ptr + 2) == -1)
532                 {
533                 t = (value - (double)(*s0)) / ((double)(*s3) - (double)(*s0));
534                 xz[0] = origin[0] + spacing[0]*i;
535                 xz[2] = z + spacing[2]*t;
536                 *(isect2Ptr + 2) = newPts->InsertNextPoint(xz);
537                 VTK_CSP3PA(i,j,k+1,s3);
538                 outPD->InterpolateEdge(inPD, *(isect2Ptr+2), edgePtId, edgePtId+zInc, t);
539                 }
540               }
541             }
542           // To keep track of ids for interpolating attributes.
543           ++edgePtId;
544 
545           // now add any polys that need to be added
546           // basically look at the isect values,
547           // form an index and lookup the polys
548           if (j > yMin && i < xMax && k > zMin)
549             {
550             idx = (v0 ? 4096 : 0);
551             idx = idx + (*(isect1Ptr - yisectstep) > -1 ? 2048 : 0);
552             idx = idx + (*(isect1Ptr -yisectstep +1) > -1 ? 1024 : 0);
553             idx = idx + (*(isect1Ptr -yisectstep +2) > -1 ? 512 : 0);
554             idx = idx + (*(isect1Ptr -yisectstep +4) > -1 ? 256 : 0);
555             idx = idx + (*(isect1Ptr -yisectstep +5) > -1 ? 128 : 0);
556             idx = idx + (*(isect1Ptr) > -1 ? 64 : 0);
557             idx = idx + (*(isect1Ptr + 2) > -1 ? 32 : 0);
558             idx = idx + (*(isect1Ptr + 5) > -1 ? 16 : 0);
559             idx = idx + (*(isect2Ptr -yisectstep) > -1 ? 8 : 0);
560             idx = idx + (*(isect2Ptr -yisectstep +1) > -1 ? 4 : 0);
561             idx = idx + (*(isect2Ptr -yisectstep +4) > -1 ? 2 : 0);
562             idx = idx + (*(isect2Ptr) > -1 ? 1 : 0);
563 
564             tablePtr = VTK_TSYNCHRONIZED_TEMPLATES_3D_TABLE_2
565               + VTK_TSYNCHRONIZED_TEMPLATES_3D_TABLE_1[idx];
566 
567             if (!outputTriangles)
568               {
569               polyBuilder.Reset();
570               }
571             while (*tablePtr != -1)
572               {
573               ptIds[0] = *(isect1Ptr + offsets[*tablePtr]);
574               tablePtr++;
575               ptIds[1] = *(isect1Ptr + offsets[*tablePtr]);
576               tablePtr++;
577               ptIds[2] = *(isect1Ptr + offsets[*tablePtr]);
578               tablePtr++;
579               if (ptIds[0] != ptIds[1] &&
580                   ptIds[0] != ptIds[2] &&
581                   ptIds[1] != ptIds[2])
582                 {
583                 if(outputTriangles)
584                   {
585                   outCellId = newPolys->InsertNextCell(3,ptIds);
586                   outCD->CopyData(inCD, inCellId, outCellId);
587                   }
588                 else
589                   {
590                   polyBuilder.InsertTriangle(ptIds);
591                   }
592                 }
593               }
594             if(!outputTriangles)
595               {
596               polyBuilder.GetPolygon(poly);
597               if(poly->GetNumberOfIds()>0)
598                 {
599                 outCellId = newPolys->InsertNextCell(poly);
600                 outCD->CopyData(inCD, inCellId, outCellId);
601                 }
602               }
603             }
604           inPtrX += xInc;
605           isect2Ptr += 3;
606           isect1Ptr += 3;
607           // To keep track of ids for copying cell attributes..
608           ++inCellId;
609           }
610         inPtrY += yInc;
611         }
612       inPtrZ += zInc;
613       }
614     }
615   delete [] isect1;
616 }
617 
vtkThreadedSynchronizedTemplates3DFinalizeOutput(vtkDataArray * inScalars,vtkPolyData * piece,vtkFloatArray * scalars,vtkFloatArray * normals,vtkFloatArray * gradients)618 static void vtkThreadedSynchronizedTemplates3DFinalizeOutput(
619   vtkDataArray *inScalars, vtkPolyData *piece, vtkFloatArray *scalars,
620   vtkFloatArray *normals, vtkFloatArray *gradients)
621 {
622   if (scalars)
623     {
624     // Lets set the name of the scalars here.
625     if (inScalars)
626       {
627       scalars->SetName(inScalars->GetName());
628       }
629     int idx = piece->GetPointData()->AddArray(scalars);
630     piece->GetPointData()->SetActiveAttribute(idx,
631                                               vtkDataSetAttributes::SCALARS);
632     scalars->Delete();
633     }
634   if (gradients)
635     {
636     int idx = piece->GetPointData()->AddArray(gradients);
637     piece->GetPointData()->SetActiveAttribute(idx,
638                                               vtkDataSetAttributes::VECTORS);
639     gradients->Delete();
640     }
641   if (normals)
642     {
643     piece->GetPointData()->SetNormals(normals);
644     normals->Delete();
645     }
646 }
647 
648 
649 //----------------------------------------------------------------------------
SetInputMemoryLimit(unsigned long vtkNotUsed (limit))650 void vtkThreadedSynchronizedTemplates3D::SetInputMemoryLimit(
651   unsigned long vtkNotUsed(limit) )
652 {
653   vtkErrorMacro( << "This filter no longer supports a memory limit." );
654   vtkErrorMacro( << "This filter no longer initiates streaming." );
655   vtkErrorMacro( << "Please use a vtkPolyDataStreamer after this filter to achieve similar functionality." );
656 }
657 
658 
659 //----------------------------------------------------------------------------
GetInputMemoryLimit()660 unsigned long vtkThreadedSynchronizedTemplates3D::GetInputMemoryLimit()
661 {
662   vtkErrorMacro( << "This filter no longer supports a memory limit." );
663   vtkErrorMacro( << "This filter no longer initiates streaming." );
664   vtkErrorMacro( << "Please use a vtkPolyDataStreamer after this filter to achieve similar functionality." );
665 
666   return 0;
667 }
668 
669 class DoThreadedContour
670 {
671 public:
DoThreadedContour(vtkThreadedSynchronizedTemplates3D * filter,int * exExt,vtkImageData * input,vtkDataArray * scalars,int numPieces)672   DoThreadedContour(vtkThreadedSynchronizedTemplates3D* filter,
673     int* exExt, vtkImageData* input, vtkDataArray* scalars,
674     int numPieces) : Filter(filter), ExExt(exExt), Input(input), Outputs(NULL),
675                      NumOutputPieces(0), Scalars(scalars),
676                      NumberOfPieces(numPieces)
677   {
678   }
679 
~DoThreadedContour()680   ~DoThreadedContour()
681   {
682     delete [] this->Outputs;
683   }
684 
GetNumberOfOutputPieces() const685   int GetNumberOfOutputPieces() const
686   {
687     return this->NumOutputPieces;
688   }
689 
GetOutputPiece(int pieceIdx)690   vtkPolyData* GetOutputPiece(int pieceIdx)
691   {
692     return this->Outputs[pieceIdx];
693   }
694 
Initialize()695   void Initialize()
696   {
697     ThreadLocalWorkSpace &ws = this->tlws.Local();
698     ws.poly = vtkPolyData::New();
699     ws.scalars = ws.normals = ws.gradients = NULL;
700 
701     if (Filter->GetComputeScalars())
702       {
703       ws.scalars = vtkFloatArray::New();
704       }
705     if (Filter->GetComputeNormals())
706       {
707       ws.normals = vtkFloatArray::New();
708       }
709     if (Filter->GetComputeGradients())
710       {
711       ws.gradients = vtkFloatArray::New();
712       }
713 
714     vtkThreadedSynchronizedTemplates3DInitializeOutput(this->ExExt,
715       this->Input, vtkSMPTools::GetEstimatedNumberOfThreads(), ws.poly,
716       ws.scalars, ws.normals, ws.gradients, this->Scalars);
717   }
718 
Reduce()719   void Reduce()
720   {
721     this->NumOutputPieces = static_cast<int>(tlws.size());
722     this->Outputs = new vtkPolyData* [this->NumOutputPieces];
723 
724     int p = 0;
725     for (TLS_t::iterator i = this->tlws.begin(); i != this->tlws.end(); ++i)
726       {
727       vtkPolyData* contour = i->poly;
728       vtkThreadedSynchronizedTemplates3DFinalizeOutput(Scalars, contour,
729         i->scalars, i->normals, i->gradients);
730       Outputs[p++] = contour;
731       }
732   }
733 
operator ()(vtkIdType begin,vtkIdType end)734   void operator()( vtkIdType begin, vtkIdType end )
735   {
736     vtkNew<vtkExtentTranslator> et;
737     et->SetWholeExtent(this->ExExt);
738     et->SetNumberOfPieces(this->NumberOfPieces);
739     ThreadLocalWorkSpace &ws = tlws.Local();
740     for(int i=begin; i<end; i++)
741       {
742       int exExt2[6];
743       et->SetPiece(i);
744       et->PieceToExtent();
745       et->GetExtent(exExt2);
746       void* ptr = this->Input->GetArrayPointerForExtent(this->Scalars, exExt2);
747       switch (this->Scalars->GetDataType())
748         {
749         vtkTemplateMacro(
750           ContourImage(this->Filter, exExt2, this->Input, ws.poly, ws.scalars,
751             ws.normals, ws.gradients, (VTK_TT *)ptr, this->Scalars, true));
752         }
753       }
754   }
755 
756 private:
757   struct ThreadLocalWorkSpace
758   {
759     vtkPolyData *poly;
760     vtkFloatArray *scalars;
761     vtkFloatArray *normals;
762     vtkFloatArray *gradients;
763   };
764   typedef vtkSMPThreadLocal<ThreadLocalWorkSpace> TLS_t;
765   TLS_t tlws;
766 
767   vtkThreadedSynchronizedTemplates3D* Filter;
768   int* ExExt;
769   vtkImageData* Input;
770   vtkPolyData **Outputs;
771   int NumOutputPieces;
772   vtkDataArray* Scalars;
773   int NumberOfPieces;
774 };
775 
776 
777 //----------------------------------------------------------------------------
778 //
779 // Contouring filter specialized for images (or slices from images)
780 //
ThreadedExecute(vtkImageData * data,vtkInformation * inInfo,vtkInformation * outInfo,vtkDataArray * inScalars)781 void vtkThreadedSynchronizedTemplates3D::ThreadedExecute(vtkImageData *data,
782                                                  vtkInformation* inInfo,
783                                                  vtkInformation *outInfo,
784                                                  vtkDataArray *inScalars)
785 {
786   vtkMultiBlockDataSet *output;
787 
788   vtkDebugMacro(<< "Executing 3D structured contour");
789 
790   output = vtkMultiBlockDataSet::GetData(outInfo);
791 
792   int* inExt = data->GetExtent();
793   int exExt[6];
794   inInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), exExt);
795   for (int i=0; i<3; i++)
796     {
797     if (inExt[2*i] > exExt[2*i])
798       {
799       exExt[2*i] = inExt[2*i];
800       }
801     if (inExt[2*i+1] < exExt[2*i+1])
802       {
803       exExt[2*i+1] = inExt[2*i+1];
804       }
805     }
806   if ( exExt[0] >= exExt[1] || exExt[2] >= exExt[3] || exExt[4] >= exExt[5] )
807     {
808     vtkDebugMacro(<<"3D structured contours requires 3D data");
809     return;
810     }
811 
812   //
813   // Check data type and execute appropriate function
814   //
815   if (inScalars == NULL)
816     {
817     vtkDebugMacro("No scalars for contouring.");
818     return;
819     }
820   int numComps = inScalars->GetNumberOfComponents();
821 
822   if (this->ArrayComponent >= numComps)
823     {
824     vtkErrorMacro("Scalars have " << numComps << " components. "
825                   "ArrayComponent must be smaller than " << numComps);
826     return;
827     }
828 
829   int ncells = (exExt[1] - exExt[0]) * (exExt[3] - exExt[2]) *
830                (exExt[5] - exExt[4]);
831   const int grainSize = 32 * 32 * 32;
832   int nPieces = (ncells == 0) ? 1 : (ncells + grainSize - 1)/grainSize;
833   DoThreadedContour functor(this, exExt, data, inScalars, nPieces);
834   vtkSMPTools::For( 0, nPieces, functor );
835 
836   int p = 0;
837   for (int i = 0; i < functor.GetNumberOfOutputPieces(); ++i)
838     {
839     vtkPolyData* piece = functor.GetOutputPiece(i);
840     output->SetBlock(p++, piece);
841     piece->Delete();
842     }
843 }
844 
845 //----------------------------------------------------------------------------
RequestData(vtkInformation * request,vtkInformationVector ** inputVector,vtkInformationVector * outputVector)846 int vtkThreadedSynchronizedTemplates3D::RequestData(
847   vtkInformation *request,
848   vtkInformationVector **inputVector,
849   vtkInformationVector *outputVector)
850 {
851   // get the info objects
852   vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
853   vtkInformation *outInfo = outputVector->GetInformationObject(0);
854 
855   // get the input and output
856   vtkImageData *input = vtkImageData::SafeDownCast(
857     inInfo->Get(vtkDataObject::DATA_OBJECT()));
858 
859   // to be safe recompute the
860   this->RequestUpdateExtent(request,inputVector,outputVector);
861 
862   vtkDataArray *inScalars = this->GetInputArrayToProcess(0,inputVector);
863 
864   // Just call the threaded execute directly.
865   this->ThreadedExecute(input, inInfo, outInfo, inScalars);
866 
867   return 1;
868 }
869 
870 //----------------------------------------------------------------------------
RequestUpdateExtent(vtkInformation * vtkNotUsed (request),vtkInformationVector ** inputVector,vtkInformationVector * outputVector)871 int vtkThreadedSynchronizedTemplates3D::RequestUpdateExtent(
872   vtkInformation *vtkNotUsed(request),
873   vtkInformationVector **inputVector,
874   vtkInformationVector *outputVector)
875 {
876   // These require extra ghost levels
877   if (this->ComputeGradients || this->ComputeNormals)
878     {
879     vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
880     vtkInformation *outInfo = outputVector->GetInformationObject(0);
881 
882     int ghostLevels;
883     ghostLevels =
884       outInfo->Get(
885         vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS());
886     inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(),
887                 ghostLevels + 1);
888     }
889 
890   return 1;
891 }
892 
893 //----------------------------------------------------------------------------
FillInputPortInformation(int,vtkInformation * info)894 int vtkThreadedSynchronizedTemplates3D::FillInputPortInformation(int, vtkInformation *info)
895 {
896   info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkImageData");
897   return 1;
898 }
899 
900 //----------------------------------------------------------------------------
PrintSelf(ostream & os,vtkIndent indent)901 void vtkThreadedSynchronizedTemplates3D::PrintSelf(ostream& os, vtkIndent indent)
902 {
903   this->Superclass::PrintSelf(os,indent);
904 
905   this->ContourValues->PrintSelf(os,indent.GetNextIndent());
906 
907   os << indent << "Compute Normals: " << (this->ComputeNormals ? "On\n" : "Off\n");
908   os << indent << "Compute Gradients: " << (this->ComputeGradients ? "On\n" : "Off\n");
909   os << indent << "Compute Scalars: " << (this->ComputeScalars ? "On\n" : "Off\n");
910   os << indent << "ArrayComponent: " << this->ArrayComponent << endl;
911 }
912 
913 
914 // template table.
915 
916 int VTK_TSYNCHRONIZED_TEMPLATES_3D_TABLE_1[] = {
917    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
918    0,    0,    0,    0,    0,    0,    0,    0,    0,  592,
919    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
920    0,    0,    0,    0,    0,    0,    0, 1312,    0,    0,
921    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
922    0,    0,    0,    0,  585,    0,    0,    0,    0,    0,
923    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
924    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
925    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
926    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
927    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
928    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
929    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
930    0,    0,    0,    0,    0,    0,    0,    0,  260,    0,
931    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
932    0,    0,    0,  948,    0,    0,    0,    0,    0,    0,
933    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
934    0,    0,    0,    0,    0,  935,    0,    0,    0,    0,
935    0,    0,    0,    0,    0,    0,    0,    0,  250,    0,
936    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
937    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
938    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
939    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
940    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
941    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
942    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
943    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
944    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
945    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
946    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
947    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
948    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
949    0,    0,    0,  620,    0,    0,    0,    0,    0,    0,
950    0,    0,    0,    0,    0,    0,   16,    0,    0,    0,
951    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
952    0,    0,    0,    0,    0,    0,    0,    0,  530,    0,
953    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
954    0,    0,    0, 1263,    0,    0,    0,    0,    0,    0,
955    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
956    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
957    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
958    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
959    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
960    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
961    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
962    0,    0,    0,    0,    0,    0,    0,  988,    0,    0,
963    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
964    0,    0,    0,    0,  288,    0,    0,    0,    0,    0,
965    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
966    0,    0,  201,    0,    0,    0,    0,    0,    0,    0,
967    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
968    0,  874,    0,    0,    0,    0,    0,    0,    0,    0,
969    0,    0,    0,    0,  106,    0,    0,    0,    0,    0,
970    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
971    0,    0,    0,  746,    0,    0,    0,    0,    0,    0,
972    0,    0,    0, 1119,    0,    0,    0,    0,    0,    0,
973    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
974  404,    0,    0,    0,    0,    0,    0,    0,    0,    0,
975    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
976    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
977    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
978    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
979    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
980    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
981    0,    0,    0,    0,    0,    0,  414,    0,    0,    0,
982    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
983    0, 1126,    0,    0,    0,    0,    0,    0,    0,    0,
984    0,    0,    0,    0,    0,  736,    0,    0,    0,    0,
985    0,    0,    0,    0,    0,    0,    0,    0,   99,    0,
986    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
987    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
988    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
989    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
990    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
991    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
992    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
993    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
994    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
995    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
996    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
997    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
998    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
999    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1000    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1001    0,    0,    0,    0,    0,    0,    0,  786,    0,    0,
1002    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1003  134,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1004    0,    0,    0,    0,  355,    0,    0,    0,    0,    0,
1005    0,    0,    0,    0,    0,    0,    0,    0,    0, 1064,
1006    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1007    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1008    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1009    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1010    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1011    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1012    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1013    0,    0,    0,    0,    0, 1172,    0,    0,    0,    0,
1014    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1015    0,    0,  448,    0,    0,    0,    0,    0,    0,    0,
1016    0,    0,   62,    0,    0,    0,    0,    0,    0,    0,
1017    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1018    0,  687,    0,    0,    0,    0,    0,    0,    0,    0,
1019    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1020    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1021    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1022    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1023    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1024    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1025    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1026    0,    0,    0, 1211,    0,    0,    0,    0,    0,    0,
1027    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1028  484,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1029   44,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1030    0,    0,    0,    0,    0,    0,    0,    0,    0,  660,
1031    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1032    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1033    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1034    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1035    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1036    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1037    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1038    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1039    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1040    0,  822,    0,    0,    0,    0,    0,    0,    0,    0,
1041    0,    0,    0,    0,  161,    0,    0,    0,    0,    0,
1042    0,    0,    0,    0,    0,    0,    0,    0,  328,    0,
1043    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1044    0,    0,    0, 1028,    0,    0,    0,    0,    0,    0,
1045    0,    0,    0,    0,    0,    0,  441,    0,    0,    0,
1046    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1047    0, 1162,    0,    0,    0,    0,    0,    0,    0,    0,
1048    0,    0,    0,    0,    0,  700,    0,    0,    0,    0,
1049    0,    0,    0,    0,    0,    0,    0,    0,   72,    0,
1050    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1051    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1052    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1053    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1054    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1055    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1056    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1057    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1058    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1059  124,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1060    0,    0,    0,    0,    0,    0,    0,    0,    0,  773,
1061    0,    0,    0,    0,    0,    0,    0,    0,    0, 1080,
1062    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1063    0,    0,    0,    0,    0,    0,  368,    0,    0,    0,
1064    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1065    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1066    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1067    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1068    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1069    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1070    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1071    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1072    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1073    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1074    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1075    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1076    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1077    0,    0,    0,    0,    0,    0,    0,    0,    0, 1018,
1078    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1079    0,    0,    0,    0,    0,    0,  315,    0,    0,    0,
1080    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1081    0,    0,    0,    0,  174,    0,    0,    0,    0,    0,
1082    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1083    0,    0,    0,  838,    0,    0,    0,    0,    0,    0,
1084    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1085    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1086    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1087    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1088    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1089    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1090    0,  647,    0,    0,    0,    0,    0,    0,    0,    0,
1091    0,    0,    0,    0,   34,    0,    0,    0,    0,    0,
1092    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1093    0,    0,    0,    0,    0,    0,  494,    0,    0,    0,
1094    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1095    0, 1218,    0,    0,    0,    0,    0,    0,    0,    0,
1096    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1097    0,    0,  278,    0,    0,    0,    0,    0,    0,    0,
1098    0,    0,    0,    0,    0,    0,    0,  975,    0,    0,
1099    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1100    0,    0,    0,    0,    0,    0,    0,    0,    0,  890,
1101    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1102    0,    0,  214,    0,    0,    0,    0,    0,    0,    0,
1103    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1104    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1105    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1106    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1107    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1108    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1109    9,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1110    0,    0,    0,    0,    0,    0,    0,    0,    0,  610,
1111    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1112    0,    0,    0,    0,    0,    0,    0, 1276,    0,    0,
1113    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1114    0,    0,    0,    0,  540,    0,    0,    0,    0,    0,
1115    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1116    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1117    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1118    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1119    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1120    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1121    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1122    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1123    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1124    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1125    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1126    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1127    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1128    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1129    0, 1011,    0,    0,    0,    0,    0,    0,    0,    0,
1130    0,    0,    0,    0,    0,    0,    0,    0,  305,    0,
1131    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1132    0,    0,    0,    0,    0,    0,  181,    0,    0,    0,
1133    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1134    0,    0,    0,    0,    0,  848,    0,    0,    0,    0,
1135    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1136    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1137    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1138    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1139    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1140    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1141    0,    0,    0,  637,    0,    0,    0,    0,    0,    0,
1142    0,    0,    0,    0,    0,    0,   27,    0,    0,    0,
1143    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1144    0,    0,    0,    0,    0,    0,    0,    0,  504,    0,
1145    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1146    0,    0,    0, 1231,    0,    0,    0,    0,    0,    0,
1147    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1148    0,    0,    0,    0,  271,    0,    0,    0,    0,    0,
1149    0,    0,    0,    0,    0,    0,    0,    0,    0,  965,
1150    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1151    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1152    0,  903,    0,    0,    0,    0,    0,    0,    0,    0,
1153    0,    0,    0,    0,  224,    0,    0,    0,    0,    0,
1154    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1155    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1156    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1157    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1158    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1159    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1160    0,    0,    5,    0,    0,    0,    0,    0,    0,    0,
1161    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1162    0,  603,    0,    0,    0,    0,    0,    0,    0,    0,
1163    0,    0,    0,    0,    0,    0,    0,    0,    0, 1292,
1164    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1165    0,    0,    0,    0,    0,    0,  553,    0,    0,    0,
1166    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1167    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1168    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1169    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1170    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1171    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1172    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1173    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1174    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1175    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1176    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1177    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1178    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1179    0,    0,    0,    0,    0,    0,    0,    0,    0, 1201,
1180    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1181    0,    0,    0,    0,    0,    0,  471,    0,    0,    0,
1182    0,    0,    0,    0,    0,    0,   48,    0,    0,    0,
1183    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1184    0,    0,    0,    0,    0,  667,    0,    0,    0,    0,
1185    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1186    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1187    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1188    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1189    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1190    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1191    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1192    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1193    0,    0,    0,    0,    0,    0,    0,  809,    0,    0,
1194    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1195  151,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1196    0,    0,    0,    0,  335,    0,    0,    0,    0,    0,
1197    0,    0,    0,    0,    0,    0,    0,    0,    0, 1038,
1198    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1199    0,    0,  431,    0,    0,    0,    0,    0,    0,    0,
1200    0,    0,    0,    0,    0,    0,    0, 1149,    0,    0,
1201    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1202    0,  710,    0,    0,    0,    0,    0,    0,    0,    0,
1203    0,    0,    0,    0,   79,    0,    0,    0,    0,    0,
1204    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1205    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1206    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1207    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1208    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1209    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1210    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1211    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1212    0,    0,    0,    0,    0,    0,  117,    0,    0,    0,
1213    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1214    0,    0,    0,    0,    0,  763,    0,    0,    0,    0,
1215    0,    0,    0,    0,    0, 1093,    0,    0,    0,    0,
1216    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1217    0,    0,  378,    0,    0,    0,    0,    0,    0,    0,
1218    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1219    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1220    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1221    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1222    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1223    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1224    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1225    0,    0,    0,    0,  110,    0,    0,    0,    0,    0,
1226    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1227    0,    0,    0,  753,    0,    0,    0,    0,    0,    0,
1228    0,    0,    0, 1109,    0,    0,    0,    0,    0,    0,
1229    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1230  391,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1231    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1232    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1233    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1234    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1235    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1236    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1237    0,    0,    0,    0,    0,    0,  421,    0,    0,    0,
1238    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1239    0, 1136,    0,    0,    0,    0,    0,    0,    0,    0,
1240    0,    0,    0,    0,    0,  723,    0,    0,    0,    0,
1241    0,    0,    0,    0,    0,    0,    0,    0,   89,    0,
1242    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1243    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1244    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1245    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1246    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1247    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1248    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1249    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1250    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1251    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1252    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1253    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1254    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1255    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1256    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1257    0,    0,    0,    0,    0,    0,    0,  796,    0,    0,
1258    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1259  141,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1260    0,    0,    0,    0,  345,    0,    0,    0,    0,    0,
1261    0,    0,    0,    0,    0,    0,    0,    0,    0, 1051,
1262    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1263    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1264    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1265    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1266    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1267    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1268    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1269    0,    0,    0,    0,    0, 1185,    0,    0,    0,    0,
1270    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1271    0,    0,  458,    0,    0,    0,    0,    0,    0,    0,
1272    0,    0,   55,    0,    0,    0,    0,    0,    0,    0,
1273    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1274    0,  677,    0,    0,    0,    0,    0,    0,    0,    0,
1275    0,    0,    0,    0,    1,    0,    0,    0,    0,    0,
1276    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1277    0,    0,    0,  596,    0,    0,    0,    0,    0,    0,
1278    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1279    0, 1299,    0,    0,    0,    0,    0,    0,    0,    0,
1280    0,    0,    0,    0,    0,    0,    0,    0,  569,    0,
1281    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1282    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1283    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1284    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1285    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1286    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1287    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1288    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1289    0,    0,  264,    0,    0,    0,    0,    0,    0,    0,
1290    0,    0,    0,    0,    0,    0,    0,  955,    0,    0,
1291    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1292    0,    0,    0,    0,    0,    0,    0,    0,    0,  919,
1293    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1294    0,    0,  237,    0,    0,    0,    0,    0,    0,    0,
1295    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1296    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1297    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1298    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1299    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1300    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1301    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1302    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1303    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1304    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1305    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1306    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1307    0,    0,    0,    0,    0,    0,    0,  627,    0,    0,
1308    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1309   20,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1310    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1311    0,    0,  517,    0,    0,    0,    0,    0,    0,    0,
1312    0,    0,    0,    0,    0,    0,    0, 1247,    0,    0,
1313    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1314    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1315    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1316    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1317    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1318    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1319    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1320    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1321    0,  998,    0,    0,    0,    0,    0,    0,    0,    0,
1322    0,    0,    0,    0,    0,    0,    0,    0,  295,    0,
1323    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1324    0,    0,    0,    0,    0,    0,  191,    0,    0,    0,
1325    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1326    0,    0,    0,    0,    0,  861,    0,    0,    0,    0,
1327    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1328    0,    0,    0,    0,    0, 2036,    0,    0,    0,    0,
1329    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1330    0,    0,    0, 1316,    0,    0,    0,    0,    0,    0,
1331    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1332 2040,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1333    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1334    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1335    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1336    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1337    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1338    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1339    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1340    0,    0,    0,    0, 2404,    0,    0,    0,    0,    0,
1341    0,    0,    0,    0,    0,    0,    0,    0,    0, 1641,
1342    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1343    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1344    0, 1648,    0,    0,    0,    0,    0,    0,    0,    0,
1345    0,    0,    0,    0, 2408,    0,    0,    0,    0,    0,
1346    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1347    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1348    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1349    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1350    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1351    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1352    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1353    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1354    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1355    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1356    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1357    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1358    0,    0,    0,    0,    0,    0,    0,    0,    0, 1993,
1359    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1360    0,    0, 2696,    0,    0,    0,    0,    0,    0,    0,
1361    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1362    0,    0,    0,    0, 2080,    0,    0,    0,    0,    0,
1363    0,    0,    0,    0,    0,    0,    0,    0,    0, 1344,
1364    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1365    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1366    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1367    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1368    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1369    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1370    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1371    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1372    0,    0,    0, 1592,    0,    0,    0,    0,    0,    0,
1373    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1374 2361,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1375    0,    0,    0,    0,    0,    0,    0,    0, 2460,    0,
1376    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1377    0,    0,    0,    0,    0,    0,    0, 1688,    0,    0,
1378    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1379 2594,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1380    0,    0,    0,    0,    0,    0,    0,    0,    0, 1837,
1381    0,    0,    0,    0,    0,    0,    0,    0,    0, 1470,
1382    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1383    0,    0,    0,    0,    0,    0, 2218,    0,    0,    0,
1384    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1385    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1386    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1387    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1388    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1389    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1390    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1391    0,    0, 2211,    0,    0,    0,    0,    0,    0,    0,
1392    0,    0,    0,    0,    0,    0,    0, 1460,    0,    0,
1393    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1394    0, 1850,    0,    0,    0,    0,    0,    0,    0,    0,
1395    0,    0,    0,    0, 2598,    0,    0,    0,    0,    0,
1396    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1397    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1398    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1399    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1400    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1401    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1402    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1403    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1404    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1405    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1406    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1407    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1408    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1409    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1410    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1411    0,    0,    0, 1776,    0,    0,    0,    0,    0,    0,
1412    0,    0,    0,    0,    0,    0, 2557,    0,    0,    0,
1413    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1414 2270,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1415    0,    0,    0,    0,    0, 1510,    0,    0,    0,    0,
1416    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1417    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1418    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1419    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1420    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1421    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1422    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1423    0, 1411,    0,    0,    0,    0,    0,    0,    0,    0,
1424    0,    0,    0,    0,    0,    0,    0,    0, 2168,    0,
1425    0,    0,    0,    0,    0,    0,    0,    0, 2632,    0,
1426    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1427    0,    0,    0,    0,    0,    0,    0, 1896,    0,    0,
1428    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1429    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1430    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1431    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1432    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1433    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1434    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1435    0,    0,    0,    0,    0,    0,    0,    0,    0, 1384,
1436    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1437    0,    0,    0,    0,    0,    0, 2132,    0,    0,    0,
1438    0,    0,    0,    0,    0,    0, 2662,    0,    0,    0,
1439    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1440    0,    0,    0,    0,    0, 1941,    0,    0,    0,    0,
1441    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1442    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1443    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1444    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1445    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1446    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1447    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1448    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1449    0,    0,    0,    0,    0,    0,    0, 1740,    0,    0,
1450    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1451 2512,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1452    0,    0,    0,    0, 2315,    0,    0,    0,    0,    0,
1453    0,    0,    0,    0,    0,    0,    0,    0,    0, 1546,
1454    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1455    0,    0, 2184,    0,    0,    0,    0,    0,    0,    0,
1456    0,    0,    0,    0,    0,    0,    0, 1424,    0,    0,
1457    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1458    0, 1886,    0,    0,    0,    0,    0,    0,    0,    0,
1459    0,    0,    0,    0, 2625,    0,    0,    0,    0,    0,
1460    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1461    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1462    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1463    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1464    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1465    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1466    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1467    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1468    0,    0,    0,    0,    0,    0, 2564,    0,    0,    0,
1469    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1470    0,    0,    0,    0,    0, 1792,    0,    0,    0,    0,
1471    0,    0,    0,    0,    0, 1497,    0,    0,    0,    0,
1472    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1473    0,    0, 2254,    0,    0,    0,    0,    0,    0,    0,
1474    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1475    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1476    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1477    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1478    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1479    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1480    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1481    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1482    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1483    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1484    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1485    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1486    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1487    0,    0,    0,    0,    0, 1562,    0,    0,    0,    0,
1488    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1489    0,    0, 2322,    0,    0,    0,    0,    0,    0,    0,
1490    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1491 2499,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1492    0,    0,    0,    0,    0,    0,    0,    0,    0, 1724,
1493    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1494    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1495    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1496    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1497    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1498    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1499    0,    0,    0,    0,    0,    0,    0, 1954,    0,    0,
1500    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1501 2666,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1502    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1503    0,    0, 2116,    0,    0,    0,    0,    0,    0,    0,
1504    0,    0,    0,    0,    0,    0,    0, 1371,    0,    0,
1505    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1506    0,    0,    0,    0,    0,    0,    0,    0, 2374,    0,
1507    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1508    0,    0,    0, 1602,    0,    0,    0,    0,    0,    0,
1509    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1510    0,    0,    0,    0,    0, 1675,    0,    0,    0,    0,
1511    0,    0,    0,    0,    0,    0,    0,    0, 2444,    0,
1512    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1513    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1514    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1515    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1516    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1517    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1518    0,    0,    0,    0,    0,    0, 2700,    0,    0,    0,
1519    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1520    0,    0,    0,    0,    0, 2000,    0,    0,    0,    0,
1521    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1522    0,    0,    0, 1334,    0,    0,    0,    0,    0,    0,
1523    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1524 2067,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1525    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1526    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1527    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1528    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1529    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1530    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1531    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1532    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1533    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1534    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1535    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1536    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1537    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1538    0,    0,    0,    0,    0,    0,    0, 1572,    0,    0,
1539    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1540    0,    0,    0,    0, 2335,    0,    0,    0,    0,    0,
1541    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1542    0,    0, 2489,    0,    0,    0,    0,    0,    0,    0,
1543    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1544    0, 1711,    0,    0,    0,    0,    0,    0,    0,    0,
1545    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1546    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1547    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1548    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1549    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1550    0,    0,    0,    0,    0,    0,    0,    0,    0, 1967,
1551    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1552    0,    0, 2676,    0,    0,    0,    0,    0,    0,    0,
1553    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1554    0,    0,    0,    0, 2103,    0,    0,    0,    0,    0,
1555    0,    0,    0,    0,    0,    0,    0,    0,    0, 1361,
1556    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1557    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1558 2384,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1559    0,    0,    0,    0,    0, 1615,    0,    0,    0,    0,
1560    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1561    0,    0,    0,    0,    0,    0,    0, 1665,    0,    0,
1562    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1563 2431,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1564    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1565    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1566    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1567    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1568    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1569    0,    0,    0,    0,    0,    0,    0,    0, 2707,    0,
1570    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1571    0,    0,    0,    0,    0,    0,    0, 2016,    0,    0,
1572    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1573    0,    0,    0,    0,    0, 1327,    0,    0,    0,    0,
1574    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1575    0,    0, 2057,    0,    0,    0,    0,    0,    0,    0,
1576    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1577    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1578    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1579    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1580    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1581    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1582    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1583    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1584    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1585    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1586    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1587    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1588    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1589    0,    0,    0,    0,    0, 1391,    0,    0,    0,    0,
1590    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1591    0,    0, 2142,    0,    0,    0,    0,    0,    0,    0,
1592    0,    0, 2655,    0,    0,    0,    0,    0,    0,    0,
1593    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1594    0, 1925,    0,    0,    0,    0,    0,    0,    0,    0,
1595    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1596    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1597    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1598    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1599    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1600    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1601    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1602    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1603    0,    0,    0, 1750,    0,    0,    0,    0,    0,    0,
1604    0,    0,    0,    0,    0,    0, 2525,    0,    0,    0,
1605    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1606 2299,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1607    0,    0,    0,    0,    0, 1533,    0,    0,    0,    0,
1608    0,    0,    0,    0,    0,    0,    0,    0, 2191,    0,
1609    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1610    0,    0,    0, 1434,    0,    0,    0,    0,    0,    0,
1611    0,    0,    0,    0,    0,    0,    0, 1873,    0,    0,
1612    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1613 2615,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1614    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1615    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1616    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1617    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1618    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1619    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1620    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1621    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1622    0,    0, 2574,    0,    0,    0,    0,    0,    0,    0,
1623    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1624    0, 1805,    0,    0,    0,    0,    0,    0,    0,    0,
1625    0, 1487,    0,    0,    0,    0,    0,    0,    0,    0,
1626    0,    0,    0,    0,    0,    0,    0,    0, 2241,    0,
1627    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1628    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1629    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1630    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1631    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1632    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1633    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1634    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1635 2587,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1636    0,    0,    0,    0,    0,    0,    0,    0,    0, 1821,
1637    0,    0,    0,    0,    0,    0,    0,    0,    0, 1477,
1638    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1639    0,    0,    0,    0,    0,    0, 2228,    0,    0,    0,
1640    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1641    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1642    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1643    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1644    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1645    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1646    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1647    0,    0, 2201,    0,    0,    0,    0,    0,    0,    0,
1648    0,    0,    0,    0,    0,    0,    0, 1447,    0,    0,
1649    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1650    0, 1860,    0,    0,    0,    0,    0,    0,    0,    0,
1651    0,    0,    0,    0, 2605,    0,    0,    0,    0,    0,
1652    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1653    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1654    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1655    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1656    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1657    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1658    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1659    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1660    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1661    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1662    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1663    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1664    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1665    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1666    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1667    0,    0,    0, 1763,    0,    0,    0,    0,    0,    0,
1668    0,    0,    0,    0,    0,    0, 2541,    0,    0,    0,
1669    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1670 2283,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1671    0,    0,    0,    0,    0, 1520,    0,    0,    0,    0,
1672    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1673    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1674    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1675    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1676    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1677    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1678    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1679    0, 1401,    0,    0,    0,    0,    0,    0,    0,    0,
1680    0,    0,    0,    0,    0,    0,    0,    0, 2155,    0,
1681    0,    0,    0,    0,    0,    0,    0,    0, 2642,    0,
1682    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1683    0,    0,    0,    0,    0,    0,    0, 1909,    0,    0,
1684    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1685 2711,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1686    0,    0,    0,    0,    0,    0,    0,    0,    0, 2029,
1687    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1688    0,    0,    0,    0,    0,    0,    0, 1320,    0,    0,
1689    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1690    0,    0,    0,    0, 2047,    0,    0,    0,    0,    0,
1691    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1692    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1693    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1694    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1695    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1696    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1697    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1698    0,    0,    0,    0,    0,    0,    0,    0, 2391,    0,
1699    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1700    0,    0,    0, 1625,    0,    0,    0,    0,    0,    0,
1701    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1702    0,    0,    0,    0,    0, 1655,    0,    0,    0,    0,
1703    0,    0,    0,    0,    0,    0,    0,    0, 2418,    0,
1704    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1705    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1706    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1707    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1708    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1709    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1710    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1711    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1712    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1713    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1714    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1715    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1716    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1717    0,    0,    0, 1977,    0,    0,    0,    0,    0,    0,
1718    0,    0,    0,    0,    0,    0, 2683,    0,    0,    0,
1719    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1720    0,    0,    0,    0,    0,    0,    0,    0, 2090,    0,
1721    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1722    0,    0,    0, 1351,    0,    0,    0,    0,    0,    0,
1723    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1724    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1725    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1726    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1727    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1728    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1729    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1730    0,    0,    0,    0,    0,    0,    0, 1579,    0,    0,
1731    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1732    0,    0,    0,    0, 2345,    0,    0,    0,    0,    0,
1733    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1734    0,    0, 2473,    0,    0,    0,    0,    0,    0,    0,
1735    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
1736    0, 1698 };
1737 
1738 
1739 int VTK_TSYNCHRONIZED_TEMPLATES_3D_TABLE_2[] = {
1740  -1,   0,   1,   2,  -1,   0,   4,   3,  -1,   3,   1,   2,
1741   4,   3,   2,  -1,   3,   7,   5,  -1,   0,   1,   2,   3,
1742   7,   5,  -1,   4,   7,   5,   0,   4,   5,  -1,   5,   1,
1743   2,   5,   2,   7,   7,   2,   4,  -1,   1,   5,   6,  -1,
1744   0,   5,   6,   2,   0,   6,  -1,   3,   0,   4,   5,   6,
1745   1,  -1,   3,   5,   6,   3,   6,   4,   4,   6,   2,  -1,
1746   1,   3,   7,   6,   1,   7,  -1,   0,   3,   7,   0,   7,
1747   2,   2,   7,   6,  -1,   1,   0,   4,   1,   4,   6,   6,
1748   4,   7,  -1,   4,   7,   2,   7,   6,   2,  -1,   8,   2,
1749   9,  -1,   8,   0,   1,   9,   8,   1,  -1,   0,   4,   3,
1750   2,   9,   8,  -1,   8,   4,   3,   8,   3,   9,   9,   3,
1751   1,  -1,   3,   7,   5,   2,   9,   8,  -1,   1,   9,   8,
1752   1,   8,   0,   3,   7,   5,  -1,   4,   7,   5,   4,   5,
1753   0,   2,   9,   8,  -1,   5,   4,   7,   5,   9,   4,   5,
1754   1,   9,   9,   8,   4,  -1,   2,   9,   8,   1,   5,   6,
1755  -1,   6,   9,   8,   6,   8,   5,   5,   8,   0,  -1,   4,
1756   3,   0,   2,   9,   8,   5,   6,   1,  -1,   8,   6,   9,
1757   4,   6,   8,   4,   5,   6,   4,   3,   5,  -1,   1,   3,
1758   7,   1,   7,   6,   9,   8,   2,  -1,   3,   7,   6,   3,
1759   6,   8,   3,   8,   0,   9,   8,   6,  -1,   8,   2,   9,
1760   4,   6,   0,   4,   7,   6,   6,   1,   0,  -1,   8,   6,
1761   9,   8,   4,   6,   4,   7,   6,  -1,   4,   8,  10,  -1,
1762   4,   8,  10,   0,   1,   2,  -1,   0,   8,  10,   3,   0,
1763  10,  -1,   2,   8,  10,   2,  10,   1,   1,  10,   3,  -1,
1764   3,   7,   5,   4,   8,  10,  -1,   1,   2,   0,   3,   7,
1765   5,   8,  10,   4,  -1,  10,   7,   5,  10,   5,   8,   8,
1766   5,   0,  -1,   5,  10,   7,   1,  10,   5,   1,   8,  10,
1767   1,   2,   8,  -1,   4,   8,  10,   5,   6,   1,  -1,   0,
1768   5,   6,   0,   6,   2,   8,  10,   4,  -1,   0,   8,  10,
1769   0,  10,   3,   5,   6,   1,  -1,   5,  10,   3,   5,   2,
1770  10,   5,   6,   2,   8,  10,   2,  -1,   7,   6,   1,   7,
1771   1,   3,   4,   8,  10,  -1,   8,  10,   4,   0,   3,   2,
1772   2,   3,   7,   2,   7,   6,  -1,  10,   0,   8,  10,   6,
1773   0,  10,   7,   6,   6,   1,   0,  -1,  10,   2,   8,  10,
1774   7,   2,   7,   6,   2,  -1,   4,   2,   9,  10,   4,   9,
1775  -1,   4,   0,   1,   4,   1,  10,  10,   1,   9,  -1,   0,
1776   2,   9,   0,   9,   3,   3,   9,  10,  -1,   3,   1,  10,
1777   1,   9,  10,  -1,   4,   2,   9,   4,   9,  10,   7,   5,
1778   3,  -1,   7,   5,   3,   4,   0,  10,  10,   0,   1,  10,
1779   1,   9,  -1,   2,   5,   0,   2,  10,   5,   2,   9,  10,
1780   7,   5,  10,  -1,   5,  10,   7,   5,   1,  10,   1,   9,
1781  10,  -1,   9,  10,   4,   9,   4,   2,   1,   5,   6,  -1,
1782   4,   9,  10,   4,   5,   9,   4,   0,   5,   5,   6,   9,
1783  -1,   5,   6,   1,   0,   2,   3,   3,   2,   9,   3,   9,
1784  10,  -1,   6,   3,   5,   6,   9,   3,   9,  10,   3,  -1,
1785   4,   2,  10,   2,   9,  10,   7,   1,   3,   7,   6,   1,
1786  -1,  10,   0,   9,  10,   4,   0,   9,   0,   6,   3,   7,
1787   0,   6,   0,   7,  -1,   6,   0,   7,   6,   1,   0,   7,
1788   0,  10,   2,   9,   0,  10,   0,   9,  -1,   6,  10,   7,
1789   9,  10,   6,  -1,   7,  10,  11,  -1,   0,   1,   2,  10,
1790  11,   7,  -1,   4,   3,   0,  10,  11,   7,  -1,   3,   1,
1791   2,   3,   2,   4,  10,  11,   7,  -1,   3,  10,  11,   5,
1792   3,  11,  -1,   3,  10,  11,   3,  11,   5,   1,   2,   0,
1793  -1,   4,  10,  11,   4,  11,   0,   0,  11,   5,  -1,  10,
1794   2,   4,  10,   5,   2,  10,  11,   5,   1,   2,   5,  -1,
1795   5,   6,   1,   7,  10,  11,  -1,   6,   2,   0,   6,   0,
1796   5,   7,  10,  11,  -1,   0,   4,   3,   5,   6,   1,  10,
1797  11,   7,  -1,  10,  11,   7,   3,   5,   4,   4,   5,   6,
1798   4,   6,   2,  -1,  11,   6,   1,  11,   1,  10,  10,   1,
1799   3,  -1,   0,   6,   2,   0,  10,   6,   0,   3,  10,  10,
1800  11,   6,  -1,   1,  11,   6,   0,  11,   1,   0,  10,  11,
1801   0,   4,  10,  -1,  11,   4,  10,  11,   6,   4,   6,   2,
1802   4,  -1,  10,  11,   7,   8,   2,   9,  -1,   8,   0,   1,
1803   8,   1,   9,  11,   7,  10,  -1,   3,   0,   4,  10,  11,
1804   7,   2,   9,   8,  -1,   7,  10,  11,   3,   9,   4,   3,
1805   1,   9,   9,   8,   4,  -1,  11,   5,   3,  11,   3,  10,
1806   8,   2,   9,  -1,   3,  10,   5,  10,  11,   5,   1,   8,
1807   0,   1,   9,   8,  -1,   2,   9,   8,   4,  10,   0,   0,
1808  10,  11,   0,  11,   5,  -1,   9,   4,   1,   9,   8,   4,
1809   1,   4,   5,  10,  11,   4,   5,   4,  11,  -1,   1,   5,
1810   6,   9,   8,   2,   7,  10,  11,  -1,  10,  11,   7,   8,
1811   5,   9,   8,   0,   5,   5,   6,   9,  -1,   0,   4,   3,
1812   8,   2,   9,   5,   6,   1,  10,  11,   7,  -1,   4,   3,
1813   5,   4,   5,   6,   4,   6,   8,   9,   8,   6,  10,  11,
1814   7,  -1,   2,   9,   8,   1,  10,   6,   1,   3,  10,  10,
1815  11,   6,  -1,  10,   6,   3,  10,  11,   6,   3,   6,   0,
1816   9,   8,   6,   0,   6,   8,  -1,   0,   4,  10,   0,  10,
1817  11,   0,  11,   1,   6,   1,  11,   2,   9,   8,  -1,  11,
1818   4,  10,  11,   6,   4,   8,   4,   9,   9,   4,   6,  -1,
1819   7,   4,   8,  11,   7,   8,  -1,   8,  11,   7,   8,   7,
1820   4,   0,   1,   2,  -1,   7,   3,   0,   7,   0,  11,  11,
1821   0,   8,  -1,   2,   3,   1,   2,  11,   3,   2,   8,  11,
1822  11,   7,   3,  -1,   3,   4,   8,   3,   8,   5,   5,   8,
1823  11,  -1,   1,   2,   0,   3,   4,   5,   5,   4,   8,   5,
1824   8,  11,  -1,   0,   8,   5,   8,  11,   5,  -1,   2,   5,
1825   1,   2,   8,   5,   8,  11,   5,  -1,   7,   4,   8,   7,
1826   8,  11,   6,   1,   5,  -1,   0,   5,   2,   5,   6,   2,
1827   8,   7,   4,   8,  11,   7,  -1,   1,   5,   6,   0,  11,
1828   3,   0,   8,  11,  11,   7,   3,  -1,  11,   3,   8,  11,
1829   7,   3,   8,   3,   2,   5,   6,   3,   2,   3,   6,  -1,
1830   4,   8,  11,   4,  11,   1,   4,   1,   3,   6,   1,  11,
1831  -1,   2,   3,   6,   2,   0,   3,   6,   3,  11,   4,   8,
1832   3,  11,   3,   8,  -1,   1,  11,   6,   1,   0,  11,   0,
1833   8,  11,  -1,  11,   2,   8,   6,   2,  11,  -1,   9,  11,
1834   7,   9,   7,   2,   2,   7,   4,  -1,   0,   1,   9,   0,
1835   9,   7,   0,   7,   4,  11,   7,   9,  -1,   7,   9,  11,
1836   3,   9,   7,   3,   2,   9,   3,   0,   2,  -1,   7,   9,
1837  11,   7,   3,   9,   3,   1,   9,  -1,   3,  11,   5,   3,
1838   2,  11,   3,   4,   2,   2,   9,  11,  -1,   5,   4,  11,
1839   5,   3,   4,  11,   4,   9,   0,   1,   4,   9,   4,   1,
1840  -1,   9,   0,   2,   9,  11,   0,  11,   5,   0,  -1,   9,
1841   5,   1,  11,   5,   9,  -1,   5,   6,   1,   7,   2,  11,
1842   7,   4,   2,   2,   9,  11,  -1,   5,   9,   0,   5,   6,
1843   9,   0,   9,   4,  11,   7,   9,   4,   9,   7,  -1,   3,
1844   0,   2,   3,   2,   9,   3,   9,   7,  11,   7,   9,   5,
1845   6,   1,  -1,   6,   3,   5,   6,   9,   3,   7,   3,  11,
1846  11,   3,   9,  -1,   2,  11,   4,   2,   9,  11,   4,  11,
1847   3,   6,   1,  11,   3,  11,   1,  -1,   0,   3,   4,   6,
1848   9,  11,  -1,   9,   0,   2,   9,  11,   0,   1,   0,   6,
1849   6,   0,  11,  -1,   9,  11,   6,  -1,   9,   6,  11,  -1,
1850   1,   2,   0,   6,  11,   9,  -1,   0,   4,   3,   6,  11,
1851   9,  -1,   2,   4,   3,   2,   3,   1,   6,  11,   9,  -1,
1852   7,   5,   3,  11,   9,   6,  -1,   3,   7,   5,   1,   2,
1853   0,  11,   9,   6,  -1,   5,   0,   4,   5,   4,   7,  11,
1854   9,   6,  -1,  11,   9,   6,   5,   1,   7,   7,   1,   2,
1855   7,   2,   4,  -1,   9,   1,   5,  11,   9,   5,  -1,   9,
1856   2,   0,   9,   0,  11,  11,   0,   5,  -1,   5,  11,   9,
1857   5,   9,   1,   0,   4,   3,  -1,   3,   5,  11,   3,  11,
1858   2,   3,   2,   4,   2,  11,   9,  -1,   7,  11,   9,   7,
1859   9,   3,   3,   9,   1,  -1,   7,  11,   9,   3,   7,   9,
1860   3,   9,   2,   3,   2,   0,  -1,   0,   9,   1,   0,   7,
1861   9,   0,   4,   7,  11,   9,   7,  -1,   9,   7,  11,   9,
1862   2,   7,   2,   4,   7,  -1,  11,   8,   2,   6,  11,   2,
1863  -1,   1,   6,  11,   1,  11,   0,   0,  11,   8,  -1,   2,
1864   6,  11,   2,  11,   8,   4,   3,   0,  -1,   4,  11,   8,
1865   4,   1,  11,   4,   3,   1,   6,  11,   1,  -1,  11,   8,
1866   2,  11,   2,   6,   5,   3,   7,  -1,   3,   7,   5,   1,
1867   6,   0,   0,   6,  11,   0,  11,   8,  -1,   8,   2,   6,
1868   8,   6,  11,   0,   4,   5,   5,   4,   7,  -1,   7,   1,
1869   4,   7,   5,   1,   4,   1,   8,   6,  11,   1,   8,   1,
1870  11,  -1,   2,   1,   5,   2,   5,   8,   8,   5,  11,  -1,
1871   0,   5,   8,   8,   5,  11,  -1,   3,   0,   4,   5,   8,
1872   1,   5,  11,   8,   8,   2,   1,  -1,   3,   8,   4,   3,
1873   5,   8,   5,  11,   8,  -1,   2,   1,   3,   2,   3,  11,
1874   2,  11,   8,  11,   3,   7,  -1,   7,   0,   3,   7,  11,
1875   0,  11,   8,   0,  -1,   8,   1,  11,   8,   2,   1,  11,
1876   1,   7,   0,   4,   1,   7,   1,   4,  -1,   7,   8,   4,
1877  11,   8,   7,  -1,   8,  10,   4,   9,   6,  11,  -1,   0,
1878   1,   2,   8,  10,   4,   6,  11,   9,  -1,  10,   3,   0,
1879  10,   0,   8,   9,   6,  11,  -1,   6,  11,   9,   2,   8,
1880   1,   1,   8,  10,   1,  10,   3,  -1,   4,   8,  10,   7,
1881   5,   3,   9,   6,  11,  -1,  11,   9,   6,   3,   7,   5,
1882   0,   1,   2,   8,  10,   4,  -1,   9,   6,  11,  10,   7,
1883   8,   8,   7,   5,   8,   5,   0,  -1,   1,   2,   8,   1,
1884   8,  10,   1,  10,   5,   7,   5,  10,   6,  11,   9,  -1,
1885   9,   1,   5,   9,   5,  11,  10,   4,   8,  -1,   4,   8,
1886  10,   0,  11,   2,   0,   5,  11,  11,   9,   2,  -1,   1,
1887   5,  11,   1,  11,   9,   3,   0,  10,  10,   0,   8,  -1,
1888  11,   2,   5,  11,   9,   2,   5,   2,   3,   8,  10,   2,
1889   3,   2,  10,  -1,   4,   8,  10,   7,  11,   3,   3,  11,
1890   9,   3,   9,   1,  -1,   3,   7,  11,   3,  11,   9,   3,
1891   9,   0,   2,   0,   9,   4,   8,  10,  -1,   8,   7,   0,
1892   8,  10,   7,   0,   7,   1,  11,   9,   7,   1,   7,   9,
1893  -1,   9,   7,  11,   9,   2,   7,  10,   7,   8,   8,   7,
1894   2,  -1,  11,  10,   4,  11,   4,   6,   6,   4,   2,  -1,
1895   1,   6,  11,   0,   1,  11,   0,  11,  10,   0,  10,   4,
1896  -1,   0,   2,   6,   0,   6,  10,   0,  10,   3,  10,   6,
1897  11,  -1,  11,   1,   6,  11,  10,   1,  10,   3,   1,  -1,
1898   3,   7,   5,   4,   6,  10,   4,   2,   6,   6,  11,  10,
1899  -1,   0,   1,   6,   0,   6,  11,   0,  11,   4,  10,   4,
1900  11,   3,   7,   5,  -1,   6,  10,   2,   6,  11,  10,   2,
1901  10,   0,   7,   5,  10,   0,  10,   5,  -1,  11,   1,   6,
1902  11,  10,   1,   5,   1,   7,   7,   1,  10,  -1,  10,   4,
1903   2,  10,   2,   5,  10,   5,  11,   1,   5,   2,  -1,   4,
1904  11,  10,   4,   0,  11,   0,   5,  11,  -1,   3,   2,  10,
1905   3,   0,   2,  10,   2,  11,   1,   5,   2,  11,   2,   5,
1906  -1,   3,  11,  10,   5,  11,   3,  -1,   3,  11,   1,   3,
1907   7,  11,   1,  11,   2,  10,   4,  11,   2,  11,   4,  -1,
1908   7,   0,   3,   7,  11,   0,   4,   0,  10,  10,   0,  11,
1909  -1,   0,   2,   1,  10,   7,  11,  -1,   7,  11,  10,  -1,
1910   6,   7,  10,   9,   6,  10,  -1,   6,   7,  10,   6,  10,
1911   9,   2,   0,   1,  -1,  10,   9,   6,  10,   6,   7,   3,
1912   0,   4,  -1,   7,  10,   9,   7,   9,   6,   4,   3,   2,
1913   2,   3,   1,  -1,   6,   5,   3,   6,   3,   9,   9,   3,
1914  10,  -1,   0,   1,   2,   3,   9,   5,   3,  10,   9,   9,
1915   6,   5,  -1,   4,  10,   9,   4,   9,   5,   4,   5,   0,
1916   5,   9,   6,  -1,   9,   5,  10,   9,   6,   5,  10,   5,
1917   4,   1,   2,   5,   4,   5,   2,  -1,   5,   7,  10,   5,
1918  10,   1,   1,  10,   9,  -1,   2,   0,   5,   2,   5,  10,
1919   2,  10,   9,   7,  10,   5,  -1,   4,   3,   0,  10,   1,
1920   7,  10,   9,   1,   1,   5,   7,  -1,   4,   5,   2,   4,
1921   3,   5,   2,   5,   9,   7,  10,   5,   9,   5,  10,  -1,
1922   3,  10,   1,   1,  10,   9,  -1,   0,   9,   2,   0,   3,
1923   9,   3,  10,   9,  -1,   4,   1,   0,   4,  10,   1,  10,
1924   9,   1,  -1,   4,   9,   2,  10,   9,   4,  -1,  10,   8,
1925   2,  10,   2,   7,   7,   2,   6,  -1,  10,   8,   0,  10,
1926   0,   6,  10,   6,   7,   6,   0,   1,  -1,   0,   4,   3,
1927   2,   7,   8,   2,   6,   7,   7,  10,   8,  -1,   7,   8,
1928   6,   7,  10,   8,   6,   8,   1,   4,   3,   8,   1,   8,
1929   3,  -1,   5,   3,  10,   5,  10,   2,   5,   2,   6,   8,
1930   2,  10,  -1,   0,   6,   8,   0,   1,   6,   8,   6,  10,
1931   5,   3,   6,  10,   6,   3,  -1,   0,  10,   5,   0,   4,
1932  10,   5,  10,   6,   8,   2,  10,   6,  10,   2,  -1,   4,
1933  10,   8,   5,   1,   6,  -1,   5,   7,  10,   1,   5,  10,
1934   1,  10,   8,   1,   8,   2,  -1,  10,   5,   7,  10,   8,
1935   5,   8,   0,   5,  -1,   1,   5,   7,   1,   7,  10,   1,
1936  10,   2,   8,   2,  10,   0,   4,   3,  -1,  10,   5,   7,
1937  10,   8,   5,   3,   5,   4,   4,   5,   8,  -1,   2,  10,
1938   8,   2,   1,  10,   1,   3,  10,  -1,   0,  10,   8,   3,
1939  10,   0,  -1,   2,  10,   8,   2,   1,  10,   4,  10,   0,
1940   0,  10,   1,  -1,   4,  10,   8,  -1,   8,   9,   6,   8,
1941   6,   4,   4,   6,   7,  -1,   0,   1,   2,   8,   9,   4,
1942   4,   9,   6,   4,   6,   7,  -1,   3,   6,   7,   3,   8,
1943   6,   3,   0,   8,   9,   6,   8,  -1,   1,   8,   3,   1,
1944   2,   8,   3,   8,   7,   9,   6,   8,   7,   8,   6,  -1,
1945   8,   9,   6,   4,   8,   6,   4,   6,   5,   4,   5,   3,
1946  -1,   4,   8,   9,   4,   9,   6,   4,   6,   3,   5,   3,
1947   6,   0,   1,   2,  -1,   6,   8,   9,   6,   5,   8,   5,
1948   0,   8,  -1,   6,   8,   9,   6,   5,   8,   2,   8,   1,
1949   1,   8,   5,  -1,   5,   7,   4,   5,   4,   9,   5,   9,
1950   1,   9,   4,   8,  -1,   4,   9,   7,   4,   8,   9,   7,
1951   9,   5,   2,   0,   9,   5,   9,   0,  -1,   1,   7,   9,
1952   1,   5,   7,   9,   7,   8,   3,   0,   7,   8,   7,   0,
1953  -1,   3,   5,   7,   2,   8,   9,  -1,   8,   3,   4,   8,
1954   9,   3,   9,   1,   3,  -1,   8,   3,   4,   8,   9,   3,
1955   0,   3,   2,   2,   3,   9,  -1,   8,   1,   0,   9,   1,
1956   8,  -1,   8,   9,   2,  -1,   4,   2,   7,   7,   2,   6,
1957  -1,   1,   4,   0,   1,   6,   4,   6,   7,   4,  -1,   0,
1958   7,   3,   0,   2,   7,   2,   6,   7,  -1,   1,   7,   3,
1959   6,   7,   1,  -1,   3,   6,   5,   3,   4,   6,   4,   2,
1960   6,  -1,   1,   4,   0,   1,   6,   4,   3,   4,   5,   5,
1961   4,   6,  -1,   0,   6,   5,   2,   6,   0,  -1,   1,   6,
1962   5,  -1,   5,   2,   1,   5,   7,   2,   7,   4,   2,  -1,
1963   4,   5,   7,   0,   5,   4,  -1,   5,   2,   1,   5,   7,
1964   2,   0,   2,   3,   3,   2,   7,  -1,   3,   5,   7,  -1,
1965   3,   2,   1,   4,   2,   3,  -1,   0,   3,   4,  -1,   0,
1966   2,   1,  -1 };
1967