Author Topic: Mandelbrot  (Read 5963 times)

0 Members and 1 Guest are viewing this topic.

Mike Lobanovsky

  • Guest
Re: Mandelbrot
« Reply #15 on: October 16, 2015, 12:18:16 PM »
Hello John,

Here's its FBSL equivalent with interpreted loops and JIT compiled iteration kernel, performing on my PC at ~60% of your sample speed for 512 iterations in a 640x480 window, persistent and resizable. (N.B. no DIB sections this time, Peter)

Code: OxygenBasic
  1. Dim MaxIter = 512
  2. Dim width = 640
  3. Dim height = 480
  4. Dim colors[MaxIter]
  5.  
  6. FillColorTable()
  7.  
  8. Dim hDC = GetDC(ME), hMemDC = CreateCompatibleDC(NULL)
  9. Dim hBmp = CreateCompatibleBitmap(hDC, width, height)
  10. Dim hOldBmp = SelectObject(hMemDC, hBmp): SetStretchBltMode(hDC, 4) ' HALFTONE
  11. Dim t = GetTickCount()
  12.  
  13. GenMandelbrot(-3, -2, 2.5, 2)
  14.  
  15. FbslSetText(ME, "-= JRS Compatible Mandel =-  TIME: " & (GetTickCount() - t) / 1000 & " SECONDS")
  16. Resize(ME, 0, 0, width, height)
  17. Center(ME)
  18. Show(ME)
  19.  
  20. Begin Events
  21.   Type RECT
  22.     Left As Long
  23.     Top As Long
  24.     Right As Long
  25.     Bottom As Long
  26.   End Type
  27.  
  28.   Static rc As RECT
  29.  
  30.   If CBMSG = &H111 AndAlso CBWPARAM = 2 Then ' WM_COMMAND && Esc
  31.    PostMessage(ME, &H10, 0, 0) ' WM_CLOSE
  32.  ElseIf CBMSG = &HF OrElse CBMSG = &H5 Then ' WM_PAINT || WM_SIZE
  33.    GetClientRect(ME, @rc)
  34.     ValidateRect(ME, NULL)
  35.     StretchBlt(hDC, 0, 0, rc.Right, rc.Bottom, hMemDC, 0, 0, width, height, &HCC0020) ' SRCCOPY
  36.    Return 0
  37.   ElseIf CBMSG = &H10 Then ' WM_CLOSE
  38.    DeleteObject(SelectObject(hMemDC, hOldBmp))
  39.     DeleteDC(hMemDC)
  40.     ReleaseDC(ME, hDC)
  41.   End If
  42. End Events
  43.  
  44. Sub GenMandelbrot(xMn, yMn, xMx, yMx)
  45.   Dim iX, iY, cx, cy, dx, dy
  46.  
  47.   dx = (xMx - xMn) / (width - 1)
  48.   dy = (yMx - yMn) / (height - 1)
  49.  
  50.   For iY = 0 To height
  51.     cy = yMn + iY * dy
  52.     For iX = 0 To width
  53.       cx = xMn + iX * dx
  54.       If Iterate(MaxIter, cx, cy) <> MaxIter Then SetPixel(hMemDC, iX, iY, colors[Iterate])
  55.     Next
  56.   Next
  57. End Sub
  58.  
  59. DynC Iterate(%mi, !!cx, !!cy) As Long
  60.   long main(long MaxIter, double cx, double cy)
  61.   {
  62.     int iters = 0;
  63.     double X = cx, Y = cy, X2 = X * X, Y2 = Y * Y, temp;
  64.    
  65.     while ((iters < MaxIter) && (X2 + Y2 < 4)) {
  66.       temp = cx + X2 - Y2;
  67.       Y = cy + 2 * X * Y;
  68.       Y2 = Y * Y;
  69.       X = temp;
  70.       X2 = X * X;
  71.       iters++;
  72.     }
  73.     return iters;
  74.   }
  75. End DynC
  76.  
  77. Sub FillColorTable()
  78.   Dim r, g, b
  79.   Dim rd, gd, bd
  80.   Dim rr, gg, bb
  81.   Dim i, j, wid
  82.  
  83.   Dim clr[3]
  84.   clr[1] = RGB(0, 255, 0)
  85.   clr[2] = RGB(255, 255, 0)
  86.   clr[3] = RGB(255, 0, 0)
  87.  
  88.   wid = MaxIter / 64
  89.  
  90.   For j = 0 To 2
  91.     toRGB(clr[j], r, g, b)
  92.     toRGB(clr[j + 1], rr, gg, bb)
  93.     rd = (rr - r) / (wid + 1)
  94.     gd = (gg - g) / (wid + 1)
  95.     bd = (bb - b) / (wid + 1)
  96.     For i = 0 To wid
  97.       colors[j * wid + i] = RGB(r, g, b)
  98.       r = r + rd
  99.       g = g + gd
  100.       b = b + bd
  101.     Next
  102.   Next
  103. End Sub
  104.  
  105. Sub toRGB(c, r, g, b)
  106.   r = c BAnd &HFF
  107.   g = (c BAnd &HFF00) / &H100
  108.   b = (c BAnd &HFF0000) / &H10000
  109. End Sub



[attachment deleted by admin]
« Last Edit: October 18, 2015, 02:12:16 AM by Mike Lobanovsky »

Aurel

  • Guest
Re: Mandelbrot
« Reply #16 on: October 16, 2015, 12:58:23 PM »
Quote
How long does Peter's latest big_julia take on your PC?

Mike
It takes 3.043 seconds ...is that Ok to?

/
well really why John remove post ?
I don't get it  ???
in fact maybe i can built-in into ruben such a mandelbrot function
and lock buffer to speed up slow interpreter (ruben)
 ;D ;D ;D
/

Peter

  • Guest
Re: Mandelbrot
« Reply #17 on: October 16, 2015, 01:53:36 PM »
Hi,
another mandelbrot.
Code: [Select]
include "asm.inc"
window 600,500,1

sys ma=16
single xs=-2.5,ys=-2,zml=1.25

Function cfunc(sys p,w) as sys
  pP=(p*1792)/w
  sys red,green,blue
  if pP <256
     red=0
     green=0
     blue=pP
  else if pP <512
     red=0
     green=pP-256
     blue=255
  else if pP <768
     red=0
     green=255
     blue =255-(pP-512)
  else if pP <1024
     red= pP-768
     green=255
     blue=0
  else if pP <1280
     red=255
     green=255-(pP-1024)
     blue=0
  else if pP <1536
     red=255
     green=0
     blue=pP-1280
  else
     red=255
     green=pP-1536
     blue=255
  end if   
  Return RGB(red,green+4,blue)
End Function

Sub funcpix(sys ix,iy, single x,y,zm)
    single xC=(xs)+(single(ix)+.5)/100/zm)
    single yC=(ys)+(single(iy)-.5)/100/zm)
    single x0=(xs)+(single(ix)+.5)/100/zm)
    single y0=(ys)+(single(iy)-.5)/100/zm)
    single x2=xc*xc
    single y2=yc*yc
    sys it
    while (x2+y2) < (2*2) and it < ma 
    yc = 2*xc*yc + y0
    xc = x2 - y2 + x0
    x2 = xc*xc
    y2 = yc*yc
    it +=1
    wend
    if it=ma
       PutPixel ix,iy,rgb(41,60,194)
    else
       PutPixel ix,iy,cfunc(it,ma)
    end if
End Sub   

t = ticks
For i=0 to 600
   For j=0 to 500
     funcpix(i,j,xs,ys,zml)
   Next
 Next
 color 255,255,255
 text 0,0,12,"TIME: " + (ticks()-t)/1000 + " SECONDS"

 WaitKey
 WinExit




[attachment deleted by admin]

Mike Lobanovsky

  • Guest
Re: Mandelbrot
« Reply #18 on: October 16, 2015, 01:54:35 PM »
Yep Aurel, those timings seem plausible for a single-core 1.7GHz Pentium. My Intel Pentium has four cores running in parallel with each other at roughly two times the speed of yours, which gives a tremendous boost even to single-threaded applications. But my CPU isn't the fastest one these days either. :)

As for the built-in Mandelbrot function, you might do it but for what purpose? We don't use fractals every day so its practicality would be next to zero...
« Last Edit: October 18, 2015, 02:12:47 AM by Mike Lobanovsky »

Mike Lobanovsky

  • Guest
Re: Mandelbrot
« Reply #19 on: October 16, 2015, 02:53:15 PM »
Hehe Peter,

Your latest Mandel won't do; it does only 16 iterations against John's and my 512. That's cheating. :D

In the meantime, here are your bananas on my PC: (FBSL's one is resizable)

Code: OxygenBasic
  1. 'vonoroi.bas for SmallBASIC 2015-10-14 MGA/B+
  2. 'modified bluatigro code from JB 2015-09-07 vonoroi diagram
  3. 'further modified into O2 banana by peter
  4. 'and finally, devoured by ML's FBSL
  5.  
  6. Dim width = 800, height = 600, points = 240
  7. Dim hDC = GetDC(ME), hMemDC = CreateCompatibleDC(NULL)
  8. Dim hBmp = CreateCompatibleBitmap(hDC, width, height)
  9. Dim hOldBmp = SelectObject(hMemDC, hBmp): SetStretchBltMode(hDC, 4) ' HALFTONE
  10. Dim t = GetTickCount()
  11.  
  12. PetersBanana(hMemDC)
  13.  
  14. FbslSetText(ME, "-= Peter's Banana =-  TIME: " & (GetTickCount() - t) / 1000 & " SECONDS")
  15. Resize(ME, 0, 0, width, height)
  16. Center(ME)
  17. Show(ME)
  18.  
  19. Begin Events
  20.   Type RECT
  21.     Left As Long
  22.     Top As Long
  23.     Right As Long
  24.     Bottom As Long
  25.   End Type
  26.  
  27.   Static rc As RECT
  28.  
  29.   If CBMSG = &H111 AndAlso CBWPARAM = 2 Then ' WM_COMMAND && Esc
  30.    PostMessage(ME, &H10, 0, 0) ' WM_CLOSE
  31.  ElseIf CBMSG = &HF OrElse CBMSG = &H5 Then ' WM_PAINT || WM_SIZE
  32.    GetClientRect(ME, @rc)
  33.     ValidateRect(ME, NULL)
  34.     StretchBlt(hDC, 0, 0, rc.Right, rc.Bottom, hMemDC, 0, 0, width, height, &HCC0020) ' SRCCOPY
  35.    Return 0
  36.   ElseIf CBMSG = &H10 Then ' WM_CLOSE
  37.    DeleteObject(SelectObject(hMemDC, hOldBmp))
  38.     DeleteDC(hMemDC)
  39.     ReleaseDC(ME, hDC)
  40.   End If
  41. End Events
  42.  
  43. DynC PetersBanana(%dc, %w = width, %p = points)
  44.   #define rnd(x, y) (rand() % (y - x) + (x))
  45.   #define RGB(r, g, b) (b) << 16 | (g) << 8 | (r)
  46.  
  47.   void __attribute__((stdcall)) SetPixelV(int, int, int, int);
  48.   double fabs(double);
  49.  
  50.   void main(int hdc, int sq, int points)
  51.   {
  52.     int x[240], y[240], kl[240]; // can't dim arrays with a var in DynC
  53.    int xx, yy, i, a, b, g, r, d, q, kkl, s2 = sq >> 1;
  54.    
  55.     for (i = 0; i < points; i++) {
  56.       x[i] = rnd(32, sq);
  57.       y[i] = rnd(32, sq);
  58.       r = 255 - x[i] / (double)sq * 255;
  59.       g = 127 - 127 * (fabs(s2 - x[i]) / s2) + 127 - 127 * (fabs(s2 - y[i]) / s2);
  60.       b = y[i] / (double)sq * 255;
  61.       kl[i] = RGB(r, g, b);
  62.     }
  63.    
  64.     for (xx = 0; xx < sq; xx++) {
  65.       for (yy = 0; yy < sq; yy++) {
  66.         d = 307201;
  67.         for (i = 0; i < points; i++) {
  68.           a = x[i] - xx; b = y[i] - yy;
  69.           q = a * a + b * b;
  70.           if (q < d) {
  71.             d = q;
  72.             kkl = i;
  73.           }
  74.         }
  75.         SetPixelV(hdc, xx, yy, kl[kkl]);
  76.       }
  77.     }
  78.   }
  79. End DynC

[attachment deleted by admin]

Mike Lobanovsky

  • Guest
Re: Mandelbrot
« Reply #20 on: October 17, 2015, 03:53:48 AM »
Hi John,

There still seems to be some room left that evidently attributes to my CPU being slightly faster than your fastest compilation (VC):

Code: OxygenBasic
  1. Type RECT
  2.   %left %top
  3.   %right %bottom
  4. End Type
  5.  
  6. Dim MaxIter = 512
  7. Dim width = 640
  8. Dim height = 480
  9.  
  10. Dim hDC = GetDC(ME), hMemDC = CreateCompatibleDC(NULL)
  11. Dim hBmp = CreateCompatibleBitmap(hDC, width, height)
  12. Dim hOldBmp = SelectObject(hMemDC, hBmp): SetStretchBltMode(hDC, 4) ' HALFTONE
  13. Dim rc As RECT: SetRect(@rc, 10, 35, width + 10, height + 35)
  14. Dim t = GetTickCount()
  15.  
  16. GenMandelbrot(-3, -2, 2.5, 2)
  17.  
  18. FbslSetText(ME, "-= JRS Compatible Mandel =-  TIME: " & (GetTickCount() - t) / 1000 & " SECONDS")
  19. AdjustWindowRectEx(@rc, &HCF0000, FALSE, &H100) ' WS_OVERLAPPEDWINDOW && WS_EX_WINDOWEDGE
  20. Resize(ME, 0, 0, rc.right - rc.left, rc.bottom - rc.top)
  21. Center(ME): Show(ME)
  22.  
  23. Begin Events
  24.   If CBMSG = &H111 AndAlso CBWPARAM = 2 Then ' WM_COMMAND && Esc
  25.    PostMessage(ME, &H10, 0, 0) ' WM_CLOSE
  26.  ElseIf CBMSG = &HF OrElse CBMSG = &H5 Then ' WM_PAINT || WM_SIZE
  27.    GetClientRect(ME, @rc)
  28.     ValidateRect(ME, NULL)
  29.     StretchBlt(hDC, 0, 0, rc.right, rc.bottom, hMemDC, 0, 0, width, height, &HCC0020) ' SRCCOPY
  30.    Return 0
  31.   ElseIf CBMSG = &H10 Then ' WM_CLOSE
  32.    DeleteObject(SelectObject(hMemDC, hOldBmp))
  33.     DeleteDC(hMemDC)
  34.     ReleaseDC(ME, hDC)
  35.   End If
  36. End Events
  37.  
  38. Sub GenMandelbrot(xMn, yMn, xMx, yMx)
  39.   Dim iX, iY, cx, cy, dx, dy
  40.  
  41.   dx = (xMx - xMn) / (width - 1)
  42.   dy = (yMx - yMn) / (height - 1)
  43.  
  44.   For iY = 0 To height
  45.     cy = yMn + iY * dy
  46.     For iX = 0 To width
  47.       cx = xMn + iX * dx
  48.       If Iterate(MaxIter, cx, cy) <> MaxIter Then
  49.         SetPixel(hMemDC, iX, iY, RGB(160 - Iterate * 32, 208 - Iterate * 16, 232 - Iterate * 8))
  50.       End If
  51.     Next
  52.   Next
  53. End Sub
  54.  
  55. DynC Iterate(%mi, !!cx, !!cy) As Long
  56.   long main(long MaxIter, double cx, double cy)
  57.   {
  58.     int iters = 0;
  59.     double X = cx, Y = cy, X2 = X * X, Y2 = Y * Y, temp;
  60.    
  61.     while ((iters < MaxIter) && (X2 + Y2 < 4)) {
  62.       temp = cx + X2 - Y2;
  63.       Y = cy + 2 * X * Y;
  64.       Y2 = Y * Y;
  65.       X = temp;
  66.       X2 = X * X;
  67.       iters++;
  68.     }
  69.     return iters;
  70.   }
  71. End DynC



[attachment deleted by admin]
« Last Edit: October 18, 2015, 02:13:24 AM by Mike Lobanovsky »

JRS

  • Guest
Re: Mandelbrot
« Reply #21 on: October 17, 2015, 08:16:02 PM »
64 bit SDL and Script BASIC on Windows 7 64 bit.

Code: Script BASIC
  1. ' ScriptBasic GFX - Mandelbrot
  2.  
  3. IMPORT gfx.inc
  4.  
  5. s = gfx::Window(640,480,"ScriptBasic GFX Mandelbrot")
  6. ts = gfx::Time()
  7. FOR y = 0 TO 479
  8.   FOR x = 0 TO 639
  9.     cx = (x - 320) / 120
  10.     cy = (y - 240) / 120
  11.     rit = gfx::Mandelbrot(cx, cy, 510)
  12.     gfx::PixelRGBA s, x, y, rit * 32, rit * 16, rit * 8, 255
  13.   NEXT
  14. NEXT
  15. te = gfx::Time()
  16. gfx::stringColor s, 20, 15, "Time: " & FORMAT("%.4f",(te-ts)/1000) & " Seconds." & CHR(0), 0x000000ff
  17. gfx::Update
  18. WHILE gfx::KeyName(1) <> "+escape"
  19. WEND
  20. gfx::Close
  21.  

Code: C
  1. besFUNCTION(gfx_Mandelbrot)
  2.   DIM AS double cx, cy, zx, zy, tp;
  3.   DIM AS int iter;
  4.   besARGUMENTS("rri")
  5.     AT cx, AT cy, AT iter
  6.   besARGEND
  7.   DEF_WHILE (zx * zx + zy * zy < 4 AND iter > 0)
  8.   BEGIN_WHILE
  9.     tp = zx * zx - zy * zy + cx;
  10.     zy = 2 * zx * zy + cy;
  11.     zx = tp;
  12.     iter = iter - 1;
  13.   WEND
  14.   besRETURN_LONG(iter);
  15. besEND
  16.  


« Last Edit: October 17, 2015, 08:27:03 PM by John »

Peter

  • Guest
Re: Mandelbrot
« Reply #22 on: October 18, 2015, 03:44:50 AM »
Hi,
Potato Mandel  ???
Code: [Select]
include "asm.inc"
window 800,600,1

Loadimage "bmp/potato.bmp"

int cells=1000
single headx, heady

single px[3000] 
single py[3000]

single radX[3000]
single radY[3000]

single angle[3000]
single cRadius[3000]
single frequency[3000]

headx = scrw()/2
heady = scrh()/2

for i=0 to cells
   radx[i] = Rand(-7,7) 
   rady[i] = Rand(-4,4)
   frequency[i] = Rand(-9,9)
   cRadius[i] = Rand(16,30)
next

while key(27)=0
  cls 0,0,0
  for i=0 to cells
     if i=0
        px[i]=headx+sin(angle[i])*radx[i]
        py[i]=heady+cos(angle[i])*rady[i]
     else
        px[i]=px[i-1]+cos(angle[i])*radx[i]
        py[i]=py[i-1]+sin(angle[i])*rady[i]
     endif   
        drawimage 1,px[i],py[i]
angle[i] = angle[i] + rad(frequency[i])
   next
   color 255,255,255
   text 316,32,12,"MANDEL POTATO"
   redraw
   wait 10
wend
winexit

[attachment deleted by admin]

Peter

  • Guest
Re: Mandelbrot
« Reply #23 on: October 18, 2015, 04:42:57 AM »
Hi,
Mandel Complex
Code: [Select]
include "asm.inc"
window 800,600,1

single x,y,zx,zy,cx,cy,tmp, sys MaxIter=512,zoom=150

ts = ticks
For y=0 to <scrH
For x=0 to <scrW
    zx=0
    zy=0
    cx= (x-400)/zoom
    cy= (y-300)/zoom
    Iter = MaxIter
    while zx * zx + zy * zy < 4 && iter > 0
      tmp = zx * zx - zy * zy + cX
      zy  = 2 * zx * zy + cY
      zx  = tmp
      iter--
    wend     
    PutPixel x,y,iter+iter*256+iter*65536/5
Next
Next
color 255,255,255
text 0,0,12,"TIME: " (ticks()-ts)/1000 " SECONDS"
waitkey
winExit

[attachment deleted by admin]

JRS

  • Guest
Re: Mandelbrot
« Reply #24 on: October 18, 2015, 07:31:57 AM »
Quote
FBSL's one is re-sizable

That feature alone make all the others static dummies.  8)

Mike Lobanovsky

  • Guest
Re: Mandelbrot
« Reply #25 on: October 18, 2015, 08:25:55 AM »
Yeah Peter, that's fast. :)

Code: OxygenBasic
  1. Type RECT
  2.   %Left %top
  3.   %Right %bottom
  4. End Type
  5.  
  6. Dim width = 800, height = 600, maxiter = 512, zoom = 150
  7. Dim hDC = GetDC(ME), hMemDC = CreateCompatibleDC(NULL)
  8. Dim hBmp = CreateCompatibleBitmap(hDC, width, height)
  9. Dim hOldBmp = SelectObject(hMemDC, hBmp): SetStretchBltMode(hDC, 4) ' HALFTONE
  10. Dim rc As RECT: SetRect(@rc, 10, 35, width + 10, height + 35)
  11. Dim t = GetTickCount()
  12.  
  13. Mandelbrot(hMemDC)
  14.  
  15. FbslSetText(ME, "-= Peter's Fast Mandelbrot =-  TIME: " &(GetTickCount() - t) / 1000 & " SECONDS")
  16. AdjustWindowRectEx(@rc, &HCF0000, FALSE, &H100) ' WS_OVERLAPPEDWINDOW && WS_EX_WINDOWEDGE
  17. Resize(ME, 0, 0, rc.Right - rc.Left, rc.bottom - rc.top)
  18. Center(ME): Show(ME)
  19.  
  20. Begin Events
  21.   If CBMSG = &H111 AndAlso CBWPARAM = 2 Then ' WM_COMMAND && Esc
  22.    PostMessage(ME, &H10, 0, 0) ' WM_CLOSE
  23.  ElseIf CBMSG = &HF OrElse CBMSG = &H5 Then ' WM_PAINT || WM_SIZE
  24.    GetClientRect(ME, @rc)
  25.     ValidateRect(ME, NULL)
  26.     StretchBlt(hDC, 0, 0, rc.Right, rc.Bottom, hMemDC, 0, 0, width, height, &HCC0020) ' SRCCOPY
  27.    Return 0
  28.   ElseIf CBMSG = &H10 Then ' WM_CLOSE
  29.    DeleteObject(SelectObject(hMemDC, hOldBmp))
  30.     DeleteDC(hMemDC)
  31.     ReleaseDC(ME, hDC)
  32.   End If
  33. End Events
  34.  
  35. DynC Mandelbrot(%dc, %w = width, %h = height, %i = maxiter, !!z = zoom)
  36.   void __attribute__((stdcall)) SetPixelV(int, int, int, int);
  37.  
  38.   void main(int hdc, int srcW, int srcH, int maxiter, double zoom)
  39.   {
  40.     int x, y, iter;
  41.     double zx, zy, cx, cy, sq, tmp;
  42.    
  43.     for (y = 0; y < srcH; y++) {
  44.       for (x = 0; x < srcW; x++) {
  45.         zx = zy = 0.0;
  46.         cx = (x - 400) / zoom;
  47.         cy = (y - 300) / zoom;
  48.         iter = maxiter;
  49.         while (zx * zx + zy * zy < 4 && iter-- > 0) {
  50.           tmp = zx * zx - zy * zy + cx;
  51.           zy = 2 * zx * zy + cy;
  52.           zx = tmp;
  53.         }
  54.         SetPixelV(hdc, x, y, iter + (iter << 8) + (iter << 16) / 5);
  55.       }
  56.     }
  57.   }
  58. End DynC

[attachment deleted by admin]
« Last Edit: October 18, 2015, 08:51:12 AM by Mike Lobanovsky »

Peter

  • Guest
Re: Mandelbrot
« Reply #26 on: October 19, 2015, 08:51:42 AM »
Hello,

Mandelbrot Robustly.  ;D
Code: [Select]
include "asm.inc"
window 800,480,1

Sub filledcircle(x1, y1, r)
r=r/2
for y=-r to r
for x=-r to r
    if x*x+y*y <= r*r
       setpixel x1+x, y1+y
    end if
next
next
End Sub

float ts = ticks
color 255,255,255
text 10,10,10,"PRESS ANY KEY"

for i=40 to 680 step 80
    color 200,200,255-i*10
    filledcircle i-200,240,i-240
next
color 255,255,255
float tz = ticks
text 0,460,12,"Time: " (tz-ts)/1000 " seconds"
waitkey
winExit

[attachment deleted by admin]

Mike Lobanovsky

  • Guest
Re: Mandelbrot
« Reply #27 on: October 19, 2015, 10:03:12 AM »