]> https://gitweb.dealii.org/ - dealii.git/commitdiff
parallel running version of multigrid Cuthill McKee reordering
authorMathias Anselmann <mathias.anselmann@posteo.de>
Tue, 10 Nov 2020 18:11:10 +0000 (19:11 +0100)
committerMathias Anselmann <mathias.anselmann@posteo.de>
Tue, 10 Nov 2020 18:11:10 +0000 (19:11 +0100)
include/deal.II/dofs/dof_renumbering.h
include/deal.II/dofs/dof_tools.h
source/dofs/dof_renumbering.cc
source/dofs/dof_renumbering.inst.in
source/dofs/dof_tools.cc
source/dofs/dof_tools.inst.in
tests/mpi/renumber_cuthill_mckee.cc
tests/mpi/renumber_cuthill_mckee.mpirun=1.with_p4est=true.output
tests/mpi/renumber_cuthill_mckee.mpirun=4.with_p4est=true.output

index 0ee1e4fb8c8c3f967d67f4e0169269df31af9155..314cb08d367b6a1b6ce5a561a9783853a6fb75dd 100644 (file)
@@ -590,7 +590,9 @@ namespace DoFRenumbering
    * This function does not perform the renumbering on the DoFHandler DoFs but
    * only returns the renumbering vector.
    *
-   * See the Cuthill_McKee() function for an explanation of the arguments.
+   * If a valid level is passed as parameter, the renumbering vector for this
+   * grid level is returned.
+   * See the Cuthill_McKee() function for an explanation of the other arguments.
    */
   template <int dim, int spacedim>
   void
@@ -600,7 +602,8 @@ namespace DoFRenumbering
     const bool                                  reversed_numbering = false,
     const bool                                  use_constraints    = false,
     const std::vector<types::global_dof_index> &starting_indices =
-      std::vector<types::global_dof_index>());
+      std::vector<types::global_dof_index>(),
+    const unsigned int level = numbers::invalid_unsigned_int);
 
   /**
    * Renumber the degrees of freedom according to the Cuthill-McKee method,
index 57c1c76721d980a3310b0b9b32d960940df74bff..fc30216f7f6b0b169adf27a9650c1e06eeffc364 100644 (file)
@@ -1657,6 +1657,21 @@ namespace DoFTools
   extract_locally_active_dofs(const DoFHandler<dim, spacedim> &dof_handler,
                               IndexSet &                       dof_set);
 
+  /**
+   * Same function as above, but on a certain level in a multigrid scenarion.
+   * Strictly speaking we don't talk about active DoFs in such a multigrid
+   * scenario. Nevertheless this function returns all DoF indices that live on
+   * all locally owned cells (including on the interface to ghost cells) on a
+   * certain level, as the function above.
+   */
+  template <int dim, int spacedim>
+  void
+  extract_locally_active_level_dofs(
+    const DoFHandler<dim, spacedim> &dof_handler,
+    IndexSet &                       dof_set,
+    const unsigned int               level);
+
+
   /**
    * Extract the set of global DoF indices that are active on the current
    * DoFHandler. For regular DoFHandlers, these are all DoF indices, but for
index 91dd5cc960943c989e52f42a9fbb20cc41119ef4..d997f2dd0818db4c9ae3c4df08bfa56af1498765 100644 (file)
@@ -39,6 +39,7 @@
 #include <deal.II/lac/sparsity_pattern.h>
 #include <deal.II/lac/sparsity_tools.h>
 
+#include <deal.II/multigrid/mg_constrained_dofs.h>
 #include <deal.II/multigrid/mg_tools.h>
 
 DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
@@ -391,8 +392,12 @@ namespace DoFRenumbering
     const DoFHandler<dim, spacedim> &           dof_handler,
     const bool                                  reversed_numbering,
     const bool                                  use_constraints,
-    const std::vector<types::global_dof_index> &starting_indices)
+    const std::vector<types::global_dof_index> &starting_indices,
+    const unsigned int                          level)
   {
+    const bool reorder_level_dofs =
+      (level == numbers::invalid_unsigned_int) ? false : true;
+
     // see if there is anything to do at all or whether we can skip the work on
     // this processor
     if (dof_handler.locally_owned_dofs().n_elements() == 0)
@@ -406,25 +411,50 @@ namespace DoFRenumbering
     // note that if constraints are not requested, then the 'constraints'
     // object will be empty and using it has no effect
     IndexSet locally_relevant_dofs;
-    DoFTools::extract_locally_relevant_dofs(dof_handler, locally_relevant_dofs);
+    IndexSet const *ptr_locally_owned_dofs;
+    if (reorder_level_dofs == false)
+      {
+        DoFTools::extract_locally_relevant_dofs(dof_handler,
+                                                locally_relevant_dofs);
+        ptr_locally_owned_dofs = &dof_handler.locally_owned_dofs();
+      }
+    else
+      {
+        Assert(dof_handler.n_dofs(level) != numbers::invalid_dof_index,
+               ExcDoFHandlerNotInitialized());
+        DoFTools::extract_locally_relevant_level_dofs(dof_handler,
+                                                      level,
+                                                      locally_relevant_dofs);
+        ptr_locally_owned_dofs = &dof_handler.locally_owned_mg_dofs(level);
+      }
 
     AffineConstraints<double> constraints;
     if (use_constraints)
       {
+        // regarding constraints is not yet implemented on a level basis
+        Assert(reorder_level_dofs == false, ExcNotImplemented());
+
         constraints.reinit(locally_relevant_dofs);
         DoFTools::make_hanging_node_constraints(dof_handler, constraints);
       }
     constraints.close();
 
-    const IndexSet &locally_owned_dofs = dof_handler.locally_owned_dofs();
-
     // see if we can get away with the sequential algorithm
-    if (locally_owned_dofs.n_elements() == locally_owned_dofs.size())
+    if (ptr_locally_owned_dofs->n_elements() == ptr_locally_owned_dofs->size())
       {
-        AssertDimension(new_indices.size(), dof_handler.n_dofs());
+        AssertDimension(new_indices.size(),
+                        ptr_locally_owned_dofs->n_elements());
 
-        DynamicSparsityPattern dsp(dof_handler.n_dofs(), dof_handler.n_dofs());
-        DoFTools::make_sparsity_pattern(dof_handler, dsp, constraints);
+        DynamicSparsityPattern dsp(ptr_locally_owned_dofs->size(),
+                                   ptr_locally_owned_dofs->size());
+        if (reorder_level_dofs == false)
+          {
+            DoFTools::make_sparsity_pattern(dof_handler, dsp, constraints);
+          }
+        else
+          {
+            MGTools::make_sparsity_pattern(dof_handler, dsp, level);
+          }
 
         SparsityTools::reorder_Cuthill_McKee(dsp,
                                              new_indices,
@@ -443,14 +473,24 @@ namespace DoFRenumbering
         // relevant. in the process, also check that all indices
         // really belong to at least the locally relevant ones
         IndexSet locally_active_dofs;
-        DoFTools::extract_locally_active_dofs(dof_handler, locally_active_dofs);
+        if (reorder_level_dofs == false)
+          {
+            DoFTools::extract_locally_active_dofs(dof_handler,
+                                                  locally_active_dofs);
+          }
+        else
+          {
+            DoFTools::extract_locally_active_level_dofs(dof_handler,
+                                                        locally_active_dofs,
+                                                        level);
+          }
 
         bool needs_locally_active = false;
         for (const auto starting_index : starting_indices)
           {
             if ((needs_locally_active ==
                  /* previously already set to */ true) ||
-                (locally_owned_dofs.is_element(starting_index) == false))
+                (ptr_locally_owned_dofs->is_element(starting_index) == false))
               {
                 Assert(
                   locally_active_dofs.is_element(starting_index),
@@ -465,15 +505,28 @@ namespace DoFRenumbering
           }
 
         const IndexSet index_set_to_use =
-          (needs_locally_active ? locally_active_dofs : locally_owned_dofs);
+          (needs_locally_active ? locally_active_dofs :
+                                  *ptr_locally_owned_dofs);
+
+        // if this process doesn't own any DoFs (on this level), there is
+        // nothing to do
+        if (index_set_to_use.n_elements() == 0)
+          return;
 
         // then create first the global sparsity pattern, and then the local
         // sparsity pattern from the global one by transferring its indices to
         // processor-local (locally owned or locally active) index space
-        DynamicSparsityPattern dsp(dof_handler.n_dofs(),
-                                   dof_handler.n_dofs(),
+        DynamicSparsityPattern dsp(index_set_to_use.size(),
+                                   index_set_to_use.size(),
                                    index_set_to_use);
-        DoFTools::make_sparsity_pattern(dof_handler, dsp, constraints);
+        if (reorder_level_dofs == false)
+          {
+            DoFTools::make_sparsity_pattern(dof_handler, dsp, constraints);
+          }
+        else
+          {
+            MGTools::make_sparsity_pattern(dof_handler, dsp, level);
+          }
 
         DynamicSparsityPattern local_sparsity(index_set_to_use.n_elements(),
                                               index_set_to_use.n_elements());
@@ -504,7 +557,8 @@ namespace DoFRenumbering
             index_set_to_use.index_within_set(starting_indices[i]);
 
         // then do the renumbering on the locally owned portion
-        AssertDimension(new_indices.size(), locally_owned_dofs.n_elements());
+        AssertDimension(new_indices.size(),
+                        ptr_locally_owned_dofs->n_elements());
         std::vector<types::global_dof_index> my_new_indices(
           index_set_to_use.n_elements());
         SparsityTools::reorder_Cuthill_McKee(local_sparsity,
@@ -523,7 +577,7 @@ namespace DoFRenumbering
           {
             // first step: figure out which DoF indices to eliminate
             IndexSet active_but_not_owned_dofs = locally_active_dofs;
-            active_but_not_owned_dofs.subtract_set(locally_owned_dofs);
+            active_but_not_owned_dofs.subtract_set(*ptr_locally_owned_dofs);
 
             std::set<types::global_dof_index> erase_these_indices;
             for (const auto p : active_but_not_owned_dofs)
@@ -563,14 +617,14 @@ namespace DoFRenumbering
                     translate_indices[i] = next_new_index;
                     ++next_new_index;
                   }
-              Assert(next_new_index == locally_owned_dofs.n_elements(),
+              Assert(next_new_index == ptr_locally_owned_dofs->n_elements(),
                      ExcInternalError());
             }
 
             // and then do the renumbering of the result of the
             // Cuthill-McKee algorithm above, right into the output array
             new_indices.clear();
-            new_indices.reserve(locally_owned_dofs.n_elements());
+            new_indices.reserve(ptr_locally_owned_dofs->n_elements());
             for (const auto &p : my_new_indices)
               if (p != numbers::invalid_dof_index)
                 {
@@ -578,7 +632,7 @@ namespace DoFRenumbering
                          ExcInternalError());
                   new_indices.push_back(translate_indices[p]);
                 }
-            Assert(new_indices.size() == locally_owned_dofs.n_elements(),
+            Assert(new_indices.size() == ptr_locally_owned_dofs->n_elements(),
                    ExcInternalError());
           }
         else
@@ -589,7 +643,7 @@ namespace DoFRenumbering
         // indices of the locally-owned DoFs. so that's where we get the
         // indices
         for (types::global_dof_index &new_index : new_indices)
-          new_index = locally_owned_dofs.nth_index_in_set(new_index);
+          new_index = ptr_locally_owned_dofs->nth_index_in_set(new_index);
       }
   }
 
@@ -605,16 +659,16 @@ namespace DoFRenumbering
     Assert(dof_handler.n_dofs(level) != numbers::invalid_dof_index,
            ExcDoFHandlerNotInitialized());
 
-    // make the connection graph
-    DynamicSparsityPattern dsp(dof_handler.n_dofs(level),
-                               dof_handler.n_dofs(level));
-    MGTools::make_sparsity_pattern(dof_handler, dsp, level);
-
-    std::vector<types::global_dof_index> new_indices(dsp.n_rows());
-    SparsityTools::reorder_Cuthill_McKee(dsp, new_indices, starting_indices);
+    std::vector<types::global_dof_index> new_indices(
+      dof_handler.locally_owned_mg_dofs(level).n_elements(),
+      numbers::invalid_dof_index);
 
-    if (reversed_numbering)
-      new_indices = Utilities::reverse_permutation(new_indices);
+    compute_Cuthill_McKee(new_indices,
+                          dof_handler,
+                          reversed_numbering,
+                          false,
+                          starting_indices,
+                          level);
 
     // actually perform renumbering;
     // this is dimension specific and
index 064de36baa3bf3fc83a193861abb3b895fb787f5..624e4a33b9aa7a6e70d9f1711a97d18879434710 100644 (file)
@@ -39,7 +39,8 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS)
         const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
         const bool,
         const bool,
-        const std::vector<types::global_dof_index> &);
+        const std::vector<types::global_dof_index> &,
+        const unsigned int);
 
       template void
       component_wise<deal_II_dimension, deal_II_space_dimension>(
index 2c88a6aa2ff093d8bf19ce6458f5dca4f08d571c..c8ddae04b3edcdca96a76b0861b3577454c679c4 100644 (file)
@@ -1133,6 +1133,43 @@ namespace DoFTools
 
 
 
+  template <int dim, int spacedim>
+  void
+  extract_locally_active_level_dofs(
+    const DoFHandler<dim, spacedim> &dof_handler,
+    IndexSet &                       dof_set,
+    const unsigned int               level)
+  {
+    // collect all the locally owned dofs
+    dof_set = dof_handler.locally_owned_mg_dofs(level);
+
+    // add the DoF on the adjacent ghost cells to the IndexSet, cache them
+    // in a set. need to check each dof manually because we can't be sure
+    // that the dof range of locally_owned_dofs is really contiguous.
+    std::vector<types::global_dof_index> dof_indices;
+    std::set<types::global_dof_index>    global_dof_indices;
+
+    typename DoFHandler<dim, spacedim>::level_cell_iterator
+      cell = dof_handler.begin_mg(level),
+      endc = dof_handler.end_mg(level);
+    for (; cell != endc; ++cell)
+      if (cell->is_locally_owned_on_level())
+        {
+          dof_indices.resize(cell->get_fe().n_dofs_per_cell());
+          cell->get_mg_dof_indices(dof_indices);
+
+          for (const types::global_dof_index dof_index : dof_indices)
+            if (!dof_set.is_element(dof_index))
+              global_dof_indices.insert(dof_index);
+        }
+
+    dof_set.add_indices(global_dof_indices.begin(), global_dof_indices.end());
+
+    dof_set.compress();
+  }
+
+
+
   template <int dim, int spacedim>
   void
   extract_locally_relevant_dofs(const DoFHandler<dim, spacedim> &dof_handler,
index 49ec698e40bf79397873ca6c2cdf5b2e12cbdea3..eca9cc1feeeb2e33c8515992214f3e4c346c69ec 100644 (file)
@@ -39,6 +39,14 @@ for (deal_II_dimension, deal_II_space_dimension : DIMENSIONS)
           &       dof_handler,
         IndexSet &dof_set);
 
+      template void
+      extract_locally_active_level_dofs<deal_II_dimension,
+                                        deal_II_space_dimension>(
+        const DoFHandler<deal_II_dimension, deal_II_space_dimension>
+          &                dof_handler,
+        IndexSet &         dof_set,
+        const unsigned int level);
+
       template std::vector<IndexSet>
       locally_owned_dofs_per_component<deal_II_dimension,
                                        deal_II_space_dimension>(
index ae04f8dc6ea90284e581f971cfc0a9c2feb5e4a5..83c506f7c039c824f641cd44d44caa594e9b8bc3 100644 (file)
@@ -44,7 +44,10 @@ test()
   unsigned int myid   = Utilities::MPI::this_mpi_process(MPI_COMM_WORLD);
   unsigned int nprocs = Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD);
 
-  parallel::distributed::Triangulation<dim> tr(MPI_COMM_WORLD);
+  parallel::distributed::Triangulation<dim> tr(
+    MPI_COMM_WORLD,
+    Triangulation<dim>::limit_level_difference_at_vertices,
+    parallel::distributed::Triangulation<dim>::construct_multigrid_hierarchy);
 
   GridGenerator::hyper_cube(tr, -1.0, 1.0);
   tr.refine_global(8 - 2 * dim);
@@ -65,45 +68,88 @@ test()
 
   static const FE_Q<dim> fe(1);
   dofh.distribute_dofs(fe);
-  std::vector<types::global_dof_index> renumbering(
-    dofh.locally_owned_dofs().n_elements());
-  DoFRenumbering::compute_Cuthill_McKee(renumbering, dofh);
-
-  // send everything to processor 0 for output
-  std::vector<types::global_dof_index> complete_renumbering(dofh.n_dofs());
-  std::copy(renumbering.begin(),
-            renumbering.end(),
-            complete_renumbering.begin());
-  unsigned int                offset = renumbering.size();
-  const std::vector<IndexSet> dofs_per_proc =
-    Utilities::MPI::all_gather(MPI_COMM_WORLD, dofh.locally_owned_dofs());
-  for (unsigned int i = 1; i < nprocs; ++i)
-    {
-      if (myid == i)
-        MPI_Send(&renumbering[0],
-                 renumbering.size(),
-                 Utilities::MPI::internal::mpi_type_id(
-                   &complete_renumbering[0]),
-                 0,
-                 i,
-                 MPI_COMM_WORLD);
-      else if (myid == 0)
-        MPI_Recv(&complete_renumbering[offset],
-                 dofs_per_proc[i].n_elements(),
-                 Utilities::MPI::internal::mpi_type_id(
-                   &complete_renumbering[0]),
-                 i,
-                 i,
-                 MPI_COMM_WORLD,
-                 MPI_STATUSES_IGNORE);
-      offset += dofs_per_proc[i].n_elements();
-    }
+  dofh.distribute_mg_dofs();
 
-  if (myid == 0)
+  for (unsigned int level = 0; level <= tr.n_levels(); ++level)
     {
-      AssertDimension(offset, complete_renumbering.size());
-      for (unsigned int i = 0; i < complete_renumbering.size(); ++i)
-        deallog << complete_renumbering[i] << std::endl;
+      types::global_dof_index              n_dofs{0};
+      std::vector<types::global_dof_index> renumbering;
+      if (level < tr.n_levels())
+        {
+          n_dofs      = dofh.n_dofs(level);
+          renumbering = std::vector<types::global_dof_index>(
+            dofh.locally_owned_mg_dofs(level).n_elements());
+          DoFRenumbering::compute_Cuthill_McKee(
+            renumbering,
+            dofh,
+            false,
+            false,
+            std::vector<types::global_dof_index>(),
+            level);
+        }
+      else
+        {
+          n_dofs      = dofh.n_dofs();
+          renumbering = std::vector<types::global_dof_index>(
+            dofh.locally_owned_dofs().n_elements());
+          DoFRenumbering::compute_Cuthill_McKee(renumbering, dofh);
+        }
+
+      // send everything to processor 0 for output
+      std::vector<types::global_dof_index> complete_renumbering(n_dofs);
+      std::copy(renumbering.begin(),
+                renumbering.end(),
+                complete_renumbering.begin());
+      unsigned int          offset = renumbering.size();
+      std::vector<IndexSet> dofs_per_proc;
+      if (level < tr.n_levels())
+        {
+          dofs_per_proc =
+            Utilities::MPI::all_gather(MPI_COMM_WORLD,
+                                       dofh.locally_owned_mg_dofs(level));
+        }
+      else
+        {
+          dofs_per_proc = Utilities::MPI::all_gather(MPI_COMM_WORLD,
+                                                     dofh.locally_owned_dofs());
+        }
+
+      for (unsigned int i = 1; i < nprocs; ++i)
+        {
+          if (myid == i)
+            MPI_Send(&renumbering[0],
+                     renumbering.size(),
+                     Utilities::MPI::internal::mpi_type_id(
+                       &complete_renumbering[0]),
+                     0,
+                     i,
+                     MPI_COMM_WORLD);
+          else if (myid == 0)
+            MPI_Recv(&complete_renumbering[offset],
+                     dofs_per_proc[i].n_elements(),
+                     Utilities::MPI::internal::mpi_type_id(
+                       &complete_renumbering[0]),
+                     i,
+                     i,
+                     MPI_COMM_WORLD,
+                     MPI_STATUSES_IGNORE);
+          offset += dofs_per_proc[i].n_elements();
+        }
+
+      if (myid == 0)
+        {
+          AssertDimension(offset, complete_renumbering.size());
+          if (level < tr.n_levels())
+            {
+              deallog << "On level: " << level << std::endl;
+            }
+          else
+            {
+              deallog << "On active cells:" << std::endl;
+            }
+          for (unsigned int i = 0; i < complete_renumbering.size(); ++i)
+            deallog << complete_renumbering[i] << std::endl;
+        }
     }
 }
 
index e571ed9ee340a74d8a9249864ca272bf0ecd5b2b..ba52e39737d7060b2c9e5c89bf064fc256502d54 100644 (file)
@@ -1,4 +1,500 @@
 
+DEAL:0:2d::On level: 0
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::On level: 1
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::7
+DEAL:0:2d::5
+DEAL:0:2d::8
+DEAL:0:2d::6
+DEAL:0:2d::On level: 2
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::6
+DEAL:0:2d::5
+DEAL:0:2d::7
+DEAL:0:2d::8
+DEAL:0:2d::9
+DEAL:0:2d::11
+DEAL:0:2d::16
+DEAL:0:2d::19
+DEAL:0:2d::12
+DEAL:0:2d::20
+DEAL:0:2d::10
+DEAL:0:2d::13
+DEAL:0:2d::14
+DEAL:0:2d::17
+DEAL:0:2d::21
+DEAL:0:2d::22
+DEAL:0:2d::15
+DEAL:0:2d::23
+DEAL:0:2d::24
+DEAL:0:2d::18
+DEAL:0:2d::On level: 3
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::6
+DEAL:0:2d::5
+DEAL:0:2d::7
+DEAL:0:2d::8
+DEAL:0:2d::9
+DEAL:0:2d::11
+DEAL:0:2d::16
+DEAL:0:2d::18
+DEAL:0:2d::12
+DEAL:0:2d::19
+DEAL:0:2d::10
+DEAL:0:2d::13
+DEAL:0:2d::14
+DEAL:0:2d::17
+DEAL:0:2d::20
+DEAL:0:2d::21
+DEAL:0:2d::15
+DEAL:0:2d::22
+DEAL:0:2d::23
+DEAL:0:2d::24
+DEAL:0:2d::25
+DEAL:0:2d::27
+DEAL:0:2d::36
+DEAL:0:2d::38
+DEAL:0:2d::28
+DEAL:0:2d::39
+DEAL:0:2d::49
+DEAL:0:2d::51
+DEAL:0:2d::64
+DEAL:0:2d::67
+DEAL:0:2d::52
+DEAL:0:2d::68
+DEAL:0:2d::29
+DEAL:0:2d::40
+DEAL:0:2d::30
+DEAL:0:2d::41
+DEAL:0:2d::53
+DEAL:0:2d::69
+DEAL:0:2d::54
+DEAL:0:2d::70
+DEAL:0:2d::26
+DEAL:0:2d::31
+DEAL:0:2d::32
+DEAL:0:2d::37
+DEAL:0:2d::42
+DEAL:0:2d::43
+DEAL:0:2d::33
+DEAL:0:2d::34
+DEAL:0:2d::44
+DEAL:0:2d::45
+DEAL:0:2d::50
+DEAL:0:2d::55
+DEAL:0:2d::56
+DEAL:0:2d::65
+DEAL:0:2d::71
+DEAL:0:2d::72
+DEAL:0:2d::57
+DEAL:0:2d::58
+DEAL:0:2d::73
+DEAL:0:2d::74
+DEAL:0:2d::35
+DEAL:0:2d::46
+DEAL:0:2d::47
+DEAL:0:2d::48
+DEAL:0:2d::59
+DEAL:0:2d::75
+DEAL:0:2d::60
+DEAL:0:2d::76
+DEAL:0:2d::61
+DEAL:0:2d::62
+DEAL:0:2d::77
+DEAL:0:2d::78
+DEAL:0:2d::63
+DEAL:0:2d::79
+DEAL:0:2d::80
+DEAL:0:2d::66
+DEAL:0:2d::On level: 4
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::6
+DEAL:0:2d::5
+DEAL:0:2d::7
+DEAL:0:2d::8
+DEAL:0:2d::9
+DEAL:0:2d::11
+DEAL:0:2d::16
+DEAL:0:2d::18
+DEAL:0:2d::12
+DEAL:0:2d::19
+DEAL:0:2d::10
+DEAL:0:2d::13
+DEAL:0:2d::14
+DEAL:0:2d::17
+DEAL:0:2d::20
+DEAL:0:2d::21
+DEAL:0:2d::15
+DEAL:0:2d::22
+DEAL:0:2d::23
+DEAL:0:2d::24
+DEAL:0:2d::25
+DEAL:0:2d::27
+DEAL:0:2d::36
+DEAL:0:2d::38
+DEAL:0:2d::28
+DEAL:0:2d::39
+DEAL:0:2d::49
+DEAL:0:2d::51
+DEAL:0:2d::64
+DEAL:0:2d::66
+DEAL:0:2d::52
+DEAL:0:2d::67
+DEAL:0:2d::29
+DEAL:0:2d::40
+DEAL:0:2d::30
+DEAL:0:2d::41
+DEAL:0:2d::53
+DEAL:0:2d::68
+DEAL:0:2d::54
+DEAL:0:2d::69
+DEAL:0:2d::26
+DEAL:0:2d::31
+DEAL:0:2d::32
+DEAL:0:2d::37
+DEAL:0:2d::42
+DEAL:0:2d::43
+DEAL:0:2d::33
+DEAL:0:2d::34
+DEAL:0:2d::44
+DEAL:0:2d::45
+DEAL:0:2d::50
+DEAL:0:2d::55
+DEAL:0:2d::56
+DEAL:0:2d::65
+DEAL:0:2d::70
+DEAL:0:2d::71
+DEAL:0:2d::57
+DEAL:0:2d::58
+DEAL:0:2d::72
+DEAL:0:2d::73
+DEAL:0:2d::35
+DEAL:0:2d::46
+DEAL:0:2d::47
+DEAL:0:2d::48
+DEAL:0:2d::59
+DEAL:0:2d::74
+DEAL:0:2d::60
+DEAL:0:2d::75
+DEAL:0:2d::61
+DEAL:0:2d::62
+DEAL:0:2d::76
+DEAL:0:2d::77
+DEAL:0:2d::63
+DEAL:0:2d::78
+DEAL:0:2d::79
+DEAL:0:2d::80
+DEAL:0:2d::81
+DEAL:0:2d::83
+DEAL:0:2d::100
+DEAL:0:2d::102
+DEAL:0:2d::84
+DEAL:0:2d::103
+DEAL:0:2d::121
+DEAL:0:2d::123
+DEAL:0:2d::144
+DEAL:0:2d::146
+DEAL:0:2d::124
+DEAL:0:2d::147
+DEAL:0:2d::85
+DEAL:0:2d::104
+DEAL:0:2d::86
+DEAL:0:2d::105
+DEAL:0:2d::125
+DEAL:0:2d::148
+DEAL:0:2d::126
+DEAL:0:2d::149
+DEAL:0:2d::169
+DEAL:0:2d::171
+DEAL:0:2d::196
+DEAL:0:2d::198
+DEAL:0:2d::172
+DEAL:0:2d::199
+DEAL:0:2d::225
+DEAL:0:2d::227
+DEAL:0:2d::256
+DEAL:0:2d::259
+DEAL:0:2d::228
+DEAL:0:2d::260
+DEAL:0:2d::173
+DEAL:0:2d::200
+DEAL:0:2d::174
+DEAL:0:2d::201
+DEAL:0:2d::229
+DEAL:0:2d::261
+DEAL:0:2d::230
+DEAL:0:2d::262
+DEAL:0:2d::87
+DEAL:0:2d::106
+DEAL:0:2d::88
+DEAL:0:2d::107
+DEAL:0:2d::127
+DEAL:0:2d::150
+DEAL:0:2d::128
+DEAL:0:2d::151
+DEAL:0:2d::89
+DEAL:0:2d::108
+DEAL:0:2d::90
+DEAL:0:2d::109
+DEAL:0:2d::129
+DEAL:0:2d::152
+DEAL:0:2d::130
+DEAL:0:2d::153
+DEAL:0:2d::175
+DEAL:0:2d::202
+DEAL:0:2d::176
+DEAL:0:2d::203
+DEAL:0:2d::231
+DEAL:0:2d::263
+DEAL:0:2d::232
+DEAL:0:2d::264
+DEAL:0:2d::177
+DEAL:0:2d::204
+DEAL:0:2d::178
+DEAL:0:2d::205
+DEAL:0:2d::233
+DEAL:0:2d::265
+DEAL:0:2d::234
+DEAL:0:2d::266
+DEAL:0:2d::82
+DEAL:0:2d::91
+DEAL:0:2d::92
+DEAL:0:2d::101
+DEAL:0:2d::110
+DEAL:0:2d::111
+DEAL:0:2d::93
+DEAL:0:2d::94
+DEAL:0:2d::112
+DEAL:0:2d::113
+DEAL:0:2d::122
+DEAL:0:2d::131
+DEAL:0:2d::132
+DEAL:0:2d::145
+DEAL:0:2d::154
+DEAL:0:2d::155
+DEAL:0:2d::133
+DEAL:0:2d::134
+DEAL:0:2d::156
+DEAL:0:2d::157
+DEAL:0:2d::95
+DEAL:0:2d::96
+DEAL:0:2d::114
+DEAL:0:2d::115
+DEAL:0:2d::97
+DEAL:0:2d::98
+DEAL:0:2d::116
+DEAL:0:2d::117
+DEAL:0:2d::135
+DEAL:0:2d::136
+DEAL:0:2d::158
+DEAL:0:2d::159
+DEAL:0:2d::137
+DEAL:0:2d::138
+DEAL:0:2d::160
+DEAL:0:2d::161
+DEAL:0:2d::170
+DEAL:0:2d::179
+DEAL:0:2d::180
+DEAL:0:2d::197
+DEAL:0:2d::206
+DEAL:0:2d::207
+DEAL:0:2d::181
+DEAL:0:2d::182
+DEAL:0:2d::208
+DEAL:0:2d::209
+DEAL:0:2d::226
+DEAL:0:2d::235
+DEAL:0:2d::236
+DEAL:0:2d::257
+DEAL:0:2d::267
+DEAL:0:2d::268
+DEAL:0:2d::237
+DEAL:0:2d::238
+DEAL:0:2d::269
+DEAL:0:2d::270
+DEAL:0:2d::183
+DEAL:0:2d::184
+DEAL:0:2d::210
+DEAL:0:2d::211
+DEAL:0:2d::185
+DEAL:0:2d::186
+DEAL:0:2d::212
+DEAL:0:2d::213
+DEAL:0:2d::239
+DEAL:0:2d::240
+DEAL:0:2d::271
+DEAL:0:2d::272
+DEAL:0:2d::241
+DEAL:0:2d::242
+DEAL:0:2d::273
+DEAL:0:2d::274
+DEAL:0:2d::99
+DEAL:0:2d::118
+DEAL:0:2d::119
+DEAL:0:2d::120
+DEAL:0:2d::139
+DEAL:0:2d::162
+DEAL:0:2d::140
+DEAL:0:2d::163
+DEAL:0:2d::141
+DEAL:0:2d::142
+DEAL:0:2d::164
+DEAL:0:2d::165
+DEAL:0:2d::143
+DEAL:0:2d::166
+DEAL:0:2d::167
+DEAL:0:2d::168
+DEAL:0:2d::187
+DEAL:0:2d::214
+DEAL:0:2d::188
+DEAL:0:2d::215
+DEAL:0:2d::243
+DEAL:0:2d::275
+DEAL:0:2d::244
+DEAL:0:2d::276
+DEAL:0:2d::189
+DEAL:0:2d::216
+DEAL:0:2d::190
+DEAL:0:2d::217
+DEAL:0:2d::245
+DEAL:0:2d::277
+DEAL:0:2d::246
+DEAL:0:2d::278
+DEAL:0:2d::191
+DEAL:0:2d::192
+DEAL:0:2d::218
+DEAL:0:2d::219
+DEAL:0:2d::193
+DEAL:0:2d::194
+DEAL:0:2d::220
+DEAL:0:2d::221
+DEAL:0:2d::247
+DEAL:0:2d::248
+DEAL:0:2d::279
+DEAL:0:2d::280
+DEAL:0:2d::249
+DEAL:0:2d::250
+DEAL:0:2d::281
+DEAL:0:2d::282
+DEAL:0:2d::195
+DEAL:0:2d::222
+DEAL:0:2d::223
+DEAL:0:2d::224
+DEAL:0:2d::251
+DEAL:0:2d::283
+DEAL:0:2d::252
+DEAL:0:2d::284
+DEAL:0:2d::253
+DEAL:0:2d::254
+DEAL:0:2d::285
+DEAL:0:2d::286
+DEAL:0:2d::255
+DEAL:0:2d::287
+DEAL:0:2d::288
+DEAL:0:2d::258
+DEAL:0:2d::On level: 5
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::6
+DEAL:0:2d::5
+DEAL:0:2d::7
+DEAL:0:2d::8
+DEAL:0:2d::9
+DEAL:0:2d::11
+DEAL:0:2d::16
+DEAL:0:2d::18
+DEAL:0:2d::12
+DEAL:0:2d::19
+DEAL:0:2d::10
+DEAL:0:2d::13
+DEAL:0:2d::14
+DEAL:0:2d::17
+DEAL:0:2d::20
+DEAL:0:2d::21
+DEAL:0:2d::15
+DEAL:0:2d::22
+DEAL:0:2d::23
+DEAL:0:2d::24
+DEAL:0:2d::25
+DEAL:0:2d::27
+DEAL:0:2d::36
+DEAL:0:2d::38
+DEAL:0:2d::28
+DEAL:0:2d::39
+DEAL:0:2d::49
+DEAL:0:2d::51
+DEAL:0:2d::64
+DEAL:0:2d::67
+DEAL:0:2d::52
+DEAL:0:2d::68
+DEAL:0:2d::29
+DEAL:0:2d::40
+DEAL:0:2d::30
+DEAL:0:2d::41
+DEAL:0:2d::53
+DEAL:0:2d::69
+DEAL:0:2d::54
+DEAL:0:2d::70
+DEAL:0:2d::26
+DEAL:0:2d::31
+DEAL:0:2d::32
+DEAL:0:2d::37
+DEAL:0:2d::42
+DEAL:0:2d::43
+DEAL:0:2d::33
+DEAL:0:2d::34
+DEAL:0:2d::44
+DEAL:0:2d::45
+DEAL:0:2d::50
+DEAL:0:2d::55
+DEAL:0:2d::56
+DEAL:0:2d::65
+DEAL:0:2d::71
+DEAL:0:2d::72
+DEAL:0:2d::57
+DEAL:0:2d::58
+DEAL:0:2d::73
+DEAL:0:2d::74
+DEAL:0:2d::35
+DEAL:0:2d::46
+DEAL:0:2d::47
+DEAL:0:2d::48
+DEAL:0:2d::59
+DEAL:0:2d::75
+DEAL:0:2d::60
+DEAL:0:2d::76
+DEAL:0:2d::61
+DEAL:0:2d::62
+DEAL:0:2d::77
+DEAL:0:2d::78
+DEAL:0:2d::63
+DEAL:0:2d::79
+DEAL:0:2d::80
+DEAL:0:2d::66
+DEAL:0:2d::On active cells:
 DEAL:0:2d::0
 DEAL:0:2d::1
 DEAL:0:2d::2
@@ -344,6 +840,170 @@ DEAL:0:2d::206
 DEAL:0:2d::231
 DEAL:0:2d::236
 DEAL:0:2d::237
+DEAL:0:3d::On level: 0
+DEAL:0:3d::0
+DEAL:0:3d::1
+DEAL:0:3d::2
+DEAL:0:3d::3
+DEAL:0:3d::4
+DEAL:0:3d::5
+DEAL:0:3d::6
+DEAL:0:3d::7
+DEAL:0:3d::On level: 1
+DEAL:0:3d::0
+DEAL:0:3d::1
+DEAL:0:3d::2
+DEAL:0:3d::4
+DEAL:0:3d::3
+DEAL:0:3d::5
+DEAL:0:3d::6
+DEAL:0:3d::7
+DEAL:0:3d::8
+DEAL:0:3d::15
+DEAL:0:3d::16
+DEAL:0:3d::24
+DEAL:0:3d::9
+DEAL:0:3d::17
+DEAL:0:3d::18
+DEAL:0:3d::25
+DEAL:0:3d::10
+DEAL:0:3d::19
+DEAL:0:3d::11
+DEAL:0:3d::20
+DEAL:0:3d::21
+DEAL:0:3d::26
+DEAL:0:3d::12
+DEAL:0:3d::22
+DEAL:0:3d::13
+DEAL:0:3d::23
+DEAL:0:3d::14
+DEAL:0:3d::On level: 2
+DEAL:0:3d::0
+DEAL:0:3d::1
+DEAL:0:3d::2
+DEAL:0:3d::4
+DEAL:0:3d::3
+DEAL:0:3d::5
+DEAL:0:3d::6
+DEAL:0:3d::7
+DEAL:0:3d::8
+DEAL:0:3d::11
+DEAL:0:3d::12
+DEAL:0:3d::20
+DEAL:0:3d::9
+DEAL:0:3d::13
+DEAL:0:3d::14
+DEAL:0:3d::21
+DEAL:0:3d::15
+DEAL:0:3d::22
+DEAL:0:3d::10
+DEAL:0:3d::16
+DEAL:0:3d::17
+DEAL:0:3d::23
+DEAL:0:3d::18
+DEAL:0:3d::24
+DEAL:0:3d::19
+DEAL:0:3d::25
+DEAL:0:3d::26
+DEAL:0:3d::27
+DEAL:0:3d::30
+DEAL:0:3d::31
+DEAL:0:3d::45
+DEAL:0:3d::64
+DEAL:0:3d::71
+DEAL:0:3d::72
+DEAL:0:3d::98
+DEAL:0:3d::32
+DEAL:0:3d::46
+DEAL:0:3d::73
+DEAL:0:3d::99
+DEAL:0:3d::33
+DEAL:0:3d::47
+DEAL:0:3d::74
+DEAL:0:3d::100
+DEAL:0:3d::48
+DEAL:0:3d::101
+DEAL:0:3d::28
+DEAL:0:3d::34
+DEAL:0:3d::35
+DEAL:0:3d::49
+DEAL:0:3d::36
+DEAL:0:3d::50
+DEAL:0:3d::65
+DEAL:0:3d::75
+DEAL:0:3d::76
+DEAL:0:3d::102
+DEAL:0:3d::77
+DEAL:0:3d::103
+DEAL:0:3d::37
+DEAL:0:3d::51
+DEAL:0:3d::52
+DEAL:0:3d::78
+DEAL:0:3d::104
+DEAL:0:3d::105
+DEAL:0:3d::38
+DEAL:0:3d::53
+DEAL:0:3d::79
+DEAL:0:3d::106
+DEAL:0:3d::80
+DEAL:0:3d::107
+DEAL:0:3d::66
+DEAL:0:3d::81
+DEAL:0:3d::54
+DEAL:0:3d::108
+DEAL:0:3d::109
+DEAL:0:3d::82
+DEAL:0:3d::29
+DEAL:0:3d::39
+DEAL:0:3d::40
+DEAL:0:3d::55
+DEAL:0:3d::41
+DEAL:0:3d::56
+DEAL:0:3d::42
+DEAL:0:3d::57
+DEAL:0:3d::58
+DEAL:0:3d::67
+DEAL:0:3d::83
+DEAL:0:3d::84
+DEAL:0:3d::110
+DEAL:0:3d::85
+DEAL:0:3d::111
+DEAL:0:3d::86
+DEAL:0:3d::112
+DEAL:0:3d::113
+DEAL:0:3d::43
+DEAL:0:3d::59
+DEAL:0:3d::87
+DEAL:0:3d::114
+DEAL:0:3d::60
+DEAL:0:3d::115
+DEAL:0:3d::88
+DEAL:0:3d::116
+DEAL:0:3d::68
+DEAL:0:3d::89
+DEAL:0:3d::117
+DEAL:0:3d::90
+DEAL:0:3d::44
+DEAL:0:3d::61
+DEAL:0:3d::62
+DEAL:0:3d::91
+DEAL:0:3d::118
+DEAL:0:3d::119
+DEAL:0:3d::92
+DEAL:0:3d::120
+DEAL:0:3d::121
+DEAL:0:3d::69
+DEAL:0:3d::93
+DEAL:0:3d::94
+DEAL:0:3d::63
+DEAL:0:3d::122
+DEAL:0:3d::123
+DEAL:0:3d::95
+DEAL:0:3d::124
+DEAL:0:3d::96
+DEAL:0:3d::97
+DEAL:0:3d::70
+DEAL:0:3d::On active cells:
 DEAL:0:3d::0
 DEAL:0:3d::1
 DEAL:0:3d::2
index 77331db60435701e29fc0b166356b9d6c1112376..87ac614b50d17185a759913f511068c8d1257ea9 100644 (file)
@@ -1,4 +1,500 @@
 
+DEAL:0:2d::On level: 0
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::On level: 1
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::5
+DEAL:0:2d::6
+DEAL:0:2d::7
+DEAL:0:2d::8
+DEAL:0:2d::On level: 2
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::7
+DEAL:0:2d::5
+DEAL:0:2d::8
+DEAL:0:2d::6
+DEAL:0:2d::9
+DEAL:0:2d::11
+DEAL:0:2d::10
+DEAL:0:2d::12
+DEAL:0:2d::13
+DEAL:0:2d::14
+DEAL:0:2d::15
+DEAL:0:2d::17
+DEAL:0:2d::19
+DEAL:0:2d::16
+DEAL:0:2d::18
+DEAL:0:2d::20
+DEAL:0:2d::21
+DEAL:0:2d::22
+DEAL:0:2d::23
+DEAL:0:2d::24
+DEAL:0:2d::On level: 3
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::6
+DEAL:0:2d::5
+DEAL:0:2d::7
+DEAL:0:2d::8
+DEAL:0:2d::9
+DEAL:0:2d::11
+DEAL:0:2d::16
+DEAL:0:2d::19
+DEAL:0:2d::12
+DEAL:0:2d::20
+DEAL:0:2d::10
+DEAL:0:2d::13
+DEAL:0:2d::14
+DEAL:0:2d::17
+DEAL:0:2d::21
+DEAL:0:2d::22
+DEAL:0:2d::15
+DEAL:0:2d::23
+DEAL:0:2d::24
+DEAL:0:2d::18
+DEAL:0:2d::25
+DEAL:0:2d::26
+DEAL:0:2d::27
+DEAL:0:2d::28
+DEAL:0:2d::29
+DEAL:0:2d::31
+DEAL:0:2d::30
+DEAL:0:2d::32
+DEAL:0:2d::34
+DEAL:0:2d::35
+DEAL:0:2d::33
+DEAL:0:2d::36
+DEAL:0:2d::37
+DEAL:0:2d::39
+DEAL:0:2d::41
+DEAL:0:2d::43
+DEAL:0:2d::40
+DEAL:0:2d::38
+DEAL:0:2d::44
+DEAL:0:2d::42
+DEAL:0:2d::45
+DEAL:0:2d::46
+DEAL:0:2d::49
+DEAL:0:2d::47
+DEAL:0:2d::48
+DEAL:0:2d::51
+DEAL:0:2d::55
+DEAL:0:2d::61
+DEAL:0:2d::59
+DEAL:0:2d::63
+DEAL:0:2d::50
+DEAL:0:2d::52
+DEAL:0:2d::53
+DEAL:0:2d::54
+DEAL:0:2d::56
+DEAL:0:2d::57
+DEAL:0:2d::60
+DEAL:0:2d::64
+DEAL:0:2d::58
+DEAL:0:2d::62
+DEAL:0:2d::65
+DEAL:0:2d::66
+DEAL:0:2d::67
+DEAL:0:2d::68
+DEAL:0:2d::69
+DEAL:0:2d::74
+DEAL:0:2d::71
+DEAL:0:2d::77
+DEAL:0:2d::70
+DEAL:0:2d::72
+DEAL:0:2d::75
+DEAL:0:2d::78
+DEAL:0:2d::73
+DEAL:0:2d::79
+DEAL:0:2d::80
+DEAL:0:2d::76
+DEAL:0:2d::On level: 4
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::6
+DEAL:0:2d::5
+DEAL:0:2d::7
+DEAL:0:2d::8
+DEAL:0:2d::9
+DEAL:0:2d::11
+DEAL:0:2d::16
+DEAL:0:2d::18
+DEAL:0:2d::12
+DEAL:0:2d::19
+DEAL:0:2d::10
+DEAL:0:2d::13
+DEAL:0:2d::14
+DEAL:0:2d::17
+DEAL:0:2d::20
+DEAL:0:2d::21
+DEAL:0:2d::15
+DEAL:0:2d::22
+DEAL:0:2d::23
+DEAL:0:2d::24
+DEAL:0:2d::25
+DEAL:0:2d::27
+DEAL:0:2d::36
+DEAL:0:2d::38
+DEAL:0:2d::28
+DEAL:0:2d::39
+DEAL:0:2d::49
+DEAL:0:2d::51
+DEAL:0:2d::64
+DEAL:0:2d::67
+DEAL:0:2d::52
+DEAL:0:2d::68
+DEAL:0:2d::29
+DEAL:0:2d::40
+DEAL:0:2d::30
+DEAL:0:2d::41
+DEAL:0:2d::53
+DEAL:0:2d::69
+DEAL:0:2d::54
+DEAL:0:2d::70
+DEAL:0:2d::26
+DEAL:0:2d::31
+DEAL:0:2d::32
+DEAL:0:2d::37
+DEAL:0:2d::42
+DEAL:0:2d::43
+DEAL:0:2d::33
+DEAL:0:2d::34
+DEAL:0:2d::44
+DEAL:0:2d::45
+DEAL:0:2d::50
+DEAL:0:2d::55
+DEAL:0:2d::56
+DEAL:0:2d::65
+DEAL:0:2d::71
+DEAL:0:2d::72
+DEAL:0:2d::57
+DEAL:0:2d::58
+DEAL:0:2d::73
+DEAL:0:2d::74
+DEAL:0:2d::35
+DEAL:0:2d::46
+DEAL:0:2d::47
+DEAL:0:2d::48
+DEAL:0:2d::59
+DEAL:0:2d::75
+DEAL:0:2d::60
+DEAL:0:2d::76
+DEAL:0:2d::61
+DEAL:0:2d::62
+DEAL:0:2d::77
+DEAL:0:2d::78
+DEAL:0:2d::63
+DEAL:0:2d::79
+DEAL:0:2d::80
+DEAL:0:2d::66
+DEAL:0:2d::81
+DEAL:0:2d::82
+DEAL:0:2d::83
+DEAL:0:2d::84
+DEAL:0:2d::85
+DEAL:0:2d::87
+DEAL:0:2d::86
+DEAL:0:2d::88
+DEAL:0:2d::90
+DEAL:0:2d::92
+DEAL:0:2d::89
+DEAL:0:2d::93
+DEAL:0:2d::91
+DEAL:0:2d::94
+DEAL:0:2d::97
+DEAL:0:2d::99
+DEAL:0:2d::95
+DEAL:0:2d::96
+DEAL:0:2d::100
+DEAL:0:2d::101
+DEAL:0:2d::98
+DEAL:0:2d::102
+DEAL:0:2d::106
+DEAL:0:2d::108
+DEAL:0:2d::103
+DEAL:0:2d::109
+DEAL:0:2d::117
+DEAL:0:2d::119
+DEAL:0:2d::130
+DEAL:0:2d::131
+DEAL:0:2d::120
+DEAL:0:2d::132
+DEAL:0:2d::104
+DEAL:0:2d::110
+DEAL:0:2d::105
+DEAL:0:2d::111
+DEAL:0:2d::121
+DEAL:0:2d::133
+DEAL:0:2d::122
+DEAL:0:2d::134
+DEAL:0:2d::107
+DEAL:0:2d::112
+DEAL:0:2d::118
+DEAL:0:2d::123
+DEAL:0:2d::113
+DEAL:0:2d::114
+DEAL:0:2d::124
+DEAL:0:2d::125
+DEAL:0:2d::135
+DEAL:0:2d::139
+DEAL:0:2d::145
+DEAL:0:2d::147
+DEAL:0:2d::140
+DEAL:0:2d::141
+DEAL:0:2d::148
+DEAL:0:2d::149
+DEAL:0:2d::115
+DEAL:0:2d::116
+DEAL:0:2d::126
+DEAL:0:2d::127
+DEAL:0:2d::128
+DEAL:0:2d::136
+DEAL:0:2d::129
+DEAL:0:2d::137
+DEAL:0:2d::142
+DEAL:0:2d::143
+DEAL:0:2d::150
+DEAL:0:2d::151
+DEAL:0:2d::144
+DEAL:0:2d::138
+DEAL:0:2d::152
+DEAL:0:2d::146
+DEAL:0:2d::153
+DEAL:0:2d::154
+DEAL:0:2d::157
+DEAL:0:2d::155
+DEAL:0:2d::156
+DEAL:0:2d::159
+DEAL:0:2d::162
+DEAL:0:2d::169
+DEAL:0:2d::164
+DEAL:0:2d::171
+DEAL:0:2d::158
+DEAL:0:2d::160
+DEAL:0:2d::161
+DEAL:0:2d::163
+DEAL:0:2d::165
+DEAL:0:2d::166
+DEAL:0:2d::167
+DEAL:0:2d::172
+DEAL:0:2d::168
+DEAL:0:2d::173
+DEAL:0:2d::178
+DEAL:0:2d::189
+DEAL:0:2d::180
+DEAL:0:2d::191
+DEAL:0:2d::203
+DEAL:0:2d::217
+DEAL:0:2d::211
+DEAL:0:2d::219
+DEAL:0:2d::181
+DEAL:0:2d::192
+DEAL:0:2d::182
+DEAL:0:2d::193
+DEAL:0:2d::212
+DEAL:0:2d::220
+DEAL:0:2d::213
+DEAL:0:2d::221
+DEAL:0:2d::170
+DEAL:0:2d::174
+DEAL:0:2d::175
+DEAL:0:2d::179
+DEAL:0:2d::183
+DEAL:0:2d::184
+DEAL:0:2d::176
+DEAL:0:2d::177
+DEAL:0:2d::185
+DEAL:0:2d::186
+DEAL:0:2d::190
+DEAL:0:2d::194
+DEAL:0:2d::195
+DEAL:0:2d::202
+DEAL:0:2d::204
+DEAL:0:2d::205
+DEAL:0:2d::196
+DEAL:0:2d::197
+DEAL:0:2d::206
+DEAL:0:2d::207
+DEAL:0:2d::187
+DEAL:0:2d::198
+DEAL:0:2d::188
+DEAL:0:2d::199
+DEAL:0:2d::214
+DEAL:0:2d::222
+DEAL:0:2d::215
+DEAL:0:2d::223
+DEAL:0:2d::200
+DEAL:0:2d::201
+DEAL:0:2d::208
+DEAL:0:2d::209
+DEAL:0:2d::216
+DEAL:0:2d::224
+DEAL:0:2d::210
+DEAL:0:2d::218
+DEAL:0:2d::225
+DEAL:0:2d::226
+DEAL:0:2d::227
+DEAL:0:2d::228
+DEAL:0:2d::229
+DEAL:0:2d::234
+DEAL:0:2d::231
+DEAL:0:2d::236
+DEAL:0:2d::230
+DEAL:0:2d::232
+DEAL:0:2d::235
+DEAL:0:2d::237
+DEAL:0:2d::233
+DEAL:0:2d::238
+DEAL:0:2d::239
+DEAL:0:2d::240
+DEAL:0:2d::241
+DEAL:0:2d::250
+DEAL:0:2d::243
+DEAL:0:2d::252
+DEAL:0:2d::261
+DEAL:0:2d::274
+DEAL:0:2d::263
+DEAL:0:2d::277
+DEAL:0:2d::244
+DEAL:0:2d::253
+DEAL:0:2d::245
+DEAL:0:2d::254
+DEAL:0:2d::264
+DEAL:0:2d::278
+DEAL:0:2d::265
+DEAL:0:2d::279
+DEAL:0:2d::242
+DEAL:0:2d::246
+DEAL:0:2d::251
+DEAL:0:2d::255
+DEAL:0:2d::247
+DEAL:0:2d::248
+DEAL:0:2d::256
+DEAL:0:2d::257
+DEAL:0:2d::262
+DEAL:0:2d::266
+DEAL:0:2d::275
+DEAL:0:2d::280
+DEAL:0:2d::267
+DEAL:0:2d::268
+DEAL:0:2d::281
+DEAL:0:2d::282
+DEAL:0:2d::249
+DEAL:0:2d::258
+DEAL:0:2d::259
+DEAL:0:2d::260
+DEAL:0:2d::269
+DEAL:0:2d::283
+DEAL:0:2d::270
+DEAL:0:2d::284
+DEAL:0:2d::271
+DEAL:0:2d::272
+DEAL:0:2d::285
+DEAL:0:2d::286
+DEAL:0:2d::273
+DEAL:0:2d::287
+DEAL:0:2d::288
+DEAL:0:2d::276
+DEAL:0:2d::On level: 5
+DEAL:0:2d::0
+DEAL:0:2d::1
+DEAL:0:2d::2
+DEAL:0:2d::3
+DEAL:0:2d::4
+DEAL:0:2d::6
+DEAL:0:2d::5
+DEAL:0:2d::7
+DEAL:0:2d::8
+DEAL:0:2d::9
+DEAL:0:2d::11
+DEAL:0:2d::16
+DEAL:0:2d::19
+DEAL:0:2d::12
+DEAL:0:2d::20
+DEAL:0:2d::10
+DEAL:0:2d::13
+DEAL:0:2d::14
+DEAL:0:2d::17
+DEAL:0:2d::21
+DEAL:0:2d::22
+DEAL:0:2d::15
+DEAL:0:2d::23
+DEAL:0:2d::24
+DEAL:0:2d::18
+DEAL:0:2d::25
+DEAL:0:2d::26
+DEAL:0:2d::27
+DEAL:0:2d::28
+DEAL:0:2d::29
+DEAL:0:2d::31
+DEAL:0:2d::30
+DEAL:0:2d::32
+DEAL:0:2d::34
+DEAL:0:2d::35
+DEAL:0:2d::33
+DEAL:0:2d::36
+DEAL:0:2d::37
+DEAL:0:2d::39
+DEAL:0:2d::41
+DEAL:0:2d::43
+DEAL:0:2d::40
+DEAL:0:2d::38
+DEAL:0:2d::44
+DEAL:0:2d::42
+DEAL:0:2d::45
+DEAL:0:2d::46
+DEAL:0:2d::49
+DEAL:0:2d::47
+DEAL:0:2d::48
+DEAL:0:2d::51
+DEAL:0:2d::55
+DEAL:0:2d::61
+DEAL:0:2d::59
+DEAL:0:2d::63
+DEAL:0:2d::50
+DEAL:0:2d::52
+DEAL:0:2d::53
+DEAL:0:2d::54
+DEAL:0:2d::56
+DEAL:0:2d::57
+DEAL:0:2d::60
+DEAL:0:2d::64
+DEAL:0:2d::58
+DEAL:0:2d::62
+DEAL:0:2d::65
+DEAL:0:2d::66
+DEAL:0:2d::67
+DEAL:0:2d::68
+DEAL:0:2d::69
+DEAL:0:2d::74
+DEAL:0:2d::71
+DEAL:0:2d::77
+DEAL:0:2d::70
+DEAL:0:2d::72
+DEAL:0:2d::75
+DEAL:0:2d::78
+DEAL:0:2d::73
+DEAL:0:2d::79
+DEAL:0:2d::80
+DEAL:0:2d::76
+DEAL:0:2d::On active cells:
 DEAL:0:2d::0
 DEAL:0:2d::1
 DEAL:0:2d::2
@@ -344,6 +840,170 @@ DEAL:0:2d::338
 DEAL:0:2d::337
 DEAL:0:2d::333
 DEAL:0:2d::334
+DEAL:0:3d::On level: 0
+DEAL:0:3d::0
+DEAL:0:3d::1
+DEAL:0:3d::2
+DEAL:0:3d::3
+DEAL:0:3d::4
+DEAL:0:3d::5
+DEAL:0:3d::6
+DEAL:0:3d::7
+DEAL:0:3d::On level: 1
+DEAL:0:3d::0
+DEAL:0:3d::4
+DEAL:0:3d::1
+DEAL:0:3d::5
+DEAL:0:3d::2
+DEAL:0:3d::6
+DEAL:0:3d::3
+DEAL:0:3d::7
+DEAL:0:3d::8
+DEAL:0:3d::9
+DEAL:0:3d::10
+DEAL:0:3d::11
+DEAL:0:3d::12
+DEAL:0:3d::14
+DEAL:0:3d::13
+DEAL:0:3d::15
+DEAL:0:3d::16
+DEAL:0:3d::17
+DEAL:0:3d::18
+DEAL:0:3d::20
+DEAL:0:3d::19
+DEAL:0:3d::21
+DEAL:0:3d::22
+DEAL:0:3d::23
+DEAL:0:3d::24
+DEAL:0:3d::25
+DEAL:0:3d::26
+DEAL:0:3d::On level: 2
+DEAL:0:3d::0
+DEAL:0:3d::1
+DEAL:0:3d::2
+DEAL:0:3d::4
+DEAL:0:3d::3
+DEAL:0:3d::5
+DEAL:0:3d::6
+DEAL:0:3d::7
+DEAL:0:3d::11
+DEAL:0:3d::20
+DEAL:0:3d::21
+DEAL:0:3d::26
+DEAL:0:3d::8
+DEAL:0:3d::12
+DEAL:0:3d::13
+DEAL:0:3d::22
+DEAL:0:3d::14
+DEAL:0:3d::23
+DEAL:0:3d::9
+DEAL:0:3d::15
+DEAL:0:3d::16
+DEAL:0:3d::24
+DEAL:0:3d::17
+DEAL:0:3d::25
+DEAL:0:3d::10
+DEAL:0:3d::18
+DEAL:0:3d::19
+DEAL:0:3d::27
+DEAL:0:3d::31
+DEAL:0:3d::32
+DEAL:0:3d::35
+DEAL:0:3d::36
+DEAL:0:3d::40
+DEAL:0:3d::41
+DEAL:0:3d::44
+DEAL:0:3d::28
+DEAL:0:3d::33
+DEAL:0:3d::37
+DEAL:0:3d::42
+DEAL:0:3d::29
+DEAL:0:3d::34
+DEAL:0:3d::38
+DEAL:0:3d::43
+DEAL:0:3d::30
+DEAL:0:3d::39
+DEAL:0:3d::45
+DEAL:0:3d::47
+DEAL:0:3d::48
+DEAL:0:3d::51
+DEAL:0:3d::55
+DEAL:0:3d::61
+DEAL:0:3d::46
+DEAL:0:3d::49
+DEAL:0:3d::50
+DEAL:0:3d::52
+DEAL:0:3d::56
+DEAL:0:3d::62
+DEAL:0:3d::53
+DEAL:0:3d::57
+DEAL:0:3d::58
+DEAL:0:3d::54
+DEAL:0:3d::59
+DEAL:0:3d::60
+DEAL:0:3d::63
+DEAL:0:3d::67
+DEAL:0:3d::69
+DEAL:0:3d::73
+DEAL:0:3d::64
+DEAL:0:3d::68
+DEAL:0:3d::70
+DEAL:0:3d::74
+DEAL:0:3d::65
+DEAL:0:3d::71
+DEAL:0:3d::66
+DEAL:0:3d::72
+DEAL:0:3d::75
+DEAL:0:3d::77
+DEAL:0:3d::78
+DEAL:0:3d::81
+DEAL:0:3d::85
+DEAL:0:3d::91
+DEAL:0:3d::83
+DEAL:0:3d::86
+DEAL:0:3d::87
+DEAL:0:3d::76
+DEAL:0:3d::79
+DEAL:0:3d::80
+DEAL:0:3d::82
+DEAL:0:3d::88
+DEAL:0:3d::92
+DEAL:0:3d::84
+DEAL:0:3d::89
+DEAL:0:3d::90
+DEAL:0:3d::93
+DEAL:0:3d::97
+DEAL:0:3d::99
+DEAL:0:3d::103
+DEAL:0:3d::94
+DEAL:0:3d::100
+DEAL:0:3d::95
+DEAL:0:3d::98
+DEAL:0:3d::101
+DEAL:0:3d::104
+DEAL:0:3d::96
+DEAL:0:3d::102
+DEAL:0:3d::105
+DEAL:0:3d::109
+DEAL:0:3d::113
+DEAL:0:3d::106
+DEAL:0:3d::110
+DEAL:0:3d::114
+DEAL:0:3d::107
+DEAL:0:3d::111
+DEAL:0:3d::115
+DEAL:0:3d::108
+DEAL:0:3d::112
+DEAL:0:3d::116
+DEAL:0:3d::117
+DEAL:0:3d::121
+DEAL:0:3d::118
+DEAL:0:3d::122
+DEAL:0:3d::119
+DEAL:0:3d::123
+DEAL:0:3d::120
+DEAL:0:3d::124
+DEAL:0:3d::On active cells:
 DEAL:0:3d::0
 DEAL:0:3d::1
 DEAL:0:3d::2

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.