SlideShare uma empresa Scribd logo
1 de 22
Contrib First
A change to how we write modules
By Andrew Riley
Director of Drupal Development
               @andrewmriley
Contrib First?
http://www.mediacurrent.com/drupal-give
Definition
 A method of treating your developed modules as
 contributed modules that you use and or adapt for your
 clients needs.
What it isn’t
 Creating a module for your client with the best intentions
 to go back once the site has launched and submit it to
 drupal.org
Why
 Good for the community
 Good for the company
 Good for you
 Good for your client/project
But we release modules!


            Really? How many?
       How many were never released?
Won’t it take more time?
 Public modules/sandboxes are a give and take
 Community will sometimes provide patches
 Community will often times request new features
 Either way, you, the company and the community are
  benefiting
Eat our own dog food
 Save fellow developers from recreating the wheel
 Its always nice when a module’s author is on staff
 You code to a higher standard when others are
  watching
Module Anatomy 101
“Glue” module
 Glues together two or more contrib modules
 Quick and dirty
 Addresses client needs but is very client specific
 Isn’t reusable
 Not always a bad thing (when used properly)
Contrib Module
 Exposes hooks for other modules to use
 Has a defined administration/configuration section
 Has documentation*
 Is reusable
 Follows coding standards
How to Contrib First
Steps
 Figure out how client specific your requirements are
 Find out if it already exists
 Can you hook or modify an existing module*
 Write your contrib module and commit it
 Write your glue module
 Profit? Your module is already published on d.o.
Client Specific?
 How much of this module will only be used by this client?
 Can you split out client specific code into a glue module?
 In this case does “client specific” really mean “industry
  specific”?
 Does it really have to be client specific?
Don’t duplicate work
 How close is an existing module?
 Does the related module provide hooks for you to use?
 Could your functionality help an existing contrib module?
 Is there an abandoned contrib module?
Write your own
 No hardcodes and limited constants
 Include an administration/config page for everything
 Add in hooks. You may not need them but somebody else
  might.
 It doesn’t have to be perfect.
 USE THE CODER MODULE
drupal.org
 You NEED to have access to create full projects
 Anybody can create sandboxes
 You can have multiple sandboxes
 Sandboxes are baby projects for development
The Cost

 Overall making a contrib first module costs anywhere
 between 5 - 20% additional time over creating a
 hardcoded client specific module.
End Result?
 You have either:


   Saved your company time/money by re-using existing
        modules (and contributing back changes)
                         - or -
  Made yourself and your company more marketable by
   publishing a new module all while helping out the
          community and your client/project.
Recap
 Figure out your requirements
 Search for existing modules
 Create your own module
 Host it on drupal.org
Mediacurrent helps organizations architect custom websites by
leveraging our proven processes and deep expertise in Drupal.



       @mediacurrent               mediacurrent.com

Mais conteúdo relacionado

Mais procurados

Requirements & Drupal: Planning for Successful Projects
Requirements & Drupal: Planning for Successful ProjectsRequirements & Drupal: Planning for Successful Projects
Requirements & Drupal: Planning for Successful Projects
Acquia
 
Intro to wordpress short course
Intro to wordpress short courseIntro to wordpress short course
Intro to wordpress short course
carishurd
 
BADCamp 2012 -Beginner Best Practices
BADCamp 2012 -Beginner Best PracticesBADCamp 2012 -Beginner Best Practices
BADCamp 2012 -Beginner Best Practices
meghsweet
 
Supporting a Drupal site over the Longterm
Supporting a Drupal site over the LongtermSupporting a Drupal site over the Longterm
Supporting a Drupal site over the Longterm
meghsweet
 
Integrating grunt and bower with maven
Integrating grunt and bower with mavenIntegrating grunt and bower with maven
Integrating grunt and bower with maven
Rahul Nanwani
 
Web development today
Web development todayWeb development today
Web development today
Jaydev Gajera
 
Sand camp beginner drupal development
Sand camp beginner drupal developmentSand camp beginner drupal development
Sand camp beginner drupal development
meghsweet
 

Mais procurados (20)

Time's Important - Let Task Management Save Yours
Time's Important - Let Task Management Save YoursTime's Important - Let Task Management Save Yours
Time's Important - Let Task Management Save Yours
 
Advanced custom fields in Wordpress
Advanced custom fields in WordpressAdvanced custom fields in Wordpress
Advanced custom fields in Wordpress
 
Requirements & Drupal: Planning for Successful Projects
Requirements & Drupal: Planning for Successful ProjectsRequirements & Drupal: Planning for Successful Projects
Requirements & Drupal: Planning for Successful Projects
 
Intro to wordpress short course
Intro to wordpress short courseIntro to wordpress short course
Intro to wordpress short course
 
Drupal vs wordpess
Drupal vs wordpessDrupal vs wordpess
Drupal vs wordpess
 
What are the advantages and disadvantages of wordpress
What are the advantages and disadvantages of wordpressWhat are the advantages and disadvantages of wordpress
What are the advantages and disadvantages of wordpress
 
Large drupal site builds a workshop for sxsw interactive - march 17, 2015
Large drupal site builds   a workshop for sxsw interactive - march 17, 2015Large drupal site builds   a workshop for sxsw interactive - march 17, 2015
Large drupal site builds a workshop for sxsw interactive - march 17, 2015
 
Drupal for beginners - Global Training Days - Cebu 2016
Drupal for beginners - Global Training Days - Cebu 2016Drupal for beginners - Global Training Days - Cebu 2016
Drupal for beginners - Global Training Days - Cebu 2016
 
BADCamp 2012 -Beginner Best Practices
BADCamp 2012 -Beginner Best PracticesBADCamp 2012 -Beginner Best Practices
BADCamp 2012 -Beginner Best Practices
 
Choosing the "right" CMS
Choosing the "right" CMSChoosing the "right" CMS
Choosing the "right" CMS
 
Build a DNN Module in Minutes
Build a DNN Module in MinutesBuild a DNN Module in Minutes
Build a DNN Module in Minutes
 
Supporting a Drupal site over the Longterm
Supporting a Drupal site over the LongtermSupporting a Drupal site over the Longterm
Supporting a Drupal site over the Longterm
 
Top java script frameworks ppt
Top java script frameworks pptTop java script frameworks ppt
Top java script frameworks ppt
 
Using Features
Using FeaturesUsing Features
Using Features
 
Simplifying the Drupal Admin Experience
Simplifying the Drupal Admin ExperienceSimplifying the Drupal Admin Experience
Simplifying the Drupal Admin Experience
 
Made with drupal 8
Made with drupal 8Made with drupal 8
Made with drupal 8
 
Integrating grunt and bower with maven
Integrating grunt and bower with mavenIntegrating grunt and bower with maven
Integrating grunt and bower with maven
 
Web development today
Web development todayWeb development today
Web development today
 
Sand camp beginner drupal development
Sand camp beginner drupal developmentSand camp beginner drupal development
Sand camp beginner drupal development
 
DNN Database Tips & Tricks
DNN Database Tips & TricksDNN Database Tips & Tricks
DNN Database Tips & Tricks
 

Destaque

U.S. Embassy reference letter- Tika
U.S. Embassy reference letter- TikaU.S. Embassy reference letter- Tika
U.S. Embassy reference letter- Tika
Kartika Melania
 
Sistemas y Tecnologias de la Información
Sistemas y Tecnologias de la InformaciónSistemas y Tecnologias de la Información
Sistemas y Tecnologias de la Información
profgloria
 
Vladímir llich uliánov lenin
Vladímir llich uliánov leninVladímir llich uliánov lenin
Vladímir llich uliánov lenin
yuri-guerra
 

Destaque (9)

U.S. Embassy reference letter- Tika
U.S. Embassy reference letter- TikaU.S. Embassy reference letter- Tika
U.S. Embassy reference letter- Tika
 
Función del período de adaptación
Función del período de adaptaciónFunción del período de adaptación
Función del período de adaptación
 
Lawrence Photography
Lawrence PhotographyLawrence Photography
Lawrence Photography
 
Genel Jeoloji Çalışmalarında Rapor Hazırlama, Prof. Dr. Tahir EMRE
Genel Jeoloji Çalışmalarında Rapor Hazırlama, Prof. Dr. Tahir EMREGenel Jeoloji Çalışmalarında Rapor Hazırlama, Prof. Dr. Tahir EMRE
Genel Jeoloji Çalışmalarında Rapor Hazırlama, Prof. Dr. Tahir EMRE
 
A jugar!
A jugar!A jugar!
A jugar!
 
Rafael alberti
Rafael albertiRafael alberti
Rafael alberti
 
Búhos números
Búhos númerosBúhos números
Búhos números
 
Sistemas y Tecnologias de la Información
Sistemas y Tecnologias de la InformaciónSistemas y Tecnologias de la Información
Sistemas y Tecnologias de la Información
 
Vladímir llich uliánov lenin
Vladímir llich uliánov leninVladímir llich uliánov lenin
Vladímir llich uliánov lenin
 

Semelhante a Contrib First

Contributing to Drupal
Contributing to DrupalContributing to Drupal
Contributing to Drupal
Chris Skene
 
Java Design Pattern Interview Questions
Java Design Pattern Interview QuestionsJava Design Pattern Interview Questions
Java Design Pattern Interview Questions
jbashask
 
Design pattern in an expressive language java script
Design pattern in an expressive language java scriptDesign pattern in an expressive language java script
Design pattern in an expressive language java script
Amit Thakkar
 

Semelhante a Contrib First (20)

Contributing to Drupal
Contributing to DrupalContributing to Drupal
Contributing to Drupal
 
Chennai Drupal Meet
Chennai Drupal MeetChennai Drupal Meet
Chennai Drupal Meet
 
Drupal training-by-ruchiwebsolutions
Drupal training-by-ruchiwebsolutionsDrupal training-by-ruchiwebsolutions
Drupal training-by-ruchiwebsolutions
 
Drupal Site Building for Developers
Drupal Site Building for DevelopersDrupal Site Building for Developers
Drupal Site Building for Developers
 
The Drupal 7 Worst Practices Catalogue
The Drupal 7 Worst Practices CatalogueThe Drupal 7 Worst Practices Catalogue
The Drupal 7 Worst Practices Catalogue
 
Beginner's guide to drupal
Beginner's guide to drupalBeginner's guide to drupal
Beginner's guide to drupal
 
January 2017 - WPCampus Online - Learning from Drupal: Implementing WordPress...
January 2017 - WPCampus Online - Learning from Drupal: Implementing WordPress...January 2017 - WPCampus Online - Learning from Drupal: Implementing WordPress...
January 2017 - WPCampus Online - Learning from Drupal: Implementing WordPress...
 
Design pattern
Design patternDesign pattern
Design pattern
 
Design patterns tutorials
Design patterns tutorialsDesign patterns tutorials
Design patterns tutorials
 
Building API's
Building API'sBuilding API's
Building API's
 
Constantly Contributing Pretty Patches FLCD
Constantly Contributing Pretty Patches FLCDConstantly Contributing Pretty Patches FLCD
Constantly Contributing Pretty Patches FLCD
 
Why Design Patterns Are Important In Software Engineering
Why Design Patterns Are Important In Software EngineeringWhy Design Patterns Are Important In Software Engineering
Why Design Patterns Are Important In Software Engineering
 
Java Design Pattern Interview Questions
Java Design Pattern Interview QuestionsJava Design Pattern Interview Questions
Java Design Pattern Interview Questions
 
Agile Model.pdf
Agile Model.pdfAgile Model.pdf
Agile Model.pdf
 
Turbo Charging Moodle
Turbo Charging MoodleTurbo Charging Moodle
Turbo Charging Moodle
 
Dev ops days berlin damien caro
Dev ops days berlin   damien caroDev ops days berlin   damien caro
Dev ops days berlin damien caro
 
Why drupal should power your next web project
Why drupal should power your next web projectWhy drupal should power your next web project
Why drupal should power your next web project
 
Amuse UX 2015: Y.Vetrov — Platform Thinking
Amuse UX 2015: Y.Vetrov — Platform ThinkingAmuse UX 2015: Y.Vetrov — Platform Thinking
Amuse UX 2015: Y.Vetrov — Platform Thinking
 
Design pattern in an expressive language java script
Design pattern in an expressive language java scriptDesign pattern in an expressive language java script
Design pattern in an expressive language java script
 
ArgoUML.ppt
ArgoUML.pptArgoUML.ppt
ArgoUML.ppt
 

Mais de Mediacurrent

Mais de Mediacurrent (20)

Penn State News: Pivoting to Decoupled Drupal with Gatsby
Penn State News: Pivoting to Decoupled Drupal with GatsbyPenn State News: Pivoting to Decoupled Drupal with Gatsby
Penn State News: Pivoting to Decoupled Drupal with Gatsby
 
Evolving How We Measure Digital Success in Higher Ed
Evolving How We Measure Digital Success in Higher EdEvolving How We Measure Digital Success in Higher Ed
Evolving How We Measure Digital Success in Higher Ed
 
Penn State scales static Drupal to new heights
Penn State scales static Drupal to new heightsPenn State scales static Drupal to new heights
Penn State scales static Drupal to new heights
 
Delivering Meaningful Digital Experiences in Higher Ed
Delivering Meaningful Digital Experiences in Higher EdDelivering Meaningful Digital Experiences in Higher Ed
Delivering Meaningful Digital Experiences in Higher Ed
 
Content Strategy: Building Connections with Your Audience
Content Strategy: Building Connections with Your AudienceContent Strategy: Building Connections with Your Audience
Content Strategy: Building Connections with Your Audience
 
Decoupled Drupal and Gatsby in the Real World
Decoupled Drupal and Gatsby in the Real WorldDecoupled Drupal and Gatsby in the Real World
Decoupled Drupal and Gatsby in the Real World
 
A Better Way to Build and Manage Sites with Rain for Drupal 9
A Better Way to Build and Manage Sites with Rain for Drupal 9A Better Way to Build and Manage Sites with Rain for Drupal 9
A Better Way to Build and Manage Sites with Rain for Drupal 9
 
Drupal Security: What You Need to Know
Drupal Security: What You Need to KnowDrupal Security: What You Need to Know
Drupal Security: What You Need to Know
 
Leveraging Design Systems to Streamline Web Projects
Leveraging Design Systems to Streamline Web ProjectsLeveraging Design Systems to Streamline Web Projects
Leveraging Design Systems to Streamline Web Projects
 
Reimagining Your Higher Ed Web Strategy
Reimagining Your Higher Ed Web StrategyReimagining Your Higher Ed Web Strategy
Reimagining Your Higher Ed Web Strategy
 
How to Digitally Transform Higher Ed with Drupal
How to Digitally Transform Higher Ed with DrupalHow to Digitally Transform Higher Ed with Drupal
How to Digitally Transform Higher Ed with Drupal
 
Is my website accessible? Common mistakes (and how to fix them)
Is my website accessible? Common mistakes (and how to fix them)Is my website accessible? Common mistakes (and how to fix them)
Is my website accessible? Common mistakes (and how to fix them)
 
Managing Images In Large Scale Drupal 8 & 9 Websites
Managing Images In Large Scale Drupal 8 & 9 WebsitesManaging Images In Large Scale Drupal 8 & 9 Websites
Managing Images In Large Scale Drupal 8 & 9 Websites
 
Paragraphs v Layout Builder - The Final Showdown
Paragraphs v Layout Builder - The Final ShowdownParagraphs v Layout Builder - The Final Showdown
Paragraphs v Layout Builder - The Final Showdown
 
MagMutual.com: On the JAMStack with Gatsby and Drupal 8
 MagMutual.com: On the JAMStack with Gatsby and Drupal 8 MagMutual.com: On the JAMStack with Gatsby and Drupal 8
MagMutual.com: On the JAMStack with Gatsby and Drupal 8
 
Creating an Organizational Culture of Giving Back to Drupal
Creating an Organizational Culture of Giving Back to DrupalCreating an Organizational Culture of Giving Back to Drupal
Creating an Organizational Culture of Giving Back to Drupal
 
Level Up Your Team: Front-End Development Best Practices
Level Up Your Team: Front-End Development Best PracticesLevel Up Your Team: Front-End Development Best Practices
Level Up Your Team: Front-End Development Best Practices
 
Best Practices for Moving to Drupal 9
Best Practices for Moving to Drupal 9Best Practices for Moving to Drupal 9
Best Practices for Moving to Drupal 9
 
How to Prove Marketing ROI: Overcoming Digital Marketing Challenges
How to Prove Marketing ROI: Overcoming Digital Marketing ChallengesHow to Prove Marketing ROI: Overcoming Digital Marketing Challenges
How to Prove Marketing ROI: Overcoming Digital Marketing Challenges
 
Prepare Your Drupal 9 Action Plan
Prepare Your Drupal 9 Action Plan Prepare Your Drupal 9 Action Plan
Prepare Your Drupal 9 Action Plan
 

Último

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 

Contrib First

  • 1. Contrib First A change to how we write modules
  • 2. By Andrew Riley Director of Drupal Development @andrewmriley
  • 4. Definition A method of treating your developed modules as contributed modules that you use and or adapt for your clients needs.
  • 5. What it isn’t Creating a module for your client with the best intentions to go back once the site has launched and submit it to drupal.org
  • 6. Why  Good for the community  Good for the company  Good for you  Good for your client/project
  • 7. But we release modules! Really? How many? How many were never released?
  • 8. Won’t it take more time?  Public modules/sandboxes are a give and take  Community will sometimes provide patches  Community will often times request new features  Either way, you, the company and the community are benefiting
  • 9. Eat our own dog food  Save fellow developers from recreating the wheel  Its always nice when a module’s author is on staff  You code to a higher standard when others are watching
  • 11. “Glue” module  Glues together two or more contrib modules  Quick and dirty  Addresses client needs but is very client specific  Isn’t reusable  Not always a bad thing (when used properly)
  • 12. Contrib Module  Exposes hooks for other modules to use  Has a defined administration/configuration section  Has documentation*  Is reusable  Follows coding standards
  • 13. How to Contrib First
  • 14. Steps  Figure out how client specific your requirements are  Find out if it already exists  Can you hook or modify an existing module*  Write your contrib module and commit it  Write your glue module  Profit? Your module is already published on d.o.
  • 15. Client Specific?  How much of this module will only be used by this client?  Can you split out client specific code into a glue module?  In this case does “client specific” really mean “industry specific”?  Does it really have to be client specific?
  • 16. Don’t duplicate work  How close is an existing module?  Does the related module provide hooks for you to use?  Could your functionality help an existing contrib module?  Is there an abandoned contrib module?
  • 17. Write your own  No hardcodes and limited constants  Include an administration/config page for everything  Add in hooks. You may not need them but somebody else might.  It doesn’t have to be perfect.  USE THE CODER MODULE
  • 18. drupal.org  You NEED to have access to create full projects  Anybody can create sandboxes  You can have multiple sandboxes  Sandboxes are baby projects for development
  • 19. The Cost Overall making a contrib first module costs anywhere between 5 - 20% additional time over creating a hardcoded client specific module.
  • 20. End Result? You have either: Saved your company time/money by re-using existing modules (and contributing back changes) - or - Made yourself and your company more marketable by publishing a new module all while helping out the community and your client/project.
  • 21. Recap  Figure out your requirements  Search for existing modules  Create your own module  Host it on drupal.org
  • 22. Mediacurrent helps organizations architect custom websites by leveraging our proven processes and deep expertise in Drupal. @mediacurrent mediacurrent.com

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n