Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/doc/notes.txt
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/doc/notes.txt	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/doc/notes.txt	(revision 29410)
@@ -1,2 +1,11 @@
+
+2010.10.14
+
+  * dX,dY = window size, Xs, Ys = corner of image
+
+  * PAD1 = 3 (gap between elements)
+  * PAD2 = 5 (alternate gap)
+  * COLORPAD = 10 (thickness of colorbar)
+  * WdY = MAX (ZOOM_Y, textdY + 2*BUTTON_HEIGHT + PAD1) : height of zoom box or text box + buttons
 
 2010.04.14
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/include/prototypes.h
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/include/prototypes.h	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/include/prototypes.h	(revision 29410)
@@ -42,4 +42,5 @@
 void	      AxisTickScale	  PROTO((Axis *axis, double *major, double *minor));
 TickMarkData *CreateAxisTicks     PROTO((Axis *axis, int *nticks));
+int           PrintTick           PROTO((char *string, double value, double min, double max));
 
 /* EventLoop */
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/include/structures.h
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/include/structures.h	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/include/structures.h	(revision 29410)
@@ -161,4 +161,5 @@
   Label    *textline;      /* placed text labels */
   int      Ntextline;      
+  int      haveGraph;   // is there anything in the plot window?
 } KapaGraphWidget;
 
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/DrawFrame.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/DrawFrame.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/DrawFrame.c	(revision 29410)
@@ -43,4 +43,31 @@
 }
 
+int PrintTick (char *string, double value, double min, double max) {
+
+  int Nexp = 0;
+  int Nchar = 0;
+  
+  if (fabs(value/(max-min)) < 0.001) { 
+    value = 0.0; 
+    Nchar = sprintf (string, "%.1f", value);
+    return Nchar;
+  }
+
+  double lvalue = log10(fabs(value));
+
+  if (isfinite(lvalue)) {
+    Nexp = fabs(lvalue);
+  } else {
+    Nexp = 0;
+  }
+  
+  if (Nexp > 3) {
+    Nchar = sprintf (string, "%.1e", value);
+  } else {
+    Nchar = sprintf (string, "%.1f", value);
+  }
+  return Nchar;
+}
+
 void DrawTick (Graphic *graphic, Axis *axis, int P, TickMarkData *tick, int naxis) {
   
@@ -101,6 +128,6 @@
     xt = fx + (value-min)*dfx/(max - min) + dx;
     yt = fy + (value-min)*dfy/(max - min) + dy;
-    if (fabs(value/(max-min)) < 0.001) { value = 0.0; }
-    sprintf (string, "%4g", value);
+
+    PrintTick (string, value, min, max);
     DrawRotText (xt, yt, string, pos, 0.0);
   }
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/DrawObjects.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/DrawObjects.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/DrawObjects.c	(revision 29410)
@@ -517,4 +517,10 @@
     }
     if (object[0].ptype == 100) {	/* connect a pair of points */
+
+      double X0 = graph[0].axis[0].fx;
+      double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
+      double Y0 = graph[0].axis[1].fy;
+      double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
+
       for (i = 0; i + 1 < object[0].Npts; i+=2) {
 	if (!(finite(x[i]) && finite(y[i]))) continue;
@@ -524,5 +530,5 @@
 	sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
 	sy2 = x[i+1]*myi + y[i+1]*myj + by;
-	DrawLine (sx1, sy1, sx2, sy2);
+	ClipLine (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
       }
     }
@@ -674,4 +680,9 @@
     }
     if (object[0].ptype == 100) {	
+      double X0 = graph[0].axis[0].fx;
+      double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
+      double Y0 = graph[0].axis[1].fy;
+      double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
+
       for (i = 0; i + 1 < object[0].Npts; i+=2) {
 	if (!(finite(x[i]) && finite(y[i]))) continue;
@@ -680,5 +691,5 @@
 	sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
 	sy2 = x[i+1]*myi + y[i+1]*myj + by;
-	DrawLine (sx1, sy1, sx2, sy2);
+	ClipLine (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
       }
     }
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/EraseCurrentPlot.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/EraseCurrentPlot.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/EraseCurrentPlot.c	(revision 29410)
@@ -15,4 +15,6 @@
   
   if (USE_XWINDOW) XClearWindow (graphic->display, graphic->window);
+
+  SetSectionSizes (section);
   Refresh ();
 
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/EraseImage.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/EraseImage.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/EraseImage.c	(revision 29410)
@@ -15,5 +15,8 @@
   section->image = NULL;
 
-  if (USE_XWINDOW) Refresh ();
+  if (USE_XWINDOW) XClearWindow (graphic->display, graphic->window);
+  
+  SetSectionSizes (section);
+  Refresh ();
   return (TRUE);
 }
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/Graphs.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/Graphs.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/Graphs.c	(revision 29410)
@@ -8,4 +8,6 @@
 
   ALLOCATE (graph, KapaGraphWidget, 1);
+
+  graph[0].haveGraph = FALSE;
 
   /* set up axis positions */
@@ -82,4 +84,6 @@
 void DrawGraph (KapaGraphWidget *graph) {
   if (graph == NULL) return;
+  if (!graph[0].haveGraph) return;
+
   DrawFrame    (graph);
   DrawObjects  (graph);
@@ -94,4 +98,5 @@
 
   if (graph == NULL) return;
+  graph[0].haveGraph = FALSE;
 
   /* free data objects, then re-alloc those needed */
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadFrame.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadFrame.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadFrame.c	(revision 29410)
@@ -15,4 +15,7 @@
 
   KapaScanGraphData (sock, &graph[0].data);
+
+  // even if we have no actual elements, once we define a frame, we have a graph
+  graph[0].haveGraph = TRUE;
 
   graph[0].axis[3].min = graph[0].axis[1].min;
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadLabels.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadLabels.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadLabels.c	(revision 29410)
@@ -14,5 +14,6 @@
   }
   graph = section->graph;
-  
+  graph[0].haveGraph = TRUE;
+
   KiiScanMessage (sock, "%d", &mode);
   label = KiiRecvData (sock);
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadObject.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadObject.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadObject.c	(revision 29410)
@@ -15,4 +15,5 @@
   }
   graph = section->graph;
+  graph[0].haveGraph = TRUE;
   
   N = graph[0].Nobjects;
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadTextlines.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadTextlines.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/LoadTextlines.c	(revision 29410)
@@ -11,9 +11,10 @@
   section = GetActiveSection();
   graph = section->graph;
-    if (section->graph == NULL) {
+  if (section->graph == NULL) {
     section->graph = InitGraph ();
     SetSectionSizes (section);
     graph = section->graph;
   }
+  graph[0].haveGraph = TRUE;
 
   graph[0].Ntextline = MAX (graph[0].Ntextline, 0);
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/PNGit.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/PNGit.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/PNGit.c	(revision 29410)
@@ -15,5 +15,5 @@
   png_structp png_ptr;
   png_infop info_ptr;
-  int Npalette;
+  int status, Npalette;
   char filename[1024];
   bDrawBuffer *buffer = NULL;
@@ -47,5 +47,11 @@
   }
 
-  if (setjmp (png_ptr[0].jmpbuf)) {
+#ifdef png_jmpbuf
+  status = setjmp(png_jmpbuf(png_ptr));
+# else
+  status = setjmp (png_ptr[0].jmpbuf);
+# endif
+
+  if (status) {
     fprintf (stderr, "can't get png return\n");
     png_destroy_write_struct (&png_ptr, &info_ptr);
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/PSFrame.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/PSFrame.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/PSFrame.c	(revision 29410)
@@ -94,6 +94,6 @@
     xt = fx + (value-min)*dfx/(max - min) + dx;
     yt = fy + (value-min)*dfy/(max - min) + dy;
-    if (fabs(value) < 0.001) { value = 0.0; }
-    sprintf (string, "%4g", value);
+
+    PrintTick (string, value, min, max);
     PSRotText (f, xt, yt, string, pos, 0.0);
   }
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/SetGraphSize.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/SetGraphSize.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/SetGraphSize.c	(revision 29410)
@@ -72,6 +72,8 @@
     for (i = 0; i < Nticks; i++) {
       if (!ticks[i].IsMajor) continue;
-      sprintf (string, "%g", ticks[i].value);
-      Nc = MAX (Nc, strlen (string));
+
+      int Nchar = PrintTick (string, ticks[i].value, graph[0].axis[1].min, graph[0].axis[1].max);
+
+      Nc = MAX (Nc, Nchar);
     }
     FREE(ticks);
@@ -96,6 +98,6 @@
     for (i = 0; i < Nticks; i++) {
       if (!ticks[i].IsMajor) continue;
-      sprintf (string, "%g", ticks[i].value);
-      Nc = MAX (Nc, strlen (string));
+      int Nchar = PrintTick (string, ticks[i].value, graph[0].axis[3].min, graph[0].axis[3].max);
+      Nc = MAX (Nc, Nchar);
     }
     FREE(ticks);
@@ -112,5 +114,5 @@
   }
 
-  /* basic size of the graph in Xwindow coordinates */
+  /* basic size of the graph in Xwindow coordinates, but measured from lower-left corner */
   X0 = graphic[0].dx * section[0].x + padYm;
   Y0 = graphic[0].dy * section[0].y + padXm;
@@ -125,17 +127,22 @@
 
     switch (section->image->location) {
+      case 0:
+	// no changes?
+	break;
       case 1:
-        Y0 = graphic[0].dy * section[0].y  + 2*PAD1 + WdY + 2; // tied to image in Y
-        dY = graphic[0].dy * section[0].dy - 5*PAD1 - WdY - COLORPAD + 1;
+        Y0 = graphic[0].dy * section[0].y  + padXm         + 2*PAD1 + WdY + 2;
+        dY = graphic[0].dy * section[0].dy - padXm - padXp - 4*PAD1 - 1 - WdY - COLORPAD;
         break;
       case 3:
-        dY = graphic[0].dy * section[0].dy - 5*PAD1 - WdY - COLORPAD - padYm - padYp;
+        dY = graphic[0].dy * section[0].dy - padXm - padXp - 4*PAD1 - 1 - WdY - COLORPAD;
         break;
       case 2:
-        X0 = graphic[0].dx * section[0].x  + 2*PAD1 + ZOOM_X;
-        dX = graphic[0].dx * section[0].dx - 3*PAD1 - ZOOM_X;
+        X0 = graphic[0].dx * section[0].x  + padYm         + 2*PAD1 + ZOOM_X;
+        dX = graphic[0].dx * section[0].dx - padYm - padYp - 3*PAD1 - ZOOM_X;
+	dY = graphic[0].dy * section[0].dy - padXm - padXp - 2*PAD1 - COLORPAD;
         break;
       case 4:
-        dX = graphic[0].dx * section[0].dx - 3*PAD1 - ZOOM_X - padXm - padXp;
+        dX = graphic[0].dx * section[0].dx - padYm - padYp - 3*PAD1 - ZOOM_X;
+	dY = graphic[0].dy * section[0].dy - padXm - padXp - 2*PAD1 - COLORPAD;
         break;
     }
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/SetImageSize.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/SetImageSize.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/SetImageSize.c	(revision 29410)
@@ -1,3 +1,3 @@
-# include "Ximage.h"
+ # include "Ximage.h"
 
 /* Set the dimensions of the specific image based on the current window size.  The image
@@ -9,4 +9,5 @@
   int Xs, Ys, dX, dY;
   int textpad, textdY, WdY; 
+  int haveGraph;
   KapaImageWidget *image;
   KapaGraphWidget *graph;
@@ -17,4 +18,5 @@
   if (image == NULL) return;
   graph = section->graph;
+  haveGraph = graph && graph->haveGraph;
 
   graphic = GetGraphic ();
@@ -33,14 +35,14 @@
 
     case 0: // no zoom / status / wide
-      if (section->graph) {
+      if (haveGraph) {
 	  image[0].picture.x  = graph[0].axis[0].fx;
 	  image[0].picture.y  = graph[0].axis[1].fy + graph[0].axis[1].dfy;
-	  image[0].picture.dx = MAX(graph[0].axis[0].dfx + 1, 1);
+	  image[0].picture.dx = MAX(fabs(graph[0].axis[0].dfx) - 1, 1);
 	  image[0].picture.dy = MAX(fabs(graph[0].axis[1].dfy) - 1, 1);
       } else {
 	  image[0].picture.x  = Xs + PAD1;
 	  image[0].picture.y  = Ys + PAD1;
-	  image[0].picture.dx = dX - 2*PAD1; 
-	  image[0].picture.dy = dY - 2*PAD1;
+	  image[0].picture.dx = dX - 2*PAD1 - 1; 
+	  image[0].picture.dy = dY - 2*PAD1 - 1;
       }
       if (USE_XWINDOW) CreatePicture (image, graphic);
@@ -48,16 +50,16 @@
       return;
 
-    case 1: // zoom / status / wide on bottom
-
-      if (section->graph) {
-	  image[0].picture.x = graph[0].axis[0].fx;
-	  image[0].picture.y = Ys + 2*PAD1 + COLORPAD;
-	  image[0].picture.dx = graph[0].axis[0].dfx;
-	  image[0].picture.dy = dY - 5*PAD1 - WdY - COLORPAD;
-      } else {
-	  image[0].picture.x  = Xs + PAD1;
-	  image[0].picture.y  = Ys + 2*PAD1 + COLORPAD;
-	  image[0].picture.dx = dX - 2*PAD1; 
-	  image[0].picture.dy = dY - 5*PAD1 - WdY - COLORPAD;
+    case 1: // zoom / status / wide on bottom (-x)
+
+      if (haveGraph) {
+	image[0].picture.x = graph[0].axis[0].fx;
+	image[0].picture.y = graph[0].axis[1].fy + graph[0].axis[1].dfy;
+	image[0].picture.dx = MAX(fabs(graph[0].axis[0].dfx) - 1, 1);
+	image[0].picture.dy = MAX(fabs(graph[0].axis[1].dfy) - 1, 1);
+      } else {
+	image[0].picture.x  = Xs + PAD1;
+	image[0].picture.y  = Ys + 2*PAD1 + COLORPAD;
+	image[0].picture.dx = dX - 2*PAD1 - 1; 
+	image[0].picture.dy = dY - 4*PAD1 - 1 - WdY - COLORPAD;
       }
 
@@ -72,5 +74,5 @@
       image[0].zoom.dy = ZOOM_Y;
       image[0].zoom.x = Xs + PAD1;
-      image[0].zoom.y = image[0].picture.y + image[0].picture.dy + PAD1;
+      image[0].zoom.y = Ys + dY - PAD1 - WdY;
 
       /** everything below is tied in x-dir to the zoom box **/
@@ -130,16 +132,16 @@
       break;
 
-    case 3: // zoom / status / wide on top
-
-      if (section->graph) {
+    case 3: // zoom / status / wide on top (+x)
+
+      if (haveGraph) {
 	image[0].picture.x = graph[0].axis[0].fx;
 	image[0].picture.y = graph[0].axis[1].fy + graph[0].axis[1].dfy;
-	image[0].picture.dx = MAX(graph[0].axis[0].dfx, 1);
+	image[0].picture.dx = MAX(fabs(graph[0].axis[0].dfx) - 1, 1);
 	image[0].picture.dy = MAX(fabs(graph[0].axis[1].dfy) - 1, 1);
       } else {
-	image[0].picture.dx = dX - 2*PAD1; 
-	image[0].picture.dy = dY - 5*PAD1 - WdY - COLORPAD;
 	image[0].picture.x = Xs + PAD1;
-	image[0].picture.y = Ys + 4*PAD1 + COLORPAD + WdY;
+	image[0].picture.y = Ys + 3*PAD1 + COLORPAD + WdY;
+	image[0].picture.dx = dX - 2*PAD1 - 1; 
+	image[0].picture.dy = dY - 4*PAD1 - 1 - WdY - COLORPAD;
       }
 
@@ -212,16 +214,16 @@
       break;
 
-    case 2: // zoom / status / wide on left
-
-      if (section->graph) {
-	image[0].picture.x = Xs + 2*PAD1 + ZOOM_X;
+    case 2: // zoom / status / wide on left (-y)
+
+      if (haveGraph) {
+	image[0].picture.x = graph[0].axis[0].fx;
 	image[0].picture.y = graph[0].axis[1].fy + graph[0].axis[1].dfy;
-	image[0].picture.dx = dX - 3*PAD1 - ZOOM_X; 
+	image[0].picture.dx = MAX(fabs(graph[0].axis[0].dfx) - 1, 1);
 	image[0].picture.dy = MAX(fabs(graph[0].axis[1].dfy) - 1, 1);
       } else {
-	image[0].picture.dx = dX - 3*PAD1 - ZOOM_X; 
-	image[0].picture.dy = dY - 3*PAD1 - COLORPAD;
 	image[0].picture.x = Xs + 2*PAD1 + ZOOM_X;
 	image[0].picture.y = Ys + 2*PAD1 + COLORPAD;
+	image[0].picture.dx = dX - 3*PAD1 - 1 - ZOOM_X; 
+	image[0].picture.dy = dY - 3*PAD1 - 1 - COLORPAD;
       }
 
@@ -236,5 +238,5 @@
       image[0].zoom.dy = ZOOM_Y;
       image[0].zoom.x = Xs + PAD1;
-      image[0].zoom.y = image[0].picture.y;
+      image[0].zoom.y = Ys + 2*PAD1 + COLORPAD;
 
       /** everything below is tied in x-dir to the zoom box **/
@@ -294,16 +296,16 @@
       break;
 
-    case 4:  // zoom / status / wide on right
-
-      if (section->graph) {
+    case 4:  // zoom / status / wide on right (+y)
+
+      if (haveGraph) {
 	image[0].picture.x = graph[0].axis[0].fx;
 	image[0].picture.y = graph[0].axis[1].fy + graph[0].axis[1].dfy;
-	image[0].picture.dx = dX - 3*PAD1 - ZOOM_X - graph[0].axis[0].fx; 
+	image[0].picture.dx = MAX(fabs(graph[0].axis[0].dfx) - 1, 1);
 	image[0].picture.dy = MAX(fabs(graph[0].axis[1].dfy) - 1, 1);
       } else {
-	image[0].picture.dx = dX - 3*PAD1 - ZOOM_X; 
-	image[0].picture.dy = dY - 3*PAD1 - COLORPAD;
 	image[0].picture.x = Xs + PAD1;
 	image[0].picture.y = Ys + 2*PAD1 + COLORPAD;
+	image[0].picture.dx = dX - 3*PAD1 - 1 - ZOOM_X; 
+	image[0].picture.dy = dY - 3*PAD1 - 1 - COLORPAD;
       }
 
@@ -317,6 +319,6 @@
       image[0].zoom.dx = ZOOM_X; 
       image[0].zoom.dy = ZOOM_Y;
-      image[0].zoom.x = image[0].picture.x + image[0].picture.dx + PAD1;
-      image[0].zoom.y = image[0].picture.y;
+      image[0].zoom.x = Xs + dX - ZOOM_X - PAD1;
+      image[0].zoom.y = Ys + 2*PAD1 + COLORPAD;
 
       /** everything below is tied in x-dir to the zoom box **/
Index: /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/bDrawFrame.c
===================================================================
--- /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/bDrawFrame.c	(revision 29409)
+++ /branches/eam_branches/ipp-20100823/Ohana/src/kapa2/src/bDrawFrame.c	(revision 29410)
@@ -93,6 +93,6 @@
     xt = fx + (value-min)*dfx/(max - min) + dx;
     yt = fy + (value-min)*dfy/(max - min) + dy;
-    if (fabs(value) < 0.001) { value = 0.0; }
-    sprintf (string, "%4g", value);
+
+    PrintTick (string, value, min, max);
     bDrawRotText (xt, yt, string, pos, 0.0);
   }
