Advertisement
Guest User

RavenDB Lucene Search issue

a guest
Oct 8th, 2013
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 20.84 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using Raven.Abstractions.Indexing;
  4. using Raven.Client.Document;
  5. using Raven.Client.Indexes;
  6. using Raven.Client;
  7.  
  8. namespace ConsoleApplication1
  9. {
  10.     /// <summary>
  11.     /// In order to run the example:
  12.     ///
  13.     /// - adjust the connection information in CreateMyDocumentStore()
  14.     /// - run SeedData() to generate sample data in the database
  15.     /// - run Search() to reproduce the problem of (apparently) unsorted results
  16.     /// </summary>
  17.     public class RavenDBLucene
  18.     {
  19.         private static DocumentStore CreateMyDocumentStore()
  20.         {
  21.             var ds = new DocumentStore
  22.             {
  23.  
  24.                 Url = "http://localhost:8085",
  25.                 DefaultDatabase = "LuceneSearchTest"
  26.             };
  27.  
  28.             ds.Initialize();
  29.  
  30.             IndexCreation.CreateIndexes(typeof(TextIndex).Assembly, ds);
  31.  
  32.             return ds;
  33.         }
  34.  
  35.         public void SeedData()
  36.         {
  37.             using (var ds = CreateMyDocumentStore())
  38.             using (var session = ds.OpenSession())
  39.             {
  40.                 var docs =
  41.                     new[] { Text1, Text2, Text3 }
  42.                         .Select(t => new TextDocument { IndexedText = t });
  43.  
  44.                 foreach (var doc in docs)
  45.                     session.Store(doc);
  46.  
  47.                 session.SaveChanges();
  48.             }
  49.         }
  50.  
  51.         private string[] _searchCriteria = new[]
  52.                                                {
  53.                                                    "venenatis OR tortor OR tellus",
  54.                                                    "justo OR facilisis OR iaculis",
  55.                                                    "dignissim OR sodales OR aenean",
  56.                                                    "in OR ornare OR bibendum OR orci",
  57.                                                    "magna OR id OR hendrerit OR dapibus",
  58.                                                    "metus OR nunc OR eleifend OR praesent",
  59.                                                    "accumsan OR in OR turpis OR venenatis",
  60.                                                    "at OR bibendum OR in",
  61.                                                    "primis OR sit OR interdum",
  62.                                                    "eu OR enim OR massa"
  63.                                                };
  64.  
  65.         public void Search()
  66.         {
  67.             using (var ds = CreateMyDocumentStore())
  68.             using (var session = ds.OpenSession())
  69.             {
  70.                 foreach (var criterion in _searchCriteria)
  71.                 {
  72.                     var results = session.Query<TextDocument, TextIndex>()
  73.                                          .Search(x => x.IndexedText, criterion)
  74.                                          .OrderByScore()
  75.                                          .ToList();
  76.  
  77.                     Console.WriteLine("--- Result scores for [{0}]:", criterion);
  78.  
  79.                     foreach (var textDocument in results)
  80.                     {
  81.                         var score = session.Advanced.GetMetadataFor(textDocument)
  82.                                            .Value<double>("Temp-Index-Score");
  83.                         Console.WriteLine(score);
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.  
  89.         private const string Text1 =
  90.             @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus nec lorem pulvinar, feugiat erat vitae, tempor nibh. Integer adipiscing turpis ipsum. Mauris id urna arcu. Donec sit amet diam quis tellus sagittis consectetur at a sapien. Sed eget libero a eros feugiat faucibus. Aliquam erat volutpat. Donec ut suscipit sapien. Curabitur elementum congue lacus, non aliquet magna porttitor a.
  91. Nulla ut odio semper augue bibendum ullamcorper. Donec hendrerit odio rutrum urna sollicitudin porttitor. Quisque turpis ligula, volutpat id risus fermentum, aliquam dignissim arcu. Maecenas a sem vitae mauris sodales blandit eu in neque. Aenean quis magna at quam tincidunt pretium. Aenean ut mattis sem. Praesent rutrum ornare quam, nec cursus orci varius nec. Vivamus eget purus a ipsum sollicitudin lacinia sit amet sit amet lacus. Maecenas quis augue nulla. Mauris auctor magna eget massa ultricies ullamcorper. Proin hendrerit ligula eget mauris suscipit mattis. Nullam quam purus, fermentum vel rhoncus quis, egestas sit amet eros. Duis tristique elit bibendum mi tristique malesuada.
  92. Proin vel aliquam augue. Proin dignissim dui tellus, vel molestie ipsum fermentum gravida. Sed aliquam mi enim, sed consectetur elit varius vitae. Praesent sagittis justo egestas, sodales ipsum in, vulputate nibh. Cras scelerisque augue nisi, in laoreet odio iaculis quis. Fusce justo turpis, rhoncus in fermentum ac, hendrerit ut lectus. Ut dapibus lobortis ante at porta. Aenean ut justo ut erat dapibus condimentum. Maecenas cursus eros eget metus commodo, ut accumsan lorem ornare. Phasellus tincidunt consequat ultrices. Curabitur iaculis sagittis tortor nec venenatis. In pretium urna felis, ac convallis velit hendrerit eget. Sed nunc ligula, fermentum eget euismod eget, dignissim vel risus.
  93. Cras ultrices posuere rutrum. Ut ac viverra leo, pharetra aliquet sapien. Sed at sodales turpis. Duis non commodo ante, vel fringilla mi. Sed mattis diam eget mauris volutpat auctor. Donec dignissim aliquam scelerisque. Vestibulum non purus laoreet, pretium sapien sed, dictum nibh. Morbi eu iaculis ipsum. Nullam feugiat diam lacus, ut imperdiet odio porta malesuada. Donec pulvinar lacinia odio in interdum. Proin volutpat tellus nisl, ut ultrices orci bibendum dapibus. Aliquam bibendum purus ipsum, at ornare est rhoncus ac. Proin pretium ullamcorper quam, sed volutpat est hendrerit non. Nulla vestibulum felis ut dui elementum commodo.
  94. Nulla facilisi. Nulla nibh mauris, gravida ac mauris vitae, vehicula ultricies mi. Duis eget dolor quis nibh dictum tristique sit amet at nisl. Quisque sapien ante, vehicula placerat risus et, pretium adipiscing erat. Nunc hendrerit ullamcorper libero eu congue. In molestie vulputate orci, vel auctor quam interdum nec. Etiam id eros vel felis vulputate elementum. Aenean sed enim eu leo tristique imperdiet sed eget lectus. Integer nunc nibh, tincidunt vitae aliquet quis, porta sit amet sapien. Ut vitae nulla vitae eros mattis semper et a enim. Pellentesque congue ligula vel dui placerat cursus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean quis lorem sed nisi rhoncus cursus.
  95. Duis rutrum iaculis ultricies. Vivamus euismod orci in faucibus ultrices. Sed ac nibh consequat felis egestas pulvinar. Nulla accumsan auctor ipsum, sit amet adipiscing metus condimentum eget. Ut eleifend neque vel vulputate ultrices. In interdum cursus posuere. Nam cursus tempus condimentum.
  96. Curabitur fermentum nisl nunc, eu pretium erat dignissim et. Sed id sapien tristique quam imperdiet fermentum. Donec ac porttitor ante. Nulla vel ligula eu sem porta vestibulum ut non velit. Morbi eu metus eu nibh placerat luctus in sit amet mauris. Sed vitae ipsum a mauris placerat varius ut eget quam. In hac habitasse platea dictumst. Fusce velit enim, consectetur a dolor ut, ultrices scelerisque nunc. Duis cursus suscipit odio. Nunc eu massa ac metus venenatis posuere non sed massa. Sed ullamcorper euismod sapien, faucibus vehicula sem lobortis eget. Integer porttitor, nulla quis viverra malesuada, dolor nisi pharetra velit, in volutpat mi metus accumsan orci. Ut sollicitudin vulputate gravida. Nunc ut facilisis ipsum. Aenean lobortis nec erat non scelerisque. Aenean non sodales massa, in vulputate sapien.
  97. Fusce tempor nibh eu nibh iaculis, eu venenatis lectus varius. Nulla imperdiet nisl vitae turpis mattis gravida. Fusce ornare nisl ut suscipit convallis. Maecenas nec neque massa. Suspendisse arcu sem, condimentum sit amet metus et, mollis molestie diam. Nunc rutrum purus non quam vestibulum, nec mattis nunc molestie. Donec molestie massa pretium diam eleifend, sit amet mollis risus condimentum. Nulla venenatis viverra augue, eu adipiscing urna auctor sit amet. Praesent ac laoreet tellus, sed aliquam urna. Donec rhoncus facilisis pellentesque. Maecenas sollicitudin nec erat sodales rutrum.
  98. In a euismod leo. Nulla quis tincidunt enim, eu fermentum augue. In et sem nec velit ultricies vulputate. Sed a lacus quis justo fringilla semper. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc convallis elit vitae lorem semper, id laoreet urna consequat. Suspendisse in mauris in sem mollis malesuada id a augue. Vestibulum libero est, sollicitudin et orci ac, blandit commodo justo.
  99. Nam in eros eu purus imperdiet tincidunt eu sed risus. Maecenas egestas arcu at nunc vestibulum cursus. Praesent quis interdum lorem. Vivamus congue pulvinar lacus non facilisis. In hac habitasse platea dictumst. Nam iaculis erat vel diam tincidunt, a luctus neque lobortis. Proin euismod ultrices euismod. Pellentesque at ligula ut tortor egestas gravida a sit amet nibh. Morbi iaculis aliquam enim nec congue. Suspendisse condimentum sagittis elit, non iaculis urna viverra quis. Mauris pellentesque est in sodales ullamcorper. Sed varius tellus eget facilisis volutpat.";
  100.  
  101.         private const string Text2 =
  102.             @"Donec consequat, enim vitae faucibus sodales, diam enim vehicula nunc, quis accumsan nisi mi quis nisi. Quisque massa justo, interdum quis lorem sit amet, sagittis dictum mi. Nulla ac magna sed lacus imperdiet rutrum. Ut ullamcorper facilisis mollis. Donec justo sem, sagittis nec ante tempus, auctor porttitor lorem. Nunc orci nisl, euismod sed gravida in, commodo non risus. Sed nibh purus, tristique varius sem quis, suscipit consequat dui. Ut consequat pretium turpis, a tristique neque consequat nec. Nulla magna ligula, dignissim vitae metus eget, varius egestas sapien. Vivamus pharetra tempus libero et congue. Praesent nisi est, mollis a urna iaculis, adipiscing facilisis ante. Phasellus odio arcu, sodales id augue non, vulputate eleifend ante. Donec ipsum arcu, iaculis et laoreet sed, posuere ut erat. Donec ac facilisis mauris, a luctus sapien.
  103. Nulla commodo nibh a congue dignissim. Nam sed eros vel diam iaculis auctor vitae non justo. Suspendisse convallis magna augue, id fermentum mauris consequat at. Etiam sodales condimentum mi sit amet cursus. Suspendisse potenti. Etiam dictum, arcu eu cursus lacinia, arcu massa fringilla eros, ac adipiscing turpis ipsum ut lacus. Morbi vehicula quis ipsum quis euismod. In hac habitasse platea dictumst. Ut vulputate rutrum lacus, non adipiscing ligula.
  104. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus rutrum bibendum est, vel auctor metus blandit ac. Praesent lacus urna, ultricies eget libero vel, tempor commodo elit. Vestibulum congue id velit in ultrices. Nulla ut facilisis tortor. Vivamus sit amet tortor faucibus, ultrices massa sed, porta nisl. Donec vitae ante vitae mauris aliquet ullamcorper sed at velit. Aenean tincidunt, mi sit amet ultricies hendrerit, enim mauris tempor purus, a fringilla ante turpis sed sem.
  105. Nulla sed nisi at libero fringilla molestie. Sed molestie orci ac accumsan facilisis. Vivamus et erat vitae lorem iaculis tristique. In hac habitasse platea dictumst. Ut eleifend nisi purus, quis tempus mauris bibendum eu. Nulla viverra ornare facilisis. Sed sit amet mauris sed nunc ultrices mollis eget sit amet ante. Aenean vitae dapibus massa. Vestibulum at ultrices turpis. Integer mi mi, consectetur in aliquet eu, rutrum in sem. Etiam elementum velit eros, et molestie felis tempus vel. Sed sit amet scelerisque urna. Donec a fringilla erat, et hendrerit nulla.
  106. Sed vehicula, mi sed tempus convallis, leo sem hendrerit risus, at gravida neque sapien vitae lectus. Curabitur sit amet metus id dui sodales molestie. Curabitur non nulla quis nisi egestas aliquam. Nulla convallis lorem felis, sed consequat tortor ornare sit amet. Etiam est risus, porta quis bibendum sed, pretium sit amet dui. Sed eu dolor quis eros lobortis luctus eget et lacus. Aliquam in lacinia velit.
  107. Quisque adipiscing elit non ligula egestas, eget cursus elit feugiat. Proin nisl tortor, interdum et ornare a, pharetra ac tellus. Nam volutpat orci nunc, a accumsan risus adipiscing faucibus. Ut laoreet ultricies tristique. Duis laoreet adipiscing lectus, a hendrerit dolor placerat at. Duis viverra urna eget quam sagittis, in pretium ligula lacinia. Nam tincidunt et arcu eu auctor. Donec aliquet facilisis ante nec volutpat.
  108. Etiam mattis volutpat tincidunt. Quisque id magna in nulla consequat tempus a ut sem. Ut eget mauris id lorem adipiscing pretium vitae quis magna. Mauris vestibulum est metus, non posuere arcu pretium in. In id accumsan nisl, mattis sollicitudin felis. Proin dictum tempor ante ut pulvinar. Morbi mi sem, elementum eu adipiscing ac, consequat quis mauris. Praesent mi velit, scelerisque et vulputate at, malesuada in massa. Vestibulum molestie consectetur magna ac pharetra. Cras posuere augue sed sem tincidunt tincidunt.
  109. Maecenas mattis massa vel odio pellentesque blandit. Donec pellentesque et justo in eleifend. Phasellus mattis metus et justo luctus venenatis. Suspendisse mollis ipsum ut imperdiet posuere. Vestibulum in tellus enim. Nunc erat mauris, lobortis vel rhoncus ac, convallis vitae massa. Nunc imperdiet non nisl vitae posuere. Sed aliquet, purus ut hendrerit adipiscing, nisl lorem porttitor risus, ac egestas augue nisl vel mauris. Suspendisse pharetra vel odio ac elementum.
  110. Quisque accumsan dolor massa, auctor dictum purus rhoncus ac. Praesent eleifend porta convallis. Aliquam dapibus nunc et pharetra ornare. Phasellus ultrices varius dui, a interdum urna condimentum vitae. Integer suscipit iaculis hendrerit. Praesent nulla dui, pharetra sit amet ante a, volutpat faucibus nisi. Nulla facilisi. Sed venenatis diam orci, eu congue nisl porttitor at. Aenean in metus mi. Nam eget consectetur sapien. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  111. In cursus, sem a pharetra elementum, libero est posuere mauris, id vestibulum nisi lorem vitae odio. Proin quam arcu, aliquet a ultrices quis, ultricies eget ipsum. Aenean dictum mi sed vestibulum sagittis. Fusce purus augue, dignissim vel nibh vitae, semper sodales eros. Vestibulum dapibus leo at urna malesuada malesuada. Vestibulum mollis enim non justo pretium, quis imperdiet diam condimentum. Curabitur metus lacus, accumsan id luctus id, gravida sed nibh. Quisque facilisis ante eget nisl viverra, a aliquam magna lacinia. Nulla sed convallis sapien. Etiam ut pulvinar quam. Etiam in tincidunt risus, ut iaculis odio. Maecenas sit amet ligula diam. Pellentesque viverra, nisi eget mollis laoreet, neque neque iaculis velit, id vulputate elit mi in risus.";
  112.  
  113.         private const string Text3 =
  114.             @"Cras felis erat, volutpat nec ornare vulputate, dictum eget lorem. Nulla adipiscing tortor nulla, sit amet aliquet quam commodo non. In et tempor ipsum. Duis cursus purus rutrum eros sodales, nec rutrum quam rhoncus. Sed ullamcorper vitae eros in pretium. Morbi fringilla pharetra nulla. Nulla lobortis ultrices dui, et sollicitudin urna ultrices eu.
  115. Phasellus id libero sit amet libero consectetur varius sit amet eget risus. Cras sodales pulvinar velit nec pulvinar. Donec enim purus, eleifend eget auctor quis, ultricies eu purus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor massa vitae tellus vehicula tempor. Donec sit amet turpis et turpis pulvinar blandit. Suspendisse accumsan erat id bibendum feugiat. Sed convallis ut quam sit amet pharetra. Nulla rutrum pretium erat, at aliquam odio. Mauris ornare nibh sit amet neque suscipit tincidunt. Integer feugiat est ut dolor placerat vehicula. Morbi consequat lorem non turpis auctor feugiat. In ac vestibulum leo. Nulla tincidunt neque sit amet iaculis accumsan. Aliquam rutrum vehicula mi nec lacinia.
  116. Suspendisse nec tortor id arcu tincidunt consectetur sed non turpis. Praesent egestas eleifend semper. Suspendisse vestibulum vestibulum tortor ut suscipit. Donec tincidunt velit iaculis nibh pulvinar, sit amet varius tortor semper. Nulla nibh justo, blandit quis mi at, rutrum molestie sapien. Integer venenatis massa ipsum, volutpat consectetur mauris feugiat et. Quisque suscipit nunc eu consequat feugiat. Sed nec sodales magna. Praesent at eros nulla. Donec at ullamcorper arcu. Duis facilisis sit amet ante quis accumsan.
  117. Nam aliquam massa ut lorem tincidunt cursus. Aliquam vulputate facilisis metus sed ultricies. Praesent aliquam justo eget mi laoreet accumsan. Proin imperdiet, massa at mattis sagittis, turpis tellus mollis risus, quis commodo sem lorem eu sem. Integer faucibus laoreet cursus. Ut odio nibh, placerat eget luctus id, placerat vel augue. Praesent consectetur scelerisque nunc. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean fermentum felis vel libero suscipit, id blandit libero posuere. Mauris eu justo ac lectus viverra gravida non eget mi. Praesent blandit dolor sed turpis ullamcorper luctus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut tellus quis sem interdum ornare in ac erat. Praesent fringilla luctus est nec lobortis. Curabitur pulvinar justo vel vehicula consequat.
  118. Cras nunc augue, gravida volutpat nibh nec, mattis ultrices dui. Interdum et malesuada fames ac ante ipsum primis in faucibus. Cras pellentesque nisl nisi, et volutpat arcu congue in. Ut blandit tempus orci sit amet consectetur. Sed sed velit sed ipsum porta placerat nec sit amet ipsum. Ut pretium ante vel urna sagittis, non hendrerit dolor molestie. Duis rutrum, dolor in aliquam volutpat, arcu sem interdum mi, vel porta urna dui et turpis. Donec viverra ipsum id convallis tincidunt. Praesent a quam vel arcu ultricies congue ac eget quam. Integer sodales dui quis metus gravida, et bibendum enim convallis. Vestibulum euismod tincidunt pellentesque. Morbi porttitor et velit sit amet congue. Proin at faucibus elit.
  119. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla ac ultricies justo. Quisque et sapien felis. Proin condimentum lacus ut auctor dapibus. Curabitur consectetur urna eu arcu tincidunt ornare. Nullam fringilla porttitor nunc vel posuere. Nam massa velit, varius at tincidunt eu, gravida quis risus. Sed ullamcorper risus nec justo dictum, nec lobortis risus cursus. Proin ullamcorper augue quis elementum suscipit. Nunc vel pharetra tortor. Sed sit amet sollicitudin tortor, non viverra ipsum. Mauris elementum iaculis elit id dignissim. Ut sed felis id lectus hendrerit venenatis. Etiam at tellus velit.
  120. In mollis dictum arcu vel placerat. Duis suscipit orci non odio facilisis, id cursus leo luctus. Donec et sem eget ligula lobortis varius. Phasellus id sem felis. Nulla vel eros pulvinar, rhoncus urna in, suscipit nisl. Maecenas gravida adipiscing urna, quis vestibulum erat. Duis rutrum blandit nulla id commodo. Nam hendrerit, velit a ultricies consectetur, elit libero iaculis sapien, tincidunt tempor ipsum enim nec sem. Morbi congue velit sed ligula pulvinar bibendum. Ut fermentum, turpis vel pharetra molestie, velit ligula imperdiet lectus, non fringilla justo nunc sed enim. Quisque vel tincidunt mi. Donec quis dolor a sem ultrices facilisis. Phasellus vehicula consequat ipsum, vitae blandit arcu aliquam a. Donec sagittis ornare arcu, quis auctor nibh aliquam et. Aliquam facilisis arcu ac bibendum ultricies. Praesent orci massa, ultricies id tincidunt ut, accumsan ac ipsum.
  121. Duis pharetra lorem nec augue euismod semper. Cras facilisis vitae erat in congue. Ut euismod tincidunt ante et accumsan. Suspendisse cursus congue dapibus. Donec in arcu sit amet ligula tincidunt malesuada. Nullam dignissim suscipit arcu, sed consectetur metus auctor sit amet. Ut blandit est in justo commodo, in porta urna lobortis. Praesent laoreet mauris ac odio molestie, quis suscipit nunc bibendum. Aliquam congue magna ut tortor lobortis, sit amet placerat magna viverra. Curabitur eget porttitor eros, sed laoreet lorem. Morbi sed diam tincidunt, condimentum metus a, cursus turpis. In ultrices eleifend libero tincidunt sollicitudin. Donec rutrum nulla tortor, et mollis dui dapibus vitae. Aenean id libero felis. Nam convallis quam a nulla tincidunt mattis. Fusce pretium dolor et nulla volutpat vulputate.
  122. Duis tincidunt, est at dignissim ultrices, eros lorem facilisis felis, pretium pretium purus enim id nisi. Praesent faucibus, enim eu commodo ullamcorper, elit neque ultrices nibh, a interdum leo nisi eu nisl. In quis hendrerit nulla, vitae interdum sapien. Suspendisse dapibus semper dui, eleifend aliquet augue facilisis a. In vehicula et enim non convallis. Vivamus sit amet velit in mi gravida ultricies. Vivamus feugiat lorem id euismod faucibus. Donec at velit tempus, ullamcorper ipsum ultricies, dignissim urna. Fusce ultrices egestas tortor, ac gravida tortor pellentesque vitae. Quisque mollis laoreet sollicitudin. Morbi sed pellentesque felis. Phasellus sit amet odio eget quam volutpat eleifend eu ac metus.
  123. Vestibulum pulvinar commodo vulputate. In pharetra ipsum tempor, molestie enim a, mollis augue. Morbi ultricies lorem eu adipiscing ornare. Suspendisse dignissim enim in dolor rhoncus suscipit. Morbi eros nisl, molestie ut tempor id, consectetur vel lorem. Etiam mauris lorem, suscipit non elit sed, blandit egestas tellus. Pellentesque eu risus dapibus, rhoncus justo eu, pretium erat. Mauris sit amet rhoncus mi, nec condimentum ligula. In tristique eros et turpis euismod, ac convallis libero pharetra.";
  124.  
  125.     }
  126.  
  127.     public class TextDocument
  128.     {
  129.         public string Id { get; set; }
  130.         public string IndexedText { get; set; }
  131.     }
  132.  
  133.     public class TextIndex : AbstractIndexCreationTask<TextDocument>
  134.     {
  135.         public TextIndex()
  136.         {
  137.             Map = docs =>
  138.                   from doc in docs
  139.                   select new { doc.IndexedText };
  140.  
  141.             Analyze(x => x.IndexedText,
  142.                 "Lucene.Net.Analysis.StopAnalyzer, Lucene.Net");
  143.  
  144.             Indexes.Add(x => x.IndexedText, FieldIndexing.Analyzed);
  145.         }
  146.     }
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement