blob: af7add25c6799612b288ae32a4c243908681fc3e [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.44.1 (20201121.0304)
-->
<!-- Pages: 1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1533pt" height="1204pt" viewBox="0.00 0.00 1532.79 1204.00"><script>
(function() {
var enablePanZoom = false;
var enablePanZoomControls = false;
var panZoomScriptUrl = "https://graphviz.corp.google.com/svg-pan-zoom.js";
var isEmbedded = true;
try {
// This condition is true when the SVG is being displayed in a
// top-level browser window. If the parent location's href is
// different, or we can't access it (due to security constraints
// on accessing javascript properties on a different domain),
// then the document is embedded.
if (window.location.href == window.parent.location.href) {
isEmbedded = false;
}
} catch (e) {}
if (!isEmbedded) enablePanZoom = true;
if (enablePanZoom &amp;&amp; typeof svgPanZoom === 'undefined') {
var panZoomScript =
document.createElementNS('http://www.w3.org/2000/svg', 'script');
panZoomScript.setAttributeNS(
'http://www.w3.org/1999/xlink', 'xlink:href', panZoomScriptUrl);
document.currentScript.parentElement.appendChild(panZoomScript);
}
window.onload = function() {
var svg = document.getElementsByTagName("svg")[0];
if (!isEmbedded) {
svg.removeAttribute("width");
svg.removeAttribute("height");
}
if (enablePanZoom) {
svgPanZoom(svg, {
minZoom: 0.2,
maxZoom: 100,
controlIconsEnabled: enablePanZoomControls
});
}
var links = document.getElementsByTagName("a");
for (var i = 0; i &lt; links.length; i++) {
if (!links[i].getAttribute("target")) {
links[i].setAttribute("target", "_top");
}
}
};
})();
</script>
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1200)">
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1200 1528.79,-1200 1528.79,4 -4,4"/>
<text text-anchor="middle" x="762.4" y="-1180.8" font-family="Times,serif" font-size="14.00">TWO-FINGER TAP RECOGNIZER</text>
<g id="clust1" class="cluster">
<title>cluster_initial_contender</title>
<polygon fill="none" stroke="black" points="296.79,-961 296.79,-1165 1021.79,-1165 1021.79,-961 296.79,-961"/>
<text text-anchor="middle" x="659.29" y="-1149.8" font-family="Times,serif" font-size="14.00">InitialContender</text>
<text text-anchor="middle" x="659.29" y="-1134.8" font-family="Times,serif" font-size="14.00">`impl Contender`</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_matched_contender</title>
<polygon fill="none" stroke="black" points="142.79,-8 142.79,-209 1219.79,-209 1219.79,-8 142.79,-8"/>
<text text-anchor="middle" x="681.29" y="-193.8" font-family="Times,serif" font-size="14.00">MatchedContender</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_two_fingers_down_contender</title>
<polygon fill="none" stroke="black" points="286.79,-217 286.79,-570 1467.29,-570 1467.29,-217 286.79,-217"/>
<text text-anchor="middle" x="877.04" y="-554.8" font-family="Times,serif" font-size="14.00">TwoFingersDownContender</text>
<text text-anchor="middle" x="877.04" y="-539.8" font-family="Times,serif" font-size="14.00">`impl Contender`</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_one_finger_down_contender</title>
<polygon fill="none" stroke="black" points="286.79,-578 286.79,-953 1516.79,-953 1516.79,-578 286.79,-578"/>
<text text-anchor="middle" x="901.79" y="-937.8" font-family="Times,serif" font-size="14.00">OneFingerDownContender</text>
<text text-anchor="middle" x="901.79" y="-922.8" font-family="Times,serif" font-size="14.00">`impl Contender`</text>
</g>
<!-- arena -->
<g id="node1" class="node">
<title>arena</title>
<ellipse fill="none" stroke="black" cx="33.9" cy="-466" rx="29.81" ry="29.81"/>
<ellipse fill="none" stroke="black" cx="33.9" cy="-466" rx="33.8" ry="33.8"/>
<text text-anchor="middle" x="33.9" y="-462.3" font-family="Times,serif" font-size="14.00">arena</text>
</g>
<!-- examine_at_initial_contender -->
<g id="node2" class="node">
<title>examine_at_initial_contender</title>
<polygon fill="none" stroke="black" points="367.79,-1064 304.79,-1026 367.79,-988 430.79,-1026 367.79,-1064"/>
<text text-anchor="middle" x="367.79" y="-1029.8" font-family="Times,serif" font-size="14.00">button</text>
<text text-anchor="middle" x="367.79" y="-1014.8" font-family="Times,serif" font-size="14.00">pressed?</text>
</g>
<!-- arena&#45;&gt;examine_at_initial_contender -->
<g id="edge1" class="edge">
<title>arena-&gt;examine_at_initial_contender</title>
<path fill="none" stroke="black" d="M37.95,-499.9C47.57,-599.63 80.43,-889.26 142.79,-957 182.38,-999.99 248.04,-1016.46 298.07,-1022.64"/>
<polygon fill="black" stroke="black" points="297.84,-1026.13 308.17,-1023.77 298.62,-1019.18 297.84,-1026.13"/>
<text text-anchor="middle" x="109.29" y="-956.8" font-family="Times,serif" font-size="14.00">examine</text>
<text text-anchor="middle" x="109.29" y="-941.8" font-family="Times,serif" font-size="14.00">event()</text>
</g>
<!-- examine_at_one_finger_down_contender -->
<g id="node7" class="node">
<title>examine_at_one_finger_down_contender</title>
<polygon fill="none" stroke="black" points="367.79,-877 294.79,-824 367.79,-771 440.79,-824 367.79,-877"/>
<text text-anchor="middle" x="367.79" y="-835.3" font-family="Times,serif" font-size="14.00">elapsed</text>
<text text-anchor="middle" x="367.79" y="-820.3" font-family="Times,serif" font-size="14.00">&lt;</text>
<text text-anchor="middle" x="367.79" y="-805.3" font-family="Times,serif" font-size="14.00">threshold?</text>
</g>
<!-- arena&#45;&gt;examine_at_one_finger_down_contender -->
<g id="edge7" class="edge">
<title>arena-&gt;examine_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M57.71,-490.61C114.37,-551.73 261.9,-710.85 330.6,-784.96"/>
<polygon fill="black" stroke="black" points="328.43,-787.76 337.79,-792.72 333.56,-783 328.43,-787.76"/>
<text text-anchor="middle" x="109.29" y="-580.8" font-family="Times,serif" font-size="14.00">examine</text>
<text text-anchor="middle" x="109.29" y="-565.8" font-family="Times,serif" font-size="14.00">event()</text>
</g>
<!-- examine_at_two_fingers_down_contender -->
<g id="node15" class="node">
<title>examine_at_two_fingers_down_contender</title>
<polygon fill="none" stroke="black" points="367.79,-519 294.79,-466 367.79,-413 440.79,-466 367.79,-519"/>
<text text-anchor="middle" x="367.79" y="-477.3" font-family="Times,serif" font-size="14.00">elapsed</text>
<text text-anchor="middle" x="367.79" y="-462.3" font-family="Times,serif" font-size="14.00">&lt;</text>
<text text-anchor="middle" x="367.79" y="-447.3" font-family="Times,serif" font-size="14.00">threshold?</text>
</g>
<!-- arena&#45;&gt;examine_at_two_fingers_down_contender -->
<g id="edge19" class="edge">
<title>arena-&gt;examine_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M67.93,-466C118.02,-466 214.73,-466 284.59,-466"/>
<polygon fill="black" stroke="black" points="284.7,-469.5 294.7,-466 284.7,-462.5 284.7,-469.5"/>
<text text-anchor="middle" x="109.29" y="-484.8" font-family="Times,serif" font-size="14.00">examine</text>
<text text-anchor="middle" x="109.29" y="-469.8" font-family="Times,serif" font-size="14.00">event()</text>
</g>
<!-- verify_at_matched_contender -->
<g id="node22" class="node">
<title>verify_at_matched_contender</title>
<polygon fill="none" stroke="black" points="367.79,-178 294.79,-125 367.79,-72 440.79,-125 367.79,-178"/>
<text text-anchor="middle" x="367.79" y="-136.3" font-family="Times,serif" font-size="14.00">elapsed</text>
<text text-anchor="middle" x="367.79" y="-121.3" font-family="Times,serif" font-size="14.00">&lt;</text>
<text text-anchor="middle" x="367.79" y="-106.3" font-family="Times,serif" font-size="14.00">threshold?</text>
</g>
<!-- arena&#45;&gt;verify_at_matched_contender -->
<g id="edge29" class="edge">
<title>arena-&gt;verify_at_matched_contender</title>
<path fill="none" stroke="black" d="M47.82,-434.82C75.54,-368.1 138.53,-217.14 142.79,-213 185.27,-171.73 249.37,-149.19 298.14,-137.28"/>
<polygon fill="black" stroke="black" points="299.05,-140.66 307.99,-134.97 297.45,-133.85 299.05,-140.66"/>
<text text-anchor="middle" x="109.29" y="-359.8" font-family="Times,serif" font-size="14.00">verify</text>
<text text-anchor="middle" x="109.29" y="-344.8" font-family="Times,serif" font-size="14.00">event()</text>
</g>
<!-- send_click_matched_contender -->
<g id="node27" class="node">
<title>send_click_matched_contender</title>
<polygon fill="none" stroke="black" points="584.79,-54 150.79,-54 150.79,-16 584.79,-16 584.79,-54"/>
<text text-anchor="middle" x="367.79" y="-38.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="367.79" y="-23.8" font-family="Times,serif" font-size="14.00">vec![Secondary Button Down, Secondary Button Up], None, TwoFingerTap</text>
</g>
<!-- arena&#45;&gt;send_click_matched_contender -->
<g id="edge36" class="edge">
<title>arena-&gt;send_click_matched_contender</title>
<path fill="none" stroke="black" d="M38.6,-432.23C49.1,-343.45 82.32,-107.29 142.79,-63 144.45,-61.78 146.14,-60.61 147.85,-59.47"/>
<polygon fill="black" stroke="black" points="149.93,-62.3 156.6,-54.07 146.25,-56.34 149.93,-62.3"/>
<text text-anchor="middle" x="109.29" y="-207.8" font-family="Times,serif" font-size="14.00">process</text>
<text text-anchor="middle" x="109.29" y="-192.8" font-family="Times,serif" font-size="14.00">buffered</text>
<text text-anchor="middle" x="109.29" y="-177.8" font-family="Times,serif" font-size="14.00">events()</text>
</g>
<!-- examine2_at_initial_contender -->
<g id="node3" class="node">
<title>examine2_at_initial_contender</title>
<polygon fill="none" stroke="black" points="702.79,-1064 642.79,-1026 702.79,-988 762.79,-1026 702.79,-1064"/>
<text text-anchor="middle" x="702.79" y="-1029.8" font-family="Times,serif" font-size="14.00">num</text>
<text text-anchor="middle" x="702.79" y="-1014.8" font-family="Times,serif" font-size="14.00">fingers?</text>
</g>
<!-- examine_at_initial_contender&#45;&gt;examine2_at_initial_contender -->
<g id="edge2" class="edge">
<title>examine_at_initial_contender-&gt;examine2_at_initial_contender</title>
<path fill="none" stroke="black" d="M431.04,-1026C488.34,-1026 573.21,-1026 632.61,-1026"/>
<polygon fill="black" stroke="black" points="632.65,-1029.5 642.65,-1026 632.65,-1022.5 632.65,-1029.5"/>
<text text-anchor="middle" x="612.29" y="-1029.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- return_mismatch_at_initial_contender -->
<g id="node4" class="node">
<title>return_mismatch_at_initial_contender</title>
<polygon fill="none" stroke="black" points="964.29,-1119 892.29,-1119 892.29,-1081 964.29,-1081 964.29,-1119"/>
<text text-anchor="middle" x="928.29" y="-1103.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="928.29" y="-1088.8" font-family="Times,serif" font-size="14.00">Mismatch</text>
</g>
<!-- examine_at_initial_contender&#45;&gt;return_mismatch_at_initial_contender -->
<g id="edge3" class="edge">
<title>examine_at_initial_contender-&gt;return_mismatch_at_initial_contender</title>
<path fill="none" stroke="black" d="M415.62,-1035.27C469.51,-1045.66 560.75,-1062.45 639.79,-1073 725.17,-1084.39 825.44,-1092.66 882.16,-1096.86"/>
<polygon fill="black" stroke="black" points="882,-1100.35 892.23,-1097.59 882.51,-1093.37 882,-1100.35"/>
<text text-anchor="middle" x="702.79" y="-1089.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- examine2_at_initial_contender&#45;&gt;return_mismatch_at_initial_contender -->
<g id="edge4" class="edge">
<title>examine2_at_initial_contender-&gt;return_mismatch_at_initial_contender</title>
<path fill="none" stroke="black" d="M742.43,-1039.12C755.55,-1043.55 770.3,-1048.51 783.79,-1053 816.84,-1063.99 854.23,-1076.23 882.56,-1085.46"/>
<polygon fill="black" stroke="black" points="881.58,-1088.83 892.18,-1088.6 883.75,-1082.17 881.58,-1088.83"/>
<text text-anchor="middle" x="804.29" y="-1069.8" font-family="Times,serif" font-size="14.00">0 or &gt;2</text>
</g>
<!-- return_one_finger_down_contender_at_initial_contender -->
<g id="node5" class="node">
<title>return_one_finger_down_contender_at_initial_contender</title>
<polygon fill="none" stroke="black" points="1010.29,-1007 846.29,-1007 846.29,-969 1010.29,-969 1010.29,-1007"/>
<text text-anchor="middle" x="928.29" y="-991.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="928.29" y="-976.8" font-family="Times,serif" font-size="14.00">OneFingerDownContender</text>
</g>
<!-- examine2_at_initial_contender&#45;&gt;return_one_finger_down_contender_at_initial_contender -->
<g id="edge5" class="edge">
<title>examine2_at_initial_contender-&gt;return_one_finger_down_contender_at_initial_contender</title>
<path fill="none" stroke="black" d="M750.38,-1018.08C775.2,-1013.86 806.63,-1008.52 836.08,-1003.51"/>
<polygon fill="black" stroke="black" points="836.71,-1006.95 845.98,-1001.83 835.53,-1000.05 836.71,-1006.95"/>
<text text-anchor="middle" x="804.29" y="-1014.8" font-family="Times,serif" font-size="14.00">1</text>
</g>
<!-- return_two_fingers_down_contender_at_initial_contender -->
<g id="node6" class="node">
<title>return_two_fingers_down_contender_at_initial_contender</title>
<polygon fill="none" stroke="black" points="1013.79,-1063 842.79,-1063 842.79,-1025 1013.79,-1025 1013.79,-1063"/>
<text text-anchor="middle" x="928.29" y="-1047.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="928.29" y="-1032.8" font-family="Times,serif" font-size="14.00">TwoFingersDownContender</text>
</g>
<!-- examine2_at_initial_contender&#45;&gt;return_two_fingers_down_contender_at_initial_contender -->
<g id="edge6" class="edge">
<title>examine2_at_initial_contender-&gt;return_two_fingers_down_contender_at_initial_contender</title>
<path fill="none" stroke="black" d="M756.2,-1030.22C778.86,-1032.05 806.12,-1034.24 832.15,-1036.34"/>
<polygon fill="black" stroke="black" points="832.18,-1039.85 842.43,-1037.17 832.74,-1032.87 832.18,-1039.85"/>
<text text-anchor="middle" x="804.29" y="-1038.8" font-family="Times,serif" font-size="14.00">2</text>
</g>
<!-- examine2_at_one_finger_down_contender -->
<g id="node8" class="node">
<title>examine2_at_one_finger_down_contender</title>
<polygon fill="none" stroke="black" points="702.79,-862 639.79,-824 702.79,-786 765.79,-824 702.79,-862"/>
<text text-anchor="middle" x="702.79" y="-827.8" font-family="Times,serif" font-size="14.00">button</text>
<text text-anchor="middle" x="702.79" y="-812.8" font-family="Times,serif" font-size="14.00">pressed?</text>
</g>
<!-- examine_at_one_finger_down_contender&#45;&gt;examine2_at_one_finger_down_contender -->
<g id="edge8" class="edge">
<title>examine_at_one_finger_down_contender-&gt;examine2_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M441.05,-824C496.87,-824 573.77,-824 629.59,-824"/>
<polygon fill="black" stroke="black" points="629.75,-827.5 639.75,-824 629.75,-820.5 629.75,-827.5"/>
<text text-anchor="middle" x="612.29" y="-827.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- return_mismatch_at_one_finger_down_contender -->
<g id="node9" class="node">
<title>return_mismatch_at_one_finger_down_contender</title>
<polygon fill="none" stroke="black" points="1459.29,-871 1387.29,-871 1387.29,-833 1459.29,-833 1459.29,-871"/>
<text text-anchor="middle" x="1423.29" y="-855.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="1423.29" y="-840.8" font-family="Times,serif" font-size="14.00">Mismatch</text>
</g>
<!-- examine_at_one_finger_down_contender&#45;&gt;return_mismatch_at_one_finger_down_contender -->
<g id="edge9" class="edge">
<title>examine_at_one_finger_down_contender-&gt;return_mismatch_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M424.27,-836.03C478.82,-847.29 564.61,-863.46 639.79,-871 924.15,-899.5 997.6,-889.32 1282.79,-871 1299.26,-869.94 1303.41,-869.94 1319.79,-868 1338.72,-865.76 1359.51,-862.64 1377.4,-859.74"/>
<polygon fill="black" stroke="black" points="1377.98,-863.2 1387.28,-858.12 1376.84,-856.29 1377.98,-863.2"/>
<text text-anchor="middle" x="928.29" y="-891.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- examine2_at_one_finger_down_contender&#45;&gt;return_mismatch_at_one_finger_down_contender -->
<g id="edge10" class="edge">
<title>examine2_at_one_finger_down_contender-&gt;return_mismatch_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M753.83,-831.42C824.02,-841.41 955.79,-858.67 1068.79,-865 1163.76,-870.32 1187.79,-869.42 1282.79,-865 1314.36,-863.53 1349.81,-860.21 1377.07,-857.29"/>
<polygon fill="black" stroke="black" points="1377.54,-860.76 1387.1,-856.19 1376.78,-853.8 1377.54,-860.76"/>
<text text-anchor="middle" x="1041.29" y="-866.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- examine3_at_one_finger_down_contender -->
<g id="node10" class="node">
<title>examine3_at_one_finger_down_contender</title>
<polygon fill="none" stroke="black" points="928.29,-809 846.68,-791 928.29,-773 1009.91,-791 928.29,-809"/>
<text text-anchor="middle" x="928.29" y="-787.3" font-family="Times,serif" font-size="14.00">num fingers?</text>
</g>
<!-- examine2_at_one_finger_down_contender&#45;&gt;examine3_at_one_finger_down_contender -->
<g id="edge11" class="edge">
<title>examine2_at_one_finger_down_contender-&gt;examine3_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M753.67,-816.64C787.63,-811.62 832.72,-804.96 868.44,-799.69"/>
<polygon fill="black" stroke="black" points="869.34,-803.1 878.72,-798.17 868.32,-796.17 869.34,-803.1"/>
<text text-anchor="middle" x="804.29" y="-814.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- examine3_at_one_finger_down_contender&#45;&gt;return_mismatch_at_one_finger_down_contender -->
<g id="edge12" class="edge">
<title>examine3_at_one_finger_down_contender-&gt;return_mismatch_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M964.23,-801.19C992.26,-808.96 1032.73,-819.27 1068.79,-825 1178.43,-842.43 1309.03,-848.7 1376.65,-850.89"/>
<polygon fill="black" stroke="black" points="1376.85,-854.39 1386.95,-851.2 1377.06,-847.4 1376.85,-854.39"/>
<text text-anchor="middle" x="1175.79" y="-849.8" font-family="Times,serif" font-size="14.00">0 or &gt; 2</text>
</g>
<!-- examine4_at_one_finger_down_contender -->
<g id="node11" class="node">
<title>examine4_at_one_finger_down_contender</title>
<polygon fill="none" stroke="black" points="1175.79,-692 1086.79,-639 1175.79,-586 1264.79,-639 1175.79,-692"/>
<text text-anchor="middle" x="1175.79" y="-650.3" font-family="Times,serif" font-size="14.00">displacement</text>
<text text-anchor="middle" x="1175.79" y="-635.3" font-family="Times,serif" font-size="14.00">&lt;</text>
<text text-anchor="middle" x="1175.79" y="-620.3" font-family="Times,serif" font-size="14.00">threshold?</text>
</g>
<!-- examine3_at_one_finger_down_contender&#45;&gt;examine4_at_one_finger_down_contender -->
<g id="edge13" class="edge">
<title>examine3_at_one_finger_down_contender-&gt;examine4_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M949.45,-777.6C976.41,-759.77 1025.82,-727.41 1068.79,-701 1085.5,-690.73 1103.88,-679.84 1120.58,-670.1"/>
<polygon fill="black" stroke="black" points="1122.78,-672.87 1129.66,-664.82 1119.26,-666.82 1122.78,-672.87"/>
<text text-anchor="middle" x="1041.29" y="-725.8" font-family="Times,serif" font-size="14.00">1</text>
</g>
<!-- examine5_at_one_finger_down_contender -->
<g id="node12" class="node">
<title>examine5_at_one_finger_down_contender</title>
<polygon fill="none" stroke="black" points="1175.79,-816 1086.79,-763 1175.79,-710 1264.79,-763 1175.79,-816"/>
<text text-anchor="middle" x="1175.79" y="-774.3" font-family="Times,serif" font-size="14.00">displacement</text>
<text text-anchor="middle" x="1175.79" y="-759.3" font-family="Times,serif" font-size="14.00">&lt;</text>
<text text-anchor="middle" x="1175.79" y="-744.3" font-family="Times,serif" font-size="14.00">threshold?</text>
</g>
<!-- examine3_at_one_finger_down_contender&#45;&gt;examine5_at_one_finger_down_contender -->
<g id="edge14" class="edge">
<title>examine3_at_one_finger_down_contender-&gt;examine5_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M982.56,-784.92C1014.15,-781.32 1054.88,-776.68 1090.71,-772.59"/>
<polygon fill="black" stroke="black" points="1091.14,-776.06 1100.68,-771.45 1090.34,-769.11 1091.14,-776.06"/>
<text text-anchor="middle" x="1041.29" y="-781.8" font-family="Times,serif" font-size="14.00">2</text>
</g>
<!-- examine4_at_one_finger_down_contender&#45;&gt;return_mismatch_at_one_finger_down_contender -->
<g id="edge15" class="edge">
<title>examine4_at_one_finger_down_contender-&gt;return_mismatch_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M1225.18,-662.87C1244.08,-673.29 1265.35,-686.46 1282.79,-701 1302.16,-717.14 1306.87,-722.35 1319.79,-744 1331.26,-763.21 1324.16,-773.27 1337.79,-791 1348.77,-805.27 1363.97,-817.66 1378.46,-827.47"/>
<polygon fill="black" stroke="black" points="1376.58,-830.43 1386.87,-832.95 1380.4,-824.56 1376.58,-830.43"/>
<text text-anchor="middle" x="1310.29" y="-747.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- return_self_at_one_finger_down_contender -->
<g id="node13" class="node">
<title>return_self_at_one_finger_down_contender</title>
<polygon fill="none" stroke="black" points="1450.29,-658 1396.29,-658 1396.29,-620 1450.29,-620 1450.29,-658"/>
<text text-anchor="middle" x="1423.29" y="-642.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="1423.29" y="-627.8" font-family="Times,serif" font-size="14.00">`self`</text>
</g>
<!-- examine4_at_one_finger_down_contender&#45;&gt;return_self_at_one_finger_down_contender -->
<g id="edge16" class="edge">
<title>examine4_at_one_finger_down_contender-&gt;return_self_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M1265.08,-639C1306.82,-639 1354.35,-639 1386.12,-639"/>
<polygon fill="black" stroke="black" points="1386.26,-642.5 1396.26,-639 1386.26,-635.5 1386.26,-642.5"/>
<text text-anchor="middle" x="1310.29" y="-642.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- examine5_at_one_finger_down_contender&#45;&gt;return_mismatch_at_one_finger_down_contender -->
<g id="edge17" class="edge">
<title>examine5_at_one_finger_down_contender-&gt;return_mismatch_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M1231.58,-782.86C1275.54,-798.8 1336.48,-820.89 1377.54,-835.78"/>
<polygon fill="black" stroke="black" points="1376.42,-839.09 1387.01,-839.21 1378.81,-832.51 1376.42,-839.09"/>
<text text-anchor="middle" x="1310.29" y="-815.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- return_two_fingers_down_contender_at_one_finger_down_contender -->
<g id="node14" class="node">
<title>return_two_fingers_down_contender_at_one_finger_down_contender</title>
<polygon fill="none" stroke="black" points="1508.79,-782 1337.79,-782 1337.79,-744 1508.79,-744 1508.79,-782"/>
<text text-anchor="middle" x="1423.29" y="-766.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="1423.29" y="-751.8" font-family="Times,serif" font-size="14.00">TwoFingersDownContender</text>
</g>
<!-- examine5_at_one_finger_down_contender&#45;&gt;return_two_fingers_down_contender_at_one_finger_down_contender -->
<g id="edge18" class="edge">
<title>examine5_at_one_finger_down_contender-&gt;return_two_fingers_down_contender_at_one_finger_down_contender</title>
<path fill="none" stroke="black" d="M1265.08,-763C1285.4,-763 1307.09,-763 1327.66,-763"/>
<polygon fill="black" stroke="black" points="1327.67,-766.5 1337.67,-763 1327.67,-759.5 1327.67,-766.5"/>
<text text-anchor="middle" x="1310.29" y="-766.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- examine2_at_two_fingers_down_contender -->
<g id="node16" class="node">
<title>examine2_at_two_fingers_down_contender</title>
<polygon fill="none" stroke="black" points="702.79,-490 639.79,-452 702.79,-414 765.79,-452 702.79,-490"/>
<text text-anchor="middle" x="702.79" y="-455.8" font-family="Times,serif" font-size="14.00">button</text>
<text text-anchor="middle" x="702.79" y="-440.8" font-family="Times,serif" font-size="14.00">pressed?</text>
</g>
<!-- examine_at_two_fingers_down_contender&#45;&gt;examine2_at_two_fingers_down_contender -->
<g id="edge20" class="edge">
<title>examine_at_two_fingers_down_contender-&gt;examine2_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M436.99,-463.13C494.43,-460.72 576.19,-457.28 633.62,-454.87"/>
<polygon fill="black" stroke="black" points="633.85,-458.36 643.7,-454.44 633.56,-451.37 633.85,-458.36"/>
<text text-anchor="middle" x="612.29" y="-459.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- return_mismatch_at_two_fingers_down_contender -->
<g id="node17" class="node">
<title>return_mismatch_at_two_fingers_down_contender</title>
<polygon fill="none" stroke="black" points="1459.29,-505 1387.29,-505 1387.29,-467 1459.29,-467 1459.29,-505"/>
<text text-anchor="middle" x="1423.29" y="-489.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="1423.29" y="-474.8" font-family="Times,serif" font-size="14.00">Mismatch</text>
</g>
<!-- examine_at_two_fingers_down_contender&#45;&gt;return_mismatch_at_two_fingers_down_contender -->
<g id="edge21" class="edge">
<title>examine_at_two_fingers_down_contender-&gt;return_mismatch_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M428.36,-475.09C483.16,-483.02 566.74,-494.01 639.79,-499 919.41,-518.11 1256.46,-497.98 1376.84,-489.44"/>
<polygon fill="black" stroke="black" points="1377.42,-492.91 1387.14,-488.7 1376.92,-485.93 1377.42,-492.91"/>
<text text-anchor="middle" x="928.29" y="-509.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- examine2_at_two_fingers_down_contender&#45;&gt;return_mismatch_at_two_fingers_down_contender -->
<g id="edge22" class="edge">
<title>examine2_at_two_fingers_down_contender-&gt;return_mismatch_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M755.06,-458.66C825.57,-467.46 956.54,-482.48 1068.79,-488 1163.79,-492.67 1187.69,-488.68 1282.79,-488 1314.26,-487.77 1349.71,-487.26 1377,-486.81"/>
<polygon fill="black" stroke="black" points="1377.1,-490.31 1387.04,-486.65 1376.98,-483.31 1377.1,-490.31"/>
<text text-anchor="middle" x="1041.29" y="-489.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- examine3_at_two_fingers_down_contender -->
<g id="node18" class="node">
<title>examine3_at_two_fingers_down_contender</title>
<polygon fill="none" stroke="black" points="928.29,-439 846.68,-421 928.29,-403 1009.91,-421 928.29,-439"/>
<text text-anchor="middle" x="928.29" y="-417.3" font-family="Times,serif" font-size="14.00">num fingers?</text>
</g>
<!-- examine2_at_two_fingers_down_contender&#45;&gt;examine3_at_two_fingers_down_contender -->
<g id="edge23" class="edge">
<title>examine2_at_two_fingers_down_contender-&gt;examine3_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M754.23,-445C787.74,-440.36 831.91,-434.23 867.24,-429.33"/>
<polygon fill="black" stroke="black" points="868,-432.76 877.43,-427.92 867.04,-425.82 868,-432.76"/>
<text text-anchor="middle" x="804.29" y="-443.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- examine3_at_two_fingers_down_contender&#45;&gt;return_mismatch_at_two_fingers_down_contender -->
<g id="edge24" class="edge">
<title>examine3_at_two_fingers_down_contender-&gt;return_mismatch_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M976.39,-428.4C1003.41,-432.56 1037.98,-437.76 1068.79,-442 1179.29,-457.19 1309.55,-472.82 1376.88,-480.72"/>
<polygon fill="black" stroke="black" points="1376.79,-484.24 1387.13,-481.93 1377.61,-477.29 1376.79,-484.24"/>
<text text-anchor="middle" x="1175.79" y="-472.8" font-family="Times,serif" font-size="14.00">1 or &gt; 2</text>
</g>
<!-- examine4_at_two_fingers_down_contender -->
<g id="node19" class="node">
<title>examine4_at_two_fingers_down_contender</title>
<polygon fill="none" stroke="black" points="1175.79,-361 1068.79,-293 1175.79,-225 1282.79,-293 1175.79,-361"/>
<text text-anchor="middle" x="1175.79" y="-311.8" font-family="Times,serif" font-size="14.00">displacement</text>
<text text-anchor="middle" x="1175.79" y="-296.8" font-family="Times,serif" font-size="14.00">&lt;</text>
<text text-anchor="middle" x="1175.79" y="-281.8" font-family="Times,serif" font-size="14.00">threshold</text>
<text text-anchor="middle" x="1175.79" y="-266.8" font-family="Times,serif" font-size="14.00">for both fingers?</text>
</g>
<!-- examine3_at_two_fingers_down_contender&#45;&gt;examine4_at_two_fingers_down_contender -->
<g id="edge25" class="edge">
<title>examine3_at_two_fingers_down_contender-&gt;examine4_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M953.28,-408.49C988.68,-390.04 1056.24,-354.81 1107.49,-328.09"/>
<polygon fill="black" stroke="black" points="1109.28,-331.1 1116.53,-323.38 1106.05,-324.9 1109.28,-331.1"/>
<text text-anchor="middle" x="1041.29" y="-367.8" font-family="Times,serif" font-size="14.00">2</text>
</g>
<!-- return_matched_contender_at_two_fingers_down_contender -->
<g id="node20" class="node">
<title>return_matched_contender_at_two_fingers_down_contender</title>
<polygon fill="none" stroke="black" points="1212.29,-432.5 1139.29,-432.5 1139.29,-379.5 1212.29,-379.5 1212.29,-432.5"/>
<text text-anchor="middle" x="1175.79" y="-417.3" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="1175.79" y="-402.3" font-family="Times,serif" font-size="14.00">Matched</text>
<text text-anchor="middle" x="1175.79" y="-387.3" font-family="Times,serif" font-size="14.00">Contender</text>
</g>
<!-- examine3_at_two_fingers_down_contender&#45;&gt;return_matched_contender_at_two_fingers_down_contender -->
<g id="edge26" class="edge">
<title>examine3_at_two_fingers_down_contender-&gt;return_matched_contender_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M992.52,-417.14C1035.11,-414.53 1090.32,-411.16 1128.77,-408.81"/>
<polygon fill="black" stroke="black" points="1129.38,-412.28 1139.15,-408.18 1128.95,-405.29 1129.38,-412.28"/>
<text text-anchor="middle" x="1041.29" y="-417.8" font-family="Times,serif" font-size="14.00">0</text>
</g>
<!-- examine4_at_two_fingers_down_contender&#45;&gt;return_mismatch_at_two_fingers_down_contender -->
<g id="edge27" class="edge">
<title>examine4_at_two_fingers_down_contender-&gt;return_mismatch_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M1226.56,-328.75C1244.45,-341.83 1264.68,-356.89 1282.79,-371 1321.1,-400.85 1364.06,-436.63 1392.06,-460.26"/>
<polygon fill="black" stroke="black" points="1390,-463.1 1399.89,-466.89 1394.52,-457.76 1390,-463.1"/>
<text text-anchor="middle" x="1310.29" y="-401.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- return_self_at_two_fingers_down_contender -->
<g id="node21" class="node">
<title>return_self_at_two_fingers_down_contender</title>
<polygon fill="none" stroke="black" points="1450.29,-312 1396.29,-312 1396.29,-274 1450.29,-274 1450.29,-312"/>
<text text-anchor="middle" x="1423.29" y="-296.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="1423.29" y="-281.8" font-family="Times,serif" font-size="14.00">`self`</text>
</g>
<!-- examine4_at_two_fingers_down_contender&#45;&gt;return_self_at_two_fingers_down_contender -->
<g id="edge28" class="edge">
<title>examine4_at_two_fingers_down_contender-&gt;return_self_at_two_fingers_down_contender</title>
<path fill="none" stroke="black" d="M1283.05,-293C1319.88,-293 1358.74,-293 1386.02,-293"/>
<polygon fill="black" stroke="black" points="1386.24,-296.5 1396.24,-293 1386.24,-289.5 1386.24,-296.5"/>
<text text-anchor="middle" x="1310.29" y="-296.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- return_mismatch_at_matched_contender -->
<g id="node23" class="node">
<title>return_mismatch_at_matched_contender</title>
<polygon fill="none" stroke="black" points="1211.79,-88 1139.79,-88 1139.79,-50 1211.79,-50 1211.79,-88"/>
<text text-anchor="middle" x="1175.79" y="-72.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="1175.79" y="-57.8" font-family="Times,serif" font-size="14.00">Mismatch</text>
</g>
<!-- verify_at_matched_contender&#45;&gt;return_mismatch_at_matched_contender -->
<g id="edge30" class="edge">
<title>verify_at_matched_contender-&gt;return_mismatch_at_matched_contender</title>
<path fill="none" stroke="black" d="M420.19,-109.92C474.28,-94.83 562.19,-72.54 639.79,-63 821.11,-40.71 868.27,-51.65 1050.79,-59 1076.92,-60.05 1106.08,-62.35 1129.55,-64.47"/>
<polygon fill="black" stroke="black" points="1129.28,-67.96 1139.56,-65.4 1129.93,-60.99 1129.28,-67.96"/>
<text text-anchor="middle" x="804.29" y="-53.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- verify2_at_matched_contender -->
<g id="node24" class="node">
<title>verify2_at_matched_contender</title>
<polygon fill="none" stroke="black" points="702.79,-178 642.79,-125 702.79,-72 762.79,-125 702.79,-178"/>
<text text-anchor="middle" x="702.79" y="-136.3" font-family="Times,serif" font-size="14.00">exactly</text>
<text text-anchor="middle" x="702.79" y="-121.3" font-family="Times,serif" font-size="14.00">zero</text>
<text text-anchor="middle" x="702.79" y="-106.3" font-family="Times,serif" font-size="14.00">fingers?</text>
</g>
<!-- verify_at_matched_contender&#45;&gt;verify2_at_matched_contender -->
<g id="edge31" class="edge">
<title>verify_at_matched_contender-&gt;verify2_at_matched_contender</title>
<path fill="none" stroke="black" d="M441.05,-125C497.87,-125 576.51,-125 632.54,-125"/>
<polygon fill="black" stroke="black" points="632.72,-128.5 642.72,-125 632.72,-121.5 632.72,-128.5"/>
<text text-anchor="middle" x="612.29" y="-128.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- verify2_at_matched_contender&#45;&gt;return_mismatch_at_matched_contender -->
<g id="edge32" class="edge">
<title>verify2_at_matched_contender-&gt;return_mismatch_at_matched_contender</title>
<path fill="none" stroke="black" d="M743.71,-107.95C771.05,-97.16 808.44,-84.13 842.79,-78 943.88,-59.96 1064.99,-62.66 1129.35,-65.98"/>
<polygon fill="black" stroke="black" points="1129.38,-69.49 1139.55,-66.54 1129.76,-62.5 1129.38,-69.49"/>
<text text-anchor="middle" x="928.29" y="-81.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
<!-- verify3_at_matched_contender -->
<g id="node25" class="node">
<title>verify3_at_matched_contender</title>
<polygon fill="none" stroke="black" points="928.29,-178 865.29,-140 928.29,-102 991.29,-140 928.29,-178"/>
<text text-anchor="middle" x="928.29" y="-143.8" font-family="Times,serif" font-size="14.00">button</text>
<text text-anchor="middle" x="928.29" y="-128.8" font-family="Times,serif" font-size="14.00">pressed?</text>
</g>
<!-- verify2_at_matched_contender&#45;&gt;verify3_at_matched_contender -->
<g id="edge33" class="edge">
<title>verify2_at_matched_contender-&gt;verify3_at_matched_contender</title>
<path fill="none" stroke="black" d="M758.76,-128.69C789.66,-130.76 828.46,-133.37 861.04,-135.55"/>
<polygon fill="black" stroke="black" points="861.17,-139.07 871.38,-136.25 861.64,-132.09 861.17,-139.07"/>
<text text-anchor="middle" x="804.29" y="-135.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- verify3_at_matched_contender&#45;&gt;return_mismatch_at_matched_contender -->
<g id="edge34" class="edge">
<title>verify3_at_matched_contender-&gt;return_mismatch_at_matched_contender</title>
<path fill="none" stroke="black" d="M971.22,-127.88C1015.27,-115.14 1084.33,-95.16 1129.58,-82.08"/>
<polygon fill="black" stroke="black" points="1130.78,-85.37 1139.42,-79.23 1128.84,-78.65 1130.78,-85.37"/>
<text text-anchor="middle" x="1041.29" y="-111.8" font-family="Times,serif" font-size="14.00">yes</text>
</g>
<!-- return_self_at_matched_contender -->
<g id="node26" class="node">
<title>return_self_at_matched_contender</title>
<polygon fill="none" stroke="black" points="1202.79,-159 1148.79,-159 1148.79,-121 1202.79,-121 1202.79,-159"/>
<text text-anchor="middle" x="1175.79" y="-143.8" font-family="Times,serif" font-size="14.00">return</text>
<text text-anchor="middle" x="1175.79" y="-128.8" font-family="Times,serif" font-size="14.00">`self`</text>
</g>
<!-- verify3_at_matched_contender&#45;&gt;return_self_at_matched_contender -->
<g id="edge35" class="edge">
<title>verify3_at_matched_contender-&gt;return_self_at_matched_contender</title>
<path fill="none" stroke="black" d="M991.56,-140C1037.92,-140 1099.61,-140 1138.27,-140"/>
<polygon fill="black" stroke="black" points="1138.53,-143.5 1148.53,-140 1138.53,-136.5 1138.53,-143.5"/>
<text text-anchor="middle" x="1041.29" y="-143.8" font-family="Times,serif" font-size="14.00">no</text>
</g>
</g>
</svg>