Megatest

Hex Artifact Content
Login

Artifact f43ad9b3a3d61d65779ebfbe9fb69e1bd2e5b8b9:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 31 37 2c 20 4d 61 74 74  right 2017, Matt
0060: 68 65 77 20 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20  hew Welland..;; 
0070: 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72 61  .;;  This progra
0080: 6d 20 69 73 20 6d 61 64 65 20 61 76 61 69 6c 61  m is made availa
0090: 62 6c 65 20 75 6e 64 65 72 20 74 68 65 20 47 4e  ble under the GN
00a0: 55 20 47 50 4c 20 76 65 72 73 69 6f 6e 20 32 2e  U GPL version 2.
00b0: 30 20 6f 72 0a 3b 3b 20 20 67 72 65 61 74 65 72  0 or.;;  greater
00c0: 2e 20 53 65 65 20 74 68 65 20 61 63 63 6f 6d 70  . See the accomp
00d0: 61 6e 79 69 6e 67 20 66 69 6c 65 20 43 4f 50 59  anying file COPY
00e0: 49 4e 47 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ING for details.
00f0: 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70 72  .;; .;;  This pr
0100: 6f 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62  ogram is distrib
0110: 75 74 65 64 20 57 49 54 48 4f 55 54 20 41 4e 59  uted WITHOUT ANY
0120: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f   WARRANTY; witho
0130: 75 74 20 65 76 65 6e 20 74 68 65 0a 3b 3b 20 20  ut even the.;;  
0140: 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79  implied warranty
0150: 20 6f 66 20 4d 45 52 43 48 41 4e 54 41 42 49 4c   of MERCHANTABIL
0160: 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46  ITY or FITNESS F
0170: 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 0a  OR A PARTICULAR.
0180: 3b 3b 20 20 50 55 52 50 4f 53 45 2e 0a 3b 3b 3d  ;;  PURPOSE..;;=
0190: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28  =====..(define (
01e0: 70 61 67 65 73 3a 68 6f 6d 65 20 73 65 73 73 69  pages:home sessi
01f0: 6f 6e 20 64 62 20 73 68 61 72 65 64 29 0a 20 20  on db shared).  
0200: 0a 20 20 28 6c 65 74 2a 20 28 28 64 62 68 20 20  .  (let* ((dbh  
0210: 20 20 20 20 20 20 20 28 73 3a 64 62 29 29 0a 20         (s:db)). 
0220: 20 20 20 20 20 20 20 20 28 6c 69 6d 69 74 20 35          (limit 5
0230: 30 29 0a 20 20 20 20 20 20 20 20 20 28 63 75 72  0).         (cur
0240: 72 2d 70 61 67 65 20 20 20 28 69 66 20 28 6f 72  r-page   (if (or
0250: 20 28 65 71 75 61 6c 3f 20 28 73 3a 67 65 74 2d   (equal? (s:get-
0260: 70 61 72 61 6d 20 22 70 67 22 29 20 22 22 29 20  param "pg") "") 
0270: 28 65 71 75 61 6c 3f 20 28 73 3a 67 65 74 2d 70  (equal? (s:get-p
0280: 61 72 61 6d 20 22 70 67 22 29 20 23 66 29 29 0a  aram "pg") #f)).
0290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02a0: 20 20 20 20 20 20 31 0a 20 20 20 20 20 20 20 20        1.        
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20  (string->number 
02d0: 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 70 67  (s:get-param "pg
02e0: 22 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 0a  ")))).         .
02f0: 20 20 20 20 20 20 20 20 20 28 6f 66 66 73 65 74           (offset
0300: 20 28 2d 20 28 2a 20 6c 69 6d 69 74 20 20 63 75   (- (* limit  cu
0310: 72 72 2d 70 61 67 65 29 20 6c 69 6d 69 74 29 29  rr-page) limit))
0320: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 28       .         (
0330: 64 6f 74 20 20 20 20 28 69 66 20 28 73 3a 67 65  dot    (if (s:ge
0340: 74 2d 70 61 72 61 6d 20 22 64 6f 74 22 29 0a 20  t-param "dot"). 
0350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0360: 20 20 20 20 20 20 20 20 20 20 28 73 74 72 69 6e            (strin
0370: 67 2d 3e 6e 75 6d 62 65 72 20 28 73 3a 67 65 74  g->number (s:get
0380: 2d 70 61 72 61 6d 20 22 64 6f 74 22 29 29 0a 20  -param "dot")). 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03a0: 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28 61            (if (a
03b0: 6e 64 20 20 28 73 3a 67 65 74 20 22 64 6f 74 22  nd  (s:get "dot"
03c0: 29 20 28 6e 6f 74 20 28 65 71 75 61 6c 3f 20 28  ) (not (equal? (
03d0: 73 3a 67 65 74 20 22 64 6f 74 22 29 20 22 61 6c  s:get "dot") "al
03e0: 6c 22 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  l"))).          
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0400: 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62     (string->numb
0410: 65 72 20 28 73 3a 67 65 74 20 22 64 6f 74 22 29  er (s:get "dot")
0420: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0440: 22 61 6c 6c 22 29 29 29 0a 20 20 20 20 20 20 20  "all"))).       
0450: 20 20 28 74 79 70 65 20 20 20 20 28 69 66 20 28    (type    (if (
0460: 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 74 79 70  s:get-param "typ
0470: 65 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  e").            
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0490: 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 74 79 70  s:get-param "typ
04a0: 65 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  e").            
04b0: 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28             (if (
04c0: 61 6e 64 20 28 73 3a 67 65 74 20 22 74 79 70 65  and (s:get "type
04d0: 22 29 20 28 6e 6f 74 20 28 65 71 75 61 6c 3f 20  ") (not (equal? 
04e0: 28 73 3a 67 65 74 20 22 74 79 70 65 22 29 20 22  (s:get "type") "
04f0: 61 6c 6c 22 29 29 29 0a 20 20 20 20 20 20 20 20  all"))).        
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0510: 20 20 20 20 20 20 28 73 3a 67 65 74 20 22 74 79        (s:get "ty
0520: 70 65 22 29 0a 20 20 20 20 20 20 20 20 20 20 20  pe").           
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0540: 20 20 20 22 61 6c 6c 22 29 29 29 0a 20 20 20 20     "all"))).    
0550: 20 20 20 20 20 20 28 62 70 20 20 20 20 28 69 66        (bp    (if
0560: 20 28 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 62   (s:get-param "b
0570: 70 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  p").            
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0590: 73 3a 67 65 74 2d 70 61 72 61 6d 20 22 62 70 22  s:get-param "bp"
05a0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
05b0: 20 20 20 20 20 20 20 20 20 28 69 66 20 28 73 3a           (if (s:
05c0: 67 65 74 20 22 62 70 22 29 20 0a 20 20 20 20 20  get "bp") .     
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 20 20 20 20 20 20 20 20 20 28 73 3a 67 65 74 20           (s:get 
05f0: 22 62 70 22 29 0a 20 20 20 20 20 20 20 20 20 20  "bp").          
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 22 70 31 32 37 33 22 29 29 29 0a 20      "p1273"))). 
0620: 20 20 20 20 20 20 20 20 20 20 28 72 65 6c 20 20            (rel  
0630: 20 20 28 69 66 20 28 73 3a 67 65 74 2d 70 61 72    (if (s:get-par
0640: 61 6d 20 22 72 65 6c 22 29 0a 20 20 20 20 20 20  am "rel").      
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 28 73 3a 67 65 74 2d 70 61 72 61       (s:get-para
0670: 6d 20 22 72 65 6c 22 29 0a 20 20 20 20 20 20 20  m "rel").       
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 28 69 66 20 28 61 6e 64 20 20 28 73 3a 67 65 74  (if (and  (s:get
06a0: 20 22 72 65 6c 22 29 20 28 6e 6f 74 20 28 65 71   "rel") (not (eq
06b0: 75 61 6c 3f 20 28 73 3a 67 65 74 20 22 72 65 6c  ual? (s:get "rel
06c0: 22 29 20 22 61 6c 6c 22 29 29 29 0a 20 20 20 20  ") "all"))).    
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06e0: 20 20 20 20 20 20 20 20 20 20 28 73 3a 67 65 74            (s:get
06f0: 20 22 72 65 6c 22 29 0a 20 20 20 20 20 20 20 20   "rel").        
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 20 20 20 20 20 20 22 22 29 29 29 20 0a 20 20 20        ""))) .   
0720: 20 20 20 20 20 20 20 28 70 61 74 74 65 72 6e 20         (pattern 
0730: 20 28 70 67 64 62 3a 6d 6b 2d 70 61 74 74 65 72   (pgdb:mk-patter
0740: 6e 20 64 6f 74 20 74 79 70 65 20 62 70 20 72 65  n dot type bp re
0750: 6c 29 29 20 09 20 0a 09 3b 20 28 74 61 72 67 65  l)) . ..; (targe
0760: 74 73 20 20 20 20 20 28 70 67 64 62 3a 67 65 74  ts     (pgdb:get
0770: 2d 74 61 72 67 65 74 73 2d 6f 66 2d 74 79 70 65  -targets-of-type
0780: 20 64 62 68 20 73 65 6c 65 63 74 65 64 20 74 66   dbh selected tf
0790: 69 6c 74 65 72 29 29 0a 09 20 20 20 20 20 20 20  ilter))..       
07a0: 20 20 20 20 20 0a 09 20 28 61 6c 6c 2d 64 61 74       .. (all-dat
07b0: 61 20 20 20 20 20 20 20 28 70 67 64 62 3a 67 65  a       (pgdb:ge
07c0: 74 2d 6c 61 74 65 73 74 2d 72 75 6e 2d 73 74 61  t-latest-run-sta
07d0: 74 73 2d 67 69 76 65 6e 2d 70 61 74 74 65 72 6e  ts-given-pattern
07e0: 20 64 62 68 20 70 61 74 74 65 72 6e 20 20 6c 69   dbh pattern  li
07f0: 6d 69 74 20 6f 66 66 73 65 74 29 29 0a 20 20 20  mit offset)).   
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 20 20 20 20 3b 27 28 29 20 20 29 0a          ;'()  ).
0820: 09 09 09 20 3b 20 28 70 67 64 62 3a 67 65 74 2d  ... ; (pgdb:get-
0830: 73 74 61 74 73 2d 67 69 76 65 6e 2d 74 79 70 65  stats-given-type
0840: 2d 74 61 72 67 65 74 20 64 62 68 20 73 65 6c 65  -target dbh sele
0850: 63 74 65 64 20 74 66 69 6c 74 65 72 29 0a 09 09  cted tfilter)...
0860: 09 20 3b 20 28 70 67 64 62 3a 67 65 74 2d 73 74  . ; (pgdb:get-st
0870: 61 74 73 2d 67 69 76 65 6e 2d 74 61 72 67 65 74  ats-given-target
0880: 20 64 62 68 20 74 66 69 6c 74 65 72 29 0a 09 09   dbh tfilter)...
0890: 09 20 20 0a 20 20 20 20 20 20 20 20 20 28 63 6e  .  .         (cn
08a0: 74 20 20 20 20 20 28 70 67 64 62 3a 67 65 74 2d  t     (pgdb:get-
08b0: 6c 61 74 65 73 74 2d 72 75 6e 2d 63 6e 74 2d 62  latest-run-cnt-b
08c0: 79 2d 70 61 74 74 65 72 6e 20 64 62 68 20 70 61  y-pattern dbh pa
08d0: 74 74 65 72 6e 29 29 0a 20 20 20 20 20 20 20 20  ttern)).        
08e0: 20 28 74 6f 74 61 6c 2d 70 61 67 65 73 20 28 63   (total-pages (c
08f0: 65 69 6c 69 6e 67 20 28 2f 20 63 6e 74 20 20 6c  eiling (/ cnt  l
0900: 69 6d 69 74 29 29 29 20 0a 20 20 20 20 20 20 20  imit))) .       
0910: 20 20 28 70 61 67 65 2d 6c 73 74 20 28 70 67 64    (page-lst (pgd
0920: 62 3a 67 65 74 2d 70 67 2d 6c 73 74 20 74 6f 74  b:get-pg-lst tot
0930: 61 6c 2d 70 61 67 65 73 29 29 0a 20 20 20 20 20  al-pages)).     
0940: 20 20 20 20 28 6f 72 64 65 72 65 64 2d 64 61 74      (ordered-dat
0950: 61 20 28 70 67 64 62 3a 63 6f 61 6c 65 73 63 65  a (pgdb:coalesce
0960: 2d 72 75 6e 73 31 20 61 6c 6c 2d 64 61 74 61 29  -runs1 all-data)
0970: 29 0a 20 20 20 20 20 20 20 20 20 28 72 65 6c 2d  ).         (rel-
0980: 76 61 6c 20 28 69 66 20 28 65 71 75 61 6c 3f 20  val (if (equal? 
0990: 72 65 6c 20 22 22 29 0a 20 20 20 20 20 20 20 20  rel "").        
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
09b0: 25 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  %".             
09c0: 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 29 29             rel))
09d0: 29 0a 20 20 20 28 73 3a 64 69 76 20 27 63 6c 61  ).   (s:div 'cla
09e0: 73 73 20 22 63 6f 6c 5f 31 32 22 20 0a 20 20 20  ss "col_12" .   
09f0: 20 20 20 20 20 28 73 3a 75 6c 20 27 63 6c 61 73       (s:ul 'clas
0a00: 73 20 22 74 61 62 73 20 6c 65 66 74 22 0a 20 20  s "tabs left".  
0a10: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
0a20: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 78   (map (lambda (x
0a30: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 09 28  ).            .(
0a40: 73 3a 6c 69 20 28 73 3a 61 20 27 68 72 65 66 20  s:li (s:a 'href 
0a50: 28 63 6f 6e 63 20 22 23 22 20 78 29 20 78 29 29  (conc "#" x) x))
0a60: 29 0a 09 20 20 2a 70 72 6f 63 65 73 73 2a 29 29  )..  *process*))
0a70: 0a 20 20 20 20 20 20 20 28 6d 61 70 20 28 6c 61  .       (map (la
0a80: 6d 62 64 61 20 28 78 29 0a 20 20 20 20 20 20 20  mbda (x).       
0a90: 20 0a 20 20 20 20 20 20 20 28 73 3a 64 69 76 20   .       (s:div 
0aa0: 27 69 64 20 20 78 20 27 63 6c 61 73 73 20 22 74  'id  x 'class "t
0ab0: 61 62 2d 63 6f 6e 74 65 6e 74 22 0a 20 20 20 20  ab-content".    
0ac0: 20 20 28 73 3a 64 69 76 20 27 63 6c 61 73 73 20    (s:div 'class 
0ad0: 22 63 6f 6c 5f 31 31 22 0a 09 20 20 20 28 73 3a  "col_11"..   (s:
0ae0: 66 69 65 6c 64 73 65 74 20 20 20 20 22 41 72 65  fieldset    "Are
0af0: 61 20 74 79 70 65 20 61 6e 64 20 74 61 72 67 65  a type and targe
0b00: 74 20 66 69 6c 74 65 72 22 0a 09 20 20 20 20 28  t filter"..    (
0b10: 73 3a 66 6f 72 6d 0a 09 20 20 20 20 20 27 61 63  s:form..     'ac
0b20: 74 69 6f 6e 20 28 63 6f 6e 63 20 22 68 6f 6d 65  tion (conc "home
0b30: 2e 66 69 6c 74 65 72 23 22 20 78 29 20 27 6d 65  .filter#" x) 'me
0b40: 74 68 6f 64 20 22 70 6f 73 74 22 0a 09 20 20 20  thod "post"..   
0b50: 20 20 28 73 3a 64 69 76 20 27 63 6c 61 73 73 20    (s:div 'class 
0b60: 22 63 6f 6c 5f 31 32 22 0a 20 20 20 20 20 20 20  "col_12".       
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 28 73 3a 64 69 76 20 27 63 6c 61 73 73 20 22   (s:div 'class "
0b90: 63 6f 6c 5f 33 22 0a 09 09 09 20 20 20 28 73 3a  col_3"....   (s:
0ba0: 6c 61 62 65 6c 20 22 52 65 6c 65 61 73 65 20 54  label "Release T
0bb0: 79 70 65 22 29 20 28 73 3a 73 65 6c 65 63 74 20  ype") (s:select 
0bc0: 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 78 29  (map (lambda (x)
0bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20              (if 
0c00: 28 65 71 75 61 6c 3f 20 20 78 20 74 79 70 65 29  (equal?  x type)
0c10: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0c40: 6c 69 73 74 20 78 20 78 20 78 20 23 74 29 0a 20  list x x x #t). 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 20 20 20 20 20 28 6c 69 73 74             (list
0c80: 20 78 20 78 20 78 20 23 66 29 29 20 29 0a 09 09   x x x #f)) )...
0c90: 09 09 09 20 20 2a 6b 69 74 2d 74 79 70 65 73 2a  ...  *kit-types*
0ca0: 29 0a 09 09 09 09 20 20 20 20 20 27 6e 61 6d 65  ).....     'name
0cb0: 20 22 6b 69 74 2d 74 79 70 65 22 29 29 0a 20 20   "kit-type")).  
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 28 73 3a 64 69 76 20 27 63 6c 61 73 73 20 22   (s:div 'class "
0ce0: 63 6f 6c 5f 33 22 0a 09 09 09 20 20 20 28 73 3a  col_3"....   (s:
0cf0: 6c 61 62 65 6c 20 22 44 6f 74 22 29 20 28 73 3a  label "Dot") (s:
0d00: 73 65 6c 65 63 74 20 28 6d 61 70 20 28 6c 61 6d  select (map (lam
0d10: 62 64 61 20 28 78 29 0a 20 20 20 20 20 20 20 20  bda (x).        
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 20 28 69 66 20 28 65 71 75 61 6c 3f 20      (if (equal? 
0d50: 20 78 20 64 6f 74 29 20 20 0a 20 20 20 20 20 20   x dot)  .      
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 28 6c 69 73 74 20 78 20 78 20        (list x x 
0d90: 78 20 23 74 29 0a 20 20 20 20 20 20 20 20 20 20  x #t).          
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 20 20 28 6c 69 73 74 20 78 20 78 20 78 20 23 66    (list x x x #f
0dd0: 29 29 29 0a 09 09 09 09 09 20 20 2a 64 6f 74 73  )))......  *dots
0de0: 2a 29 0a 09 09 09 09 20 20 20 20 20 27 6e 61 6d  *).....     'nam
0df0: 65 20 22 64 6f 74 22 29 29 0a 0a 09 09 20 20 20  e "dot"))....   
0e00: 28 73 3a 64 69 76 20 27 63 6c 61 73 73 20 22 63  (s:div 'class "c
0e10: 6f 6c 5f 33 22 0a 20 20 20 20 20 20 20 20 20 20  ol_3".          
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 28 73 3a 69 6e 70 75 74 20 27 74 79 70 65    (s:input 'type
0e40: 20 22 68 69 64 64 65 6e 22 20 27 76 61 6c 75 65   "hidden" 'value
0e50: 20 78 20 27 6e 61 6d 65 20 22 62 70 22 29 0a 09   x 'name "bp")..
0e60: 09 09 20 20 20 28 73 3a 6c 61 62 65 6c 20 22 52  ..   (s:label "R
0e70: 65 6c 65 61 73 65 20 23 22 29 20 28 73 3a 69 6e  elease #") (s:in
0e80: 70 75 74 20 27 74 79 70 65 20 22 74 65 78 74 22  put 'type "text"
0e90: 20 27 6e 61 6d 65 20 22 72 65 6c 2d 6e 75 6d 22   'name "rel-num"
0ea0: 20 27 76 61 6c 75 65 20 72 65 6c 2d 76 61 6c 29   'value rel-val)
0eb0: 29 0a 09 09 20 20 20 20 28 73 3a 64 69 76 20 27  )...    (s:div '
0ec0: 63 6c 61 73 73 20 22 63 6f 6c 5f 32 22 0a 09 09  class "col_2"...
0ed0: 09 20 20 20 28 73 3a 69 6e 70 75 74 20 27 74 79  .   (s:input 'ty
0ee0: 70 65 20 22 73 75 62 6d 69 74 22 20 27 6e 61 6d  pe "submit" 'nam
0ef0: 65 20 22 73 65 74 2d 66 69 6c 74 65 72 2d 76 61  e "set-filter-va
0f00: 6c 73 22 20 27 76 61 6c 75 65 20 22 53 75 62 6d  ls" 'value "Subm
0f10: 69 74 22 29 29 29 29 29 0a 20 20 20 20 20 20 20  it"))))).       
0f20: 20 20 20 20 28 73 3a 62 72 29 0a 20 20 20 20 20      (s:br).     
0f30: 20 20 20 20 20 20 3b 28 73 3a 70 20 28 63 6f 6e        ;(s:p (con
0f40: 63 20 64 6f 74 28 73 74 72 69 6e 67 3f 20 64 6f  c dot(string? do
0f50: 74 29 20 29 29 20 0a 20 20 20 20 20 20 20 20 20  t) )) .         
0f60: 20 20 20 20 28 73 3a 70 20 28 6d 61 70 0a 20 20      (s:p (map.  
0f70: 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64            (lambd
0f80: 61 20 28 69 29 20 0a 20 20 20 20 20 20 20 20 20  a (i) .         
0f90: 20 28 73 3a 73 70 61 6e 20 28 73 3a 61 20 27 68   (s:span (s:a 'h
0fa0: 72 65 66 20 28 73 3a 6c 69 6e 6b 2d 74 6f 20 22  ref (s:link-to "
0fb0: 68 6f 6d 65 22 20 27 70 67 20 69 20 29 20 22 50  home" 'pg i ) "P
0fc0: 41 47 45 20 22 20 69 20 20 29 22 26 6e 62 73 70  AGE " i  )"&nbsp
0fd0: 3b 7c 26 6e 62 73 70 3b 22 29 29 20 20 0a 20 20  ;| "))  .  
0fe0: 20 20 20 20 20 20 20 20 70 61 67 65 2d 6c 73 74          page-lst
0ff0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 73  )).           (s
1000: 3a 70 20 22 26 6e 62 73 70 3b 26 6e 62 73 70 3b  :p "  
1010: 52 65 73 75 6c 74 20 46 6f 72 6d 61 74 3a 20 26  Result Format: &
1020: 6e 62 73 70 3b 26 6e 62 73 70 3b 74 6f 74 61 6c  nbsp; total
1030: 20 2f 20 70 61 73 73 20 2f 20 66 61 69 6c 20 2f   / pass / fail /
1040: 20 6f 74 68 65 72 22 29 0a 20 20 20 20 20 20 20   other").       
1050: 20 20 20 20 20 28 69 66 20 28 65 71 75 61 6c 3f       (if (equal?
1060: 20 78 20 62 70 29 0a 20 20 20 20 20 20 20 20 20   x bp).         
1070: 20 20 20 20 28 62 65 67 69 6e 20 0a 20 20 20 20      (begin .    
1080: 20 20 20 20 20 20 20 28 73 3a 66 69 65 6c 64 73         (s:fields
1090: 65 74 09 20 20 20 20 28 63 6f 6e 63 20 22 52 75  et.    (conc "Ru
10a0: 6e 73 20 64 61 74 61 20 66 6f 72 20 22 20 70 61  ns data for " pa
10b0: 74 74 65 72 6e 29 0a 09 20 20 20 20 20 20 28 6c  ttern)..      (l
10c0: 65 74 2a 20 28 28 61 2d 6b 65 79 73 20 28 70 67  et* ((a-keys (pg
10d0: 64 62 3a 6f 72 64 65 72 65 64 2d 64 61 74 61 2d  db:ordered-data-
10e0: 3e 61 2d 6b 65 79 73 20 6f 72 64 65 72 65 64 2d  >a-keys ordered-
10f0: 64 61 74 61 29 29 0a 09 09 20 20 20 28 62 2d 6b  data))...   (b-k
1100: 65 79 73 20 28 70 67 64 62 3a 6f 72 64 65 72 65  eys (pgdb:ordere
1110: 64 2d 64 61 74 61 2d 3e 62 2d 6b 65 79 73 20 6f  d-data->b-keys o
1120: 72 64 65 72 65 64 2d 64 61 74 61 20 61 2d 6b 65  rdered-data a-ke
1130: 79 73 29 29 29 0a 20 20 09 09 20 20 28 73 3a 74  ys))).  ..  (s:t
1140: 61 62 6c 65 20 20 27 63 6c 61 73 73 20 22 73 74  able  'class "st
1150: 72 69 70 65 64 22 0a 09 09 20 20 20 28 73 3a 74  riped"...   (s:t
1160: 72 20 20 28 73 3a 74 68 20 20 27 63 6c 61 73 73  r  (s:th  'class
1170: 20 22 68 65 61 64 69 6e 67 22 20 29 20 0a 20 09   "heading" ) . .
1180: 09 09 28 6d 61 70 0a 20 20 20 20 20 20 20 20 20  ..(map.         
1190: 20 20 20 20 20 20 20 09 28 6c 61 6d 62 64 61 20         .(lambda 
11a0: 28 74 68 2d 6b 65 79 29 20 0a 20 20 20 20 20 20  (th-key) .      
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 28 73 3a 74 68 20 27 63 6c 61 73 73 20     (s:th 'class 
11d0: 22 68 65 61 64 69 6e 67 22 20 74 68 2d 6b 65 79  "heading" th-key
11e0: 20 29 29 20 0a 20 20 20 20 20 20 20 20 20 20 20   )) .           
11f0: 20 20 20 20 20 20 20 20 20 61 2d 6b 65 79 73 29           a-keys)
1200: 29 0a 09 09 20 20 20 28 6d 61 70 0a 09 09 20 20  )...   (map...  
1210: 20 20 28 6c 61 6d 62 64 61 20 28 72 6f 77 2d 6b    (lambda (row-k
1220: 65 79 29 0a 09 09 20 20 20 20 20 20 28 73 3a 74  ey)...      (s:t
1230: 72 20 28 73 3a 74 64 20 72 6f 77 2d 6b 65 79 29  r (s:td row-key)
1240: 0a 09 09 09 20 20 20 20 28 6d 61 70 0a 09 09 09  ....    (map....
1250: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f       (lambda (co
1260: 6c 2d 6b 65 79 29 0a 09 09 09 20 20 20 20 20 20  l-key)....      
1270: 20 28 6c 65 74 20 28 28 76 61 6c 20 28 6c 65 74   (let ((val (let
1280: 2a 20 28 28 68 74 20 20 28 68 61 73 68 2d 74 61  * ((ht  (hash-ta
1290: 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20  ble-ref/default 
12a0: 6f 72 64 65 72 65 64 2d 64 61 74 61 20 63 6f 6c  ordered-data col
12b0: 2d 6b 65 79 20 23 66 29 29 29 0a 09 09 09 09 09  -key #f)))......
12c0: 20 20 20 20 28 69 66 20 68 74 20 28 68 61 73 68      (if ht (hash
12d0: 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75  -table-ref/defau
12e0: 6c 74 20 68 74 20 72 6f 77 2d 6b 65 79 20 23 66  lt ht row-key #f
12f0: 29 29 29 29 29 0a 09 09 09 09 20 28 69 66 20 76  )))))..... (if v
1300: 61 6c 0a 09 09 09 09 20 20 20 20 20 28 6c 65 74  al.....     (let
1310: 2a 20 28 28 74 6f 74 61 6c 20 28 76 65 63 74 6f  * ((total (vecto
1320: 72 2d 72 65 66 20 76 61 6c 20 32 29 29 0a 20 20  r-ref val 2)).  
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 28 65 76 65 6e 74            (event
1360: 2d 74 69 6d 65 20 28 76 65 63 74 6f 72 2d 72 65  -time (vector-re
1370: 66 20 76 61 6c 20 31 29 29 20 0a 09 09 09 09 09  f val 1)) ......
1380: 20 20 20 20 28 70 61 73 73 20 20 28 76 65 63 74      (pass  (vect
1390: 6f 72 2d 72 65 66 20 76 61 6c 20 33 29 29 0a 09  or-ref val 3))..
13a0: 09 09 09 09 20 20 20 20 28 66 61 69 6c 20 20 28  ....    (fail  (
13b0: 76 65 63 74 6f 72 2d 72 65 66 20 76 61 6c 20 34  vector-ref val 4
13c0: 29 29 0a 09 09 09 09 09 20 20 20 20 28 6f 74 68  ))......    (oth
13d0: 65 72 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76  er (vector-ref v
13e0: 61 6c 20 35 29 29 0a 20 20 20 20 20 20 20 20 20  al 5)).         
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 28 69 64 20 28 76 65 63 74 6f 72 2d 72     (id (vector-r
1420: 65 66 20 76 61 6c 20 36 29 29 20 0a 09 09 09 09  ef val 6)) .....
1430: 09 20 20 20 20 28 70 61 73 73 70 65 72 20 28 72  .    (passper (r
1440: 6f 75 6e 64 20 28 2a 20 28 2f 20 70 61 73 73 20  ound (* (/ pass 
1450: 74 6f 74 61 6c 29 20 31 30 30 29 29 29 0a 09 09  total) 100)))...
1460: 09 09 09 20 20 20 20 28 66 61 69 6c 70 65 72 20  ...    (failper 
1470: 28 2d 20 31 30 30 20 70 61 73 73 70 65 72 29 29  (- 100 passper))
1480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 68                (h
14b0: 69 73 74 6f 72 79 20 28 70 67 64 62 3a 67 65 74  istory (pgdb:get
14c0: 2d 72 75 6e 2d 73 74 61 74 73 2d 68 69 73 74 6f  -run-stats-histo
14d0: 72 79 2d 67 69 76 65 6e 2d 74 61 72 67 65 74 20  ry-given-target 
14e0: 64 62 68 20 31 20 28 63 6f 6e 63 20 63 6f 6c 2d  dbh 1 (conc col-
14f0: 6b 65 79 20 22 2f 22 20 72 6f 77 2d 6b 65 79 29  key "/" row-key)
1500: 29 29 20 20 0a 20 20 20 20 20 20 20 20 20 09 09  ))  .         ..
1510: 09 09 20 20 20 20 20 28 68 69 73 74 6f 72 79 2d  ..     (history-
1520: 68 61 73 68 20 28 70 67 64 62 3a 67 65 74 2d 68  hash (pgdb:get-h
1530: 69 73 74 6f 72 79 2d 68 61 73 68 20 68 69 73 74  istory-hash hist
1540: 6f 72 79 29 29 0a 20 20 20 20 20 20 20 20 20 20  ory)).          
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 28 68 69 73 74 6f 72 79 2d 6b 65 79 73     (history-keys
1580: 20 28 73 6f 72 74 20 28 68 61 73 68 2d 74 61 62   (sort (hash-tab
1590: 6c 65 2d 6b 65 79 73 20 68 69 73 74 6f 72 79 2d  le-keys history-
15a0: 68 61 73 68 29 20 73 74 72 69 6e 67 3e 3d 3f 29  hash) string>=?)
15b0: 29 0a 09 09 09 09 09 20 20 20 20 28 72 75 6e 2d  )......    (run-
15c0: 6b 65 79 20 28 73 74 72 69 6e 67 2d 73 75 62 73  key (string-subs
15d0: 74 69 74 75 74 65 20 22 5b 2f 5d 22 20 22 5f 78  titute "[/]" "_x
15e0: 5f 22 20 28 63 6f 6e 63 20 63 6f 6c 2d 6b 65 79  _" (conc col-key
15f0: 20 22 2f 22 20 72 6f 77 2d 6b 65 79 29 20 27 61   "/" row-key) 'a
1600: 6c 6c 29 29 29 0a 09 09 09 09 20 20 20 20 20 20  ll))).....      
1610: 20 28 73 3a 74 64 20 20 20 27 73 74 79 6c 65 20   (s:td   'style 
1620: 28 63 6f 6e 63 20 22 62 61 63 6b 67 72 6f 75 6e  (conc "backgroun
1630: 64 3a 20 2d 77 65 62 6b 69 74 2d 6c 69 6e 65 61  d: -webkit-linea
1640: 72 2d 67 72 61 64 69 65 6e 74 28 6c 65 66 74 2c  r-gradient(left,
1650: 20 67 72 65 65 6e 20 22 20 70 61 73 73 70 65 72   green " passper
1660: 20 22 25 2c 20 72 65 64 29 3b 20 62 61 63 6b 67   "%, red); backg
1670: 72 6f 75 6e 64 3a 20 2d 6f 2d 6c 69 6e 65 61 72  round: -o-linear
1680: 2d 67 72 61 64 69 65 6e 74 28 72 69 67 68 74 2c  -gradient(right,
1690: 20 67 72 65 65 6e 20 22 20 70 61 73 73 70 65 72   green " passper
16a0: 20 22 25 2c 20 72 65 64 29 3b 20 62 61 63 6b 67   "%, red); backg
16b0: 72 6f 75 6e 64 3a 20 2d 6d 6f 7a 2d 6c 69 6e 65  round: -moz-line
16c0: 61 72 2d 67 72 61 64 69 65 6e 74 28 72 69 67 68  ar-gradient(righ
16d0: 74 2c 20 67 72 65 65 6e 20 22 20 70 61 73 73 70  t, green " passp
16e0: 65 72 20 22 25 2c 20 72 65 64 29 3b 20 62 61 63  er "%, red); bac
16f0: 6b 67 72 6f 75 6e 64 3a 20 6c 69 6e 65 61 72 2d  kground: linear-
1700: 67 72 61 64 69 65 6e 74 28 74 6f 20 72 69 67 68  gradient(to righ
1710: 74 2c 20 67 72 65 65 6e 20 22 20 70 61 73 73 70  t, green " passp
1720: 65 72 20 22 25 2c 20 72 65 64 29 3b 22 29 0a 20  er "%, red);"). 
1730: 20 20 20 20 20 09 09 09 09 20 20 20 20 20 20 28       ....      (
1740: 73 3a 61 20 27 63 6c 61 73 73 20 22 77 68 69 74  s:a 'class "whit
1750: 65 22 20 20 27 68 72 65 66 20 28 73 3a 6c 69 6e  e"  'href (s:lin
1760: 6b 2d 74 6f 20 22 72 75 6e 22 20 27 74 61 72 67  k-to "run" 'targ
1770: 65 74 20 72 75 6e 2d 6b 65 79 29 0a 09 09 09 09  et run-key).....
1780: 09 20 20 28 63 6f 6e 63 20 22 4c 61 74 65 73 74  .  (conc "Latest
1790: 3a 22 20 74 6f 74 61 6c 20 22 2f 22 20 70 61 73  :" total "/" pas
17a0: 73 20 22 2f 22 20 66 61 69 6c 20 22 2f 22 20 6f  s "/" fail "/" o
17b0: 74 68 65 72 29 29 20 28 73 3a 73 70 61 6e 20 22  ther)) (s:span "
17c0: 20 20 7c 20 22 29 20 28 73 3a 61 20 27 69 64 20    | ") (s:a 'id 
17d0: 69 64 20 27 63 6c 61 73 73 20 22 76 69 65 77 6d  id 'class "viewm
17e0: 6f 64 61 6c 22 20 20 27 74 69 74 6c 65 20 22 43  odal"  'title "C
17f0: 6c 69 63 6b 20 74 6f 20 73 65 65 20 64 65 73 63  lick to see desc
1800: 72 69 70 74 69 6f 6e 22 20 20 22 48 69 73 74 6f  ription"  "Histo
1810: 72 79 22 29 20 28 73 3a 62 72 29 0a 20 20 20 20  ry") (s:br).    
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1840: 73 3a 64 69 76 20 27 69 64 20 28 63 6f 6e 63 20  s:div 'id (conc 
1850: 22 6d 79 4d 6f 64 61 6c 22 20 69 64 29 20 27 63  "myModal" id) 'c
1860: 6c 61 73 73 20 22 6d 6f 64 61 6c 22 0a 20 20 20  lass "modal".   
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 20 20 20 28 73 3a 64 69 76 20 27 63 6c 61       (s:div 'cla
18a0: 73 73 20 22 6d 6f 64 61 6c 2d 63 6f 6e 74 65 6e  ss "modal-conten
18b0: 74 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t".             
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 28 73 3a 73 70 61 6e 20 27 69 64 20 69 64 20 27  (s:span 'id id '
18f0: 63 6c 61 73 73 20 22 63 6c 6f 73 65 22 20 22 26  class "close" "&
1900: 74 69 6d 65 73 3b 22 29 20 0a 20 20 20 20 09 09  times;") .    ..
1910: 09 09 09 09 3b 28 73 3a 70 20 28 63 6f 6e 63 20  ....;(s:p (conc 
1920: 22 4d 6f 64 61 6c 20 22 20 69 64 20 22 2e 2e 22  "Modal " id ".."
1930: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 28 73 3a 64 69 76 20 20 20 20 20 20      (s:div      
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 28 73 3a 74 61 62 6c 65 20         (s:table 
19e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1a20: 3a 74 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  :tr.            
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 28 73 3a 74 68 20 22 52 75 6e 61 6d 65     (s:th "Runame
1a70: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ").             
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 28 73 3a 74 68 20 22 52 65 73 75 6c 74 22    (s:th "Result"
1ac0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ).             
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b40: 6d 61 70 0a 09 09 09 20 20 20 20 09 09 09 09 09  map....    .....
1b50: 28 6c 61 6d 62 64 61 20 28 68 69 73 74 6f 72 79  (lambda (history
1b60: 2d 6b 65 79 29 0a 20 20 20 20 20 20 20 20 20 20  -key).          
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 68         (let* ((h
1bb0: 69 73 74 6f 72 79 2d 72 6f 77 20 28 68 61 73 68  istory-row (hash
1bc0: 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75  -table-ref/defau
1bd0: 6c 74 20 68 69 73 74 6f 72 79 2d 68 61 73 68 20  lt history-hash 
1be0: 68 69 73 74 6f 72 79 2d 6b 65 79 20 23 66 29 29  history-key #f))
1bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 28 68 74 6f 74 61            (htota
1c40: 6c 20 28 76 65 63 74 6f 72 2d 72 65 66 20 68 69  l (vector-ref hi
1c50: 73 74 6f 72 79 2d 72 6f 77 20 31 29 29 0a 20 20  story-row 1)).  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 28 68 70 61 73 73 20 28 76         (hpass (v
1cb0: 65 63 74 6f 72 2d 72 65 66 20 68 69 73 74 6f 72  ector-ref histor
1cc0: 79 2d 72 6f 77 20 32 29 29 0a 20 20 20 20 20 20  y-row 2)).      
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 20 28 68 66 61 69 6c 20 28 76 65 63 74 6f     (hfail (vecto
1d20: 72 2d 72 65 66 20 68 69 73 74 6f 72 79 2d 72 6f  r-ref history-ro
1d30: 77 20 33 29 29 0a 20 20 20 20 20 20 20 20 20 20  w 3)).          
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d80: 68 6f 74 68 65 72 20 28 76 65 63 74 6f 72 2d 72  hother (vector-r
1d90: 65 66 20 68 69 73 74 6f 72 79 2d 72 6f 77 20 34  ef history-row 4
1da0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 28 70 61 73              (pas
1df0: 73 70 65 72 20 28 72 6f 75 6e 64 20 28 2a 20 28  sper (round (* (
1e00: 2f 20 68 70 61 73 73 20 68 74 6f 74 61 6c 29 20  / hpass htotal) 
1e10: 31 30 30 29 29 29 29 0a 20 20 20 20 20 20 20 20  100)))).        
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 28 73 3a 74 72 20 28 73          (s:tr (s
1e60: 3a 74 64 20 20 68 69 73 74 6f 72 79 2d 6b 65 79  :td  history-key
1e70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 20 20 20 20 28 73 3a 74 64 20 27 73          (s:td 's
1ec0: 74 79 6c 65 20 28 63 6f 6e 63 20 22 62 61 63 6b  tyle (conc "back
1ed0: 67 72 6f 75 6e 64 3a 20 2d 77 65 62 6b 69 74 2d  ground: -webkit-
1ee0: 6c 69 6e 65 61 72 2d 67 72 61 64 69 65 6e 74 28  linear-gradient(
1ef0: 6c 65 66 74 2c 20 67 72 65 65 6e 20 22 20 70 61  left, green " pa
1f00: 73 73 70 65 72 20 22 25 2c 20 72 65 64 29 3b 20  ssper "%, red); 
1f10: 62 61 63 6b 67 72 6f 75 6e 64 3a 20 2d 6f 2d 6c  background: -o-l
1f20: 69 6e 65 61 72 2d 67 72 61 64 69 65 6e 74 28 72  inear-gradient(r
1f30: 69 67 68 74 2c 20 67 72 65 65 6e 20 22 20 70 61  ight, green " pa
1f40: 73 73 70 65 72 20 22 25 2c 20 72 65 64 29 3b 20  ssper "%, red); 
1f50: 62 61 63 6b 67 72 6f 75 6e 64 3a 20 2d 6d 6f 7a  background: -moz
1f60: 2d 6c 69 6e 65 61 72 2d 67 72 61 64 69 65 6e 74  -linear-gradient
1f70: 28 72 69 67 68 74 2c 20 67 72 65 65 6e 20 22 20  (right, green " 
1f80: 70 61 73 73 70 65 72 20 22 25 2c 20 72 65 64 29  passper "%, red)
1f90: 3b 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 6c 69  ; background: li
1fa0: 6e 65 61 72 2d 67 72 61 64 69 65 6e 74 28 74 6f  near-gradient(to
1fb0: 20 72 69 67 68 74 2c 20 67 72 65 65 6e 20 22 20   right, green " 
1fc0: 70 61 73 73 70 65 72 20 22 25 2c 20 72 65 64 29  passper "%, red)
1fd0: 3b 22 29 0a 28 63 6f 6e 63 20 20 68 74 6f 74 61  ;").(conc  htota
1fe0: 6c 20 22 2f 22 20 68 70 61 73 73 20 22 2f 22 20  l "/" hpass "/" 
1ff0: 68 66 61 69 6c 20 22 2f 22 20 68 6f 74 68 65 72  hfail "/" hother
2000: 20 29 29 29 29 29 0a 20 20 20 20 20 20 20 20 20   ))))).         
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 20 68 69 73 74 6f 72 79 2d 6b 65 79       history-key
2050: 73 29 29 29 29 29 29 29 0a 09 09 09 09 20 20 20  s))))))).....   
2060: 20 20 28 73 3a 74 64 20 22 22 29 29 29 29 0a 09    (s:td ""))))..
2070: 09 09 20 20 20 20 20 61 2d 6b 65 79 73 29 29 29  ..     a-keys)))
2080: 0a 09 09 20 20 20 20 62 2d 6b 65 79 73 29 29 29  ...    b-keys)))
2090: 29 0a 29 0a 28 62 65 67 69 6e 20 0a 28 73 3a 70  ).).(begin .(s:p
20a0: 20 22 22 29 29 29 29 29 29 0a 20 2a 70 72 6f 63   "")))))). *proc
20b0: 65 73 73 2a 29 29 29 29 0a                       ess*)))).