blob: 5cc7d7754ce7e8c9bb405a47a513a42a558cc337 [file] [log] [blame]
<div xmlns:py="http://genshi.edgewall.org/">
<h2>Summary of the tests</h2>
<div py:for="summary in summaries">
<table class="datatable test_verdicts">
<tr>
<th>Id</th>
<th>Type</th>
<th>Pass/Fail</th>
</tr>
<tr>
<td>${summary.id}</td>
<td>${summary.type}</td>
<td class="${'passed' if summary.verdict == 'Pass' else 'failed' if summary.verdict == 'Fail' else ''}">${summary.verdict}</td>
</tr>
</table>
</div>
<div py:for="results in all_results">
<!--! Display test and session parameters -->
<h1 class="test_title">${"%s #%s" % (results[0].test_type_name, results[1].test_id)}</h1>
<h2 class="test_title">${results[1].dut['manufacturer']} ${results[1].dut['program']} ${results[1].dut['sample_id']} ${results[1].test_item['finger_type']}
<span class="no_summary">${results[1].testsession['operator']} ${results[1].test_item['starttime']}, test session ID: ${results[1].testsession['id']}</span>
</h2>
<table class="datatable test_verdicts">
<tr>
<th></th>
<th>Value</th>
<th>Maximum allowed</th>
<th>Pass/Fail</th>
</tr>
<tr>
<td class="vertical_header_th">Ghost touches:</td>
<td>${results[0].ghost_touches_and_events.max_ghost_touch_count}</td>
<td>0</td>
<td class="${'passed' if results[0].ghost_touches_and_events.max_ghost_touch_count == 0 else 'failed'}" >
${"Pass" if results[0].ghost_touches_and_events.max_ghost_touch_count == 0 else "Fail"}
</td>
</tr>
<tr>
<th></th>
<th>Value</th>
<th>Must have</th>
<th>Pass/Fail</th>
</tr>
<tr>
<td class="vertical_header_th">Touchup events:</td>
<td>${results[0].ghost_touches_and_events.ups}</td>
<td>${results[0].max_events}</td>
<td class="${'passed' if results[0].max_events == results[0].ghost_touches_and_events.ups else 'failed'}" >
${"Pass" if results[0].max_events == results[0].ghost_touches_and_events.ups else "Fail"}
</td>
</tr>
<tr>
<td class="vertical_header_th">Touchdown events:</td>
<td>${results[0].ghost_touches_and_events.downs}</td>
<td>${results[0].max_events}</td>
<td class="${'passed' if results[0].max_events == results[0].ghost_touches_and_events.downs else 'failed'}" >
${"Pass" if results[0].max_events == results[0].ghost_touches_and_events.downs else "Fail"}
</td>
</tr>
</table>
<h3>Swipe Latency</h3>
<table class="datatable test_verdicts">
<tr>
<th></th>
<th>Value</th>
<th>Maximum allowed</th>
<th>Pass/Fail</th>
</tr>
<tr py:if="'swipe_accuracy' in results[0]">
<td class="vertical_header_th">Failed lines</td>
<td>${results[0].swipe_accuracy.failed_paths} / ${results[0].swipe_accuracy.failed_paths + results[0].swipe_accuracy.passed_paths}</td>
<td>0</td>
<td class="${'passed' if results[0].swipe_accuracy.failed_paths == 0 else 'failed'}" >
${"Pass" if results[0].swipe_accuracy.failed_paths == 0 else "Fail"}
</td>
</tr>
<tr py:if="'swipe_accuracy' in results[0]">
<td class="vertical_header_th">Max swipe latency (AKA mcg test) error:</td>
<td>${"%s" % results[0].swipe_accuracy.max_input_error} mm</td>
<td>${"%s" % results[1].settings['swipeerror']} mm</td>
<td class="${'passed' if results[1].settings['swipeerror'] >= results[0].swipe_accuracy.max_input_error else 'failed'}" >
${"Pass" if results[1].settings['swipeerror'] >= results[0].swipe_accuracy.max_input_error else "Fail"}
</td>
</tr>
</table>
<h3>Path Accuracy</h3>
<table class="datatable test_verdicts">
<tr>
<th></th>
<th>Value</th>
<th>Maximum allowed</th>
<th>Pass/Fail</th>
</tr>
<tr py:if="'path_accuracy' in results[0]">
<td class="vertical_header_th">Failed lines</td>
<td>${results[0].path_accuracy.failed_paths} / ${results[0].path_accuracy.failed_paths + results[0].path_accuracy.passed_paths}</td>
<td>0</td>
<td class="${'passed' if results[0].path_accuracy.failed_paths == 0 else 'failed'}" >
${"Pass" if results[0].path_accuracy.failed_paths == 0 else "Fail"}
</td>
</tr>
<tr py:if="'path_accuracy' in results[0]">
<td class="vertical_header_th">Max path accuracy error:</td>
<td>${"%s" % results[0].path_accuracy.max_input_error} mm</td>
<td>${"%s" % results[1].settings['maxpathinputerror']} mm</td>
<td class="${'passed' if results[1].settings['maxposerror'] >= results[0].path_accuracy.max_input_error else 'failed'}" >
${"Pass" if results[1].settings['maxposerror'] >= results[0].path_accuracy.max_input_error else "Fail"}
</td>
</tr>
</table>
<h3>Path Length</h3>
<table class="datatable test_verdicts">
<tr>
<th></th>
<th>Value</th>
<th>Maximum allowed</th>
<th>Pass/Fail</th>
</tr>
<tr py:if="'path_length_comparison' in results[0]">
<td class="vertical_header_th">Failed lines</td>
<td>${results[0].path_length_comparison.failed_paths} / ${results[0].path_length_comparison.failed_paths + results[0].path_length_comparison.passed_paths}</td>
<td>0</td>
<td class="${'passed' if results[0].path_length_comparison.failed_paths == 0 else 'failed'}" >
${"Pass" if results[0].path_length_comparison.failed_paths == 0 else "Fail"}
</td>
</tr>
<tr py:if="'path_length_comparison' in results[0]">
<td class="vertical_header_th">Max path length error:</td>
<td>${"%s" % results[0].path_length_comparison.max_panel_length_error} mm</td>
<td>± ${"%s" % results[1].settings['maxlengtherror']} mm</td>
<td class="${'passed' if results[0].path_length_comparison.verdict else 'failed'}" >
${"Pass" if results[0].path_length_comparison.verdict else "Fail"}
</td>
</tr>
<tr py:if="'path_length_comparison' in results[0]">
<td class="vertical_header_th">Max path length error (%):</td>
<td>${"%s" % results[0].path_length_comparison.max_panel_percentage_length_error} %</td>
<td>${"%s" % results[1].settings['maxpercentagelengtherror']} %</td>
<td class="${'passed' if results[1].settings['maxpercentagelengtherror'] > results[0].path_length_comparison.max_panel_percentage_length_error else 'failed'}" >
${"Pass" if results[1].settings['maxpercentagelengtherror'] > results[0].path_length_comparison.max_panel_percentage_length_error else "Fail"}
</td>
</tr>
</table>
<h3>Curved Path Linearity</h3>
<table class="datatable test_verdicts">
<tr>
<th></th>
<th>Value</th>
<th>Maximum allowed</th>
<th>Pass/Fail</th>
</tr>
<tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
<td class="vertical_header_th">Failed lines</td>
<td>${results[0].curved_path_linearity.failed_paths} / ${results[0].curved_path_linearity.failed_paths + results[0].curved_path_linearity.passed_paths}</td>
<td>0</td>
<td class="${'passed' if results[0].curved_path_linearity.failed_paths == 0 else 'failed'}" >
${"Pass" if results[0].curved_path_linearity.failed_paths == 0 else "Fail"}
</td>
</tr>
<tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
<td class="vertical_header_th">Max linearity error:</td>
<td>${"%s" % results[0].curved_path_linearity.max_input_error} mm</td>
<td>${"%s" % results[1].settings['maxpathinputerror']} mm</td>
<td class="${'passed' if results[1].settings['maxposerror'] >= results[0].curved_path_linearity.max_input_error else 'failed'}" >
${"Pass" if results[1].settings['maxposerror'] >= results[0].curved_path_linearity.max_input_error else "Fail"}
</td>
</tr>
<!--span py:if="results[0].device_level == False">
<tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
<td class="vertical_header_th">Max latency:</td>
<td>${"%s" % results[0].curved_path_linearity.max_latency} ms</td>
<td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
<td class="${'passed' if results[1].settings['maxlatencyerror'] >= results[0].curved_path_linearity.max_latency else 'failed'}" >
${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].curved_path_linearity.max_latency) else "Fail"}
</td>
</tr>
<tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
<td class="vertical_header_th">Min latency:</td>
<td>${"%s" % results[0].curved_path_linearity.min_latency} ms</td>
<td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
<td class="${'passed' if results[1].settings['maxlatencyerror'] >= results[0].curved_path_linearity.min_latency else 'failed'}" >
${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].curved_path_linearity.min_latency) else "Fail"}
</td>
</tr>
<tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
<td class="vertical_header_th">Average latency:</td>
<td>${"%s" % results[0].curved_path_linearity.average_latency} ms</td>
<td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
<td class="${'passed' if results[1].settings['maxlatencyerror'] >= results[0].curved_path_linearity.average_latency else 'failed'}" >
${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].curved_path_linearity.average_latency) else "Fail"}
</td>
</tr>
<tr py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
<td class="vertical_header_th">Median latency:</td>
<td>${"%s" % results[0].curved_path_linearity.median_latency} ms</td>
<td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
<td class="${'passed' if results[1].settings['maxlatencyerror'] >= results[0].curved_path_linearity.median_latency else 'failed'}" >
${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].curved_path_linearity.median_latency) else "Fail"}
</td>
</tr>
</span-->
</table>
<h3>Proximity of Reported Positions to Robot Position</h3>
<table class="datatable test_verdicts">
<tr>
<th></th>
<th>Value</th>
<th>Maximum allowed</th>
<th>Pass/Fail</th>
</tr>
<tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
<td class="vertical_header_th">Failed lines</td>
<td>${results[0].reported_pos_proximity_to_robot_pos.failed_paths} / ${results[0].reported_pos_proximity_to_robot_pos.failed_paths + results[0].reported_pos_proximity_to_robot_pos.passed_paths}</td>
<td>0</td>
<td class="${'passed' if results[0].reported_pos_proximity_to_robot_pos.failed_paths == 0 else 'failed'}" >
${"Pass" if results[0].reported_pos_proximity_to_robot_pos.failed_paths == 0 else "Fail"}
</td>
</tr>
<tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
<td class="vertical_header_th">Max offset error:</td>
<td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.max_input_error} mm</td>
<td>${"%s" % results[1].settings['maxoffseterror']} mm</td>
<td class="${'passed' if results[1].settings['maxoffseterror'] >= results[0].reported_pos_proximity_to_robot_pos.max_input_error else 'failed'}" >
${"Pass" if results[1].settings['maxoffseterror'] >= results[0].reported_pos_proximity_to_robot_pos.max_input_error else "Fail"}
</td>
</tr>
<!--span py:if="results[0].device_level == False">
<tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
<td class="vertical_header_th">Max latency:</td>
<td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.max_latency} ms</td>
<td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
<td class="${'passed' if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.max_latency) else 'failed'}" >
${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.max_latency) else "Fail"}
</td>
</tr>
<tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
<td class="vertical_header_th">Min latency:</td>
<td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.min_latency} ms</td>
<td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
<td class="${'passed' if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.min_latency) else 'failed'}" >
${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.min_latency) else "Fail"}
</td>
</tr>
<tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
<td class="vertical_header_th">Average latency:</td>
<td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.average_latency} ms</td>
<td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
<td class="${'passed' if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.average_latency) else 'failed'}" >
${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.average_latency) else "Fail"}
</td>
</tr>
<tr py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
<td class="vertical_header_th">Median latency:</td>
<td>${"%s" % results[0].reported_pos_proximity_to_robot_pos.median_latency} ms</td>
<td>${"%s" % results[1].settings['maxlatencyerror']} ms</td>
<td class="${'passed' if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.median_latency) else 'failed'}" >
${"Pass" if results[1].settings['maxlatencyerror'] >= abs(results[0].reported_pos_proximity_to_robot_pos.median_latency) else "Fail"}
</td>
</tr>
</span-->
</table>
<!-- Preview images -->
<span py:if="'swipe_accuracy' in results[0]">
<div py:for="img in results[0].swipe_accuracy.images" class="preview">
<a href="${img[1]}">
<img src="${img[0]}" alt="Preview image"/>
</a>
</div>
</span>
<span py:if="'path_accuracy' in results[0]">
<div py:for="img in results[0].path_accuracy.images" class="preview">
<a href="${img[1]}">
<img src="${img[0]}" alt="Preview image"/>
</a>
</div>
</span>
<span py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
<div py:for="img in results[0].curved_path_linearity.images" class="preview">
<a href="${img[1]}">
<img src="${img[0]}" alt="Preview image"/>
</a>
</div>
</span>
<span py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
<div py:for="img in results[0].reported_pos_proximity_to_robot_pos.images" class="preview">
<a href="${img[1]}">
<img src="${img[0]}" alt="Preview image"/>
</a>
</div>
</span>
<h2>Path Accuracy Analysis</h2>
<div py:if="'swipe_accuracy' in results[0]">
<div class="dtable no_print">
<div class="dtable_row subplot_selector">
<div class="dtable_header narrow_cell">Toggle:
</div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
</div>
</div>
<div class="dtable subplot_table">
<div class="dtable_header_row">
<div class="dtable_header">Path ID
</div><div class="dtable_header">Max input error
</div><div class="dtable_header">Pass/Fail
</div><div class="dtable_header no_print">Detailed plot</div>
</div>
<div py:for="id, path in results[0].swipe_accuracy.paths.items()" class="dtable_row plot_header">
<div class="dtable_cell">${id}
</div>
<div class="dtable_cell"> ${"%s mm" % path.max_input_error if path.max_input_error is not None else "N/A"}
</div>
<div class="dtable_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
</div>
<div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
</div>
<div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
<div class="plot" onclick="location.href='${path.images[3]}';" style="cursor: pointer" data-src="${path.images[2]}"/>
<div class="plot" onclick="location.href='${path.images[5]}';" style="cursor: pointer" data-src="${path.images[4]}"/>
</div>
</div>
</div>
<h2>Path Accuracy Analysis</h2>
<div py:if="'path_accuracy' in results[0]">
<div class="dtable no_print">
<div class="dtable_row subplot_selector">
<div class="dtable_header narrow_cell">Toggle:
</div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
</div>
</div>
<div class="dtable subplot_table">
<div class="dtable_header_row">
<div class="dtable_header">Path ID
</div><div class="dtable_header">Max input error
</div><div class="dtable_header">Pass/Fail
</div><div class="dtable_header no_print">Detailed plot</div>
</div>
<div py:for="id, path in results[0].path_accuracy.paths.items()" class="dtable_row plot_header">
<div class="dtable_cell">${id}
</div>
<div class="dtable_cell"> ${"%s mm" % path.max_input_error if path.max_input_error is not None else "N/A"}
</div>
<div class="dtable_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
</div>
<div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
</div>
<div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
<div class="plot" onclick="location.href='${path.images[3]}';" style="cursor: pointer" data-src="${path.images[2]}"/>
<div class="plot" onclick="location.href='${path.images[5]}';" style="cursor: pointer" data-src="${path.images[4]}"/>
</div>
</div>
</div>
<br />
<h2>Path Length Analysis</h2>
<div py:if="'path_length_comparison' in results[0]">
<div class="dtable no_print">
<div class="dtable_row subplot_selector">
<div class="dtable_header narrow_cell">Toggle:
</div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
</div>
</div>
<div class="dtable subplot_table">
<div class="dtable_header_row">
<div class="dtable_header narrow_cell">Path ID
</div><div class="dtable_header">Length error
</div><div class="dtable_header">Length error (%)
</div><div class="dtable_header narrow_cell">Pass/Fail
</div><div class="dtable_header no_print">Detailed plot</div>
</div>
<div py:for="id, path in results[0].path_length_comparison.paths.items()" class="dtable_row plot_header">
<div class="dtable_cell narrow_cell">${id}
</div>
<div class="dtable_cell"> ${"%s mm" % path.error if path.error is not None else "N/A"}
</div>
<div class="dtable_cell"> ${"%s " % path.percentage_error if path.percentage_error is not None else "N/A"} %
</div>
<div class="dtable_cell narrow_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
</div>
<div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
</div>
<div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
</div>
</div>
</div>
<br />
<h2>Curved Path Linearity Analysis</h2>
<div py:if="'curved_path_linearity' in results[0] and results[0].curved_path_linearity is not None">
<div class="dtable no_print">
<div class="dtable_row subplot_selector">
<div class="dtable_header narrow_cell">Toggle:
</div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
</div>
</div>
<div class="dtable subplot_table">
<div class="dtable_header_row">
<div class="dtable_header narrow_cell">Path ID
</div><div class="dtable_header">Max input error
</div>
<span py:if="results[0].device_level == False">
<div class="dtable_header">Median latency</div>
</span>
<div class="dtable_header narrow_cell">Pass/Fail
</div><div class="dtable_header no_print">Detailed plot</div>
</div>
<div py:for="id, path in results[0].curved_path_linearity.paths.items()" class="dtable_row plot_header">
<div class="dtable_cell narrow_cell">${id}
</div>
<div class="dtable_cell"> ${"%s mm" % path.max_input_error if path.max_input_error is not None else "N/A"}
</div>
<span py:if="results[0].device_level == False">
<div class="dtable_cell"> ${path.median_latency} ms</div>
</span>
<div class="dtable_cell narrow_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
</div>
<div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
</div>
<div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
<div class="plot" onclick="location.href='${path.images[3]}';" style="cursor: pointer" data-src="${path.images[2]}"/>
</div>
</div>
</div>
<br />
<h2>Proximity of Reported Positions to Robot Position</h2>
<div py:if="'reported_pos_proximity_to_robot_pos' in results[0] and results[0].reported_pos_proximity_to_robot_pos is not None">
<div class="dtable no_print">
<div class="dtable_row subplot_selector">
<div class="dtable_header narrow_cell">Toggle:
</div><div class="dtable_header narrow_cell subplot_button"><button class="all_lines_button">All</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="failed_lines_button">Failed</button>
</div><div class="dtable_header narrow_cell subplot_button"><button class="passed_lines_button">Passed</button></div>
</div>
</div>
<div class="dtable subplot_table">
<div class="dtable_header_row">
<div class="dtable_header narrow_cell">Path ID
</div><div class="dtable_header">Max offset error
</div>
<span py:if="results[0].device_level == False">
<div class="dtable_header">Median latency</div>
</span>
<div class="dtable_header narrow_cell">Pass/Fail
</div><div class="dtable_header no_print">Detailed plot</div>
</div>
<div py:for="id, path in results[0].reported_pos_proximity_to_robot_pos.paths.items()" class="dtable_row plot_header">
<div class="dtable_cell narrow_cell">${id}
</div>
<div class="dtable_cell"> ${"%s mm" % path.max_input_error if path.max_input_error is not None else "N/A"}
</div>
<span py:if="results[0].device_level == False">
<div class="dtable_cell"> ${path.median_latency} ms</div>
</span>
<div class="dtable_cell narrow_cell ${'passed' if path.verdict else 'failed'}"> ${'Pass' if path.verdict else 'Fail'}
</div>
<div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button>
</div>
<div class="plot" onclick="location.href='${path.images[1]}';" style="cursor: pointer" data-src="${path.images[0]}"/>
</div>
</div>
</div>
<br />
<br />
</div>
<div class='row'><hr style="width: 100%; color: black; height: 4px; background-color:black;" /></div>
</div>