├── .DS_Store ├── Pipfile ├── Pipfile.lock ├── facematch.py ├── findfaces.py ├── img ├── .DS_Store ├── groups │ ├── .DS_Store │ ├── bill-steve-elon.jpg │ ├── bill-steve.jpg │ ├── team1.jpg │ └── team2.jpg ├── known │ ├── .DS_Store │ ├── Barack Obama.jpg │ ├── Bill Gates.jpg │ ├── Donald Trump.jpg │ ├── Elon Musk.jpg │ ├── Michael Jordan.jpg │ └── Steve Jobs.jpg └── unknown │ ├── 1523669923561.jpg │ ├── 220px-Mark_Wahlberg_2017.jpg │ ├── barack-obama-12782369-1-402.jpg │ ├── bill-gates-4.jpg │ ├── bill-gates-750-563.jpg │ ├── d-trump.jpg │ ├── gates_lookalike.jpg │ ├── jordan-basketball.jpeg │ ├── keanu-reeves-2000.jpg │ ├── keanu-reeves-9454211-1-402.jpg │ ├── lead_720_405.jpg │ ├── mark.jpg │ ├── mark2.jpg │ ├── obama.jpeg │ ├── obama2_0.jpg │ ├── sarahmullerEB358D55-EC16-36C7-7932-0C2F4E502D06.jpg │ ├── steve-jobs---mini-biography.jpg │ ├── stevejobs.png │ └── xxx_d06_jordan_01_876569.jpg ├── indentify.py └── pullfaces.py /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/.DS_Store -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | name = "pypi" 3 | url = "https://pypi.org/simple" 4 | verify_ssl = true 5 | 6 | [dev-packages] 7 | autopep8 = "*" 8 | 9 | [packages] 10 | face-recognition = "*" 11 | 12 | [requires] 13 | python_version = "3.7" 14 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "559bf92d41b4ad46c63ca55e9100d3e35b561020ffc9cb59bf8b28d8d9d43ac9" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.7" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "click": { 20 | "hashes": [ 21 | "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", 22 | "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" 23 | ], 24 | "version": "==7.0" 25 | }, 26 | "dlib": { 27 | "hashes": [ 28 | "sha256:92587c81b0165e933593f505fdf099dface0d0f8ec874b1d8655fc774598911f" 29 | ], 30 | "version": "==19.17.0" 31 | }, 32 | "face-recognition": { 33 | "hashes": [ 34 | "sha256:08c41397d3b899ed5b4a801646abd20935a2610ac4ba8643173db0aef6372f21", 35 | "sha256:a03eb709d1280bc3ca648add274ff741761b4c56f5317167252fc90cb519eda1" 36 | ], 37 | "index": "pypi", 38 | "version": "==1.2.3" 39 | }, 40 | "face-recognition-models": { 41 | "hashes": [ 42 | "sha256:b79bd200a88c87c9a9d446c990ae71c5a626d1f3730174e6d570157ff1d896cf" 43 | ], 44 | "version": "==0.3.0" 45 | }, 46 | "numpy": { 47 | "hashes": [ 48 | "sha256:1980f8d84548d74921685f68096911585fee393975f53797614b34d4f409b6da", 49 | "sha256:22752cd809272671b273bb86df0f505f505a12368a3a5fc0aa811c7ece4dfd5c", 50 | "sha256:23cc40313036cffd5d1873ef3ce2e949bdee0646c5d6f375bf7ee4f368db2511", 51 | "sha256:2b0b118ff547fecabc247a2668f48f48b3b1f7d63676ebc5be7352a5fd9e85a5", 52 | "sha256:3a0bd1edf64f6a911427b608a894111f9fcdb25284f724016f34a84c9a3a6ea9", 53 | "sha256:3f25f6c7b0d000017e5ac55977a3999b0b1a74491eacb3c1aa716f0e01f6dcd1", 54 | "sha256:4061c79ac2230594a7419151028e808239450e676c39e58302ad296232e3c2e8", 55 | "sha256:560ceaa24f971ab37dede7ba030fc5d8fa173305d94365f814d9523ffd5d5916", 56 | "sha256:62be044cd58da2a947b7e7b2252a10b42920df9520fc3d39f5c4c70d5460b8ba", 57 | "sha256:6c692e3879dde0b67a9dc78f9bfb6f61c666b4562fd8619632d7043fb5b691b0", 58 | "sha256:6f65e37b5a331df950ef6ff03bd4136b3c0bbcf44d4b8e99135d68a537711b5a", 59 | "sha256:7a78cc4ddb253a55971115f8320a7ce28fd23a065fc33166d601f51760eecfa9", 60 | "sha256:80a41edf64a3626e729a62df7dd278474fc1726836552b67a8c6396fd7e86760", 61 | "sha256:893f4d75255f25a7b8516feb5766c6b63c54780323b9bd4bc51cdd7efc943c73", 62 | "sha256:972ea92f9c1b54cc1c1a3d8508e326c0114aaf0f34996772a30f3f52b73b942f", 63 | "sha256:9f1d4865436f794accdabadc57a8395bd3faa755449b4f65b88b7df65ae05f89", 64 | "sha256:9f4cd7832b35e736b739be03b55875706c8c3e5fe334a06210f1a61e5c2c8ca5", 65 | "sha256:adab43bf657488300d3aeeb8030d7f024fcc86e3a9b8848741ea2ea903e56610", 66 | "sha256:bd2834d496ba9b1bdda3a6cf3de4dc0d4a0e7be306335940402ec95132ad063d", 67 | "sha256:d20c0360940f30003a23c0adae2fe50a0a04f3e48dc05c298493b51fd6280197", 68 | "sha256:d3b3ed87061d2314ff3659bb73896e622252da52558f2380f12c421fbdee3d89", 69 | "sha256:dc235bf29a406dfda5790d01b998a1c01d7d37f449128c0b1b7d1c89a84fae8b", 70 | "sha256:fb3c83554f39f48f3fa3123b9c24aecf681b1c289f9334f8215c1d3c8e2f6e5b" 71 | ], 72 | "version": "==1.16.2" 73 | }, 74 | "pillow": { 75 | "hashes": [ 76 | "sha256:15c056bfa284c30a7f265a41ac4cbbc93bdbfc0dfe0613b9cb8a8581b51a9e55", 77 | "sha256:1a4e06ba4f74494ea0c58c24de2bb752818e9d504474ec95b0aa94f6b0a7e479", 78 | "sha256:1c3c707c76be43c9e99cb7e3d5f1bee1c8e5be8b8a2a5eeee665efbf8ddde91a", 79 | "sha256:1fd0b290203e3b0882d9605d807b03c0f47e3440f97824586c173eca0aadd99d", 80 | "sha256:24114e4a6e1870c5a24b1da8f60d0ba77a0b4027907860188ea82bd3508c80eb", 81 | "sha256:258d886a49b6b058cd7abb0ab4b2b85ce78669a857398e83e8b8e28b317b5abb", 82 | "sha256:33c79b6dd6bc7f65079ab9ca5bebffb5f5d1141c689c9c6a7855776d1b09b7e8", 83 | "sha256:367385fc797b2c31564c427430c7a8630db1a00bd040555dfc1d5c52e39fcd72", 84 | "sha256:3c1884ff078fb8bf5f63d7d86921838b82ed4a7d0c027add773c2f38b3168754", 85 | "sha256:44e5240e8f4f8861d748f2a58b3f04daadab5e22bfec896bf5434745f788f33f", 86 | "sha256:46aa988e15f3ea72dddd81afe3839437b755fffddb5e173886f11460be909dce", 87 | "sha256:74d90d499c9c736d52dd6d9b7221af5665b9c04f1767e35f5dd8694324bd4601", 88 | "sha256:809c0a2ce9032cbcd7b5313f71af4bdc5c8c771cb86eb7559afd954cab82ebb5", 89 | "sha256:85d1ef2cdafd5507c4221d201aaf62fc9276f8b0f71bd3933363e62a33abc734", 90 | "sha256:8c3889c7681af77ecfa4431cd42a2885d093ecb811e81fbe5e203abc07e0995b", 91 | "sha256:9218d81b9fca98d2c47d35d688a0cea0c42fd473159dfd5612dcb0483c63e40b", 92 | "sha256:9aa4f3827992288edd37c9df345783a69ef58bd20cc02e64b36e44bcd157bbf1", 93 | "sha256:9d80f44137a70b6f84c750d11019a3419f409c944526a95219bea0ac31f4dd91", 94 | "sha256:b7ebd36128a2fe93991293f997e44be9286503c7530ace6a55b938b20be288d8", 95 | "sha256:c4c78e2c71c257c136cdd43869fd3d5e34fc2162dc22e4a5406b0ebe86958239", 96 | "sha256:c6a842537f887be1fe115d8abb5daa9bc8cc124e455ff995830cc785624a97af", 97 | "sha256:cf0a2e040fdf5a6d95f4c286c6ef1df6b36c218b528c8a9158ec2452a804b9b8", 98 | "sha256:cfd28aad6fc61f7a5d4ee556a997dc6e5555d9381d1390c00ecaf984d57e4232", 99 | "sha256:dca5660e25932771460d4688ccbb515677caaf8595f3f3240ec16c117deff89a", 100 | "sha256:de7aedc85918c2f887886442e50f52c1b93545606317956d65f342bd81cb4fc3", 101 | "sha256:e6c0bbf8e277b74196e3140c35f9a1ae3eafd818f7f2d3a15819c49135d6c062" 102 | ], 103 | "version": "==6.0.0" 104 | } 105 | }, 106 | "develop": { 107 | "autopep8": { 108 | "hashes": [ 109 | "sha256:33d2b5325b7e1afb4240814fe982eea3a92ebea712869bfd08b3c0393404248c" 110 | ], 111 | "index": "pypi", 112 | "version": "==1.4.3" 113 | }, 114 | "pycodestyle": { 115 | "hashes": [ 116 | "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", 117 | "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" 118 | ], 119 | "version": "==2.5.0" 120 | } 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /facematch.py: -------------------------------------------------------------------------------- 1 | import face_recognition 2 | 3 | image_of_bill = face_recognition.load_image_file('./img/known/Bill Gates.jpg') 4 | bill_face_encoding = face_recognition.face_encodings(image_of_bill)[0] 5 | 6 | unknown_image = face_recognition.load_image_file( 7 | './img/unknown/d-trump.jpg') 8 | unknown_face_encoding = face_recognition.face_encodings(unknown_image)[0] 9 | 10 | # Compare faces 11 | results = face_recognition.compare_faces( 12 | [bill_face_encoding], unknown_face_encoding) 13 | 14 | if results[0]: 15 | print('This is Bill Gates') 16 | else: 17 | print('This is NOT Bill Gates') 18 | -------------------------------------------------------------------------------- /findfaces.py: -------------------------------------------------------------------------------- 1 | import face_recognition 2 | 3 | image = face_recognition.load_image_file('./img/groups/team2.jpg') 4 | face_locations = face_recognition.face_locations(image) 5 | 6 | # Array of coords of each face 7 | # print(face_locations) 8 | 9 | print(f'There are {len(face_locations)} people in this image') 10 | -------------------------------------------------------------------------------- /img/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/.DS_Store -------------------------------------------------------------------------------- /img/groups/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/groups/.DS_Store -------------------------------------------------------------------------------- /img/groups/bill-steve-elon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/groups/bill-steve-elon.jpg -------------------------------------------------------------------------------- /img/groups/bill-steve.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/groups/bill-steve.jpg -------------------------------------------------------------------------------- /img/groups/team1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/groups/team1.jpg -------------------------------------------------------------------------------- /img/groups/team2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/groups/team2.jpg -------------------------------------------------------------------------------- /img/known/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/known/.DS_Store -------------------------------------------------------------------------------- /img/known/Barack Obama.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/known/Barack Obama.jpg -------------------------------------------------------------------------------- /img/known/Bill Gates.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/known/Bill Gates.jpg -------------------------------------------------------------------------------- /img/known/Donald Trump.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/known/Donald Trump.jpg -------------------------------------------------------------------------------- /img/known/Elon Musk.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/known/Elon Musk.jpg -------------------------------------------------------------------------------- /img/known/Michael Jordan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/known/Michael Jordan.jpg -------------------------------------------------------------------------------- /img/known/Steve Jobs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/known/Steve Jobs.jpg -------------------------------------------------------------------------------- /img/unknown/1523669923561.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/1523669923561.jpg -------------------------------------------------------------------------------- /img/unknown/220px-Mark_Wahlberg_2017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/220px-Mark_Wahlberg_2017.jpg -------------------------------------------------------------------------------- /img/unknown/barack-obama-12782369-1-402.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/barack-obama-12782369-1-402.jpg -------------------------------------------------------------------------------- /img/unknown/bill-gates-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/bill-gates-4.jpg -------------------------------------------------------------------------------- /img/unknown/bill-gates-750-563.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/bill-gates-750-563.jpg -------------------------------------------------------------------------------- /img/unknown/d-trump.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/d-trump.jpg -------------------------------------------------------------------------------- /img/unknown/gates_lookalike.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/gates_lookalike.jpg -------------------------------------------------------------------------------- /img/unknown/jordan-basketball.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/jordan-basketball.jpeg -------------------------------------------------------------------------------- /img/unknown/keanu-reeves-2000.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/keanu-reeves-2000.jpg -------------------------------------------------------------------------------- /img/unknown/keanu-reeves-9454211-1-402.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/keanu-reeves-9454211-1-402.jpg -------------------------------------------------------------------------------- /img/unknown/lead_720_405.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/lead_720_405.jpg -------------------------------------------------------------------------------- /img/unknown/mark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/mark.jpg -------------------------------------------------------------------------------- /img/unknown/mark2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/mark2.jpg -------------------------------------------------------------------------------- /img/unknown/obama.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/obama.jpeg -------------------------------------------------------------------------------- /img/unknown/obama2_0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/obama2_0.jpg -------------------------------------------------------------------------------- /img/unknown/sarahmullerEB358D55-EC16-36C7-7932-0C2F4E502D06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/sarahmullerEB358D55-EC16-36C7-7932-0C2F4E502D06.jpg -------------------------------------------------------------------------------- /img/unknown/steve-jobs---mini-biography.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/steve-jobs---mini-biography.jpg -------------------------------------------------------------------------------- /img/unknown/stevejobs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/stevejobs.png -------------------------------------------------------------------------------- /img/unknown/xxx_d06_jordan_01_876569.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bradtraversy/face_recognition_examples/385cb7148b3d092ad6faa466c14d2013d57b6df6/img/unknown/xxx_d06_jordan_01_876569.jpg -------------------------------------------------------------------------------- /indentify.py: -------------------------------------------------------------------------------- 1 | import face_recognition 2 | from PIL import Image, ImageDraw 3 | 4 | image_of_bill = face_recognition.load_image_file('./img/known/Bill Gates.jpg') 5 | bill_face_encoding = face_recognition.face_encodings(image_of_bill)[0] 6 | 7 | image_of_steve = face_recognition.load_image_file('./img/known/Steve Jobs.jpg') 8 | steve_face_encoding = face_recognition.face_encodings(image_of_steve)[0] 9 | 10 | image_of_elon = face_recognition.load_image_file('./img/known/Elon Musk.jpg') 11 | elon_face_encoding = face_recognition.face_encodings(image_of_elon)[0] 12 | 13 | # Create arrays of encodings and names 14 | known_face_encodings = [ 15 | bill_face_encoding, 16 | steve_face_encoding, 17 | elon_face_encoding 18 | ] 19 | 20 | known_face_names = [ 21 | "Bill Gates", 22 | "Steve Jobs", 23 | "Elon Musk" 24 | ] 25 | 26 | # Load test image to find faces in 27 | test_image = face_recognition.load_image_file('./img/groups/bill-steve-elon.jpg') 28 | 29 | # Find faces in test image 30 | face_locations = face_recognition.face_locations(test_image) 31 | face_encodings = face_recognition.face_encodings(test_image, face_locations) 32 | 33 | # Convert to PIL format 34 | pil_image = Image.fromarray(test_image) 35 | 36 | # Create a ImageDraw instance 37 | draw = ImageDraw.Draw(pil_image) 38 | 39 | # Loop through faces in test image 40 | for(top, right, bottom, left), face_encoding in zip(face_locations, face_encodings): 41 | matches = face_recognition.compare_faces(known_face_encodings, face_encoding) 42 | 43 | name = "Unknown Person" 44 | 45 | # If match 46 | if True in matches: 47 | first_match_index = matches.index(True) 48 | name = known_face_names[first_match_index] 49 | 50 | # Draw box 51 | draw.rectangle(((left, top), (right, bottom)), outline=(255,255,0)) 52 | 53 | # Draw label 54 | text_width, text_height = draw.textsize(name) 55 | draw.rectangle(((left,bottom - text_height - 10), (right, bottom)), fill=(255,255,0), outline=(255,255,0)) 56 | draw.text((left + 6, bottom - text_height - 5), name, fill=(0,0,0)) 57 | 58 | del draw 59 | 60 | # Display image 61 | pil_image.show() 62 | 63 | # Save image 64 | pil_image.save('identify.jpg') -------------------------------------------------------------------------------- /pullfaces.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | import face_recognition 3 | 4 | image = face_recognition.load_image_file('./img/groups/team1.jpg') 5 | face_locations = face_recognition.face_locations(image) 6 | 7 | for face_location in face_locations: 8 | top, right, bottom, left = face_location 9 | 10 | face_image = image[top:bottom, left:right] 11 | pil_image = Image.fromarray(face_image) 12 | # pil_image.show() 13 | pil_image.save(f'{top}.jpg') 14 | --------------------------------------------------------------------------------