We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Kivy 1.8.0 dev: touch.is_double_tap is set allways to true on Windows
Hello,
On MS Windows with Kivy 1.8.0 dev: If you press a button twice, even after a greater time gap between the touches, you always get touch.is_double_tap == True on the second tap. 

Does not appear with 1.7.1 on Android.

Greetings

Carsten


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `kivy/input/postproc/doubletap.py`
Content:
```
1 '''
2 Double Tap
3 ==========
4 
5 Search touch for a double tap
6 '''
7 
8 __all__ = ('InputPostprocDoubleTap', )
9 
10 from kivy.config import Config
11 from kivy.vector import Vector
12 from kivy.clock import Clock
13 
14 
15 class InputPostprocDoubleTap(object):
16     '''
17     InputPostProcDoubleTap is a post-processor to check if
18     a touch is a double tap or not.
19     Double tap can be configured in the Kivy config file::
20 
21         [postproc]
22         double_tap_time = 250
23         double_tap_distance = 20
24 
25     Distance parameter is in 0-1000, and time is in millisecond.
26     '''
27 
28     def __init__(self):
29         dist = Config.getint('postproc', 'double_tap_distance')
30         self.double_tap_distance = dist / 1000.0
31         time = Config.getint('postproc', 'double_tap_time')
32         self.double_tap_time = time / 1000.0
33         self.touches = {}
34 
35     def find_double_tap(self, ref):
36         '''Find a double tap touch within self.touches.
37         The touch must be not a previous double tap, and the distance
38         must be ok, also, the touch profile must be compared so the kind
39         of touch is the same
40         '''
41         ref_button = None
42         if 'button' in ref.profile:
43             ref_button = ref.button
44 
45         for touchid in self.touches:
46             if ref.uid == touchid:
47                 continue
48             etype, touch = self.touches[touchid]
49             if etype != 'end':
50                 continue
51             if touch.is_double_tap:
52                 continue
53             distance = Vector.distance(
54                 Vector(ref.sx, ref.sy),
55                 Vector(touch.osx, touch.osy))
56             if distance > self.double_tap_distance:
57                 continue
58             if touch.is_mouse_scrolling or ref.is_mouse_scrolling:
59                 continue
60             touch_button = None
61             if 'button' in touch.profile:
62                 touch_button = touch.button
63             if touch_button != ref_button:
64                 continue
65             touch.double_tap_distance = distance
66             return touch
67         return None
68 
69     def process(self, events):
70         if self.double_tap_distance == 0 or self.double_tap_time == 0:
71             return events
72         # first, check if a touch down have a double tap
73         for etype, touch in events:
74             if not touch.is_touch:
75                 continue
76             if etype == 'begin':
77                 double_tap = self.find_double_tap(touch)
78                 if double_tap:
79                     touch.is_double_tap = True
80                     time = touch.time_start - double_tap.time_start
81                     touch.double_tap_time = time
82                     distance = double_tap.double_tap_distance
83                     touch.double_tap_distance = distance
84 
85             # add the touch internaly
86             self.touches[touch.uid] = (etype, touch)
87 
88         # second, check if up-touch is timeout for double tap
89         time_current = Clock.get_time()
90         to_delete = []
91         for touchid in self.touches.keys():
92             etype, touch = self.touches[touchid]
93             if etype != 'end':
94                 continue
95             if time_current - touch.time_start < self.double_tap_time:
96                 continue
97             to_delete.append(touchid)
98 
99         for touchid in to_delete:
100             del self.touches[touchid]
101 
102         return events
103
```

Path: `kivy/input/postproc/tripletap.py`
Content:
```
1 '''
2 Triple Tap
3 ==========
4 
5 .. versionadded:: 1.7.0
6 
7 Search touch for a triple tap
8 '''
9 
10 __all__ = ('InputPostprocTripleTap', )
11 
12 from kivy.config import Config
13 from kivy.vector import Vector
14 from kivy.clock import Clock
15 
16 
17 class InputPostprocTripleTap(object):
18     '''
19     InputPostProcTripleTap is a post-processor to check if
20     a touch is a triple tap or not.
21     Triple tap can be configured in the Kivy config file::
22 
23         [postproc]
24         triple_tap_time = 250
25         triple_tap_distance = 20
26 
27     Distance parameter is in 0-1000, and time is in millisecond.
28     '''
29 
30     def __init__(self):
31         dist = Config.getint('postproc', 'triple_tap_distance')
32         self.triple_tap_distance = dist / 1000.0
33         time = Config.getint('postproc', 'triple_tap_time')
34         self.triple_tap_time = time / 1000.0
35         self.touches = {}
36 
37     def find_triple_tap(self, ref):
38         '''Find a triple tap touch within self.touches.
39         The touch must be not a previous triple tap, and the distance
40         must be ok, also, the touch profile must be compared so the kind
41         of touch is the same
42         '''
43         ref_button = None
44         if 'button' in ref.profile:
45             ref_button = ref.button
46 
47         for touchid in self.touches:
48             if ref.uid == touchid:
49                 continue
50             etype, touch = self.touches[touchid]
51             if not touch.is_double_tap:
52                 continue
53             if etype != 'end':
54                 continue
55             if touch.is_triple_tap:
56                 continue
57             distance = Vector.distance(
58                 Vector(ref.sx, ref.sy),
59                 Vector(touch.osx, touch.osy))
60             if distance > self.triple_tap_distance:
61                 continue
62             if touch.is_mouse_scrolling or ref.is_mouse_scrolling:
63                 continue
64             touch_button = None
65             if 'button' in touch.profile:
66                 touch_button = touch.button
67             if touch_button != ref_button:
68                 continue
69             touch.triple_tap_distance = distance
70             return touch
71         return None
72 
73     def process(self, events):
74         if self.triple_tap_distance == 0 or self.triple_tap_time == 0:
75             return events
76         # first, check if a touch down have a triple tap
77         for etype, touch in events:
78             if not touch.is_touch:
79                 continue
80             if etype == 'begin':
81                 triple_tap = self.find_triple_tap(touch)
82                 if triple_tap:
83                     touch.is_double_tap = False
84                     touch.is_triple_tap = True
85                     time = touch.time_start - triple_tap.time_start
86                     touch.triple_tap_time = time
87                     distance = triple_tap.triple_tap_distance
88                     touch.triple_tap_distance = distance
89 
90             # add the touch internaly
91             self.touches[touch.uid] = (etype, touch)
92 
93         # second, check if up-touch is timeout for triple tap
94         time_current = Clock.get_time()
95         to_delete = []
96         for touchid in self.touches.keys():
97             etype, touch = self.touches[touchid]
98             if etype != 'end':
99                 continue
100             if time_current - touch.time_start < self.triple_tap_time:
101                 continue
102             to_delete.append(touchid)
103 
104         for touchid in to_delete:
105             del self.touches[touchid]
106 
107         return events
108
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/kivy/input/postproc/doubletap.py b/kivy/input/postproc/doubletap.py
--- a/kivy/input/postproc/doubletap.py
+++ b/kivy/input/postproc/doubletap.py
@@ -7,6 +7,7 @@
 
 __all__ = ('InputPostprocDoubleTap', )
 
+from time import time
 from kivy.config import Config
 from kivy.vector import Vector
 from kivy.clock import Clock
@@ -77,8 +78,8 @@
                 double_tap = self.find_double_tap(touch)
                 if double_tap:
                     touch.is_double_tap = True
-                    time = touch.time_start - double_tap.time_start
-                    touch.double_tap_time = time
+                    tap_time = touch.time_start - double_tap.time_start
+                    touch.double_tap_time = tap_time
                     distance = double_tap.double_tap_distance
                     touch.double_tap_distance = distance
 
@@ -86,7 +87,7 @@
             self.touches[touch.uid] = (etype, touch)
 
         # second, check if up-touch is timeout for double tap
-        time_current = Clock.get_time()
+        time_current = time()
         to_delete = []
         for touchid in self.touches.keys():
             etype, touch = self.touches[touchid]
diff --git a/kivy/input/postproc/tripletap.py b/kivy/input/postproc/tripletap.py
--- a/kivy/input/postproc/tripletap.py
+++ b/kivy/input/postproc/tripletap.py
@@ -9,6 +9,7 @@
 
 __all__ = ('InputPostprocTripleTap', )
 
+from time import time
 from kivy.config import Config
 from kivy.vector import Vector
 from kivy.clock import Clock
@@ -82,8 +83,8 @@
                 if triple_tap:
                     touch.is_double_tap = False
                     touch.is_triple_tap = True
-                    time = touch.time_start - triple_tap.time_start
-                    touch.triple_tap_time = time
+                    tap_time = touch.time_start - triple_tap.time_start
+                    touch.triple_tap_time = tap_time
                     distance = triple_tap.triple_tap_distance
                     touch.triple_tap_distance = distance
 
@@ -91,7 +92,7 @@
             self.touches[touch.uid] = (etype, touch)
 
         # second, check if up-touch is timeout for triple tap
-        time_current = Clock.get_time()
+        time_current = time()
         to_delete = []
         for touchid in self.touches.keys():
             etype, touch = self.touches[touchid]

{"golden_diff": "diff --git a/kivy/input/postproc/doubletap.py b/kivy/input/postproc/doubletap.py\n--- a/kivy/input/postproc/doubletap.py\n+++ b/kivy/input/postproc/doubletap.py\n@@ -7,6 +7,7 @@\n \n __all__ = ('InputPostprocDoubleTap', )\n \n+from time import time\n from kivy.config import Config\n from kivy.vector import Vector\n from kivy.clock import Clock\n@@ -77,8 +78,8 @@\n                 double_tap = self.find_double_tap(touch)\n                 if double_tap:\n                     touch.is_double_tap = True\n-                    time = touch.time_start - double_tap.time_start\n-                    touch.double_tap_time = time\n+                    tap_time = touch.time_start - double_tap.time_start\n+                    touch.double_tap_time = tap_time\n                     distance = double_tap.double_tap_distance\n                     touch.double_tap_distance = distance\n \n@@ -86,7 +87,7 @@\n             self.touches[touch.uid] = (etype, touch)\n \n         # second, check if up-touch is timeout for double tap\n-        time_current = Clock.get_time()\n+        time_current = time()\n         to_delete = []\n         for touchid in self.touches.keys():\n             etype, touch = self.touches[touchid]\ndiff --git a/kivy/input/postproc/tripletap.py b/kivy/input/postproc/tripletap.py\n--- a/kivy/input/postproc/tripletap.py\n+++ b/kivy/input/postproc/tripletap.py\n@@ -9,6 +9,7 @@\n \n __all__ = ('InputPostprocTripleTap', )\n \n+from time import time\n from kivy.config import Config\n from kivy.vector import Vector\n from kivy.clock import Clock\n@@ -82,8 +83,8 @@\n                 if triple_tap:\n                     touch.is_double_tap = False\n                     touch.is_triple_tap = True\n-                    time = touch.time_start - triple_tap.time_start\n-                    touch.triple_tap_time = time\n+                    tap_time = touch.time_start - triple_tap.time_start\n+                    touch.triple_tap_time = tap_time\n                     distance = triple_tap.triple_tap_distance\n                     touch.triple_tap_distance = distance\n \n@@ -91,7 +92,7 @@\n             self.touches[touch.uid] = (etype, touch)\n \n         # second, check if up-touch is timeout for triple tap\n-        time_current = Clock.get_time()\n+        time_current = time()\n         to_delete = []\n         for touchid in self.touches.keys():\n             etype, touch = self.touches[touchid]\n", "issue": "Kivy 1.8.0 dev: touch.is_double_tap is set allways to true on Windows\nHello,\nOn MS Windows with Kivy 1.8.0 dev: If you press a button twice, even after a greater time gap between the touches, you always get touch.is_double_tap == True on the second tap. \n\nDoes not appear with 1.7.1 on Android.\n\nGreetings\n\nCarsten\n\n", "before_files": [{"content": "'''\nDouble Tap\n==========\n\nSearch touch for a double tap\n'''\n\n__all__ = ('InputPostprocDoubleTap', )\n\nfrom kivy.config import Config\nfrom kivy.vector import Vector\nfrom kivy.clock import Clock\n\n\nclass InputPostprocDoubleTap(object):\n    '''\n    InputPostProcDoubleTap is a post-processor to check if\n    a touch is a double tap or not.\n    Double tap can be configured in the Kivy config file::\n\n        [postproc]\n        double_tap_time = 250\n        double_tap_distance = 20\n\n    Distance parameter is in 0-1000, and time is in millisecond.\n    '''\n\n    def __init__(self):\n        dist = Config.getint('postproc', 'double_tap_distance')\n        self.double_tap_distance = dist / 1000.0\n        time = Config.getint('postproc', 'double_tap_time')\n        self.double_tap_time = time / 1000.0\n        self.touches = {}\n\n    def find_double_tap(self, ref):\n        '''Find a double tap touch within self.touches.\n        The touch must be not a previous double tap, and the distance\n        must be ok, also, the touch profile must be compared so the kind\n        of touch is the same\n        '''\n        ref_button = None\n        if 'button' in ref.profile:\n            ref_button = ref.button\n\n        for touchid in self.touches:\n            if ref.uid == touchid:\n                continue\n            etype, touch = self.touches[touchid]\n            if etype != 'end':\n                continue\n            if touch.is_double_tap:\n                continue\n            distance = Vector.distance(\n                Vector(ref.sx, ref.sy),\n                Vector(touch.osx, touch.osy))\n            if distance > self.double_tap_distance:\n                continue\n            if touch.is_mouse_scrolling or ref.is_mouse_scrolling:\n                continue\n            touch_button = None\n            if 'button' in touch.profile:\n                touch_button = touch.button\n            if touch_button != ref_button:\n                continue\n            touch.double_tap_distance = distance\n            return touch\n        return None\n\n    def process(self, events):\n        if self.double_tap_distance == 0 or self.double_tap_time == 0:\n            return events\n        # first, check if a touch down have a double tap\n        for etype, touch in events:\n            if not touch.is_touch:\n                continue\n            if etype == 'begin':\n                double_tap = self.find_double_tap(touch)\n                if double_tap:\n                    touch.is_double_tap = True\n                    time = touch.time_start - double_tap.time_start\n                    touch.double_tap_time = time\n                    distance = double_tap.double_tap_distance\n                    touch.double_tap_distance = distance\n\n            # add the touch internaly\n            self.touches[touch.uid] = (etype, touch)\n\n        # second, check if up-touch is timeout for double tap\n        time_current = Clock.get_time()\n        to_delete = []\n        for touchid in self.touches.keys():\n            etype, touch = self.touches[touchid]\n            if etype != 'end':\n                continue\n            if time_current - touch.time_start < self.double_tap_time:\n                continue\n            to_delete.append(touchid)\n\n        for touchid in to_delete:\n            del self.touches[touchid]\n\n        return events\n", "path": "kivy/input/postproc/doubletap.py"}, {"content": "'''\nTriple Tap\n==========\n\n.. versionadded:: 1.7.0\n\nSearch touch for a triple tap\n'''\n\n__all__ = ('InputPostprocTripleTap', )\n\nfrom kivy.config import Config\nfrom kivy.vector import Vector\nfrom kivy.clock import Clock\n\n\nclass InputPostprocTripleTap(object):\n    '''\n    InputPostProcTripleTap is a post-processor to check if\n    a touch is a triple tap or not.\n    Triple tap can be configured in the Kivy config file::\n\n        [postproc]\n        triple_tap_time = 250\n        triple_tap_distance = 20\n\n    Distance parameter is in 0-1000, and time is in millisecond.\n    '''\n\n    def __init__(self):\n        dist = Config.getint('postproc', 'triple_tap_distance')\n        self.triple_tap_distance = dist / 1000.0\n        time = Config.getint('postproc', 'triple_tap_time')\n        self.triple_tap_time = time / 1000.0\n        self.touches = {}\n\n    def find_triple_tap(self, ref):\n        '''Find a triple tap touch within self.touches.\n        The touch must be not a previous triple tap, and the distance\n        must be ok, also, the touch profile must be compared so the kind\n        of touch is the same\n        '''\n        ref_button = None\n        if 'button' in ref.profile:\n            ref_button = ref.button\n\n        for touchid in self.touches:\n            if ref.uid == touchid:\n                continue\n            etype, touch = self.touches[touchid]\n            if not touch.is_double_tap:\n                continue\n            if etype != 'end':\n                continue\n            if touch.is_triple_tap:\n                continue\n            distance = Vector.distance(\n                Vector(ref.sx, ref.sy),\n                Vector(touch.osx, touch.osy))\n            if distance > self.triple_tap_distance:\n                continue\n            if touch.is_mouse_scrolling or ref.is_mouse_scrolling:\n                continue\n            touch_button = None\n            if 'button' in touch.profile:\n                touch_button = touch.button\n            if touch_button != ref_button:\n                continue\n            touch.triple_tap_distance = distance\n            return touch\n        return None\n\n    def process(self, events):\n        if self.triple_tap_distance == 0 or self.triple_tap_time == 0:\n            return events\n        # first, check if a touch down have a triple tap\n        for etype, touch in events:\n            if not touch.is_touch:\n                continue\n            if etype == 'begin':\n                triple_tap = self.find_triple_tap(touch)\n                if triple_tap:\n                    touch.is_double_tap = False\n                    touch.is_triple_tap = True\n                    time = touch.time_start - triple_tap.time_start\n                    touch.triple_tap_time = time\n                    distance = triple_tap.triple_tap_distance\n                    touch.triple_tap_distance = distance\n\n            # add the touch internaly\n            self.touches[touch.uid] = (etype, touch)\n\n        # second, check if up-touch is timeout for triple tap\n        time_current = Clock.get_time()\n        to_delete = []\n        for touchid in self.touches.keys():\n            etype, touch = self.touches[touchid]\n            if etype != 'end':\n                continue\n            if time_current - touch.time_start < self.triple_tap_time:\n                continue\n            to_delete.append(touchid)\n\n        for touchid in to_delete:\n            del self.touches[touchid]\n\n        return events\n", "path": "kivy/input/postproc/tripletap.py"}], "after_files": [{"content": "'''\nDouble Tap\n==========\n\nSearch touch for a double tap\n'''\n\n__all__ = ('InputPostprocDoubleTap', )\n\nfrom time import time\nfrom kivy.config import Config\nfrom kivy.vector import Vector\nfrom kivy.clock import Clock\n\n\nclass InputPostprocDoubleTap(object):\n    '''\n    InputPostProcDoubleTap is a post-processor to check if\n    a touch is a double tap or not.\n    Double tap can be configured in the Kivy config file::\n\n        [postproc]\n        double_tap_time = 250\n        double_tap_distance = 20\n\n    Distance parameter is in 0-1000, and time is in millisecond.\n    '''\n\n    def __init__(self):\n        dist = Config.getint('postproc', 'double_tap_distance')\n        self.double_tap_distance = dist / 1000.0\n        time = Config.getint('postproc', 'double_tap_time')\n        self.double_tap_time = time / 1000.0\n        self.touches = {}\n\n    def find_double_tap(self, ref):\n        '''Find a double tap touch within self.touches.\n        The touch must be not a previous double tap, and the distance\n        must be ok, also, the touch profile must be compared so the kind\n        of touch is the same\n        '''\n        ref_button = None\n        if 'button' in ref.profile:\n            ref_button = ref.button\n\n        for touchid in self.touches:\n            if ref.uid == touchid:\n                continue\n            etype, touch = self.touches[touchid]\n            if etype != 'end':\n                continue\n            if touch.is_double_tap:\n                continue\n            distance = Vector.distance(\n                Vector(ref.sx, ref.sy),\n                Vector(touch.osx, touch.osy))\n            if distance > self.double_tap_distance:\n                continue\n            if touch.is_mouse_scrolling or ref.is_mouse_scrolling:\n                continue\n            touch_button = None\n            if 'button' in touch.profile:\n                touch_button = touch.button\n            if touch_button != ref_button:\n                continue\n            touch.double_tap_distance = distance\n            return touch\n        return None\n\n    def process(self, events):\n        if self.double_tap_distance == 0 or self.double_tap_time == 0:\n            return events\n        # first, check if a touch down have a double tap\n        for etype, touch in events:\n            if not touch.is_touch:\n                continue\n            if etype == 'begin':\n                double_tap = self.find_double_tap(touch)\n                if double_tap:\n                    touch.is_double_tap = True\n                    tap_time = touch.time_start - double_tap.time_start\n                    touch.double_tap_time = tap_time\n                    distance = double_tap.double_tap_distance\n                    touch.double_tap_distance = distance\n\n            # add the touch internaly\n            self.touches[touch.uid] = (etype, touch)\n\n        # second, check if up-touch is timeout for double tap\n        time_current = time()\n        to_delete = []\n        for touchid in self.touches.keys():\n            etype, touch = self.touches[touchid]\n            if etype != 'end':\n                continue\n            if time_current - touch.time_start < self.double_tap_time:\n                continue\n            to_delete.append(touchid)\n\n        for touchid in to_delete:\n            del self.touches[touchid]\n\n        return events\n", "path": "kivy/input/postproc/doubletap.py"}, {"content": "'''\nTriple Tap\n==========\n\n.. versionadded:: 1.7.0\n\nSearch touch for a triple tap\n'''\n\n__all__ = ('InputPostprocTripleTap', )\n\nfrom time import time\nfrom kivy.config import Config\nfrom kivy.vector import Vector\nfrom kivy.clock import Clock\n\n\nclass InputPostprocTripleTap(object):\n    '''\n    InputPostProcTripleTap is a post-processor to check if\n    a touch is a triple tap or not.\n    Triple tap can be configured in the Kivy config file::\n\n        [postproc]\n        triple_tap_time = 250\n        triple_tap_distance = 20\n\n    Distance parameter is in 0-1000, and time is in millisecond.\n    '''\n\n    def __init__(self):\n        dist = Config.getint('postproc', 'triple_tap_distance')\n        self.triple_tap_distance = dist / 1000.0\n        time = Config.getint('postproc', 'triple_tap_time')\n        self.triple_tap_time = time / 1000.0\n        self.touches = {}\n\n    def find_triple_tap(self, ref):\n        '''Find a triple tap touch within self.touches.\n        The touch must be not a previous triple tap, and the distance\n        must be ok, also, the touch profile must be compared so the kind\n        of touch is the same\n        '''\n        ref_button = None\n        if 'button' in ref.profile:\n            ref_button = ref.button\n\n        for touchid in self.touches:\n            if ref.uid == touchid:\n                continue\n            etype, touch = self.touches[touchid]\n            if not touch.is_double_tap:\n                continue\n            if etype != 'end':\n                continue\n            if touch.is_triple_tap:\n                continue\n            distance = Vector.distance(\n                Vector(ref.sx, ref.sy),\n                Vector(touch.osx, touch.osy))\n            if distance > self.triple_tap_distance:\n                continue\n            if touch.is_mouse_scrolling or ref.is_mouse_scrolling:\n                continue\n            touch_button = None\n            if 'button' in touch.profile:\n                touch_button = touch.button\n            if touch_button != ref_button:\n                continue\n            touch.triple_tap_distance = distance\n            return touch\n        return None\n\n    def process(self, events):\n        if self.triple_tap_distance == 0 or self.triple_tap_time == 0:\n            return events\n        # first, check if a touch down have a triple tap\n        for etype, touch in events:\n            if not touch.is_touch:\n                continue\n            if etype == 'begin':\n                triple_tap = self.find_triple_tap(touch)\n                if triple_tap:\n                    touch.is_double_tap = False\n                    touch.is_triple_tap = True\n                    tap_time = touch.time_start - triple_tap.time_start\n                    touch.triple_tap_time = tap_time\n                    distance = triple_tap.triple_tap_distance\n                    touch.triple_tap_distance = distance\n\n            # add the touch internaly\n            self.touches[touch.uid] = (etype, touch)\n\n        # second, check if up-touch is timeout for triple tap\n        time_current = time()\n        to_delete = []\n        for touchid in self.touches.keys():\n            etype, touch = self.touches[touchid]\n            if etype != 'end':\n                continue\n            if time_current - touch.time_start < self.triple_tap_time:\n                continue\n            to_delete.append(touchid)\n\n        for touchid in to_delete:\n            del self.touches[touchid]\n\n        return events\n", "path": "kivy/input/postproc/tripletap.py"}]}