1836:
375:
66:
25:
200:
511:), These, as per build tool convention, are often found in the root directory of the package's source code. The gulpfile contains most of the logic that gulp needs to run its build tasks. First, all the necessary modules are loaded and then tasks are defined in the gulpfile. All the necessary plugins specified in the gulpfile are listed in the devDependencies section of
125:
762:
The default task is used in gulp to run any number of dependent sub tasks defined above in a sequential order automatically. gulp can also monitor source files and run an appropriate task when changes are made to the files. The sub tasks are to be mentioned as the elements of the array in the second
453:
their own plugins to define their own tasks. Unlike other task runners that run tasks by configuration, gulp requires knowledge of JavaScript and coding to define its tasks. gulp is a build system which means apart from running tasks, it is also capable of copying files from one location to another,
452:
operator, doing one task at a time. The original files are not affected until all the plugins are processed. It can be configured either to modify the original files or to create new ones. This grants the ability to perform complex tasks through linking its numerous plugins. The users can also write
486:
calls and the creation of many temporary files. Whereas gulp streams through the file system do not require any of these temporary locations, decreasing the number of I/O calls thus, improving performance. Grunt uses configuration files to perform tasks, whereas gulp requires its build file to be
481:
scripts because they can be simple and easy to implement, there are numerous ways where gulp and Grunt seem to have an advantage over each other, and the default provided scripts. Grunt runs tasks by transforming files and saves them as new ones in temporary folders, and the output of one task is
535:
gulpfile is the place where all the operations are defined in gulp. The basic anatomy of the gulpfile consists of required plugins included at the top, definition of the tasks and a default task at the end.
432:
gulp uses a code-over-configuration approach to define its tasks and relies on its small, single-purpose plugins to carry them out. The gulp ecosystem includes more than 3500 such plugins.
487:
coded. In Grunt, each plugin needs to be configured to match its input location to the previous plugin's output. In gulp, the plugins are automatically pipe-lined.
631:
Alternatively, a task that performs several predefined functions can be created. Those functions are passed as the second parameter in the form of an array.
837:
the images would indeed be optimized, but are not stored. Since the optimized images are stored to another folder, the original images remain unaltered.
1185:
Furthermore, it is possible to accomplish an update of the browser content using the Watch-tasks. For this, there are numerous options and plugins.
1860:
1792:
1773:
1230:
544:
Any installed plugin that is required to perform a task is to be added at the top of the gulpfile as a dependency in the following format.
76:
143:
1811:
1574:
179:
161:
52:
275:
249:
1635:
418:
403:
477:
because the basic npm scripts are inefficient when executing multiple tasks. Even though some developers prefer
448:. gulp reads the file system and pipes the data at hand from one single-purposed plugin to another through the
38:
1435:
482:
taken as input for another and so on until the output reaches the destination folder. This involves a lot of
496:
1077:
The Watch-task serves to react to changes in files. In the following example, the tasks with the names
1534:
478:
474:
388:
374:
458:
445:
337:
325:
1338:
957:
overwrites the original files with the output. For this, one must first return to the required
1807:
1788:
1769:
1570:
1226:
584:
and takes the name of the task as the first parameter and a function as the second parameter.
417:, used for automation of time-consuming and repetitive tasks involved in web development like
1764:
Jed Mao; Maximilian
Schmitt; Tomasz Stryjewski; Cary Country Holt; William Lubelski (2014).
1221:
Jed Mao; Maximilian
Schmitt; Tomasz Stryjewski; Cary Country Holt; William Lubelski (2014).
1194:
470:
426:
349:
305:
399:
1835:
1462:
1387:
1664:
1085:
are called when any of JavaScript files or images change in the specified directories.
414:
1614:
87:
1854:
1292:
591:
is mandatory and specifies the name by which the task in the shell can be executed.
724:
The default task is to be defined at the end of the gulpfile. It can be run by the
422:
395:
44:
1593:
816:
retrieves all the images with the extension .png, .gif or .jpg in the directory '
441:
354:
1636:"Durchstarten mit Gulp.js – Websites optimieren, Arbeitsabläufe automatisieren"
1414:
1199:
763:
parameter. The process can be triggered by simply running the default task by
587:
The following example shows the creation of a gulp tasks. The first parameter
391:
298:
217:
207:
1486:
1689:
454:
1713:
1643:
1266:
199:
1246:
1737:
728:
command in the shell. In the case below, the default task does nothing.
410:
342:
330:
318:
1845:
1507:
1318:
1297:
1271:
825:
channels the images found, through the optimization process and with
523:. Complex tasks are defined by chaining the plugins with the help of
444:. These streams facilitate the connection of file operations through
1415:"substack/stream-handbook: how to write node programs with streams"
134:
provides insufficient context for those unfamiliar with the subject
945:
In the following example, all JavaScript files from the directory
314:
310:
1841:
281:
1363:
519:. Individual tasks can be defined by gulp.task and are run by
483:
118:
59:
18:
1785:
Pro JavaScript
Development Coding, Capabilities, and Tooling
99:
503:, which is used to list the various plugins for gulp, and
91:
580:
The tasks can then be created. A gulp task is defined by
95:
139:
83:
461:, creating notifications, unit testing, linting, etc.
1829:
365:
360:
348:
336:
324:
304:
294:
274:
248:
226:
216:
206:
780:The module definition can be at the beginning of
1783:Den Odell (2014). "Build Tools and Automation".
1588:
1586:
1457:
1455:
1665:"Front-end Workflow mit Gulp - Liechtenecker"
8:
1409:
1407:
812:The subsequent image task optimizes images.
440:gulp is a build tool in JavaScript built on
192:
1615:"gulp/API.md at 4.0 · gulpjs/gulp · GitHub"
53:Learn how and when to remove these messages
1834:
965:package installer and at the beginning of
373:
191:
180:Learn how and when to remove this message
162:Learn how and when to remove this message
1594:"An Introduction to Gulp.js - SitePoint"
1339:"Building With Gulp – Smashing Magazine"
1210:
829:the optimized images are saved to the '
77:instructions, advice, or how-to content
1768:(1st ed.). Bleeding Edge Press.
1560:
1558:
1556:
1554:
1529:
1527:
1225:(1st ed.). Bleeding Edge Press.
1090:// Rerun the task When a file changes
144:providing more context for the reader
7:
1216:
1214:
672:// Task with array of function names
521:gulp <task> <othertask>
499:(CLI) shell and require two files,
398:(similar to a more package-focused
86:so that it is more encyclopedic or
14:
473:are built on Node.js rather than
34:This article has multiple issues.
969:, the module should be defined.
887:'images/*.{png,gif,jpg}'
421:, concatenation, cache busting,
255:5.0.0 / 29 March 2024
222:Blaine Bublitz, Eric Schoffstall
198:
123:
64:
23:
16:Server-side JavaScript framework
1319:"License field from gulp - npm"
1247:"Release Date of Version 1.0.0"
42:or discuss these issues on the
495:The gulp tasks are run from a
1:
1508:"install | npm Documentation"
409:It is a task runner built on
394:toolkit, used as a streaming
1861:JavaScript programming tools
1642:. 2014-05-25. Archived from
515:. The default task runs by
469:Task-runners like gulp and
1877:
1804:Getting Started with Gulp
1567:Getting Started with Gulp
1364:"gulp.js plugin registry"
404:front-end web development
270:
244:
197:
1806:. Packt Publishing Ltd.
1802:Maynard, Travis (2015).
1569:. Packt Publishing Ltd.
1565:Maynard, Travis (2015).
1489:. CSS-Tricks. 2015-09-01
1293:"LICENSE file on GitHub"
1267:"Releases · gulpjs/gulp"
1087:
971:
839:
786:
730:
633:
593:
546:
1738:"Browsersync + Gulp.js"
1138:'scripts/js/**'
804:'gulp-imagemin'
1766:Developing a Gulp Edge
1223:Developing a Gulp Edge
1019:'scripts/*.js'
929:'dist/images/'
497:command-line interface
465:Need for a task runner
257:; 5 months ago
232:; 10 years ago
230:26 September 2013
955:gulp.dest('scripts/')
549://Adding dependencies
429:, optimization, etc.
1617:. GitHub. 2016-05-12
1487:"Gulp for Beginners"
1343:Smashingmagazine.com
733:// Gulp default task
1162:'images/**'
949:are optimized with
531:Anatomy of gulpfile
194:
140:improve the article
84:rewrite the content
1061:'scripts/'
959:gulp-uglify plugin
827:.pipe(gulp.dest())
687:'taskName'
608:'taskName'
208:Original author(s)
1794:978-1-4302-6268-8
1775:978-1-939902-14-6
1232:978-1-939902-14-6
989:'scripts'
823:.pipe(imagemin())
748:'default'
382:
381:
190:
189:
182:
172:
171:
164:
117:
116:
57:
1868:
1838:
1833:
1832:
1830:Official website
1817:
1798:
1779:
1752:
1751:
1749:
1748:
1734:
1728:
1727:
1725:
1724:
1710:
1704:
1703:
1701:
1700:
1686:
1680:
1679:
1677:
1676:
1669:Liechtenecker.at
1661:
1655:
1654:
1652:
1651:
1640:Magazin.phlow.de
1632:
1626:
1625:
1623:
1622:
1611:
1605:
1604:
1602:
1601:
1590:
1581:
1580:
1562:
1549:
1548:
1546:
1545:
1531:
1522:
1521:
1519:
1518:
1504:
1498:
1497:
1495:
1494:
1483:
1477:
1476:
1474:
1473:
1459:
1450:
1449:
1447:
1446:
1432:
1426:
1425:
1423:
1422:
1411:
1402:
1401:
1399:
1398:
1384:
1378:
1377:
1375:
1374:
1360:
1354:
1353:
1351:
1350:
1335:
1329:
1328:
1326:
1325:
1315:
1309:
1308:
1306:
1305:
1289:
1283:
1282:
1280:
1279:
1263:
1257:
1256:
1254:
1253:
1243:
1237:
1236:
1218:
1195:Grunt (software)
1181:
1178:
1175:
1172:
1169:
1166:
1163:
1160:
1157:
1154:
1151:
1148:
1145:
1142:
1139:
1136:
1133:
1130:
1127:
1124:
1121:
1118:
1115:
1112:
1109:
1106:
1103:
1100:
1097:
1094:
1091:
1068:
1065:
1062:
1059:
1056:
1053:
1050:
1047:
1044:
1041:
1038:
1035:
1032:
1029:
1026:
1023:
1020:
1017:
1014:
1011:
1008:
1005:
1002:
999:
996:
993:
990:
987:
984:
981:
978:
975:
956:
952:
936:
933:
930:
927:
924:
921:
918:
915:
912:
909:
906:
903:
900:
897:
894:
891:
888:
885:
882:
879:
876:
873:
870:
867:
864:
861:
858:
857:'images'
855:
852:
849:
846:
843:
836:
828:
824:
815:
808:
805:
802:
799:
796:
793:
790:
783:
766:
758:
755:
752:
749:
746:
743:
740:
737:
734:
727:
715:
712:
709:
706:
703:
700:
697:
694:
691:
688:
685:
682:
679:
676:
673:
670:
667:
664:
661:
658:
655:
652:
649:
646:
643:
640:
637:
627:
624:
621:
618:
615:
612:
609:
606:
603:
600:
597:
571:
568:
565:
562:
559:
556:
553:
550:
526:
522:
518:
514:
510:
506:
502:
451:
378:
377:
370:
367:
306:Operating system
290:
287:
285:
283:
265:
263:
258:
240:
238:
233:
212:Eric Schoffstall
202:
195:
185:
178:
167:
160:
156:
153:
147:
127:
126:
119:
112:
109:
103:
68:
67:
60:
49:
27:
26:
19:
1876:
1875:
1871:
1870:
1869:
1867:
1866:
1865:
1851:
1850:
1828:
1827:
1824:
1814:
1801:
1795:
1782:
1776:
1763:
1760:
1755:
1746:
1744:
1736:
1735:
1731:
1722:
1720:
1712:
1711:
1707:
1698:
1696:
1688:
1687:
1683:
1674:
1672:
1663:
1662:
1658:
1649:
1647:
1634:
1633:
1629:
1620:
1618:
1613:
1612:
1608:
1599:
1597:
1592:
1591:
1584:
1577:
1564:
1563:
1552:
1543:
1541:
1533:
1532:
1525:
1516:
1514:
1506:
1505:
1501:
1492:
1490:
1485:
1484:
1480:
1471:
1469:
1461:
1460:
1453:
1444:
1442:
1434:
1433:
1429:
1420:
1418:
1413:
1412:
1405:
1396:
1394:
1386:
1385:
1381:
1372:
1370:
1362:
1361:
1357:
1348:
1346:
1337:
1336:
1332:
1323:
1321:
1317:
1316:
1312:
1303:
1301:
1291:
1290:
1286:
1277:
1275:
1265:
1264:
1260:
1251:
1249:
1245:
1244:
1240:
1233:
1220:
1219:
1212:
1208:
1191:
1183:
1182:
1179:
1176:
1173:
1170:
1167:
1164:
1161:
1158:
1155:
1152:
1149:
1146:
1143:
1140:
1137:
1134:
1131:
1128:
1125:
1122:
1119:
1116:
1113:
1110:
1107:
1105:'watch'
1104:
1101:
1098:
1095:
1092:
1089:
1075:
1070:
1069:
1066:
1063:
1060:
1057:
1054:
1051:
1048:
1045:
1042:
1039:
1036:
1033:
1030:
1027:
1024:
1021:
1018:
1015:
1012:
1009:
1006:
1003:
1000:
997:
994:
991:
988:
985:
982:
979:
976:
973:
954:
951:.pipe(uglify())
950:
943:
938:
937:
934:
931:
928:
925:
922:
919:
916:
913:
910:
907:
904:
901:
898:
895:
892:
889:
886:
883:
880:
877:
874:
871:
868:
865:
862:
859:
856:
853:
850:
847:
844:
841:
834:
831:images/' folder
826:
822:
813:
810:
809:
806:
803:
800:
797:
794:
791:
788:
781:
778:
773:
764:
760:
759:
756:
753:
750:
747:
744:
741:
738:
735:
732:
725:
722:
717:
716:
713:
710:
707:
704:
701:
698:
695:
692:
689:
686:
683:
680:
677:
674:
671:
668:
666:// do something
665:
662:
659:
656:
653:
650:
648:// do something
647:
644:
641:
638:
635:
629:
628:
625:
622:
619:
616:
613:
610:
607:
604:
601:
598:
595:
578:
573:
572:
569:
566:
563:
560:
557:
554:
551:
548:
542:
533:
524:
520:
516:
512:
508:
504:
500:
493:
467:
449:
438:
372:
364:
280:
266:
261:
259:
256:
236:
234:
231:
227:Initial release
186:
175:
174:
173:
168:
157:
151:
148:
137:
128:
124:
113:
107:
104:
81:
69:
65:
28:
24:
17:
12:
11:
5:
1874:
1872:
1864:
1863:
1853:
1852:
1849:
1848:
1839:
1823:
1822:External links
1820:
1819:
1818:
1812:
1799:
1793:
1780:
1774:
1759:
1756:
1754:
1753:
1742:Browsersync.io
1729:
1705:
1681:
1656:
1627:
1606:
1582:
1575:
1550:
1523:
1512:docs.npmjs.com
1499:
1478:
1451:
1427:
1403:
1379:
1355:
1345:. 11 June 2014
1330:
1310:
1284:
1258:
1238:
1231:
1209:
1207:
1204:
1203:
1202:
1197:
1190:
1187:
1088:
1074:
1071:
974:// Script task
972:
942:
939:
842:// Images task
840:
818:images-orig/'.
787:
777:
774:
772:
769:
731:
721:
718:
634:
623://do something
594:
577:
574:
567:'gulp'
547:
541:
538:
532:
529:
492:
489:
466:
463:
437:
434:
380:
379:
362:
358:
357:
352:
346:
345:
340:
334:
333:
328:
322:
321:
308:
302:
301:
296:
292:
291:
278:
272:
271:
268:
267:
254:
252:
250:Stable release
246:
245:
242:
241:
228:
224:
223:
220:
214:
213:
210:
204:
203:
188:
187:
170:
169:
131:
129:
122:
115:
114:
72:
70:
63:
58:
32:
31:
29:
22:
15:
13:
10:
9:
6:
4:
3:
2:
1873:
1862:
1859:
1858:
1856:
1847:
1843:
1840:
1837:
1831:
1826:
1825:
1821:
1815:
1813:9781784393472
1809:
1805:
1800:
1796:
1790:
1786:
1781:
1777:
1771:
1767:
1762:
1761:
1757:
1743:
1739:
1733:
1730:
1719:
1715:
1709:
1706:
1695:
1691:
1690:"gulp-uglify"
1685:
1682:
1670:
1666:
1660:
1657:
1646:on 2017-06-16
1645:
1641:
1637:
1631:
1628:
1616:
1610:
1607:
1595:
1589:
1587:
1583:
1578:
1576:9781784393472
1572:
1568:
1561:
1559:
1557:
1555:
1551:
1540:
1536:
1535:"gulpjs/gulp"
1530:
1528:
1524:
1513:
1509:
1503:
1500:
1488:
1482:
1479:
1468:
1464:
1463:"gulpjs/gulp"
1458:
1456:
1452:
1441:
1437:
1436:"gulpjs/gulp"
1431:
1428:
1416:
1410:
1408:
1404:
1393:
1389:
1388:"gulpjs/gulp"
1383:
1380:
1369:
1365:
1359:
1356:
1344:
1340:
1334:
1331:
1320:
1314:
1311:
1300:
1299:
1294:
1288:
1285:
1274:
1273:
1268:
1262:
1259:
1248:
1242:
1239:
1234:
1228:
1224:
1217:
1215:
1211:
1205:
1201:
1198:
1196:
1193:
1192:
1188:
1186:
1086:
1084:
1080:
1072:
970:
968:
964:
960:
948:
940:
838:
832:
820:
819:
785:
775:
771:Example tasks
770:
768:
729:
719:
632:
592:
590:
585:
583:
575:
545:
539:
537:
530:
528:
498:
490:
488:
485:
480:
476:
472:
464:
462:
460:
456:
447:
443:
435:
433:
430:
428:
424:
420:
416:
412:
407:
405:
401:
397:
393:
390:
386:
376:
369:
363:
359:
356:
353:
351:
347:
344:
341:
339:
335:
332:
329:
327:
323:
320:
316:
312:
309:
307:
303:
300:
297:
293:
289:
279:
277:
273:
269:
253:
251:
247:
243:
229:
225:
221:
219:
215:
211:
209:
205:
201:
196:
184:
181:
166:
163:
155:
145:
141:
135:
132:This article
130:
121:
120:
111:
101:
97:
93:
89:
85:
79:
78:
73:This article
71:
62:
61:
56:
54:
47:
46:
41:
40:
35:
30:
21:
20:
1803:
1784:
1765:
1745:. Retrieved
1741:
1732:
1721:. Retrieved
1717:
1714:"gulp-watch"
1708:
1697:. Retrieved
1693:
1684:
1673:. Retrieved
1671:. 2015-05-29
1668:
1659:
1648:. Retrieved
1644:the original
1639:
1630:
1619:. Retrieved
1609:
1598:. Retrieved
1596:. 2014-02-10
1566:
1542:. Retrieved
1538:
1515:. Retrieved
1511:
1502:
1491:. Retrieved
1481:
1470:. Retrieved
1466:
1443:. Retrieved
1439:
1430:
1419:. Retrieved
1395:. Retrieved
1391:
1382:
1371:. Retrieved
1367:
1358:
1347:. Retrieved
1342:
1333:
1322:. Retrieved
1313:
1302:. Retrieved
1296:
1287:
1276:. Retrieved
1270:
1261:
1250:. Retrieved
1241:
1222:
1184:
1082:
1078:
1076:
966:
962:
958:
946:
944:
941:Scripts Task
830:
821:
817:
811:
779:
761:
723:
720:Default task
630:
588:
586:
581:
579:
543:
534:
513:package.json
501:package.json
494:
468:
442:node streams
439:
431:
423:unit testing
419:minification
408:
396:build system
384:
383:
218:Developer(s)
176:
158:
152:January 2017
149:
138:Please help
133:
108:October 2016
105:
82:Please help
74:
50:
43:
37:
36:Please help
33:
835:gulp.dest()
782:Gulpfile.js
507:(or simply
505:gulpfile.js
389:open-source
355:MIT License
92:Wikiversity
1787:. Apress.
1758:Literature
1747:2016-12-14
1723:2016-09-23
1699:2016-12-14
1675:2016-12-14
1650:2016-12-14
1621:2016-12-14
1600:2016-09-23
1544:2016-09-23
1517:2016-09-22
1493:2016-12-14
1472:2016-09-23
1445:2016-09-22
1421:2016-12-14
1397:2016-09-22
1373:2016-12-14
1368:Gulpjs.com
1349:2016-12-14
1324:2020-12-31
1304:2020-12-31
1278:2020-12-31
1252:2020-12-31
1206:References
1200:Browserify
1073:Watch Task
833:. Without
814:gulp.src()
776:Image Task
527:operator.
392:JavaScript
299:JavaScript
295:Written in
276:Repository
262:2024-03-29
237:2013-09-26
100:Wikivoyage
39:improve it
1718:Npmjs.com
1694:Npmjs.com
767:command.
582:gulp.task
491:Operation
459:deploying
455:compiling
446:pipelines
96:Wikibooks
75:contains
45:talk page
1855:Category
1417:. GitHub
1189:See also
1111:function
995:function
967:gulpfile
947:scripts/
902:imagemin
863:function
792:imagemin
784:like so:
699:parallel
654:function
636:function
614:function
589:taskName
509:gulpfile
436:Overview
326:Platform
1144:scripts
1079:scripts
798:require
561:require
540:Plugins
525:.pipe()
450:.pipe()
427:linting
411:Node.js
361:Website
350:License
343:Toolkit
331:Node.js
319:Windows
286:/gulpjs
260: (
235: (
1846:GitHub
1810:
1791:
1772:
1573:
1539:GitHub
1467:GitHub
1440:GitHub
1392:GitHub
1298:GitHub
1272:GitHub
1229:
1168:images
1083:images
1034:uglify
1004:return
872:return
517:$ gulp
387:is an
371:
366:gulpjs
282:github
90:it to
1156:watch
1132:watch
576:Tasks
471:Grunt
402:) in
315:macOS
311:Linux
288:/gulp
98:, or
1842:gulp
1808:ISBN
1789:ISBN
1770:ISBN
1571:ISBN
1227:ISBN
1150:gulp
1126:gulp
1099:task
1093:gulp
1081:and
1055:dest
1049:gulp
1043:pipe
1028:pipe
1007:gulp
983:task
977:gulp
953:and
923:dest
917:gulp
911:pipe
896:pipe
875:gulp
851:task
845:gulp
765:gulp
742:task
736:gulp
726:gulp
693:gulp
681:task
675:gulp
602:task
596:gulp
555:gulp
413:and
400:Make
385:gulp
368:.com
338:Type
284:.com
193:gulp
88:move
1844:on
1180:});
1177:();
1067:});
1064:));
1037:())
1013:src
963:npm
961:on
935:});
932:));
905:())
881:src
789:var
714:));
711:fn2
705:fn1
657:fn2
639:fn1
626:});
552:var
484:I/O
479:npm
475:npm
415:npm
142:by
1857::
1740:.
1716:.
1692:.
1667:.
1638:.
1585:^
1553:^
1537:.
1526:^
1510:.
1465:.
1454:^
1438:.
1406:^
1390:.
1366:.
1341:.
1295:.
1269:.
1213:^
1174:cb
1171:);
1147:);
1117:cb
998:()
866:()
807:);
757:);
754:fn
660:()
642:()
617:()
570:);
457:,
425:,
406:.
317:,
313:,
94:,
48:.
1816:.
1797:.
1778:.
1750:.
1726:.
1702:.
1678:.
1653:.
1624:.
1603:.
1579:.
1547:.
1520:.
1496:.
1475:.
1448:.
1424:.
1400:.
1376:.
1352:.
1327:.
1307:.
1281:.
1255:.
1235:.
1165:,
1159:(
1153:.
1141:,
1135:(
1129:.
1123:{
1120:)
1114:(
1108:,
1102:(
1096:.
1058:(
1052:.
1046:(
1040:.
1031:(
1025:.
1022:)
1016:(
1010:.
1001:{
992:,
986:(
980:.
926:(
920:.
914:(
908:.
899:(
893:.
890:)
884:(
878:.
869:{
860:,
854:(
848:.
801:(
795:=
751:,
745:(
739:.
708:,
702:(
696:.
690:,
684:(
678:.
669:}
663:{
651:}
645:{
620:{
611:,
605:(
599:.
564:(
558:=
264:)
239:)
183:)
177:(
165:)
159:(
154:)
150:(
146:.
136:.
110:)
106:(
102:.
80:.
55:)
51:(
Text is available under the Creative Commons Attribution-ShareAlike License. Additional terms may apply.