SlideShare une entreprise Scribd logo
1  sur  96
Rest in Practice:
Hypermedia e Cache
     Guilherme Silveira
     @guilhermecaelum
Guilherme Silveira
11 years, 1992: “Basic”
2002 guj.com.br
 2003 vraptor
2004 extreme programming
       2006 scrum
           ...
2009 restfulie




http://restfulie.caelumobjects.com/
2010 tectura




http://www.tectura.com.br
2004 caelum - daily life




    www.caelum.com.br
blogs


    blog.caelum.com.br
agilenomundoreal.com.br
 blog.caelumobjects.com
bank.com
bank.com   calendar.com
bank.com     calendar.com




travel.com
bank.com     calendar.com




travel.com   company.com
bank.com     calendar.com




travel.com   company.com
what is the future
 of integration
 over the web?
what was REST?
Restful Web


              Services
Restful Web

create a saas account

                        Services
Restful Web

create a saas account


   freeze account
                        Services
Restful Web

create a saas account


   freeze account
                        Services

 reactivate account
Web




Restful         Services
Web
          http




Restful          Services
Web
           http

          port 80




Restful             Services
Web
           http

          port 80


      firewall heaven


Restful             Services
Web Services


Restful
Web Services

             xml, json
Restful
Web Services

              xml, json
Restful
             get, post, ...
DESAFIO 1
rest
     =
web services
não
unresttrips.com: flight details



<?xml version="1.0" encoding="UTF-8" standalum="yes"?>
<flight>
  <information>
    <from>sao paulo</from>
    <to>seoul</to>
  </information>
  <value>900.00</value>
</flight>
service locator when integrating:
                         coupling++

                            unrest
                             pay


                    unresttrips.com

 guilherme
service locator when integrating:
                         coupling++

                            unrest
                             pay


                    unresttrips.com

 guilherme
resttrips.com: flight details



<?xml version="1.0" encoding="UTF-8" standalum="yes"?>
<flight>
  <information>
    <from>sao paulo</from>
    <to>seoul</to>
  </information>
  <value>900.00</value>
  <link rel="payment"
              href="http://resttrips.com/payment/custom"/
</flight>
resttrips.com: making the payment




flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment").
                  patch(cardInformation, value);
resttrips.com: changing its payment provider


<?xml version="1.0" encoding="UTF-8" standalum="yes"?>
<flight>
  <information>
    <from>sao paulo</from>
    <to>seoul</to>
  </information>
  <value>900.00</value>
  <link rel="payment"
              href="http://paysite.com/custom"/>
</flight>
dependency injection when integrating:

                             coupling--

                              restrips
                                pay

                        resttrips.com


   guilherme




                              paysite.com
dependency injection when integrating:

                             coupling--

                              restrips
                                pay

                        resttrips.com


   guilherme




                              paysite.com
DESAFIO 2
adicione 1 link
mas
eu não viajo sozinho
meu amigo
 sergio
resttrips.com: sharing a trip


flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment").
                  patch(cardInformation, value/2);

// send the payment link to another part of the web

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment").
                  patch(cardInformation, value/2);
resttrips.com: sharing a trip


flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment").
                  patch(cardInformation, value/2);

// send the payment link to another part of the web

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment").
                  patch(cardInformation, value/2);
resttrips.com: sharing a trip


flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment").
                  patch(cardInformation, value/2);

// send the payment link to another part of the web

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment").
                  patch(cardInformation, value/2);
calendar: integrating my systems


myself = Client.at('http://users.calendar.com')
                                .with(auth).get();

myself.link("calendar").patch(flight.link("self"));
calendar: integrating my systems


myself = Client.at('http://users.calendar.com')
                                .with(auth).get();

myself.link("calendar").patch(flight.link("self"));
calendar: more examples



me.link("calendar").patch(link_to_birthday_list)
me.link("calendar").patch(link_to_hotel_reservation)
me.link("calendar").patch(link_to_trip_details)
so what?
Any update on the flight ==> reflects here
Any update on the hotel ==> reflects here
Any update on the meeting ==> reflects here




                         so what?
DESAFIO 3
DESAFIO 3 e 4
Any update on the flight ==> reflects here
Any update on the hotel ==> reflects here
Any update on the meeting ==> reflects here




                         so what?
Any update on the flight ==> reflects here


                                               !
     Any update on the hotel ==> reflects here

                                            te
     Any update on the meeting ==> reflects here


                                     g ra
                            in t   e
                    s e   ,
             st   u
     ’t   ju                       so what?
d o n
Remove ==> Cancels the flight
Remove ==> Cancels the reservation
Remove ==> Emails your coworkers




                   so what?
Remove ==> Cancels the flight


                                    l!
            Remove ==> Cancels the reservation


                                 ro
            Remove ==> Emails your coworkers

                                t
                           co n
                 l iz    e
             tr a
        ce n
  o n’t                        so what?
d
so what? that was just keeping an URI.




                                        ro l!
                                   co nt
                         a li ze
                    en tr
              no tc
           o
          dRemove ==> Cancels the flight
           Remove ==> Cancels the reservation
           Remove ==> Emails your coworkers
DESAFIO 5
nosso sistema
‘rest’ funciona
    assim?
misc
#json, #xml,
#soap #etc?
which #json, #xml
      #etc?
micro formatos
atom
calendars
must ignore
integration over the web
integration over the web
cache
mov 2011        RELATÓRIO

     detalhes



mov 2011



     detalhes



mov 2011



     detalhes
mov 2010        RELATÓRIO

     detalhes



mov 2010



     detalhes



mov 2010



     detalhes
pagine!
pagine!
mov 2011



mov 2011



mov 2010


pagina 1
pagine!
mov 2011



mov 2011   mov 2010


mov 2010   mov 2010

pagina 1   pagina 2
pagine!
       A!
    AC
  C
mov 2011



mov 2011   mov 2010


mov 2010   mov 2010

pagina 1   pagina 2
pagine!
pagine!
mov 2011



mov 2011


pagina 1
pagine!
                mov 2010


mov 2011
                 mov 2010


mov 2011
                 mov 2010

pagina 1   pagina ano anterior
pagine!
       t u !
  u n i
B
                 mov 2010


 mov 2011
                  mov 2010


 mov 2011
                  mov 2010

 pagina 1   pagina ano anterior
quebre!
 mov 2010



 mov 2010



 mov 2010



 mov 2010
quebre!
 mov 2010
            detalhes


 mov 2010



 mov 2010



 mov 2010
quebre!
       LINK!!!
 mov 2010
             detalhes


 mov 2010



 mov 2010



 mov 2010
quebre!
           Q ?
       ? P
    LINK!!!
  mov 2010




     K
             detalhes




 I N
  mov 2010




L mov 2010



  mov 2010
quebre! O
        R N
         E T E
     H ELINK!!!
     mov 2010
                detalhes



  AC
C
     mov 2010



     mov 2010



     mov 2010
quebre! O
        R N
         E T E
     H ELINK!!!
     mov 2010
                detalhes



  AC
C
     mov 2010



     mov 2010



     mov 2010
quebre! O
         R N
who      E T E
     H
    wanELINK!!!
     mov 2010
                  detalhes


   C ts
  Ao
C f        to
     mov 2010


    rev         live
       er?
     mov 2010



     mov 2010
UM LINK POR VERSÃO
cache
não pode cachear?
acredite. você pode!
      cacheie
bottom up
   design by committe
       mime type?
      microformat
  controlled vocabulary
hypermedia
  integration over the web
hypermedia
         R E
     E B
 Q U
  integration over the web
LIN RE
hypermedia
     E
     KEB
 Q U
  integration over the web
LIN RIE
hypermedia
         E E
     E
     K
    CEHB
 Q
 C U
   A
  integration over the web
@guilhermecaelum
http://www.caelum.com.br




obrigado

Contenu connexe

En vedette

En vedette (8)

Sistemas Multimídia - Aula 03 - O que é Multimídia (Evolução da comunicação e...
Sistemas Multimídia - Aula 03 - O que é Multimídia (Evolução da comunicação e...Sistemas Multimídia - Aula 03 - O que é Multimídia (Evolução da comunicação e...
Sistemas Multimídia - Aula 03 - O que é Multimídia (Evolução da comunicação e...
 
Sistemas Multimídia - Aula 09 - A TERCEIRA DIMENSÃO (Computação gráfica trid...
Sistemas Multimídia - Aula 09 -  A TERCEIRA DIMENSÃO (Computação gráfica trid...Sistemas Multimídia - Aula 09 -  A TERCEIRA DIMENSÃO (Computação gráfica trid...
Sistemas Multimídia - Aula 09 - A TERCEIRA DIMENSÃO (Computação gráfica trid...
 
Sistemas Multimídia - Aula 06 - Autoria (Ferramentas para Autoria de Títulos,...
Sistemas Multimídia - Aula 06 - Autoria (Ferramentas para Autoria de Títulos,...Sistemas Multimídia - Aula 06 - Autoria (Ferramentas para Autoria de Títulos,...
Sistemas Multimídia - Aula 06 - Autoria (Ferramentas para Autoria de Títulos,...
 
Sistemas Multimídia - Aula 05 - As Plataformas (Ambientes e Configurações)
Sistemas Multimídia - Aula 05 - As Plataformas (Ambientes e Configurações)Sistemas Multimídia - Aula 05 - As Plataformas (Ambientes e Configurações)
Sistemas Multimídia - Aula 05 - As Plataformas (Ambientes e Configurações)
 
Sistemas Operacionais - Aula 01 (Conceitos básicos de so)
Sistemas Operacionais - Aula 01 (Conceitos básicos de so)Sistemas Operacionais - Aula 01 (Conceitos básicos de so)
Sistemas Operacionais - Aula 01 (Conceitos básicos de so)
 
Sistemas Multimídia - Aula 04 - O Que é Multimídia (Ambientes Multimídia e Pr...
Sistemas Multimídia - Aula 04 - O Que é Multimídia (Ambientes Multimídia e Pr...Sistemas Multimídia - Aula 04 - O Que é Multimídia (Ambientes Multimídia e Pr...
Sistemas Multimídia - Aula 04 - O Que é Multimídia (Ambientes Multimídia e Pr...
 
Sistemas Multimídia - Aula 01 - Apresentação
Sistemas Multimídia - Aula 01 - ApresentaçãoSistemas Multimídia - Aula 01 - Apresentação
Sistemas Multimídia - Aula 01 - Apresentação
 
Sistemas Multimídia - Aula 02 - Introdução
Sistemas Multimídia - Aula 02 - IntroduçãoSistemas Multimídia - Aula 02 - Introdução
Sistemas Multimídia - Aula 02 - Introdução
 

Similaire à REST: Hypermidia e Cache - DNAD 2011

Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
Pat Cito
 
Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)
True-Vision
 

Similaire à REST: Hypermidia e Cache - DNAD 2011 (20)

Arquitetura: chega de mesmice
Arquitetura: chega de mesmiceArquitetura: chega de mesmice
Arquitetura: chega de mesmice
 
Arquitetura chega de mesmice
Arquitetura  chega de mesmiceArquitetura  chega de mesmice
Arquitetura chega de mesmice
 
CloudKit
CloudKitCloudKit
CloudKit
 
The dark side of the app - Todi Appy Days 2015
The dark side of the app - Todi Appy Days 2015The dark side of the app - Todi Appy Days 2015
The dark side of the app - Todi Appy Days 2015
 
The dark side of the app
The dark side of the appThe dark side of the app
The dark side of the app
 
Lost in transaction - Strategies to deal with (in)consistency in distributed ...
Lost in transaction - Strategies to deal with (in)consistency in distributed ...Lost in transaction - Strategies to deal with (in)consistency in distributed ...
Lost in transaction - Strategies to deal with (in)consistency in distributed ...
 
Layar Events in New York and San Francisco
Layar Events in New York and San FranciscoLayar Events in New York and San Francisco
Layar Events in New York and San Francisco
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
Tying Your Shoes
Tying Your ShoesTying Your Shoes
Tying Your Shoes
 
Secure my ng-app
Secure my ng-appSecure my ng-app
Secure my ng-app
 
A reviravolta do desenvolvimento web
A reviravolta do desenvolvimento webA reviravolta do desenvolvimento web
A reviravolta do desenvolvimento web
 
The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016
 
Mojolicious: what works and what doesn't
Mojolicious: what works and what doesn'tMojolicious: what works and what doesn't
Mojolicious: what works and what doesn't
 
Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!
 
Building Single Page Application (SPA) with Symfony2 and AngularJS
Building Single Page Application (SPA) with Symfony2 and AngularJSBuilding Single Page Application (SPA) with Symfony2 and AngularJS
Building Single Page Application (SPA) with Symfony2 and AngularJS
 
Asynchronous programming patterns in Perl
Asynchronous programming patterns in PerlAsynchronous programming patterns in Perl
Asynchronous programming patterns in Perl
 
Sencha Touch e PhoneGap: SouJava - IBM Maio 2013
Sencha Touch e PhoneGap: SouJava - IBM Maio 2013Sencha Touch e PhoneGap: SouJava - IBM Maio 2013
Sencha Touch e PhoneGap: SouJava - IBM Maio 2013
 
Server-Side Push: Comet, Web Sockets come of age (OSCON 2013)
Server-Side Push: Comet, Web Sockets come of age (OSCON 2013)Server-Side Push: Comet, Web Sockets come of age (OSCON 2013)
Server-Side Push: Comet, Web Sockets come of age (OSCON 2013)
 
The Future of Progressive Web Apps - View Source conference, Berlin 2016
The Future of Progressive Web Apps - View Source conference, Berlin 2016The Future of Progressive Web Apps - View Source conference, Berlin 2016
The Future of Progressive Web Apps - View Source conference, Berlin 2016
 
Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)
 

Plus de Guilherme Silveira

Equipes ágeis em 2012 - Lições aprendidas
Equipes ágeis em 2012 - Lições aprendidasEquipes ágeis em 2012 - Lições aprendidas
Equipes ágeis em 2012 - Lições aprendidas
Guilherme Silveira
 
Introducao a machine learning na educacao
Introducao a machine learning na educacaoIntroducao a machine learning na educacao
Introducao a machine learning na educacao
Guilherme Silveira
 
Caelum 2009 Rest Ao Restful - CEJUG 2009
Caelum 2009   Rest Ao Restful - CEJUG 2009Caelum 2009   Rest Ao Restful - CEJUG 2009
Caelum 2009 Rest Ao Restful - CEJUG 2009
Guilherme Silveira
 

Plus de Guilherme Silveira (18)

Equipes ágeis em 2012 - Lições aprendidas
Equipes ágeis em 2012 - Lições aprendidasEquipes ágeis em 2012 - Lições aprendidas
Equipes ágeis em 2012 - Lições aprendidas
 
Introducao a machine learning na educacao
Introducao a machine learning na educacaoIntroducao a machine learning na educacao
Introducao a machine learning na educacao
 
Depois de Scrum e XP: não pare de aprender, não pare de inovar
Depois de Scrum e XP: não pare de aprender, não pare de inovarDepois de Scrum e XP: não pare de aprender, não pare de inovar
Depois de Scrum e XP: não pare de aprender, não pare de inovar
 
O grandiosismo dos loucos - Agile Brazil 2011, Cecilia Fernandes e Guilherme ...
O grandiosismo dos loucos - Agile Brazil 2011, Cecilia Fernandes e Guilherme ...O grandiosismo dos loucos - Agile Brazil 2011, Cecilia Fernandes e Guilherme ...
O grandiosismo dos loucos - Agile Brazil 2011, Cecilia Fernandes e Guilherme ...
 
Software de qualidade e qualidade de código
Software de qualidade e qualidade de códigoSoftware de qualidade e qualidade de código
Software de qualidade e qualidade de código
 
Using the web for real
Using the web for realUsing the web for real
Using the web for real
 
Arquitetura: chega de mesmice
Arquitetura: chega de mesmiceArquitetura: chega de mesmice
Arquitetura: chega de mesmice
 
Rest @ Qcon 2010
Rest @ Qcon 2010Rest @ Qcon 2010
Rest @ Qcon 2010
 
Rest clients
Rest clientsRest clients
Rest clients
 
Rest clients
Rest clientsRest clients
Rest clients
 
Rest clients
Rest clientsRest clients
Rest clients
 
Um produto por semana
Um produto por semanaUm produto por semana
Um produto por semana
 
Deploy continuo, integraçao continua não basta
Deploy continuo, integraçao continua não bastaDeploy continuo, integraçao continua não basta
Deploy continuo, integraçao continua não basta
 
noSql + rest: Arquitetura Contemporanea
noSql + rest: Arquitetura ContemporaneanoSql + rest: Arquitetura Contemporanea
noSql + rest: Arquitetura Contemporanea
 
Rest workflows
Rest workflowsRest workflows
Rest workflows
 
Caelum 2010 - Rest Arquitetura Irreponsavel?
Caelum 2010 - Rest Arquitetura Irreponsavel?Caelum 2010 - Rest Arquitetura Irreponsavel?
Caelum 2010 - Rest Arquitetura Irreponsavel?
 
REST in Practice
REST in PracticeREST in Practice
REST in Practice
 
Caelum 2009 Rest Ao Restful - CEJUG 2009
Caelum 2009   Rest Ao Restful - CEJUG 2009Caelum 2009   Rest Ao Restful - CEJUG 2009
Caelum 2009 Rest Ao Restful - CEJUG 2009
 

Dernier

Dernier (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
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
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 

REST: Hypermidia e Cache - DNAD 2011

Notes de l'éditeur

  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
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n