SOLIDnie po łebkach

Ilu z nas wracając do starego kodu (napisanego wczoraj/ tydzień temu/ miesiąc temu) krzywi się patrząc na bałagan, który po sobie pozostawił? W zasadzie prościej będzie chyba zapytać komu się to nie zdarza. Otóż amerykańscy naukowcy znaleźli na to sposób. No dobra może nie amerykańscy, ale skrót jest z angielskiego – SOLID, rozkłada się on na pięć czynników, a każdy z nich jest znowu jakimś skrótem.

S – (SRP) Single Responsibility Principle
O – (OCP) Open / Closed Principle
L – (LSP) Liskov Substitution Principle
I – (ISP) Interface Segregation Principle
D – (DIP) Dependency Inversion Principle
(podobno wszystko co napisane Helvetica jest mądrzejsze)

O co chodzi z tymi regułami wchodzącymi w skład SOLID? Jest to pięć zasad mówiących o tym jak tworzyć kod, który będzie łatwiej utrzymywać, rozszerzać, czytać, a problem głodu na świecie zniknie. Pitu pitu, już pokazuje przykłady, które będą proste, czasem wręcz naiwne, chodzi o ukazanie idei, nie rozwiązanie jakiegoś rzeczywistego problemu.

Single Resposibility Principle wszyscy piszą że “Nigdy nie powinno być więcej niż jednego powodu do modyfikacji”. Strasznie mnie irytuje taki zapis, bo można napisać “klasa jest odpowiedzialna tylko za jedną logiczną funkcjonalność”. Skoro służy do mierzenia, to nie służy do zapisywania. Jeśli ma konwertować wartości z jednego formatu na inny, to nie powinna ich wysłać do innych części aplikacji. etc., itd., itp.

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, “Courier New”, Courier, Monospace;
background-color: #ffffff;
max-height: 300px;
overflow: auto;
/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}

.csharpcode .lnum { color: #606060; }

   1:   public class BadHardwareDevice
   2:      {
   3:          int hardwareReadingLevel;
   4:          void DisplayHardwareLevelAlarm()
   5:          {
   6:              Console.WriteLine("Current value of {0} is dangerous!", hardwareReadingLevel);
   7:          }
   8:   
   9:          int GetHardwareReadings()
  10:          {
  11:              // reads data from device into hardwareReagingLevel
  12:              // return value from that reading
  13:              return hardwareReadingLevel;
  14:          }
  15:      }

Prosta klasa, ale zajmuje się ona dwiema rzeczami jednocześnie; odczytuje wartość z urządzenia (GetHardwareReadings) oraz wypisuje alarm na konsolę (DisplayHardwareLevelAlarm).
Kod można zmodyfikować na przykład w taki sposób:

   1:  public class BetterHardwareDeviceConsoleLogger
   2:      {
   3:          void DisplayHardwareLevelAlarm(int aLevel)
   4:          {
   5:              Console.WriteLine("Current value of {0} is dangerous!", aLevel);
   6:          }
   7:      }
   8:   
   9:      public class BetterHardwareDeviceReader
  10:      {
  11:          int hardwareReadingLevel;
  12:          int GetHardwareReadings()
  13:          {
  14:              // reads data from device into hardwareReagingLevel
  15:              // return value from that reading
  16:              return hardwareReadingLevel;
  17:          }
  18:      }

Teraz klasa odczytu zajmuje się tylko odczytem, natomiast klasa logująca alarm tylko wypisaniem na konsolę. Dodatkowo jeśli będzie potrzeba wysłania zapisu gdzieś indziej niż na konsolę nie będzie to miało wpływu na działanie innych komponentów. Bez modyfikacji już istniejących klas można stworzyć klasę BetterHardwareDeviceNetworkLogger i wysłać informację o poziomie wartości w świat.

Open / Close Principle wszyscy piszą, że klasa powinna być otwarta na rozszerzenia, a zamknięta na modyfikacje. I bądź mądry. Już nadciągam z chłopską odsieczą i rozumowaniem. Klasa powinna być tak napisana, aby nie trzeba było jej aktualizować gdy pojawi się nowa implementacja np. klasy logującej. Rozszerzenie funkcjonalne aplikacji powinno zostać zaimplementowane poza klasą, ona sama natomiast może z niej skorzystać. Jak zawsze bez kodu ciężko jest tłumaczyć:

   1:  public class BadLogger
   2:      {
   3:          public void LogMessage(string aMessage, BadLogTarger aTarget)
   4:          {
   5:              switch (aTarget)
   6:              {
   7:                  case BadLogTarger.ConLog:
   8:                      // write to console
   9:                      break;
  10:                  case BadLogTarger.NetLog:
  11:                      // write to network
  12:                      break;
  13:                  case BadLogTarger.DevNullLog:
  14:                      // ignore writing
  15:                      break;
  16:              }
  17:          }
  18:      }
  19:    
  20:      public enum BadLogTarger
  21:      {
  22:          ConLog,
  23:          NetLog,
  24:          DevNullLog,
  25:      }

Tutaj aby dodać logowanie np. do pliku należy dodać kolejnego enuma (przewińcie przykładowy kod na dół), a następnie rozszerzyć metodą LogMessage o odpowiedniego case….. dużo roboty. Może lepiej będzie zrobić coś takiego:

   1:  public class BetterLogger
   2:  {
   3:      ILogger logger;
   4:      public BetterLogger(ILogger aLogger)
   5:      {
   6:          this.logger = aLogger;
   7:      }
   8:      
   9:      public void LogMessage( string aMessage )
  10:      {
  11:          logger.LogMessage(aMessage);
  12:      }
  13:  }
  14:   
  15:  public interface ILogger
  16:  {
  17:      void LogMessage(string aMessage);
  18:  }
  19:   
  20:  public class ConLogger: ILogger
  21:  {
  22:      void ILogger.LogMessage(string aMessage)
  23:      {
  24:          // log to console
  25:   
  26:      }
  27:  }
  28:   
  29:  public class NetLogger : ILogger
  30:  {
  31:      public void LogMessage(string aMessage)
  32:      {
  33:          // log to network
  34:      }
  35:  }
  36:   
  37:  public class DevNullLogger : ILogger
  38:  {
  39:      public void LogMessage(string aMessage)
  40:      {
  41:          // log to network
  42:      }
  43:  }

Ojej więcej kodu. Tak tak, ale teraz obczaj to (miły czytelniku), po dodaniu nowego logera (np. FileLoger) implementuje się metodą LogMessage, a następnie przekazują taką klasę do BetterLogger, której nie trzeba już modyfikować. Wszystko działa tak jak poprzednio, a jest nowa funkcjonalność. Klasa jest otwarta na rozszerzenia, ale zamknięta na zmiany – voila.

Liskov Substitution Principle wszyscy strasznie komplikują opis. Mam proste wytłumaczenie tej zasady (proste bo po co komplikować, albo proste bo nie zrozumiałem zasady), jeśli dziedziczysz lub implementujesz pewien interfejs, wszystkie klasy pochodne powinny zachowywać się w podobny (logicznie podobny) sposób. Tak aby obiekt wykorzystujący referencję (wskaźnik) do klasy bazowej, mógł spokojnie wykorzystać funkcjonalność klas bardziej pochodnych i nie zostać zaskoczonym przez nietypowym zachowaniem (patrz kod poniżej). Dodatkowym założeniem jest, że parametry akceptowane przez klasy pochodne mogą być mniej restrykcyjne niż w klasie bazowej (może obsłużyć więcej przypadków), natomiast wartości zwracana mogą być takie same lub mniejsze (nie można zwrócić czegoś, co nie jest określone przez klasa bazowa). Dygresja: Przykład z prostokątem i kwadratem dla mnie ma sens i jest poprawny, nie wiem dlaczego jest uznawany za błędną implementacje, jeśli ktoś potrafi to wytłumaczyć proszę o kontakt.

   1:  public interface BadISettings
   2:  {
   3:      void Save();
   4:      void Load();
   5:  }
   6:   
   7:  public class BadUserSettings : BadISettings
   8:  {
   9:      public void Save()
  10:      {
  11:          // save user settings
  12:      }
  13:   
  14:      public void Load()
  15:      {
  16:          // load user settings
  17:      }
  18:  }
  19:   
  20:  public class BadApplicationSettings : BadISettings
  21:  {
  22:      public void Save()
  23:      {
  24:          // throw InvalidOperationException
  25:          // cannot overwrite application settings
  26:      }
  27:   
  28:      public void Load()
  29:      {
  30:          // load application settings
  31:      }
  32:  }

Co jest nie tak? Otóż ustawienia aplikacja nie chętnie się zapisują. Co wpływa na możliwość ich wykorzystania przez interfejs BadISettings. Interfejs nie definiuje nigdzie, że będzie rzucał wyjątkiem, poza tym nie definiuje on metody tylko po to żeby jej nie wspierać. Jednym z rozwiązań jest coś takiego:

   1:  public interface BetterIReadSettings
   2:  {
   3:      void Read();
   4:  }
   5:   
   6:  public interface BetterIWritableSettings
   7:  {
   8:      void Save();
   9:  }
  10:   
  11:  public class BetterUserSettings : BetterIReadSettings, BetterIWritableSettings
  12:  {
  13:      void Read()
  14:      {
  15:          // read settings
  16:      }
  17:   
  18:      void Save()
  19:      {
  20:          // save settings
  21:      }
  22:  }
  23:   
  24:  public class BetterApplicationSettings : BetterIReadSettings
  25:  {
  26:      public void Read()
  27:      {
  28:          // load application settings
  29:      }
  30:  }

//Pozdrawiam czułe oko Jacka

Teraz można spokojnie wykorzystać wspólny interfejs BetterIWritableSettings bez obaw że coś się wywali lub wyleci w powietrze. A BetterIReadableSettings z jedną metodą? A czy jest w tym coś złego? Zerknij na SRP.

Interface Segregation Principle – różnie o tym piszą, akurat nie ma informacji w rodzimym języku. Klienci naszej klasy nie powinni mieć dostępu do elementów z których nie korzystają. Będzie lepiej jeśli nawet nie będzie o nich wiedzieć. Klient powinien dostać tylko tyle ile potrzebuje, nic więcej. Jak zwykle abstrakcja i interfejsy są jor friend.

   1:  public class BadPerson
   2:  {
   3:      public string FirstName;
   4:      public string LastName;
   5:      public string EmailAddress;
   6:      public string PhoneNumber;
   7:      public string Address;
   8:  }
   9:   
  10:  public class BadEmailer
  11:  {
  12:      public void SendEmail( BadPerson aBadPerson )
  13:      {
  14:          // send email using just email address
  15:      }
  16:  }
  17:   
  18:  public class PhoneCaller
  19:  {
  20:      public void PhoneCall( BadPerson aBadPerson )
  21:      {
  22:          // make phone call using just phone number
  23:      }
  24:  }
  25:   
  26:  public class LetterSender
  27:  {
  28:      public void SendLetter (BadPerson aBadPerson )
  29:      {
  30:          // send letter using firstname, lastname and an address
  31:      }
  32:  }

Tutaj widać że klasa BadPerson agreguje wszystko co dotyczy jakiegoś człowieczka, co dał się wbić w internet za kubek kawy ;). Następnie wszystkie te informacje są przekazywane do innych obiektów, który wykorzystują tylko część z tych danych. Kto wie co one tak naprawdę robią z resztą z nich? Czy nie lepiej zamienić to na coś takiego:

   1:  public interface BetterIEmailable
   2:  {
   3:      string EmailAddress{get;set;}
   4:  }
   5:   
   6:  public interface BetterIPhoneable
   7:  {
   8:      string PhoneNumber{get;set;}
   9:  }
  10:   
  11:  public interface BetterILetterable
  12:  {
  13:      string FirstName{get;set;}
  14:      string LastName{get;set;}
  15:      string Address{get;set;}
  16:  }
  17:   
  18:  public class BetterPerson : BetterIEmailable, BetterILetterable, BetterIPhoneable
  19:  {
  20:      public string EmailAddress { get; set; }
  21:      public string PhoneNumber { get; set; }
  22:      public string FirstName { get; set; }
  23:      public string LastName { get; set; }
  24:      public string Address { get; set; }
  25:  }
  26:   
  27:  public class BetterEmailer
  28:  {
  29:      public void SendEmail(BetterIEmailable aBetterPerson)
  30:      {
  31:          // send email using just email address
  32:      }
  33:  }
  34:   
  35:  public class BetterSender
  36:  {
  37:      public void SendLetter(BetterILetterable aBetterPerson)
  38:      {
  39:          // send letter using firstname, lastname and an address
  40:      }
  41:  }
  42:   
  43:  public class BetterCaller
  44:  {
  45:      public void PhoneCall(BetterIPhoneable aBetterPerson)
  46:      {
  47:          // make phone call using just phone number and first name
  48:      }
  49:  }

Teraz każdy dostaje tylko to czego potrzebuje. Nie zaistnieje problem, w którym klasa wysyłająca pocztę elektroniczną zacznie zapisywać dane teleadresowe, podczas gdy miała wysłać tylko email. Wiecie rozumiecie.

Dependency Inversion Principle – mówi o tym, aby powiązania pomiędzy klasami były luźne. Klasy nie powinny zależeć od właściwej implementacji, a działać na wcześniej zdefiniowanym interfejsie. Dzięki temu prościej jest rozszerzać funkcjonalność lub całkowicie ją zmieniać, oczywiście w ramach interfejsu i zasady LSP.

   1:  public class BadButton
   2:  {
   3:      public BadButton( BadLamp aLamp)
   4:      {
   5:          Lamp = aLamp;
   6:      }
   7:   
   8:      public void Click()
   9:      {
  10:          this.Lamp.Switch();
  11:      }
  12:   
  13:      public BadLamp Lamp { get; private set; }
  14:  }
  15:   
  16:  public class BadLamp
  17:  {
  18:      readonly BadButton button;
  19:      public BadLamp()
  20:      {
  21:          this.button = new BadButton(this);
  22:      }
  23:   
  24:      public void Switch()
  25:      {
  26:          // switch the light on/off
  27:      }
  28:  }

Przykład powyżej to wyjątkowo mocne powiązanie klasy BadButton oraz BadLamp. Nie będą one współpracować z żadną inną klasą niż te zdefiniowane, chyba że dziedziczące po BadLamp, natomiast już na pewno nie zaistnieje możliwość zmiany guzika na inny. Oczywiście istnieje lepsze rozwiązanie:

   1:  public interface BetterIButtonClient
   2:  {
   3:      void Switch();
   4:  }
   5:   
   6:  public interface BetterIButton
   7:  {
   8:      void Click();
   9:  }
  10:   
  11:  public class BetterButton : BetterIButton
  12:  {
  13:      BetterIButtonClient client;
  14:      public BetterButton(BetterIButtonClient aClient)
  15:      {
  16:          client = aClient;
  17:      }
  18:   
  19:      public void Click()
  20:      {
  21:          this.client.Switch();
  22:      }
  23:  }
  24:   
  25:  public class FancyBetterButton : BetterIButton
  26:  {
  27:      BetterIButtonClient client;
  28:      public FancyBetterButton(BetterIButtonClient aClient)
  29:      {
  30:          client = aClient;
  31:      }
  32:   
  33:      public void Click()
  34:      {
  35:          this.client.Switch();
  36:      }
  37:  }
  38:   
  39:  public class BetterLamp : BetterIButtonClient
  40:  {
  41:      BetterIButton betterButton;
  42:      public BetterLamp(BetterIButton aBetterButton)
  43:      {
  44:          betterButton = aBetterButton;
  45:      }
  46:   
  47:      public void Switch()
  48:      {
  49:          // switch the light on/off
  50:      }
  51:  }

Co dostajemy? Otóż button już nie musi działać tylko i wyłącznie z lampą, zadziała także z pralką, lodówką i innym AGD o ile sprzęt będzie obsługiwać interfejs BetterIButtonClient i prostą metodą Switch. A dalej widać, że lampa także może być już bardziej fikuśna, nie zależy ona już tylko od jednego rodzaju Buttona. W dodatku to nie ona jest odpowiedzialna za decydowanie z którego skorzysta (od siebie dodałem idee: DI). Dzięki temu fabryka lamp może w prosty sposób przerzucić się na nowszy model z wykorzystaniem FancyBetterButton-ów. Widać tu wpływy idei OCP. Taki kod prościej jest wykorzytać w innym projektach, ponieważ nie jest on mocno powiązany z bezpośrednią implementacją klasy guzików czy innych obiektów, zdefiniowanych z projekcie.

Podczas pisania kodu należy przede wszystkim korzystać z G.Ł.O.W.Y. to jest najważniejsza zasada! Dopiero później warto podpierać się różnymi ideami i regułami, które proponują inni. Zasady są po to aby je łamać, a nic tak nie uczy człowieka jak popełniane błędy. Zachęcam do łamania zasad SOLID, a potem sprawdzenia czy miało to sens i podzielenia się tym doświadczeniem ze mną i innymi 😉

Podczas wpisu sporą część (bardzo dużą część wiedzy) oparłem na
[1] http://www.blackwasp.co.uk/SOLIDPrinciples.aspx
[2] www.wikipedia.org polska i angielska wersja
[3] http://www.objectmentor.com Tutaj trzeba się porządnie naszukać aby znaleźć materiały
Szczególnie polecam punkt pierwszy.

Uwagi jak zawsze chętnie przyjmę.

ps. Jutro do pracy
ps2. C# jest czytelny, nawet dla nie programujących w C#.
ps3. Link do źródełek ze wszystkimi zasadami  https://www.sugarsync.com/pf/D6056980_3239101_969599
 

Wzorce: Pyłek / Flyweight

Dzień dobry/wieczór

Nastał czas na kolejną porcję wiedzy, w tym odcinku opowiem bajki o wzorcu Pyłek z angielskiego Flyweight. Nie wiem dlaczego tak się on nazywa po polsku, tzn. wiem, ale to tłumaczenie jest całkowicie bez sensu.
Jak zwykle na początku co o pyłku mówią inni:
wikipedia.pl
wikipedia.en

I teraz moja interpretacja:
Pyłek to wzorzec, który rozwiązuje problem posiadania i powielania tej samej informacji (np. kolor, rozmiar, etc) przez wiele różnych obiektów. Uzyskuje się to poprzez współdzielenie tej informacji, przetrzymywanie w jednym wspólnym miejscu. Instancje klas posiadają tylko referencję do tej informacji. To jest najprostsza implementacja wzorca.

Życiowe przykłady: podczas implementacji edytora tekstu, gdy pojawia się potrzeba formatowania tekstu. Normalny użytkownik najprawdopodobniej skorzysta z 2-3 rodzajów czcionki i podobnej ilości kolorów. Ale już osoba kolorystycznie nie zrównoważona, mogłaby by ustawiać różne kolory, rodzaje czcionek czy jej rozmiar dla każdej możliwej literki. Pyłek (przeklęta nazwa) zadziała wówczas w następujący sposób: style literek (czy innych podobnych elementów) zostaną umieszczone w osobnej klasie:

[code]

Code Snippet
  1. using System.Drawing;
  2.  
  3. namespace flyweight
  4. {
  5.     public class CharacterSpecification
  6.     {
  7.         private readonly Color _color;
  8.         private readonly string _fontType;
  9.         private readonly uint _size;
  10.         private readonly int _hashCode;
  11.  
  12.         public CharacterSpecification(Color color, string fontType = "Arial", uint size = 12u)
  13.         {
  14.             _color = color;
  15.             _size = size;
  16.             _fontType = fontType;
  17.             string hash_base = string.Format("{0}{1}{2}", _color.ToString(), _size.ToString(), _fontType);
  18.             _hashCode = hash_base.GetHashCode();
  19.         }
  20.  
  21.         public Color CharColor
  22.         { get { return _color; } }
  23.  
  24.         public string CharFontType
  25.         { get { return _fontType; } }
  26.  
  27.         public uint CharSize
  28.         { get { return _size; } }
  29.  
  30.         public override int GetHashCode()
  31.         {
  32.             return _hashCode;
  33.         }
  34.  
  35.         public override string ToString()
  36.         {
  37.             return string.Format("{0} {1} {2}", _color.ToString(), _size.ToString(), _fontType);
  38.         }
  39.     }
  40. }

[/code]

Treść która będzie unikatowa dla edytora, np:

[code]

Code Snippet
  1. namespace flyweight
  2. {
  3.     public class CharacterInfo
  4.     {
  5.         public char CharacterValue { get; set; }
  6.         public CharacterSpecification CharInfoSpecification { get; set; }
  7.         
  8.         public CharacterInfo(char aCharValue, CharacterSpecification aSpecification)
  9.         {
  10.             CharacterValue = aCharValue;
  11.             CharInfoSpecification = aSpecification;
  12.         }
  13.  
  14.         public override string ToString()
  15.         {
  16.             return string.Format("{0} – {1}", CharacterValue, CharInfoSpecification);
  17.         }
  18.     }
  19. }

[/code]

W tym przykładzie, brakuje kilku dodatkowych pól, które powinny się znaleźć aby móc poprawnie wyświetlić znaki w edytorze. Na potrzeby przykładu ograniczam skomplikowanie kodu.

Co jest do tej pory? Klasa CharacterInfo zawierać będzie informacje o tym co narysować, właściwą informacje, np. literkę ‘ś’ oraz informacje o tym jak ją narysować, np. czerwony kolor, arial, rozmiar 12. Teraz jeżeli będzie potrzeba zmienić styl, zmienia się go w CharacterInfo ustawiając nowy styl we właściwości klasy CharInfoSpecification na nowy, np. czarny/times new roman/14.
Na razie szału nie ma. Proszę więc zamknąć oczy i wyobrazić sobie wielki dokument a w nim tysiące literek mieniących się różnymi kolorami, krojami czy rozmiarem – jednym słowem piekiełko. Dla tych, którzy nie wierzą, że to się da stworzyć link. Odcinam się od treści, która tam jest i staram się zwrócić uwagę na styl. Widać że kolory się powtarzają, szkoda żeby nasz edytor dla pojedynczych znaków przechowywał nadmiarową informację. Wprowadza się więc obiekt, który się tym zajmie:

//Ważne w c# wszystkie klasy są ref type. Dla c++ fabryka powinna zwracać referencje lub wskaźnik!
[code]

Code Snippet
  1. using System.Collections.Generic;
  2. using System.Drawing;
  3.  
  4. namespace flyweight
  5. {
  6.     public class CharSpecFactory
  7.     {
  8.         private List<CharacterSpecification> _specCollection = new List<CharacterSpecification>();
  9.  
  10.         public CharacterSpecification GetSpecificCharacter(Color aCharColor, string aCharFontType, uint aCharSize)
  11.         {
  12.             CharacterSpecification cs = new CharacterSpecification(aCharColor, aCharFontType, aCharSize);
  13.             int i = _specCollection.FindIndex(o => o.GetHashCode() == cs.GetHashCode());
  14.             if (i != -1)
  15.             {
  16.                 return _specCollection[i];
  17.             }
  18.             else
  19.             {
  20.                 _specCollection.Add(cs);
  21.                 return cs;
  22.             }
  23.         }
  24.  
  25.         public void DumpFactoryInfo()
  26.         {
  27.             int counter = 1;
  28.             System.Diagnostics.Trace.WriteLine("dumping factory cache");
  29.             foreach (var s in _specCollection)
  30.             {
  31.                 System.Diagnostics.Trace.WriteLine(string.Format("{0:D5}: {1}", counter++, s));
  32.             }
  33.             System.Diagnostics.Trace.Flush();
  34.         }
  35.     }
  36. }

[/code]

Co takie cudownego w tej fabryce? Ha! Poza produkcja pyłków zajmuje się ona także ich buforowaniem, tzn. jeżeli klient zarządza specyficznego znaku CharacterSpecification, który już został wcześniej stworzony. Fabryka nie wytworzy nowej instancji, ale zwróci tylko referencje do istniejącego już obiektu. W ten sposób poszczególne style będą współdzielone i znika problem powielania informacji. Dodatkowo elementy te zostały oznaczone jako readonly (const), zabezpiecza to przed zmianą tego stylu. Pamiętajmy że jest on współdzielony przez kilka obiektów. Gdyby zezwolić na jego modyfikację, inne nie zaznaczone obiekty, również zmieniłby swój styl. Jest to miejsce na implementacje innego wzorca (Copy On Write/ Kopiowanie przy zapisie). Tak więc jeden styl może zostać przypisany do wielu literek, ale literka będzie posiadać zawsze tylko jeden styl. Kolejne miejsce do popisu, to sytuacja gdy wykorzysta się wszystkie możliwe kolory, fonty, etc. a potem usunie się formatowanie i powróci do jednego wspólnego stylu. Wtedy SpecificCharacter musiałby wiedzieć, czy ktoś z niego korzysta i jeżeli nie jest z nikim powiązany, klasa fabryki mogłaby się go pozbywać. Ale to zupełnie inny temat (zliczanie referencji, reference counting).

Cały kod potrzebny do wzorca został już praktycznie pokazany, krótkie podsumowanie myśli: fabryka zawiera bufor ze wszystkimi stworzonymi elementami, które mają być współdzielone. Nie powinno się ich tworzyć wcześniej. Tylko ona powinna produkować nowe elementy. Litery które chcą być kolorowe i fikuśne zwracają się do niej (fabryki) po nową stylówe. Klasa dokumentu podczas rysowania zwraca się do literek o narysowanie, a on wg. swojego wewnętrznego stylu się rysują.
Można spotkać takie trochę odwrócona sytuacje, tj. taką że dokument wysyła do stylówek żądanie narysowania, przekazując im przez parametr zmienną informację (wartość literki do narysowania) – nie potrafię ogarnąć tego odwróconego wzorca, dlatego nie podałem go tutaj.

Przykład dokumentu, przy losowych wytwarzaniu literek i styli:
[code]

Code Snippet
  1. public void GenerateRandomStuff()
  2.         {
  3.             FontTypes ft = FontTypes.Arial;
  4.             char letter = 'A';
  5.             for (int i = 0; i < 1500; i++)
  6.             {
  7.                 var specchar = _charFactory.GetSpecificCharacter(
  8.                     Color.FromArgb(255, (byte) (32*(i%8) – 1), (byte) (32*(i%8) – 1), (byte) (32*(i%8) – 1)),
  9.                     string.Format("{0}", ft), (uint) (i%12) + 8);
  10.                 if (++ft > FontTypes.Comic)
  11.                 {
  12.                     ft = FontTypes.Arial;
  13.                 }
  14.                 CharacterInfo ci = new CharacterInfo(letter, specchar);
  15.                 if (++letter > 'z')
  16.                 {
  17.                     letter = 'A';
  18.                 }
  19.                 _docContent.Add(ci);
  20.             }//for
  21.  
  22.             int counter = 1;
  23.             System.Diagnostics.Trace.WriteLine("dumping word document content");
  24.             foreach (var characterInfo in _docContent)
  25.             {
  26.                 System.Diagnostics.Trace.WriteLine(string.Format("{0:D5}: {1}", counter++, characterInfo));
  27.             }
  28.             System.Diagnostics.Trace.Flush();
  29.             
  30.  
  31.             _charFactory.DumpFactoryInfo();
  32.         }

[/code]
Po wywołaniu metody [i]GenerateRandomStylishLetters[/i] wyświetlone zostaną jakieś takie informacje:

dumping word document content
00001: A – Color [A=255, R=255, G=255, B=255] 8 Arial
00002: B – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00003: C – Color [A=255, R=63, G=63, B=63] 10 Sherif
00004: D – Color [A=255, R=95, G=95, B=95] 11 Comic
00005: E – Color [A=255, R=127, G=127, B=127] 12 Arial
00006: F – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00007: G – Color [A=255, R=191, G=191, B=191] 14 Sherif
00008: H – Color [A=255, R=223, G=223, B=223] 15 Comic
00009: I – Color [A=255, R=255, G=255, B=255] 16 Arial
00010: J – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00011: K – Color [A=255, R=63, G=63, B=63] 18 Sherif
00012: L – Color [A=255, R=95, G=95, B=95] 19 Comic
00013: M – Color [A=255, R=127, G=127, B=127] 8 Arial
00014: N – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00015: O – Color [A=255, R=191, G=191, B=191] 10 Sherif
00016: P – Color [A=255, R=223, G=223, B=223] 11 Comic
00017: Q – Color [A=255, R=255, G=255, B=255] 12 Arial
00018: R – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00019: S – Color [A=255, R=63, G=63, B=63] 14 Sherif
00020: T – Color [A=255, R=95, G=95, B=95] 15 Comic
00021: U – Color [A=255, R=127, G=127, B=127] 16 Arial
00022: V – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00023: W – Color [A=255, R=191, G=191, B=191] 18 Sherif
00024: X – Color [A=255, R=223, G=223, B=223] 19 Comic
00025: Y – Color [A=255, R=255, G=255, B=255] 8 Arial
00026: Z – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00027: [ – Color [A=255, R=63, G=63, B=63] 10 Sherif
00028: – Color [A=255, R=95, G=95, B=95] 11 Comic
00029: ] – Color [A=255, R=127, G=127, B=127] 12 Arial
00030: ^ – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00031: _ – Color [A=255, R=191, G=191, B=191] 14 Sherif
00032: ` – Color [A=255, R=223, G=223, B=223] 15 Comic
00033: a – Color [A=255, R=255, G=255, B=255] 16 Arial
00034: b – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00035: c – Color [A=255, R=63, G=63, B=63] 18 Sherif
00036: d – Color [A=255, R=95, G=95, B=95] 19 Comic
00037: e – Color [A=255, R=127, G=127, B=127] 8 Arial
00038: f – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00039: g – Color [A=255, R=191, G=191, B=191] 10 Sherif
00040: h – Color [A=255, R=223, G=223, B=223] 11 Comic
00041: i – Color [A=255, R=255, G=255, B=255] 12 Arial
00042: j – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00043: k – Color [A=255, R=63, G=63, B=63] 14 Sherif
00044: l – Color [A=255, R=95, G=95, B=95] 15 Comic
00045: m – Color [A=255, R=127, G=127, B=127] 16 Arial
00046: n – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00047: o – Color [A=255, R=191, G=191, B=191] 18 Sherif
00048: p – Color [A=255, R=223, G=223, B=223] 19 Comic
00049: q – Color [A=255, R=255, G=255, B=255] 8 Arial
00050: r – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00051: s – Color [A=255, R=63, G=63, B=63] 10 Sherif
00052: t – Color [A=255, R=95, G=95, B=95] 11 Comic
00053: u – Color [A=255, R=127, G=127, B=127] 12 Arial
00054: v – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00055: w – Color [A=255, R=191, G=191, B=191] 14 Sherif
00056: x – Color [A=255, R=223, G=223, B=223] 15 Comic
00057: y – Color [A=255, R=255, G=255, B=255] 16 Arial
00058: z – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00059: A – Color [A=255, R=63, G=63, B=63] 18 Sherif
00060: B – Color [A=255, R=95, G=95, B=95] 19 Comic
00061: C – Color [A=255, R=127, G=127, B=127] 8 Arial
00062: D – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00063: E – Color [A=255, R=191, G=191, B=191] 10 Sherif
00064: F – Color [A=255, R=223, G=223, B=223] 11 Comic
00065: G – Color [A=255, R=255, G=255, B=255] 12 Arial
00066: H – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00067: I – Color [A=255, R=63, G=63, B=63] 14 Sherif
00068: J – Color [A=255, R=95, G=95, B=95] 15 Comic
00069: K – Color [A=255, R=127, G=127, B=127] 16 Arial
00070: L – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00071: M – Color [A=255, R=191, G=191, B=191] 18 Sherif
00072: N – Color [A=255, R=223, G=223, B=223] 19 Comic
00073: O – Color [A=255, R=255, G=255, B=255] 8 Arial
00074: P – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00075: Q – Color [A=255, R=63, G=63, B=63] 10 Sherif
00076: R – Color [A=255, R=95, G=95, B=95] 11 Comic
00077: S – Color [A=255, R=127, G=127, B=127] 12 Arial
00078: T – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00079: U – Color [A=255, R=191, G=191, B=191] 14 Sherif
00080: V – Color [A=255, R=223, G=223, B=223] 15 Comic
00081: W – Color [A=255, R=255, G=255, B=255] 16 Arial
00082: X – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00083: Y – Color [A=255, R=63, G=63, B=63] 18 Sherif
00084: Z – Color [A=255, R=95, G=95, B=95] 19 Comic
00085: [ – Color [A=255, R=127, G=127, B=127] 8 Arial
00086: – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00087: ] – Color [A=255, R=191, G=191, B=191] 10 Sherif
00088: ^ – Color [A=255, R=223, G=223, B=223] 11 Comic
00089: _ – Color [A=255, R=255, G=255, B=255] 12 Arial
00090: ` – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00091: a – Color [A=255, R=63, G=63, B=63] 14 Sherif
00092: b – Color [A=255, R=95, G=95, B=95] 15 Comic
00093: c – Color [A=255, R=127, G=127, B=127] 16 Arial
00094: d – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00095: e – Color [A=255, R=191, G=191, B=191] 18 Sherif
00096: f – Color [A=255, R=223, G=223, B=223] 19 Comic
00097: g – Color [A=255, R=255, G=255, B=255] 8 Arial
00098: h – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00099: i – Color [A=255, R=63, G=63, B=63] 10 Sherif
00100: j – Color [A=255, R=95, G=95, B=95] 11 Comic
00101: k – Color [A=255, R=127, G=127, B=127] 12 Arial
00102: l – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00103: m – Color [A=255, R=191, G=191, B=191] 14 Sherif
00104: n – Color [A=255, R=223, G=223, B=223] 15 Comic
00105: o – Color [A=255, R=255, G=255, B=255] 16 Arial
00106: p – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00107: q – Color [A=255, R=63, G=63, B=63] 18 Sherif
00108: r – Color [A=255, R=95, G=95, B=95] 19 Comic
00109: s – Color [A=255, R=127, G=127, B=127] 8 Arial
00110: t – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00111: u – Color [A=255, R=191, G=191, B=191] 10 Sherif
00112: v – Color [A=255, R=223, G=223, B=223] 11 Comic
00113: w – Color [A=255, R=255, G=255, B=255] 12 Arial
00114: x – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00115: y – Color [A=255, R=63, G=63, B=63] 14 Sherif
00116: z – Color [A=255, R=95, G=95, B=95] 15 Comic
00117: A – Color [A=255, R=127, G=127, B=127] 16 Arial
00118: B – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00119: C – Color [A=255, R=191, G=191, B=191] 18 Sherif
00120: D – Color [A=255, R=223, G=223, B=223] 19 Comic
00121: E – Color [A=255, R=255, G=255, B=255] 8 Arial
00122: F – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00123: G – Color [A=255, R=63, G=63, B=63] 10 Sherif
00124: H – Color [A=255, R=95, G=95, B=95] 11 Comic
00125: I – Color [A=255, R=127, G=127, B=127] 12 Arial
00126: J – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00127: K – Color [A=255, R=191, G=191, B=191] 14 Sherif
00128: L – Color [A=255, R=223, G=223, B=223] 15 Comic
00129: M – Color [A=255, R=255, G=255, B=255] 16 Arial
00130: N – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00131: O – Color [A=255, R=63, G=63, B=63] 18 Sherif
00132: P – Color [A=255, R=95, G=95, B=95] 19 Comic
00133: Q – Color [A=255, R=127, G=127, B=127] 8 Arial
00134: R – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00135: S – Color [A=255, R=191, G=191, B=191] 10 Sherif
00136: T – Color [A=255, R=223, G=223, B=223] 11 Comic
00137: U – Color [A=255, R=255, G=255, B=255] 12 Arial
00138: V – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00139: W – Color [A=255, R=63, G=63, B=63] 14 Sherif
00140: X – Color [A=255, R=95, G=95, B=95] 15 Comic
00141: Y – Color [A=255, R=127, G=127, B=127] 16 Arial
00142: Z – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00143: [ – Color [A=255, R=191, G=191, B=191] 18 Sherif
00144: – Color [A=255, R=223, G=223, B=223] 19 Comic
00145: ] – Color [A=255, R=255, G=255, B=255] 8 Arial
00146: ^ – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00147: _ – Color [A=255, R=63, G=63, B=63] 10 Sherif
00148: ` – Color [A=255, R=95, G=95, B=95] 11 Comic
00149: a – Color [A=255, R=127, G=127, B=127] 12 Arial
00150: b – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00151: c – Color [A=255, R=191, G=191, B=191] 14 Sherif
00152: d – Color [A=255, R=223, G=223, B=223] 15 Comic
00153: e – Color [A=255, R=255, G=255, B=255] 16 Arial
00154: f – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00155: g – Color [A=255, R=63, G=63, B=63] 18 Sherif
00156: h – Color [A=255, R=95, G=95, B=95] 19 Comic
00157: i – Color [A=255, R=127, G=127, B=127] 8 Arial
00158: j – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00159: k – Color [A=255, R=191, G=191, B=191] 10 Sherif
00160: l – Color [A=255, R=223, G=223, B=223] 11 Comic
00161: m – Color [A=255, R=255, G=255, B=255] 12 Arial
00162: n – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00163: o – Color [A=255, R=63, G=63, B=63] 14 Sherif
00164: p – Color [A=255, R=95, G=95, B=95] 15 Comic
00165: q – Color [A=255, R=127, G=127, B=127] 16 Arial
00166: r – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00167: s – Color [A=255, R=191, G=191, B=191] 18 Sherif
00168: t – Color [A=255, R=223, G=223, B=223] 19 Comic
00169: u – Color [A=255, R=255, G=255, B=255] 8 Arial
00170: v – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00171: w – Color [A=255, R=63, G=63, B=63] 10 Sherif
00172: x – Color [A=255, R=95, G=95, B=95] 11 Comic
00173: y – Color [A=255, R=127, G=127, B=127] 12 Arial
00174: z – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00175: A – Color [A=255, R=191, G=191, B=191] 14 Sherif
00176: B – Color [A=255, R=223, G=223, B=223] 15 Comic
00177: C – Color [A=255, R=255, G=255, B=255] 16 Arial
00178: D – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00179: E – Color [A=255, R=63, G=63, B=63] 18 Sherif
00180: F – Color [A=255, R=95, G=95, B=95] 19 Comic
00181: G – Color [A=255, R=127, G=127, B=127] 8 Arial
00182: H – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00183: I – Color [A=255, R=191, G=191, B=191] 10 Sherif
00184: J – Color [A=255, R=223, G=223, B=223] 11 Comic
00185: K – Color [A=255, R=255, G=255, B=255] 12 Arial
00186: L – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00187: M – Color [A=255, R=63, G=63, B=63] 14 Sherif
00188: N – Color [A=255, R=95, G=95, B=95] 15 Comic
00189: O – Color [A=255, R=127, G=127, B=127] 16 Arial
00190: P – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00191: Q – Color [A=255, R=191, G=191, B=191] 18 Sherif
00192: R – Color [A=255, R=223, G=223, B=223] 19 Comic
00193: S – Color [A=255, R=255, G=255, B=255] 8 Arial
00194: T – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00195: U – Color [A=255, R=63, G=63, B=63] 10 Sherif
00196: V – Color [A=255, R=95, G=95, B=95] 11 Comic
00197: W – Color [A=255, R=127, G=127, B=127] 12 Arial
00198: X – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00199: Y – Color [A=255, R=191, G=191, B=191] 14 Sherif
00200: Z – Color [A=255, R=223, G=223, B=223] 15 Comic
00201: [ – Color [A=255, R=255, G=255, B=255] 16 Arial
00202: – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00203: ] – Color [A=255, R=63, G=63, B=63] 18 Sherif
00204: ^ – Color [A=255, R=95, G=95, B=95] 19 Comic
00205: _ – Color [A=255, R=127, G=127, B=127] 8 Arial
00206: ` – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00207: a – Color [A=255, R=191, G=191, B=191] 10 Sherif
00208: b – Color [A=255, R=223, G=223, B=223] 11 Comic
00209: c – Color [A=255, R=255, G=255, B=255] 12 Arial
00210: d – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00211: e – Color [A=255, R=63, G=63, B=63] 14 Sherif
00212: f – Color [A=255, R=95, G=95, B=95] 15 Comic
00213: g – Color [A=255, R=127, G=127, B=127] 16 Arial
00214: h – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00215: i – Color [A=255, R=191, G=191, B=191] 18 Sherif
00216: j – Color [A=255, R=223, G=223, B=223] 19 Comic
00217: k – Color [A=255, R=255, G=255, B=255] 8 Arial
00218: l – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00219: m – Color [A=255, R=63, G=63, B=63] 10 Sherif
00220: n – Color [A=255, R=95, G=95, B=95] 11 Comic
00221: o – Color [A=255, R=127, G=127, B=127] 12 Arial
00222: p – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00223: q – Color [A=255, R=191, G=191, B=191] 14 Sherif
00224: r – Color [A=255, R=223, G=223, B=223] 15 Comic
00225: s – Color [A=255, R=255, G=255, B=255] 16 Arial
00226: t – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00227: u – Color [A=255, R=63, G=63, B=63] 18 Sherif
00228: v – Color [A=255, R=95, G=95, B=95] 19 Comic
00229: w – Color [A=255, R=127, G=127, B=127] 8 Arial
00230: x – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00231: y – Color [A=255, R=191, G=191, B=191] 10 Sherif
00232: z – Color [A=255, R=223, G=223, B=223] 11 Comic
00233: A – Color [A=255, R=255, G=255, B=255] 12 Arial
00234: B – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00235: C – Color [A=255, R=63, G=63, B=63] 14 Sherif
00236: D – Color [A=255, R=95, G=95, B=95] 15 Comic
00237: E – Color [A=255, R=127, G=127, B=127] 16 Arial
00238: F – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00239: G – Color [A=255, R=191, G=191, B=191] 18 Sherif
00240: H – Color [A=255, R=223, G=223, B=223] 19 Comic
00241: I – Color [A=255, R=255, G=255, B=255] 8 Arial
00242: J – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00243: K – Color [A=255, R=63, G=63, B=63] 10 Sherif
00244: L – Color [A=255, R=95, G=95, B=95] 11 Comic
00245: M – Color [A=255, R=127, G=127, B=127] 12 Arial
00246: N – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00247: O – Color [A=255, R=191, G=191, B=191] 14 Sherif
00248: P – Color [A=255, R=223, G=223, B=223] 15 Comic
00249: Q – Color [A=255, R=255, G=255, B=255] 16 Arial
00250: R – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00251: S – Color [A=255, R=63, G=63, B=63] 18 Sherif
00252: T – Color [A=255, R=95, G=95, B=95] 19 Comic
00253: U – Color [A=255, R=127, G=127, B=127] 8 Arial
00254: V – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00255: W – Color [A=255, R=191, G=191, B=191] 10 Sherif
00256: X – Color [A=255, R=223, G=223, B=223] 11 Comic
00257: Y – Color [A=255, R=255, G=255, B=255] 12 Arial
00258: Z – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00259: [ – Color [A=255, R=63, G=63, B=63] 14 Sherif
00260: – Color [A=255, R=95, G=95, B=95] 15 Comic
00261: ] – Color [A=255, R=127, G=127, B=127] 16 Arial
00262: ^ – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00263: _ – Color [A=255, R=191, G=191, B=191] 18 Sherif
00264: ` – Color [A=255, R=223, G=223, B=223] 19 Comic
00265: a – Color [A=255, R=255, G=255, B=255] 8 Arial
00266: b – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00267: c – Color [A=255, R=63, G=63, B=63] 10 Sherif
00268: d – Color [A=255, R=95, G=95, B=95] 11 Comic
00269: e – Color [A=255, R=127, G=127, B=127] 12 Arial
00270: f – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00271: g – Color [A=255, R=191, G=191, B=191] 14 Sherif
00272: h – Color [A=255, R=223, G=223, B=223] 15 Comic
00273: i – Color [A=255, R=255, G=255, B=255] 16 Arial
00274: j – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00275: k – Color [A=255, R=63, G=63, B=63] 18 Sherif
00276: l – Color [A=255, R=95, G=95, B=95] 19 Comic
00277: m – Color [A=255, R=127, G=127, B=127] 8 Arial
00278: n – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00279: o – Color [A=255, R=191, G=191, B=191] 10 Sherif
00280: p – Color [A=255, R=223, G=223, B=223] 11 Comic
00281: q – Color [A=255, R=255, G=255, B=255] 12 Arial
00282: r – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00283: s – Color [A=255, R=63, G=63, B=63] 14 Sherif
00284: t – Color [A=255, R=95, G=95, B=95] 15 Comic
00285: u – Color [A=255, R=127, G=127, B=127] 16 Arial
00286: v – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00287: w – Color [A=255, R=191, G=191, B=191] 18 Sherif
00288: x – Color [A=255, R=223, G=223, B=223] 19 Comic
00289: y – Color [A=255, R=255, G=255, B=255] 8 Arial
00290: z – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00291: A – Color [A=255, R=63, G=63, B=63] 10 Sherif
00292: B – Color [A=255, R=95, G=95, B=95] 11 Comic
00293: C – Color [A=255, R=127, G=127, B=127] 12 Arial
00294: D – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00295: E – Color [A=255, R=191, G=191, B=191] 14 Sherif
00296: F – Color [A=255, R=223, G=223, B=223] 15 Comic
00297: G – Color [A=255, R=255, G=255, B=255] 16 Arial
00298: H – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00299: I – Color [A=255, R=63, G=63, B=63] 18 Sherif
00300: J – Color [A=255, R=95, G=95, B=95] 19 Comic
00301: K – Color [A=255, R=127, G=127, B=127] 8 Arial
00302: L – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00303: M – Color [A=255, R=191, G=191, B=191] 10 Sherif
00304: N – Color [A=255, R=223, G=223, B=223] 11 Comic
00305: O – Color [A=255, R=255, G=255, B=255] 12 Arial
00306: P – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00307: Q – Color [A=255, R=63, G=63, B=63] 14 Sherif
00308: R – Color [A=255, R=95, G=95, B=95] 15 Comic
00309: S – Color [A=255, R=127, G=127, B=127] 16 Arial
00310: T – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00311: U – Color [A=255, R=191, G=191, B=191] 18 Sherif
00312: V – Color [A=255, R=223, G=223, B=223] 19 Comic
00313: W – Color [A=255, R=255, G=255, B=255] 8 Arial
00314: X – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00315: Y – Color [A=255, R=63, G=63, B=63] 10 Sherif
00316: Z – Color [A=255, R=95, G=95, B=95] 11 Comic
00317: [ – Color [A=255, R=127, G=127, B=127] 12 Arial
00318: – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00319: ] – Color [A=255, R=191, G=191, B=191] 14 Sherif
00320: ^ – Color [A=255, R=223, G=223, B=223] 15 Comic
00321: _ – Color [A=255, R=255, G=255, B=255] 16 Arial
00322: ` – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00323: a – Color [A=255, R=63, G=63, B=63] 18 Sherif
00324: b – Color [A=255, R=95, G=95, B=95] 19 Comic
00325: c – Color [A=255, R=127, G=127, B=127] 8 Arial
00326: d – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00327: e – Color [A=255, R=191, G=191, B=191] 10 Sherif
00328: f – Color [A=255, R=223, G=223, B=223] 11 Comic
00329: g – Color [A=255, R=255, G=255, B=255] 12 Arial
00330: h – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00331: i – Color [A=255, R=63, G=63, B=63] 14 Sherif
00332: j – Color [A=255, R=95, G=95, B=95] 15 Comic
00333: k – Color [A=255, R=127, G=127, B=127] 16 Arial
00334: l – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00335: m – Color [A=255, R=191, G=191, B=191] 18 Sherif
00336: n – Color [A=255, R=223, G=223, B=223] 19 Comic
00337: o – Color [A=255, R=255, G=255, B=255] 8 Arial
00338: p – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00339: q – Color [A=255, R=63, G=63, B=63] 10 Sherif
00340: r – Color [A=255, R=95, G=95, B=95] 11 Comic
00341: s – Color [A=255, R=127, G=127, B=127] 12 Arial
00342: t – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00343: u – Color [A=255, R=191, G=191, B=191] 14 Sherif
00344: v – Color [A=255, R=223, G=223, B=223] 15 Comic
00345: w – Color [A=255, R=255, G=255, B=255] 16 Arial
00346: x – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00347: y – Color [A=255, R=63, G=63, B=63] 18 Sherif
00348: z – Color [A=255, R=95, G=95, B=95] 19 Comic
00349: A – Color [A=255, R=127, G=127, B=127] 8 Arial
00350: B – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00351: C – Color [A=255, R=191, G=191, B=191] 10 Sherif
00352: D – Color [A=255, R=223, G=223, B=223] 11 Comic
00353: E – Color [A=255, R=255, G=255, B=255] 12 Arial
00354: F – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00355: G – Color [A=255, R=63, G=63, B=63] 14 Sherif
00356: H – Color [A=255, R=95, G=95, B=95] 15 Comic
00357: I – Color [A=255, R=127, G=127, B=127] 16 Arial
00358: J – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00359: K – Color [A=255, R=191, G=191, B=191] 18 Sherif
00360: L – Color [A=255, R=223, G=223, B=223] 19 Comic
00361: M – Color [A=255, R=255, G=255, B=255] 8 Arial
00362: N – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00363: O – Color [A=255, R=63, G=63, B=63] 10 Sherif
00364: P – Color [A=255, R=95, G=95, B=95] 11 Comic
00365: Q – Color [A=255, R=127, G=127, B=127] 12 Arial
00366: R – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00367: S – Color [A=255, R=191, G=191, B=191] 14 Sherif
00368: T – Color [A=255, R=223, G=223, B=223] 15 Comic
00369: U – Color [A=255, R=255, G=255, B=255] 16 Arial
00370: V – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00371: W – Color [A=255, R=63, G=63, B=63] 18 Sherif
00372: X – Color [A=255, R=95, G=95, B=95] 19 Comic
00373: Y – Color [A=255, R=127, G=127, B=127] 8 Arial
00374: Z – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00375: [ – Color [A=255, R=191, G=191, B=191] 10 Sherif
00376: – Color [A=255, R=223, G=223, B=223] 11 Comic
00377: ] – Color [A=255, R=255, G=255, B=255] 12 Arial
00378: ^ – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00379: _ – Color [A=255, R=63, G=63, B=63] 14 Sherif
00380: ` – Color [A=255, R=95, G=95, B=95] 15 Comic
00381: a – Color [A=255, R=127, G=127, B=127] 16 Arial
00382: b – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00383: c – Color [A=255, R=191, G=191, B=191] 18 Sherif
00384: d – Color [A=255, R=223, G=223, B=223] 19 Comic
00385: e – Color [A=255, R=255, G=255, B=255] 8 Arial
00386: f – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00387: g – Color [A=255, R=63, G=63, B=63] 10 Sherif
00388: h – Color [A=255, R=95, G=95, B=95] 11 Comic
00389: i – Color [A=255, R=127, G=127, B=127] 12 Arial
00390: j – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00391: k – Color [A=255, R=191, G=191, B=191] 14 Sherif
00392: l – Color [A=255, R=223, G=223, B=223] 15 Comic
00393: m – Color [A=255, R=255, G=255, B=255] 16 Arial
00394: n – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00395: o – Color [A=255, R=63, G=63, B=63] 18 Sherif
00396: p – Color [A=255, R=95, G=95, B=95] 19 Comic
00397: q – Color [A=255, R=127, G=127, B=127] 8 Arial
00398: r – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00399: s – Color [A=255, R=191, G=191, B=191] 10 Sherif
00400: t – Color [A=255, R=223, G=223, B=223] 11 Comic
00401: u – Color [A=255, R=255, G=255, B=255] 12 Arial
00402: v – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00403: w – Color [A=255, R=63, G=63, B=63] 14 Sherif
00404: x – Color [A=255, R=95, G=95, B=95] 15 Comic
00405: y – Color [A=255, R=127, G=127, B=127] 16 Arial
00406: z – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00407: A – Color [A=255, R=191, G=191, B=191] 18 Sherif
00408: B – Color [A=255, R=223, G=223, B=223] 19 Comic
00409: C – Color [A=255, R=255, G=255, B=255] 8 Arial
00410: D – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00411: E – Color [A=255, R=63, G=63, B=63] 10 Sherif
00412: F – Color [A=255, R=95, G=95, B=95] 11 Comic
00413: G – Color [A=255, R=127, G=127, B=127] 12 Arial
00414: H – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00415: I – Color [A=255, R=191, G=191, B=191] 14 Sherif
00416: J – Color [A=255, R=223, G=223, B=223] 15 Comic
00417: K – Color [A=255, R=255, G=255, B=255] 16 Arial
00418: L – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00419: M – Color [A=255, R=63, G=63, B=63] 18 Sherif
00420: N – Color [A=255, R=95, G=95, B=95] 19 Comic
00421: O – Color [A=255, R=127, G=127, B=127] 8 Arial
00422: P – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00423: Q – Color [A=255, R=191, G=191, B=191] 10 Sherif
00424: R – Color [A=255, R=223, G=223, B=223] 11 Comic
00425: S – Color [A=255, R=255, G=255, B=255] 12 Arial
00426: T – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00427: U – Color [A=255, R=63, G=63, B=63] 14 Sherif
00428: V – Color [A=255, R=95, G=95, B=95] 15 Comic
00429: W – Color [A=255, R=127, G=127, B=127] 16 Arial
00430: X – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00431: Y – Color [A=255, R=191, G=191, B=191] 18 Sherif
00432: Z – Color [A=255, R=223, G=223, B=223] 19 Comic
00433: [ – Color [A=255, R=255, G=255, B=255] 8 Arial
00434: – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00435: ] – Color [A=255, R=63, G=63, B=63] 10 Sherif
00436: ^ – Color [A=255, R=95, G=95, B=95] 11 Comic
00437: _ – Color [A=255, R=127, G=127, B=127] 12 Arial
00438: ` – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00439: a – Color [A=255, R=191, G=191, B=191] 14 Sherif
00440: b – Color [A=255, R=223, G=223, B=223] 15 Comic
00441: c – Color [A=255, R=255, G=255, B=255] 16 Arial
00442: d – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00443: e – Color [A=255, R=63, G=63, B=63] 18 Sherif
00444: f – Color [A=255, R=95, G=95, B=95] 19 Comic
00445: g – Color [A=255, R=127, G=127, B=127] 8 Arial
00446: h – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00447: i – Color [A=255, R=191, G=191, B=191] 10 Sherif
00448: j – Color [A=255, R=223, G=223, B=223] 11 Comic
00449: k – Color [A=255, R=255, G=255, B=255] 12 Arial
00450: l – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00451: m – Color [A=255, R=63, G=63, B=63] 14 Sherif
00452: n – Color [A=255, R=95, G=95, B=95] 15 Comic
00453: o – Color [A=255, R=127, G=127, B=127] 16 Arial
00454: p – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00455: q – Color [A=255, R=191, G=191, B=191] 18 Sherif
00456: r – Color [A=255, R=223, G=223, B=223] 19 Comic
00457: s – Color [A=255, R=255, G=255, B=255] 8 Arial
00458: t – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00459: u – Color [A=255, R=63, G=63, B=63] 10 Sherif
00460: v – Color [A=255, R=95, G=95, B=95] 11 Comic
00461: w – Color [A=255, R=127, G=127, B=127] 12 Arial
00462: x – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00463: y – Color [A=255, R=191, G=191, B=191] 14 Sherif
00464: z – Color [A=255, R=223, G=223, B=223] 15 Comic
00465: A – Color [A=255, R=255, G=255, B=255] 16 Arial
00466: B – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00467: C – Color [A=255, R=63, G=63, B=63] 18 Sherif
00468: D – Color [A=255, R=95, G=95, B=95] 19 Comic
00469: E – Color [A=255, R=127, G=127, B=127] 8 Arial
00470: F – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00471: G – Color [A=255, R=191, G=191, B=191] 10 Sherif
00472: H – Color [A=255, R=223, G=223, B=223] 11 Comic
00473: I – Color [A=255, R=255, G=255, B=255] 12 Arial
00474: J – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00475: K – Color [A=255, R=63, G=63, B=63] 14 Sherif
00476: L – Color [A=255, R=95, G=95, B=95] 15 Comic
00477: M – Color [A=255, R=127, G=127, B=127] 16 Arial
00478: N – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00479: O – Color [A=255, R=191, G=191, B=191] 18 Sherif
00480: P – Color [A=255, R=223, G=223, B=223] 19 Comic
00481: Q – Color [A=255, R=255, G=255, B=255] 8 Arial
00482: R – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00483: S – Color [A=255, R=63, G=63, B=63] 10 Sherif
00484: T – Color [A=255, R=95, G=95, B=95] 11 Comic
00485: U – Color [A=255, R=127, G=127, B=127] 12 Arial
00486: V – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00487: W – Color [A=255, R=191, G=191, B=191] 14 Sherif
00488: X – Color [A=255, R=223, G=223, B=223] 15 Comic
00489: Y – Color [A=255, R=255, G=255, B=255] 16 Arial
00490: Z – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00491: [ – Color [A=255, R=63, G=63, B=63] 18 Sherif
00492: – Color [A=255, R=95, G=95, B=95] 19 Comic
00493: ] – Color [A=255, R=127, G=127, B=127] 8 Arial
00494: ^ – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00495: _ – Color [A=255, R=191, G=191, B=191] 10 Sherif
00496: ` – Color [A=255, R=223, G=223, B=223] 11 Comic
00497: a – Color [A=255, R=255, G=255, B=255] 12 Arial
00498: b – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00499: c – Color [A=255, R=63, G=63, B=63] 14 Sherif
00500: d – Color [A=255, R=95, G=95, B=95] 15 Comic
00501: e – Color [A=255, R=127, G=127, B=127] 16 Arial
00502: f – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00503: g – Color [A=255, R=191, G=191, B=191] 18 Sherif
00504: h – Color [A=255, R=223, G=223, B=223] 19 Comic
00505: i – Color [A=255, R=255, G=255, B=255] 8 Arial
00506: j – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00507: k – Color [A=255, R=63, G=63, B=63] 10 Sherif
00508: l – Color [A=255, R=95, G=95, B=95] 11 Comic
00509: m – Color [A=255, R=127, G=127, B=127] 12 Arial
00510: n – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00511: o – Color [A=255, R=191, G=191, B=191] 14 Sherif
00512: p – Color [A=255, R=223, G=223, B=223] 15 Comic
00513: q – Color [A=255, R=255, G=255, B=255] 16 Arial
00514: r – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00515: s – Color [A=255, R=63, G=63, B=63] 18 Sherif
00516: t – Color [A=255, R=95, G=95, B=95] 19 Comic
00517: u – Color [A=255, R=127, G=127, B=127] 8 Arial
00518: v – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00519: w – Color [A=255, R=191, G=191, B=191] 10 Sherif
00520: x – Color [A=255, R=223, G=223, B=223] 11 Comic
00521: y – Color [A=255, R=255, G=255, B=255] 12 Arial
00522: z – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00523: A – Color [A=255, R=63, G=63, B=63] 14 Sherif
00524: B – Color [A=255, R=95, G=95, B=95] 15 Comic
00525: C – Color [A=255, R=127, G=127, B=127] 16 Arial
00526: D – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00527: E – Color [A=255, R=191, G=191, B=191] 18 Sherif
00528: F – Color [A=255, R=223, G=223, B=223] 19 Comic
00529: G – Color [A=255, R=255, G=255, B=255] 8 Arial
00530: H – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00531: I – Color [A=255, R=63, G=63, B=63] 10 Sherif
00532: J – Color [A=255, R=95, G=95, B=95] 11 Comic
00533: K – Color [A=255, R=127, G=127, B=127] 12 Arial
00534: L – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00535: M – Color [A=255, R=191, G=191, B=191] 14 Sherif
00536: N – Color [A=255, R=223, G=223, B=223] 15 Comic
00537: O – Color [A=255, R=255, G=255, B=255] 16 Arial
00538: P – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00539: Q – Color [A=255, R=63, G=63, B=63] 18 Sherif
00540: R – Color [A=255, R=95, G=95, B=95] 19 Comic
00541: S – Color [A=255, R=127, G=127, B=127] 8 Arial
00542: T – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00543: U – Color [A=255, R=191, G=191, B=191] 10 Sherif
00544: V – Color [A=255, R=223, G=223, B=223] 11 Comic
00545: W – Color [A=255, R=255, G=255, B=255] 12 Arial
00546: X – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00547: Y – Color [A=255, R=63, G=63, B=63] 14 Sherif
00548: Z – Color [A=255, R=95, G=95, B=95] 15 Comic
00549: [ – Color [A=255, R=127, G=127, B=127] 16 Arial
00550: – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00551: ] – Color [A=255, R=191, G=191, B=191] 18 Sherif
00552: ^ – Color [A=255, R=223, G=223, B=223] 19 Comic
00553: _ – Color [A=255, R=255, G=255, B=255] 8 Arial
00554: ` – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00555: a – Color [A=255, R=63, G=63, B=63] 10 Sherif
00556: b – Color [A=255, R=95, G=95, B=95] 11 Comic
00557: c – Color [A=255, R=127, G=127, B=127] 12 Arial
00558: d – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00559: e – Color [A=255, R=191, G=191, B=191] 14 Sherif
00560: f – Color [A=255, R=223, G=223, B=223] 15 Comic
00561: g – Color [A=255, R=255, G=255, B=255] 16 Arial
00562: h – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00563: i – Color [A=255, R=63, G=63, B=63] 18 Sherif
00564: j – Color [A=255, R=95, G=95, B=95] 19 Comic
00565: k – Color [A=255, R=127, G=127, B=127] 8 Arial
00566: l – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00567: m – Color [A=255, R=191, G=191, B=191] 10 Sherif
00568: n – Color [A=255, R=223, G=223, B=223] 11 Comic
00569: o – Color [A=255, R=255, G=255, B=255] 12 Arial
00570: p – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00571: q – Color [A=255, R=63, G=63, B=63] 14 Sherif
00572: r – Color [A=255, R=95, G=95, B=95] 15 Comic
00573: s – Color [A=255, R=127, G=127, B=127] 16 Arial
00574: t – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00575: u – Color [A=255, R=191, G=191, B=191] 18 Sherif
00576: v – Color [A=255, R=223, G=223, B=223] 19 Comic
00577: w – Color [A=255, R=255, G=255, B=255] 8 Arial
00578: x – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00579: y – Color [A=255, R=63, G=63, B=63] 10 Sherif
00580: z – Color [A=255, R=95, G=95, B=95] 11 Comic
00581: A – Color [A=255, R=127, G=127, B=127] 12 Arial
00582: B – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00583: C – Color [A=255, R=191, G=191, B=191] 14 Sherif
00584: D – Color [A=255, R=223, G=223, B=223] 15 Comic
00585: E – Color [A=255, R=255, G=255, B=255] 16 Arial
00586: F – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00587: G – Color [A=255, R=63, G=63, B=63] 18 Sherif
00588: H – Color [A=255, R=95, G=95, B=95] 19 Comic
00589: I – Color [A=255, R=127, G=127, B=127] 8 Arial
00590: J – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00591: K – Color [A=255, R=191, G=191, B=191] 10 Sherif
00592: L – Color [A=255, R=223, G=223, B=223] 11 Comic
00593: M – Color [A=255, R=255, G=255, B=255] 12 Arial
00594: N – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00595: O – Color [A=255, R=63, G=63, B=63] 14 Sherif
00596: P – Color [A=255, R=95, G=95, B=95] 15 Comic
00597: Q – Color [A=255, R=127, G=127, B=127] 16 Arial
00598: R – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00599: S – Color [A=255, R=191, G=191, B=191] 18 Sherif
00600: T – Color [A=255, R=223, G=223, B=223] 19 Comic
00601: U – Color [A=255, R=255, G=255, B=255] 8 Arial
00602: V – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00603: W – Color [A=255, R=63, G=63, B=63] 10 Sherif
00604: X – Color [A=255, R=95, G=95, B=95] 11 Comic
00605: Y – Color [A=255, R=127, G=127, B=127] 12 Arial
00606: Z – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00607: [ – Color [A=255, R=191, G=191, B=191] 14 Sherif
00608: – Color [A=255, R=223, G=223, B=223] 15 Comic
00609: ] – Color [A=255, R=255, G=255, B=255] 16 Arial
00610: ^ – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00611: _ – Color [A=255, R=63, G=63, B=63] 18 Sherif
00612: ` – Color [A=255, R=95, G=95, B=95] 19 Comic
00613: a – Color [A=255, R=127, G=127, B=127] 8 Arial
00614: b – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00615: c – Color [A=255, R=191, G=191, B=191] 10 Sherif
00616: d – Color [A=255, R=223, G=223, B=223] 11 Comic
00617: e – Color [A=255, R=255, G=255, B=255] 12 Arial
00618: f – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00619: g – Color [A=255, R=63, G=63, B=63] 14 Sherif
00620: h – Color [A=255, R=95, G=95, B=95] 15 Comic
00621: i – Color [A=255, R=127, G=127, B=127] 16 Arial
00622: j – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00623: k – Color [A=255, R=191, G=191, B=191] 18 Sherif
00624: l – Color [A=255, R=223, G=223, B=223] 19 Comic
00625: m – Color [A=255, R=255, G=255, B=255] 8 Arial
00626: n – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00627: o – Color [A=255, R=63, G=63, B=63] 10 Sherif
00628: p – Color [A=255, R=95, G=95, B=95] 11 Comic
00629: q – Color [A=255, R=127, G=127, B=127] 12 Arial
00630: r – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00631: s – Color [A=255, R=191, G=191, B=191] 14 Sherif
00632: t – Color [A=255, R=223, G=223, B=223] 15 Comic
00633: u – Color [A=255, R=255, G=255, B=255] 16 Arial
00634: v – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00635: w – Color [A=255, R=63, G=63, B=63] 18 Sherif
00636: x – Color [A=255, R=95, G=95, B=95] 19 Comic
00637: y – Color [A=255, R=127, G=127, B=127] 8 Arial
00638: z – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00639: A – Color [A=255, R=191, G=191, B=191] 10 Sherif
00640: B – Color [A=255, R=223, G=223, B=223] 11 Comic
00641: C – Color [A=255, R=255, G=255, B=255] 12 Arial
00642: D – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00643: E – Color [A=255, R=63, G=63, B=63] 14 Sherif
00644: F – Color [A=255, R=95, G=95, B=95] 15 Comic
00645: G – Color [A=255, R=127, G=127, B=127] 16 Arial
00646: H – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00647: I – Color [A=255, R=191, G=191, B=191] 18 Sherif
00648: J – Color [A=255, R=223, G=223, B=223] 19 Comic
00649: K – Color [A=255, R=255, G=255, B=255] 8 Arial
00650: L – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00651: M – Color [A=255, R=63, G=63, B=63] 10 Sherif
00652: N – Color [A=255, R=95, G=95, B=95] 11 Comic
00653: O – Color [A=255, R=127, G=127, B=127] 12 Arial
00654: P – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00655: Q – Color [A=255, R=191, G=191, B=191] 14 Sherif
00656: R – Color [A=255, R=223, G=223, B=223] 15 Comic
00657: S – Color [A=255, R=255, G=255, B=255] 16 Arial
00658: T – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00659: U – Color [A=255, R=63, G=63, B=63] 18 Sherif
00660: V – Color [A=255, R=95, G=95, B=95] 19 Comic
00661: W – Color [A=255, R=127, G=127, B=127] 8 Arial
00662: X – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00663: Y – Color [A=255, R=191, G=191, B=191] 10 Sherif
00664: Z – Color [A=255, R=223, G=223, B=223] 11 Comic
00665: [ – Color [A=255, R=255, G=255, B=255] 12 Arial
00666: – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00667: ] – Color [A=255, R=63, G=63, B=63] 14 Sherif
00668: ^ – Color [A=255, R=95, G=95, B=95] 15 Comic
00669: _ – Color [A=255, R=127, G=127, B=127] 16 Arial
00670: ` – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00671: a – Color [A=255, R=191, G=191, B=191] 18 Sherif
00672: b – Color [A=255, R=223, G=223, B=223] 19 Comic
00673: c – Color [A=255, R=255, G=255, B=255] 8 Arial
00674: d – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00675: e – Color [A=255, R=63, G=63, B=63] 10 Sherif
00676: f – Color [A=255, R=95, G=95, B=95] 11 Comic
00677: g – Color [A=255, R=127, G=127, B=127] 12 Arial
00678: h – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00679: i – Color [A=255, R=191, G=191, B=191] 14 Sherif
00680: j – Color [A=255, R=223, G=223, B=223] 15 Comic
00681: k – Color [A=255, R=255, G=255, B=255] 16 Arial
00682: l – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00683: m – Color [A=255, R=63, G=63, B=63] 18 Sherif
00684: n – Color [A=255, R=95, G=95, B=95] 19 Comic
00685: o – Color [A=255, R=127, G=127, B=127] 8 Arial
00686: p – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00687: q – Color [A=255, R=191, G=191, B=191] 10 Sherif
00688: r – Color [A=255, R=223, G=223, B=223] 11 Comic
00689: s – Color [A=255, R=255, G=255, B=255] 12 Arial
00690: t – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00691: u – Color [A=255, R=63, G=63, B=63] 14 Sherif
00692: v – Color [A=255, R=95, G=95, B=95] 15 Comic
00693: w – Color [A=255, R=127, G=127, B=127] 16 Arial
00694: x – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00695: y – Color [A=255, R=191, G=191, B=191] 18 Sherif
00696: z – Color [A=255, R=223, G=223, B=223] 19 Comic
00697: A – Color [A=255, R=255, G=255, B=255] 8 Arial
00698: B – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00699: C – Color [A=255, R=63, G=63, B=63] 10 Sherif
00700: D – Color [A=255, R=95, G=95, B=95] 11 Comic
00701: E – Color [A=255, R=127, G=127, B=127] 12 Arial
00702: F – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00703: G – Color [A=255, R=191, G=191, B=191] 14 Sherif
00704: H – Color [A=255, R=223, G=223, B=223] 15 Comic
00705: I – Color [A=255, R=255, G=255, B=255] 16 Arial
00706: J – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00707: K – Color [A=255, R=63, G=63, B=63] 18 Sherif
00708: L – Color [A=255, R=95, G=95, B=95] 19 Comic
00709: M – Color [A=255, R=127, G=127, B=127] 8 Arial
00710: N – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00711: O – Color [A=255, R=191, G=191, B=191] 10 Sherif
00712: P – Color [A=255, R=223, G=223, B=223] 11 Comic
00713: Q – Color [A=255, R=255, G=255, B=255] 12 Arial
00714: R – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00715: S – Color [A=255, R=63, G=63, B=63] 14 Sherif
00716: T – Color [A=255, R=95, G=95, B=95] 15 Comic
00717: U – Color [A=255, R=127, G=127, B=127] 16 Arial
00718: V – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00719: W – Color [A=255, R=191, G=191, B=191] 18 Sherif
00720: X – Color [A=255, R=223, G=223, B=223] 19 Comic
00721: Y – Color [A=255, R=255, G=255, B=255] 8 Arial
00722: Z – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00723: [ – Color [A=255, R=63, G=63, B=63] 10 Sherif
00724: – Color [A=255, R=95, G=95, B=95] 11 Comic
00725: ] – Color [A=255, R=127, G=127, B=127] 12 Arial
00726: ^ – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00727: _ – Color [A=255, R=191, G=191, B=191] 14 Sherif
00728: ` – Color [A=255, R=223, G=223, B=223] 15 Comic
00729: a – Color [A=255, R=255, G=255, B=255] 16 Arial
00730: b – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00731: c – Color [A=255, R=63, G=63, B=63] 18 Sherif
00732: d – Color [A=255, R=95, G=95, B=95] 19 Comic
00733: e – Color [A=255, R=127, G=127, B=127] 8 Arial
00734: f – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00735: g – Color [A=255, R=191, G=191, B=191] 10 Sherif
00736: h – Color [A=255, R=223, G=223, B=223] 11 Comic
00737: i – Color [A=255, R=255, G=255, B=255] 12 Arial
00738: j – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00739: k – Color [A=255, R=63, G=63, B=63] 14 Sherif
00740: l – Color [A=255, R=95, G=95, B=95] 15 Comic
00741: m – Color [A=255, R=127, G=127, B=127] 16 Arial
00742: n – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00743: o – Color [A=255, R=191, G=191, B=191] 18 Sherif
00744: p – Color [A=255, R=223, G=223, B=223] 19 Comic
00745: q – Color [A=255, R=255, G=255, B=255] 8 Arial
00746: r – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00747: s – Color [A=255, R=63, G=63, B=63] 10 Sherif
00748: t – Color [A=255, R=95, G=95, B=95] 11 Comic
00749: u – Color [A=255, R=127, G=127, B=127] 12 Arial
00750: v – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00751: w – Color [A=255, R=191, G=191, B=191] 14 Sherif
00752: x – Color [A=255, R=223, G=223, B=223] 15 Comic
00753: y – Color [A=255, R=255, G=255, B=255] 16 Arial
00754: z – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00755: A – Color [A=255, R=63, G=63, B=63] 18 Sherif
00756: B – Color [A=255, R=95, G=95, B=95] 19 Comic
00757: C – Color [A=255, R=127, G=127, B=127] 8 Arial
00758: D – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00759: E – Color [A=255, R=191, G=191, B=191] 10 Sherif
00760: F – Color [A=255, R=223, G=223, B=223] 11 Comic
00761: G – Color [A=255, R=255, G=255, B=255] 12 Arial
00762: H – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00763: I – Color [A=255, R=63, G=63, B=63] 14 Sherif
00764: J – Color [A=255, R=95, G=95, B=95] 15 Comic
00765: K – Color [A=255, R=127, G=127, B=127] 16 Arial
00766: L – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00767: M – Color [A=255, R=191, G=191, B=191] 18 Sherif
00768: N – Color [A=255, R=223, G=223, B=223] 19 Comic
00769: O – Color [A=255, R=255, G=255, B=255] 8 Arial
00770: P – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00771: Q – Color [A=255, R=63, G=63, B=63] 10 Sherif
00772: R – Color [A=255, R=95, G=95, B=95] 11 Comic
00773: S – Color [A=255, R=127, G=127, B=127] 12 Arial
00774: T – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00775: U – Color [A=255, R=191, G=191, B=191] 14 Sherif
00776: V – Color [A=255, R=223, G=223, B=223] 15 Comic
00777: W – Color [A=255, R=255, G=255, B=255] 16 Arial
00778: X – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00779: Y – Color [A=255, R=63, G=63, B=63] 18 Sherif
00780: Z – Color [A=255, R=95, G=95, B=95] 19 Comic
00781: [ – Color [A=255, R=127, G=127, B=127] 8 Arial
00782: – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00783: ] – Color [A=255, R=191, G=191, B=191] 10 Sherif
00784: ^ – Color [A=255, R=223, G=223, B=223] 11 Comic
00785: _ – Color [A=255, R=255, G=255, B=255] 12 Arial
00786: ` – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00787: a – Color [A=255, R=63, G=63, B=63] 14 Sherif
00788: b – Color [A=255, R=95, G=95, B=95] 15 Comic
00789: c – Color [A=255, R=127, G=127, B=127] 16 Arial
00790: d – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00791: e – Color [A=255, R=191, G=191, B=191] 18 Sherif
00792: f – Color [A=255, R=223, G=223, B=223] 19 Comic
00793: g – Color [A=255, R=255, G=255, B=255] 8 Arial
00794: h – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00795: i – Color [A=255, R=63, G=63, B=63] 10 Sherif
00796: j – Color [A=255, R=95, G=95, B=95] 11 Comic
00797: k – Color [A=255, R=127, G=127, B=127] 12 Arial
00798: l – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00799: m – Color [A=255, R=191, G=191, B=191] 14 Sherif
00800: n – Color [A=255, R=223, G=223, B=223] 15 Comic
00801: o – Color [A=255, R=255, G=255, B=255] 16 Arial
00802: p – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00803: q – Color [A=255, R=63, G=63, B=63] 18 Sherif
00804: r – Color [A=255, R=95, G=95, B=95] 19 Comic
00805: s – Color [A=255, R=127, G=127, B=127] 8 Arial
00806: t – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00807: u – Color [A=255, R=191, G=191, B=191] 10 Sherif
00808: v – Color [A=255, R=223, G=223, B=223] 11 Comic
00809: w – Color [A=255, R=255, G=255, B=255] 12 Arial
00810: x – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00811: y – Color [A=255, R=63, G=63, B=63] 14 Sherif
00812: z – Color [A=255, R=95, G=95, B=95] 15 Comic
00813: A – Color [A=255, R=127, G=127, B=127] 16 Arial
00814: B – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00815: C – Color [A=255, R=191, G=191, B=191] 18 Sherif
00816: D – Color [A=255, R=223, G=223, B=223] 19 Comic
00817: E – Color [A=255, R=255, G=255, B=255] 8 Arial
00818: F – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00819: G – Color [A=255, R=63, G=63, B=63] 10 Sherif
00820: H – Color [A=255, R=95, G=95, B=95] 11 Comic
00821: I – Color [A=255, R=127, G=127, B=127] 12 Arial
00822: J – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00823: K – Color [A=255, R=191, G=191, B=191] 14 Sherif
00824: L – Color [A=255, R=223, G=223, B=223] 15 Comic
00825: M – Color [A=255, R=255, G=255, B=255] 16 Arial
00826: N – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00827: O – Color [A=255, R=63, G=63, B=63] 18 Sherif
00828: P – Color [A=255, R=95, G=95, B=95] 19 Comic
00829: Q – Color [A=255, R=127, G=127, B=127] 8 Arial
00830: R – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00831: S – Color [A=255, R=191, G=191, B=191] 10 Sherif
00832: T – Color [A=255, R=223, G=223, B=223] 11 Comic
00833: U – Color [A=255, R=255, G=255, B=255] 12 Arial
00834: V – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00835: W – Color [A=255, R=63, G=63, B=63] 14 Sherif
00836: X – Color [A=255, R=95, G=95, B=95] 15 Comic
00837: Y – Color [A=255, R=127, G=127, B=127] 16 Arial
00838: Z – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00839: [ – Color [A=255, R=191, G=191, B=191] 18 Sherif
00840: – Color [A=255, R=223, G=223, B=223] 19 Comic
00841: ] – Color [A=255, R=255, G=255, B=255] 8 Arial
00842: ^ – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00843: _ – Color [A=255, R=63, G=63, B=63] 10 Sherif
00844: ` – Color [A=255, R=95, G=95, B=95] 11 Comic
00845: a – Color [A=255, R=127, G=127, B=127] 12 Arial
00846: b – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00847: c – Color [A=255, R=191, G=191, B=191] 14 Sherif
00848: d – Color [A=255, R=223, G=223, B=223] 15 Comic
00849: e – Color [A=255, R=255, G=255, B=255] 16 Arial
00850: f – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00851: g – Color [A=255, R=63, G=63, B=63] 18 Sherif
00852: h – Color [A=255, R=95, G=95, B=95] 19 Comic
00853: i – Color [A=255, R=127, G=127, B=127] 8 Arial
00854: j – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00855: k – Color [A=255, R=191, G=191, B=191] 10 Sherif
00856: l – Color [A=255, R=223, G=223, B=223] 11 Comic
00857: m – Color [A=255, R=255, G=255, B=255] 12 Arial
00858: n – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00859: o – Color [A=255, R=63, G=63, B=63] 14 Sherif
00860: p – Color [A=255, R=95, G=95, B=95] 15 Comic
00861: q – Color [A=255, R=127, G=127, B=127] 16 Arial
00862: r – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00863: s – Color [A=255, R=191, G=191, B=191] 18 Sherif
00864: t – Color [A=255, R=223, G=223, B=223] 19 Comic
00865: u – Color [A=255, R=255, G=255, B=255] 8 Arial
00866: v – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00867: w – Color [A=255, R=63, G=63, B=63] 10 Sherif
00868: x – Color [A=255, R=95, G=95, B=95] 11 Comic
00869: y – Color [A=255, R=127, G=127, B=127] 12 Arial
00870: z – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00871: A – Color [A=255, R=191, G=191, B=191] 14 Sherif
00872: B – Color [A=255, R=223, G=223, B=223] 15 Comic
00873: C – Color [A=255, R=255, G=255, B=255] 16 Arial
00874: D – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00875: E – Color [A=255, R=63, G=63, B=63] 18 Sherif
00876: F – Color [A=255, R=95, G=95, B=95] 19 Comic
00877: G – Color [A=255, R=127, G=127, B=127] 8 Arial
00878: H – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00879: I – Color [A=255, R=191, G=191, B=191] 10 Sherif
00880: J – Color [A=255, R=223, G=223, B=223] 11 Comic
00881: K – Color [A=255, R=255, G=255, B=255] 12 Arial
00882: L – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00883: M – Color [A=255, R=63, G=63, B=63] 14 Sherif
00884: N – Color [A=255, R=95, G=95, B=95] 15 Comic
00885: O – Color [A=255, R=127, G=127, B=127] 16 Arial
00886: P – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00887: Q – Color [A=255, R=191, G=191, B=191] 18 Sherif
00888: R – Color [A=255, R=223, G=223, B=223] 19 Comic
00889: S – Color [A=255, R=255, G=255, B=255] 8 Arial
00890: T – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00891: U – Color [A=255, R=63, G=63, B=63] 10 Sherif
00892: V – Color [A=255, R=95, G=95, B=95] 11 Comic
00893: W – Color [A=255, R=127, G=127, B=127] 12 Arial
00894: X – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00895: Y – Color [A=255, R=191, G=191, B=191] 14 Sherif
00896: Z – Color [A=255, R=223, G=223, B=223] 15 Comic
00897: [ – Color [A=255, R=255, G=255, B=255] 16 Arial
00898: – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00899: ] – Color [A=255, R=63, G=63, B=63] 18 Sherif
00900: ^ – Color [A=255, R=95, G=95, B=95] 19 Comic
00901: _ – Color [A=255, R=127, G=127, B=127] 8 Arial
00902: ` – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00903: a – Color [A=255, R=191, G=191, B=191] 10 Sherif
00904: b – Color [A=255, R=223, G=223, B=223] 11 Comic
00905: c – Color [A=255, R=255, G=255, B=255] 12 Arial
00906: d – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00907: e – Color [A=255, R=63, G=63, B=63] 14 Sherif
00908: f – Color [A=255, R=95, G=95, B=95] 15 Comic
00909: g – Color [A=255, R=127, G=127, B=127] 16 Arial
00910: h – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00911: i – Color [A=255, R=191, G=191, B=191] 18 Sherif
00912: j – Color [A=255, R=223, G=223, B=223] 19 Comic
00913: k – Color [A=255, R=255, G=255, B=255] 8 Arial
00914: l – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00915: m – Color [A=255, R=63, G=63, B=63] 10 Sherif
00916: n – Color [A=255, R=95, G=95, B=95] 11 Comic
00917: o – Color [A=255, R=127, G=127, B=127] 12 Arial
00918: p – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00919: q – Color [A=255, R=191, G=191, B=191] 14 Sherif
00920: r – Color [A=255, R=223, G=223, B=223] 15 Comic
00921: s – Color [A=255, R=255, G=255, B=255] 16 Arial
00922: t – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00923: u – Color [A=255, R=63, G=63, B=63] 18 Sherif
00924: v – Color [A=255, R=95, G=95, B=95] 19 Comic
00925: w – Color [A=255, R=127, G=127, B=127] 8 Arial
00926: x – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00927: y – Color [A=255, R=191, G=191, B=191] 10 Sherif
00928: z – Color [A=255, R=223, G=223, B=223] 11 Comic
00929: A – Color [A=255, R=255, G=255, B=255] 12 Arial
00930: B – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00931: C – Color [A=255, R=63, G=63, B=63] 14 Sherif
00932: D – Color [A=255, R=95, G=95, B=95] 15 Comic
00933: E – Color [A=255, R=127, G=127, B=127] 16 Arial
00934: F – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00935: G – Color [A=255, R=191, G=191, B=191] 18 Sherif
00936: H – Color [A=255, R=223, G=223, B=223] 19 Comic
00937: I – Color [A=255, R=255, G=255, B=255] 8 Arial
00938: J – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00939: K – Color [A=255, R=63, G=63, B=63] 10 Sherif
00940: L – Color [A=255, R=95, G=95, B=95] 11 Comic
00941: M – Color [A=255, R=127, G=127, B=127] 12 Arial
00942: N – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00943: O – Color [A=255, R=191, G=191, B=191] 14 Sherif
00944: P – Color [A=255, R=223, G=223, B=223] 15 Comic
00945: Q – Color [A=255, R=255, G=255, B=255] 16 Arial
00946: R – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00947: S – Color [A=255, R=63, G=63, B=63] 18 Sherif
00948: T – Color [A=255, R=95, G=95, B=95] 19 Comic
00949: U – Color [A=255, R=127, G=127, B=127] 8 Arial
00950: V – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00951: W – Color [A=255, R=191, G=191, B=191] 10 Sherif
00952: X – Color [A=255, R=223, G=223, B=223] 11 Comic
00953: Y – Color [A=255, R=255, G=255, B=255] 12 Arial
00954: Z – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00955: [ – Color [A=255, R=63, G=63, B=63] 14 Sherif
00956: – Color [A=255, R=95, G=95, B=95] 15 Comic
00957: ] – Color [A=255, R=127, G=127, B=127] 16 Arial
00958: ^ – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00959: _ – Color [A=255, R=191, G=191, B=191] 18 Sherif
00960: ` – Color [A=255, R=223, G=223, B=223] 19 Comic
00961: a – Color [A=255, R=255, G=255, B=255] 8 Arial
00962: b – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00963: c – Color [A=255, R=63, G=63, B=63] 10 Sherif
00964: d – Color [A=255, R=95, G=95, B=95] 11 Comic
00965: e – Color [A=255, R=127, G=127, B=127] 12 Arial
00966: f – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00967: g – Color [A=255, R=191, G=191, B=191] 14 Sherif
00968: h – Color [A=255, R=223, G=223, B=223] 15 Comic
00969: i – Color [A=255, R=255, G=255, B=255] 16 Arial
00970: j – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00971: k – Color [A=255, R=63, G=63, B=63] 18 Sherif
00972: l – Color [A=255, R=95, G=95, B=95] 19 Comic
00973: m – Color [A=255, R=127, G=127, B=127] 8 Arial
00974: n – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00975: o – Color [A=255, R=191, G=191, B=191] 10 Sherif
00976: p – Color [A=255, R=223, G=223, B=223] 11 Comic
00977: q – Color [A=255, R=255, G=255, B=255] 12 Arial
00978: r – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00979: s – Color [A=255, R=63, G=63, B=63] 14 Sherif
00980: t – Color [A=255, R=95, G=95, B=95] 15 Comic
00981: u – Color [A=255, R=127, G=127, B=127] 16 Arial
00982: v – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00983: w – Color [A=255, R=191, G=191, B=191] 18 Sherif
00984: x – Color [A=255, R=223, G=223, B=223] 19 Comic
00985: y – Color [A=255, R=255, G=255, B=255] 8 Arial
00986: z – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00987: A – Color [A=255, R=63, G=63, B=63] 10 Sherif
00988: B – Color [A=255, R=95, G=95, B=95] 11 Comic
00989: C – Color [A=255, R=127, G=127, B=127] 12 Arial
00990: D – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00991: E – Color [A=255, R=191, G=191, B=191] 14 Sherif
00992: F – Color [A=255, R=223, G=223, B=223] 15 Comic
00993: G – Color [A=255, R=255, G=255, B=255] 16 Arial
00994: H – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00995: I – Color [A=255, R=63, G=63, B=63] 18 Sherif
00996: J – Color [A=255, R=95, G=95, B=95] 19 Comic
00997: K – Color [A=255, R=127, G=127, B=127] 8 Arial
00998: L – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00999: M – Color [A=255, R=191, G=191, B=191] 10 Sherif
01000: N – Color [A=255, R=223, G=223, B=223] 11 Comic
01001: O – Color [A=255, R=255, G=255, B=255] 12 Arial
01002: P – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01003: Q – Color [A=255, R=63, G=63, B=63] 14 Sherif
01004: R – Color [A=255, R=95, G=95, B=95] 15 Comic
01005: S – Color [A=255, R=127, G=127, B=127] 16 Arial
01006: T – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01007: U – Color [A=255, R=191, G=191, B=191] 18 Sherif
01008: V – Color [A=255, R=223, G=223, B=223] 19 Comic
01009: W – Color [A=255, R=255, G=255, B=255] 8 Arial
01010: X – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01011: Y – Color [A=255, R=63, G=63, B=63] 10 Sherif
01012: Z – Color [A=255, R=95, G=95, B=95] 11 Comic
01013: [ – Color [A=255, R=127, G=127, B=127] 12 Arial
01014: – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01015: ] – Color [A=255, R=191, G=191, B=191] 14 Sherif
01016: ^ – Color [A=255, R=223, G=223, B=223] 15 Comic
01017: _ – Color [A=255, R=255, G=255, B=255] 16 Arial
01018: ` – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01019: a – Color [A=255, R=63, G=63, B=63] 18 Sherif
01020: b – Color [A=255, R=95, G=95, B=95] 19 Comic
01021: c – Color [A=255, R=127, G=127, B=127] 8 Arial
01022: d – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01023: e – Color [A=255, R=191, G=191, B=191] 10 Sherif
01024: f – Color [A=255, R=223, G=223, B=223] 11 Comic
01025: g – Color [A=255, R=255, G=255, B=255] 12 Arial
01026: h – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01027: i – Color [A=255, R=63, G=63, B=63] 14 Sherif
01028: j – Color [A=255, R=95, G=95, B=95] 15 Comic
01029: k – Color [A=255, R=127, G=127, B=127] 16 Arial
01030: l – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01031: m – Color [A=255, R=191, G=191, B=191] 18 Sherif
01032: n – Color [A=255, R=223, G=223, B=223] 19 Comic
01033: o – Color [A=255, R=255, G=255, B=255] 8 Arial
01034: p – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01035: q – Color [A=255, R=63, G=63, B=63] 10 Sherif
01036: r – Color [A=255, R=95, G=95, B=95] 11 Comic
01037: s – Color [A=255, R=127, G=127, B=127] 12 Arial
01038: t – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01039: u – Color [A=255, R=191, G=191, B=191] 14 Sherif
01040: v – Color [A=255, R=223, G=223, B=223] 15 Comic
01041: w – Color [A=255, R=255, G=255, B=255] 16 Arial
01042: x – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01043: y – Color [A=255, R=63, G=63, B=63] 18 Sherif
01044: z – Color [A=255, R=95, G=95, B=95] 19 Comic
01045: A – Color [A=255, R=127, G=127, B=127] 8 Arial
01046: B – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01047: C – Color [A=255, R=191, G=191, B=191] 10 Sherif
01048: D – Color [A=255, R=223, G=223, B=223] 11 Comic
01049: E – Color [A=255, R=255, G=255, B=255] 12 Arial
01050: F – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01051: G – Color [A=255, R=63, G=63, B=63] 14 Sherif
01052: H – Color [A=255, R=95, G=95, B=95] 15 Comic
01053: I – Color [A=255, R=127, G=127, B=127] 16 Arial
01054: J – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01055: K – Color [A=255, R=191, G=191, B=191] 18 Sherif
01056: L – Color [A=255, R=223, G=223, B=223] 19 Comic
01057: M – Color [A=255, R=255, G=255, B=255] 8 Arial
01058: N – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01059: O – Color [A=255, R=63, G=63, B=63] 10 Sherif
01060: P – Color [A=255, R=95, G=95, B=95] 11 Comic
01061: Q – Color [A=255, R=127, G=127, B=127] 12 Arial
01062: R – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01063: S – Color [A=255, R=191, G=191, B=191] 14 Sherif
01064: T – Color [A=255, R=223, G=223, B=223] 15 Comic
01065: U – Color [A=255, R=255, G=255, B=255] 16 Arial
01066: V – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01067: W – Color [A=255, R=63, G=63, B=63] 18 Sherif
01068: X – Color [A=255, R=95, G=95, B=95] 19 Comic
01069: Y – Color [A=255, R=127, G=127, B=127] 8 Arial
01070: Z – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01071: [ – Color [A=255, R=191, G=191, B=191] 10 Sherif
01072: – Color [A=255, R=223, G=223, B=223] 11 Comic
01073: ] – Color [A=255, R=255, G=255, B=255] 12 Arial
01074: ^ – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01075: _ – Color [A=255, R=63, G=63, B=63] 14 Sherif
01076: ` – Color [A=255, R=95, G=95, B=95] 15 Comic
01077: a – Color [A=255, R=127, G=127, B=127] 16 Arial
01078: b – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01079: c – Color [A=255, R=191, G=191, B=191] 18 Sherif
01080: d – Color [A=255, R=223, G=223, B=223] 19 Comic
01081: e – Color [A=255, R=255, G=255, B=255] 8 Arial
01082: f – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01083: g – Color [A=255, R=63, G=63, B=63] 10 Sherif
01084: h – Color [A=255, R=95, G=95, B=95] 11 Comic
01085: i – Color [A=255, R=127, G=127, B=127] 12 Arial
01086: j – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01087: k – Color [A=255, R=191, G=191, B=191] 14 Sherif
01088: l – Color [A=255, R=223, G=223, B=223] 15 Comic
01089: m – Color [A=255, R=255, G=255, B=255] 16 Arial
01090: n – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01091: o – Color [A=255, R=63, G=63, B=63] 18 Sherif
01092: p – Color [A=255, R=95, G=95, B=95] 19 Comic
01093: q – Color [A=255, R=127, G=127, B=127] 8 Arial
01094: r – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01095: s – Color [A=255, R=191, G=191, B=191] 10 Sherif
01096: t – Color [A=255, R=223, G=223, B=223] 11 Comic
01097: u – Color [A=255, R=255, G=255, B=255] 12 Arial
01098: v – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01099: w – Color [A=255, R=63, G=63, B=63] 14 Sherif
01100: x – Color [A=255, R=95, G=95, B=95] 15 Comic
01101: y – Color [A=255, R=127, G=127, B=127] 16 Arial
01102: z – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01103: A – Color [A=255, R=191, G=191, B=191] 18 Sherif
01104: B – Color [A=255, R=223, G=223, B=223] 19 Comic
01105: C – Color [A=255, R=255, G=255, B=255] 8 Arial
01106: D – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01107: E – Color [A=255, R=63, G=63, B=63] 10 Sherif
01108: F – Color [A=255, R=95, G=95, B=95] 11 Comic
01109: G – Color [A=255, R=127, G=127, B=127] 12 Arial
01110: H – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01111: I – Color [A=255, R=191, G=191, B=191] 14 Sherif
01112: J – Color [A=255, R=223, G=223, B=223] 15 Comic
01113: K – Color [A=255, R=255, G=255, B=255] 16 Arial
01114: L – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01115: M – Color [A=255, R=63, G=63, B=63] 18 Sherif
01116: N – Color [A=255, R=95, G=95, B=95] 19 Comic
01117: O – Color [A=255, R=127, G=127, B=127] 8 Arial
01118: P – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01119: Q – Color [A=255, R=191, G=191, B=191] 10 Sherif
01120: R – Color [A=255, R=223, G=223, B=223] 11 Comic
01121: S – Color [A=255, R=255, G=255, B=255] 12 Arial
01122: T – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01123: U – Color [A=255, R=63, G=63, B=63] 14 Sherif
01124: V – Color [A=255, R=95, G=95, B=95] 15 Comic
01125: W – Color [A=255, R=127, G=127, B=127] 16 Arial
01126: X – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01127: Y – Color [A=255, R=191, G=191, B=191] 18 Sherif
01128: Z – Color [A=255, R=223, G=223, B=223] 19 Comic
01129: [ – Color [A=255, R=255, G=255, B=255] 8 Arial
01130: – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01131: ] – Color [A=255, R=63, G=63, B=63] 10 Sherif
01132: ^ – Color [A=255, R=95, G=95, B=95] 11 Comic
01133: _ – Color [A=255, R=127, G=127, B=127] 12 Arial
01134: ` – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01135: a – Color [A=255, R=191, G=191, B=191] 14 Sherif
01136: b – Color [A=255, R=223, G=223, B=223] 15 Comic
01137: c – Color [A=255, R=255, G=255, B=255] 16 Arial
01138: d – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01139: e – Color [A=255, R=63, G=63, B=63] 18 Sherif
01140: f – Color [A=255, R=95, G=95, B=95] 19 Comic
01141: g – Color [A=255, R=127, G=127, B=127] 8 Arial
01142: h – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01143: i – Color [A=255, R=191, G=191, B=191] 10 Sherif
01144: j – Color [A=255, R=223, G=223, B=223] 11 Comic
01145: k – Color [A=255, R=255, G=255, B=255] 12 Arial
01146: l – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01147: m – Color [A=255, R=63, G=63, B=63] 14 Sherif
01148: n – Color [A=255, R=95, G=95, B=95] 15 Comic
01149: o – Color [A=255, R=127, G=127, B=127] 16 Arial
01150: p – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01151: q – Color [A=255, R=191, G=191, B=191] 18 Sherif
01152: r – Color [A=255, R=223, G=223, B=223] 19 Comic
01153: s – Color [A=255, R=255, G=255, B=255] 8 Arial
01154: t – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01155: u – Color [A=255, R=63, G=63, B=63] 10 Sherif
01156: v – Color [A=255, R=95, G=95, B=95] 11 Comic
01157: w – Color [A=255, R=127, G=127, B=127] 12 Arial
01158: x – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01159: y – Color [A=255, R=191, G=191, B=191] 14 Sherif
01160: z – Color [A=255, R=223, G=223, B=223] 15 Comic
01161: A – Color [A=255, R=255, G=255, B=255] 16 Arial
01162: B – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01163: C – Color [A=255, R=63, G=63, B=63] 18 Sherif
01164: D – Color [A=255, R=95, G=95, B=95] 19 Comic
01165: E – Color [A=255, R=127, G=127, B=127] 8 Arial
01166: F – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01167: G – Color [A=255, R=191, G=191, B=191] 10 Sherif
01168: H – Color [A=255, R=223, G=223, B=223] 11 Comic
01169: I – Color [A=255, R=255, G=255, B=255] 12 Arial
01170: J – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01171: K – Color [A=255, R=63, G=63, B=63] 14 Sherif
01172: L – Color [A=255, R=95, G=95, B=95] 15 Comic
01173: M – Color [A=255, R=127, G=127, B=127] 16 Arial
01174: N – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01175: O – Color [A=255, R=191, G=191, B=191] 18 Sherif
01176: P – Color [A=255, R=223, G=223, B=223] 19 Comic
01177: Q – Color [A=255, R=255, G=255, B=255] 8 Arial
01178: R – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01179: S – Color [A=255, R=63, G=63, B=63] 10 Sherif
01180: T – Color [A=255, R=95, G=95, B=95] 11 Comic
01181: U – Color [A=255, R=127, G=127, B=127] 12 Arial
01182: V – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01183: W – Color [A=255, R=191, G=191, B=191] 14 Sherif
01184: X – Color [A=255, R=223, G=223, B=223] 15 Comic
01185: Y – Color [A=255, R=255, G=255, B=255] 16 Arial
01186: Z – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01187: [ – Color [A=255, R=63, G=63, B=63] 18 Sherif
01188: – Color [A=255, R=95, G=95, B=95] 19 Comic
01189: ] – Color [A=255, R=127, G=127, B=127] 8 Arial
01190: ^ – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01191: _ – Color [A=255, R=191, G=191, B=191] 10 Sherif
01192: ` – Color [A=255, R=223, G=223, B=223] 11 Comic
01193: a – Color [A=255, R=255, G=255, B=255] 12 Arial
01194: b – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01195: c – Color [A=255, R=63, G=63, B=63] 14 Sherif
01196: d – Color [A=255, R=95, G=95, B=95] 15 Comic
01197: e – Color [A=255, R=127, G=127, B=127] 16 Arial
01198: f – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01199: g – Color [A=255, R=191, G=191, B=191] 18 Sherif
01200: h – Color [A=255, R=223, G=223, B=223] 19 Comic
01201: i – Color [A=255, R=255, G=255, B=255] 8 Arial
01202: j – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01203: k – Color [A=255, R=63, G=63, B=63] 10 Sherif
01204: l – Color [A=255, R=95, G=95, B=95] 11 Comic
01205: m – Color [A=255, R=127, G=127, B=127] 12 Arial
01206: n – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01207: o – Color [A=255, R=191, G=191, B=191] 14 Sherif
01208: p – Color [A=255, R=223, G=223, B=223] 15 Comic
01209: q – Color [A=255, R=255, G=255, B=255] 16 Arial
01210: r – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01211: s – Color [A=255, R=63, G=63, B=63] 18 Sherif
01212: t – Color [A=255, R=95, G=95, B=95] 19 Comic
01213: u – Color [A=255, R=127, G=127, B=127] 8 Arial
01214: v – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01215: w – Color [A=255, R=191, G=191, B=191] 10 Sherif
01216: x – Color [A=255, R=223, G=223, B=223] 11 Comic
01217: y – Color [A=255, R=255, G=255, B=255] 12 Arial
01218: z – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01219: A – Color [A=255, R=63, G=63, B=63] 14 Sherif
01220: B – Color [A=255, R=95, G=95, B=95] 15 Comic
01221: C – Color [A=255, R=127, G=127, B=127] 16 Arial
01222: D – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01223: E – Color [A=255, R=191, G=191, B=191] 18 Sherif
01224: F – Color [A=255, R=223, G=223, B=223] 19 Comic
01225: G – Color [A=255, R=255, G=255, B=255] 8 Arial
01226: H – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01227: I – Color [A=255, R=63, G=63, B=63] 10 Sherif
01228: J – Color [A=255, R=95, G=95, B=95] 11 Comic
01229: K – Color [A=255, R=127, G=127, B=127] 12 Arial
01230: L – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01231: M – Color [A=255, R=191, G=191, B=191] 14 Sherif
01232: N – Color [A=255, R=223, G=223, B=223] 15 Comic
01233: O – Color [A=255, R=255, G=255, B=255] 16 Arial
01234: P – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01235: Q – Color [A=255, R=63, G=63, B=63] 18 Sherif
01236: R – Color [A=255, R=95, G=95, B=95] 19 Comic
01237: S – Color [A=255, R=127, G=127, B=127] 8 Arial
01238: T – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01239: U – Color [A=255, R=191, G=191, B=191] 10 Sherif
01240: V – Color [A=255, R=223, G=223, B=223] 11 Comic
01241: W – Color [A=255, R=255, G=255, B=255] 12 Arial
01242: X – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01243: Y – Color [A=255, R=63, G=63, B=63] 14 Sherif
01244: Z – Color [A=255, R=95, G=95, B=95] 15 Comic
01245: [ – Color [A=255, R=127, G=127, B=127] 16 Arial
01246: – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01247: ] – Color [A=255, R=191, G=191, B=191] 18 Sherif
01248: ^ – Color [A=255, R=223, G=223, B=223] 19 Comic
01249: _ – Color [A=255, R=255, G=255, B=255] 8 Arial
01250: ` – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01251: a – Color [A=255, R=63, G=63, B=63] 10 Sherif
01252: b – Color [A=255, R=95, G=95, B=95] 11 Comic
01253: c – Color [A=255, R=127, G=127, B=127] 12 Arial
01254: d – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01255: e – Color [A=255, R=191, G=191, B=191] 14 Sherif
01256: f – Color [A=255, R=223, G=223, B=223] 15 Comic
01257: g – Color [A=255, R=255, G=255, B=255] 16 Arial
01258: h – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01259: i – Color [A=255, R=63, G=63, B=63] 18 Sherif
01260: j – Color [A=255, R=95, G=95, B=95] 19 Comic
01261: k – Color [A=255, R=127, G=127, B=127] 8 Arial
01262: l – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01263: m – Color [A=255, R=191, G=191, B=191] 10 Sherif
01264: n – Color [A=255, R=223, G=223, B=223] 11 Comic
01265: o – Color [A=255, R=255, G=255, B=255] 12 Arial
01266: p – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01267: q – Color [A=255, R=63, G=63, B=63] 14 Sherif
01268: r – Color [A=255, R=95, G=95, B=95] 15 Comic
01269: s – Color [A=255, R=127, G=127, B=127] 16 Arial
01270: t – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01271: u – Color [A=255, R=191, G=191, B=191] 18 Sherif
01272: v – Color [A=255, R=223, G=223, B=223] 19 Comic
01273: w – Color [A=255, R=255, G=255, B=255] 8 Arial
01274: x – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01275: y – Color [A=255, R=63, G=63, B=63] 10 Sherif
01276: z – Color [A=255, R=95, G=95, B=95] 11 Comic
01277: A – Color [A=255, R=127, G=127, B=127] 12 Arial
01278: B – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01279: C – Color [A=255, R=191, G=191, B=191] 14 Sherif
01280: D – Color [A=255, R=223, G=223, B=223] 15 Comic
01281: E – Color [A=255, R=255, G=255, B=255] 16 Arial
01282: F – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01283: G – Color [A=255, R=63, G=63, B=63] 18 Sherif
01284: H – Color [A=255, R=95, G=95, B=95] 19 Comic
01285: I – Color [A=255, R=127, G=127, B=127] 8 Arial
01286: J – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01287: K – Color [A=255, R=191, G=191, B=191] 10 Sherif
01288: L – Color [A=255, R=223, G=223, B=223] 11 Comic
01289: M – Color [A=255, R=255, G=255, B=255] 12 Arial
01290: N – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01291: O – Color [A=255, R=63, G=63, B=63] 14 Sherif
01292: P – Color [A=255, R=95, G=95, B=95] 15 Comic
01293: Q – Color [A=255, R=127, G=127, B=127] 16 Arial
01294: R – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01295: S – Color [A=255, R=191, G=191, B=191] 18 Sherif
01296: T – Color [A=255, R=223, G=223, B=223] 19 Comic
01297: U – Color [A=255, R=255, G=255, B=255] 8 Arial
01298: V – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01299: W – Color [A=255, R=63, G=63, B=63] 10 Sherif
01300: X – Color [A=255, R=95, G=95, B=95] 11 Comic
01301: Y – Color [A=255, R=127, G=127, B=127] 12 Arial
01302: Z – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01303: [ – Color [A=255, R=191, G=191, B=191] 14 Sherif
01304: – Color [A=255, R=223, G=223, B=223] 15 Comic
01305: ] – Color [A=255, R=255, G=255, B=255] 16 Arial
01306: ^ – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01307: _ – Color [A=255, R=63, G=63, B=63] 18 Sherif
01308: ` – Color [A=255, R=95, G=95, B=95] 19 Comic
01309: a – Color [A=255, R=127, G=127, B=127] 8 Arial
01310: b – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01311: c – Color [A=255, R=191, G=191, B=191] 10 Sherif
01312: d – Color [A=255, R=223, G=223, B=223] 11 Comic
01313: e – Color [A=255, R=255, G=255, B=255] 12 Arial
01314: f – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01315: g – Color [A=255, R=63, G=63, B=63] 14 Sherif
01316: h – Color [A=255, R=95, G=95, B=95] 15 Comic
01317: i – Color [A=255, R=127, G=127, B=127] 16 Arial
01318: j – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01319: k – Color [A=255, R=191, G=191, B=191] 18 Sherif
01320: l – Color [A=255, R=223, G=223, B=223] 19 Comic
01321: m – Color [A=255, R=255, G=255, B=255] 8 Arial
01322: n – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01323: o – Color [A=255, R=63, G=63, B=63] 10 Sherif
01324: p – Color [A=255, R=95, G=95, B=95] 11 Comic
01325: q – Color [A=255, R=127, G=127, B=127] 12 Arial
01326: r – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01327: s – Color [A=255, R=191, G=191, B=191] 14 Sherif
01328: t – Color [A=255, R=223, G=223, B=223] 15 Comic
01329: u – Color [A=255, R=255, G=255, B=255] 16 Arial
01330: v – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01331: w – Color [A=255, R=63, G=63, B=63] 18 Sherif
01332: x – Color [A=255, R=95, G=95, B=95] 19 Comic
01333: y – Color [A=255, R=127, G=127, B=127] 8 Arial
01334: z – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01335: A – Color [A=255, R=191, G=191, B=191] 10 Sherif
01336: B – Color [A=255, R=223, G=223, B=223] 11 Comic
01337: C – Color [A=255, R=255, G=255, B=255] 12 Arial
01338: D – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01339: E – Color [A=255, R=63, G=63, B=63] 14 Sherif
01340: F – Color [A=255, R=95, G=95, B=95] 15 Comic
01341: G – Color [A=255, R=127, G=127, B=127] 16 Arial
01342: H – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01343: I – Color [A=255, R=191, G=191, B=191] 18 Sherif
01344: J – Color [A=255, R=223, G=223, B=223] 19 Comic
01345: K – Color [A=255, R=255, G=255, B=255] 8 Arial
01346: L – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01347: M – Color [A=255, R=63, G=63, B=63] 10 Sherif
01348: N – Color [A=255, R=95, G=95, B=95] 11 Comic
01349: O – Color [A=255, R=127, G=127, B=127] 12 Arial
01350: P – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01351: Q – Color [A=255, R=191, G=191, B=191] 14 Sherif
01352: R – Color [A=255, R=223, G=223, B=223] 15 Comic
01353: S – Color [A=255, R=255, G=255, B=255] 16 Arial
01354: T – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01355: U – Color [A=255, R=63, G=63, B=63] 18 Sherif
01356: V – Color [A=255, R=95, G=95, B=95] 19 Comic
01357: W – Color [A=255, R=127, G=127, B=127] 8 Arial
01358: X – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01359: Y – Color [A=255, R=191, G=191, B=191] 10 Sherif
01360: Z – Color [A=255, R=223, G=223, B=223] 11 Comic
01361: [ – Color [A=255, R=255, G=255, B=255] 12 Arial
01362: – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01363: ] – Color [A=255, R=63, G=63, B=63] 14 Sherif
01364: ^ – Color [A=255, R=95, G=95, B=95] 15 Comic
01365: _ – Color [A=255, R=127, G=127, B=127] 16 Arial
01366: ` – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01367: a – Color [A=255, R=191, G=191, B=191] 18 Sherif
01368: b – Color [A=255, R=223, G=223, B=223] 19 Comic
01369: c – Color [A=255, R=255, G=255, B=255] 8 Arial
01370: d – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01371: e – Color [A=255, R=63, G=63, B=63] 10 Sherif
01372: f – Color [A=255, R=95, G=95, B=95] 11 Comic
01373: g – Color [A=255, R=127, G=127, B=127] 12 Arial
01374: h – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01375: i – Color [A=255, R=191, G=191, B=191] 14 Sherif
01376: j – Color [A=255, R=223, G=223, B=223] 15 Comic
01377: k – Color [A=255, R=255, G=255, B=255] 16 Arial
01378: l – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01379: m – Color [A=255, R=63, G=63, B=63] 18 Sherif
01380: n – Color [A=255, R=95, G=95, B=95] 19 Comic
01381: o – Color [A=255, R=127, G=127, B=127] 8 Arial
01382: p – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01383: q – Color [A=255, R=191, G=191, B=191] 10 Sherif
01384: r – Color [A=255, R=223, G=223, B=223] 11 Comic
01385: s – Color [A=255, R=255, G=255, B=255] 12 Arial
01386: t – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01387: u – Color [A=255, R=63, G=63, B=63] 14 Sherif
01388: v – Color [A=255, R=95, G=95, B=95] 15 Comic
01389: w – Color [A=255, R=127, G=127, B=127] 16 Arial
01390: x – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01391: y – Color [A=255, R=191, G=191, B=191] 18 Sherif
01392: z – Color [A=255, R=223, G=223, B=223] 19 Comic
01393: A – Color [A=255, R=255, G=255, B=255] 8 Arial
01394: B – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01395: C – Color [A=255, R=63, G=63, B=63] 10 Sherif
01396: D – Color [A=255, R=95, G=95, B=95] 11 Comic
01397: E – Color [A=255, R=127, G=127, B=127] 12 Arial
01398: F – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01399: G – Color [A=255, R=191, G=191, B=191] 14 Sherif
01400: H – Color [A=255, R=223, G=223, B=223] 15 Comic
01401: I – Color [A=255, R=255, G=255, B=255] 16 Arial
01402: J – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01403: K – Color [A=255, R=63, G=63, B=63] 18 Sherif
01404: L – Color [A=255, R=95, G=95, B=95] 19 Comic
01405: M – Color [A=255, R=127, G=127, B=127] 8 Arial
01406: N – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01407: O – Color [A=255, R=191, G=191, B=191] 10 Sherif
01408: P – Color [A=255, R=223, G=223, B=223] 11 Comic
01409: Q – Color [A=255, R=255, G=255, B=255] 12 Arial
01410: R – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01411: S – Color [A=255, R=63, G=63, B=63] 14 Sherif
01412: T – Color [A=255, R=95, G=95, B=95] 15 Comic
01413: U – Color [A=255, R=127, G=127, B=127] 16 Arial
01414: V – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01415: W – Color [A=255, R=191, G=191, B=191] 18 Sherif
01416: X – Color [A=255, R=223, G=223, B=223] 19 Comic
01417: Y – Color [A=255, R=255, G=255, B=255] 8 Arial
01418: Z – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01419: [ – Color [A=255, R=63, G=63, B=63] 10 Sherif
01420: – Color [A=255, R=95, G=95, B=95] 11 Comic
01421: ] – Color [A=255, R=127, G=127, B=127] 12 Arial
01422: ^ – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01423: _ – Color [A=255, R=191, G=191, B=191] 14 Sherif
01424: ` – Color [A=255, R=223, G=223, B=223] 15 Comic
01425: a – Color [A=255, R=255, G=255, B=255] 16 Arial
01426: b – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01427: c – Color [A=255, R=63, G=63, B=63] 18 Sherif
01428: d – Color [A=255, R=95, G=95, B=95] 19 Comic
01429: e – Color [A=255, R=127, G=127, B=127] 8 Arial
01430: f – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01431: g – Color [A=255, R=191, G=191, B=191] 10 Sherif
01432: h – Color [A=255, R=223, G=223, B=223] 11 Comic
01433: i – Color [A=255, R=255, G=255, B=255] 12 Arial
01434: j – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01435: k – Color [A=255, R=63, G=63, B=63] 14 Sherif
01436: l – Color [A=255, R=95, G=95, B=95] 15 Comic
01437: m – Color [A=255, R=127, G=127, B=127] 16 Arial
01438: n – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01439: o – Color [A=255, R=191, G=191, B=191] 18 Sherif
01440: p – Color [A=255, R=223, G=223, B=223] 19 Comic
01441: q – Color [A=255, R=255, G=255, B=255] 8 Arial
01442: r – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01443: s – Color [A=255, R=63, G=63, B=63] 10 Sherif
01444: t – Color [A=255, R=95, G=95, B=95] 11 Comic
01445: u – Color [A=255, R=127, G=127, B=127] 12 Arial
01446: v – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01447: w – Color [A=255, R=191, G=191, B=191] 14 Sherif
01448: x – Color [A=255, R=223, G=223, B=223] 15 Comic
01449: y – Color [A=255, R=255, G=255, B=255] 16 Arial
01450: z – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01451: A – Color [A=255, R=63, G=63, B=63] 18 Sherif
01452: B – Color [A=255, R=95, G=95, B=95] 19 Comic
01453: C – Color [A=255, R=127, G=127, B=127] 8 Arial
01454: D – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01455: E – Color [A=255, R=191, G=191, B=191] 10 Sherif
01456: F – Color [A=255, R=223, G=223, B=223] 11 Comic
01457: G – Color [A=255, R=255, G=255, B=255] 12 Arial
01458: H – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01459: I – Color [A=255, R=63, G=63, B=63] 14 Sherif
01460: J – Color [A=255, R=95, G=95, B=95] 15 Comic
01461: K – Color [A=255, R=127, G=127, B=127] 16 Arial
01462: L – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01463: M – Color [A=255, R=191, G=191, B=191] 18 Sherif
01464: N – Color [A=255, R=223, G=223, B=223] 19 Comic
01465: O – Color [A=255, R=255, G=255, B=255] 8 Arial
01466: P – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01467: Q – Color [A=255, R=63, G=63, B=63] 10 Sherif
01468: R – Color [A=255, R=95, G=95, B=95] 11 Comic
01469: S – Color [A=255, R=127, G=127, B=127] 12 Arial
01470: T – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01471: U – Color [A=255, R=191, G=191, B=191] 14 Sherif
01472: V – Color [A=255, R=223, G=223, B=223] 15 Comic
01473: W – Color [A=255, R=255, G=255, B=255] 16 Arial
01474: X – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01475: Y – Color [A=255, R=63, G=63, B=63] 18 Sherif
01476: Z – Color [A=255, R=95, G=95, B=95] 19 Comic
01477: [ – Color [A=255, R=127, G=127, B=127] 8 Arial
01478: – Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
01479: ] – Color [A=255, R=191, G=191, B=191] 10 Sherif
01480: ^ – Color [A=255, R=223, G=223, B=223] 11 Comic
01481: _ – Color [A=255, R=255, G=255, B=255] 12 Arial
01482: ` – Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
01483: a – Color [A=255, R=63, G=63, B=63] 14 Sherif
01484: b – Color [A=255, R=95, G=95, B=95] 15 Comic
01485: c – Color [A=255, R=127, G=127, B=127] 16 Arial
01486: d – Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
01487: e – Color [A=255, R=191, G=191, B=191] 18 Sherif
01488: f – Color [A=255, R=223, G=223, B=223] 19 Comic
01489: g – Color [A=255, R=255, G=255, B=255] 8 Arial
01490: h – Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
01491: i – Color [A=255, R=63, G=63, B=63] 10 Sherif
01492: j – Color [A=255, R=95, G=95, B=95] 11 Comic
01493: k – Color [A=255, R=127, G=127, B=127] 12 Arial
01494: l – Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
01495: m – Color [A=255, R=191, G=191, B=191] 14 Sherif
01496: n – Color [A=255, R=223, G=223, B=223] 15 Comic
01497: o – Color [A=255, R=255, G=255, B=255] 16 Arial
01498: p – Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
01499: q – Color [A=255, R=63, G=63, B=63] 18 Sherif
01500: r – Color [A=255, R=95, G=95, B=95] 19 Comic

Oraz output z fabryki:

00001: Color [A=255, R=255, G=255, B=255] 8 Arial
00002: Color [A=255, R=31, G=31, B=31] 9 TimesNewRoman
00003: Color [A=255, R=63, G=63, B=63] 10 Sherif
00004: Color [A=255, R=95, G=95, B=95] 11 Comic
00005: Color [A=255, R=127, G=127, B=127] 12 Arial
00006: Color [A=255, R=159, G=159, B=159] 13 TimesNewRoman
00007: Color [A=255, R=191, G=191, B=191] 14 Sherif
00008: Color [A=255, R=223, G=223, B=223] 15 Comic
00009: Color [A=255, R=255, G=255, B=255] 16 Arial
00010: Color [A=255, R=31, G=31, B=31] 17 TimesNewRoman
00011: Color [A=255, R=63, G=63, B=63] 18 Sherif
00012: Color [A=255, R=95, G=95, B=95] 19 Comic
00013: Color [A=255, R=127, G=127, B=127] 8 Arial
00014: Color [A=255, R=159, G=159, B=159] 9 TimesNewRoman
00015: Color [A=255, R=191, G=191, B=191] 10 Sherif
00016: Color [A=255, R=223, G=223, B=223] 11 Comic
00017: Color [A=255, R=255, G=255, B=255] 12 Arial
00018: Color [A=255, R=31, G=31, B=31] 13 TimesNewRoman
00019: Color [A=255, R=63, G=63, B=63] 14 Sherif
00020: Color [A=255, R=95, G=95, B=95] 15 Comic
00021: Color [A=255, R=127, G=127, B=127] 16 Arial
00022: Color [A=255, R=159, G=159, B=159] 17 TimesNewRoman
00023: Color [A=255, R=191, G=191, B=191] 18 Sherif
00024: Color [A=255, R=223, G=223, B=223] 19 Comic

I koniec. Dla 1500 literek wystarczy 25 wspólnych styli, żeby wszyscy byli zadowoleni. Bajera nie?! Wzorzec ten jest jak wino, zyskuje na swojej wspaniałości z czasem, gdy projekt się powiększa, ilość obiektów rośnie, podczas gdy ilość współdzielonych obiektów praktycznie pozostaje na tym samym poziomie.
Ile to kosztuje? Czas, tzn. cykle procesora. Taka implementacja zmniejszy wydajność aplikacji w minimalnym stopniu, dojdzie czas potrzebny na zarządzanie fabryką, ale w znacznym stopniu spadnie zapotrzebowanie na pamięć. Jak zwykle trzeba rozważyć plusy i minusy takiego rozwiązania oraz to czy się ono w ogóle przyda. Jeżeli podczas działa aplikacji stosunek styli do wyświetlanych literek będzie wysoki (dużo literek, dużo styli) lub gdy dopuszczale będą tylko jeden czy dwa style na cały dokument, wtedy nie warto będzie inwestować w obiekt fabryki.

Ode mnie to tyle. Jak zwykle z niecierpliwością czekam na feedback, opinie, oraz wyprowadzenie mnie z błedu o ile w nim jestem. Jeżeli ktoś rozumie także, sytuacje gdzie to styl będzie rysować literki, bardzo proszę o oświecenie mnie.

Jarek

Wzorce: Odwiedzający / Wizytator

Tak mnie wzięło na wzorce projektowe ostatnimi czasy, dzisiaj coś o o odwiedzającym (wizytatorze). Polska Wikipedia mówi o nim tak odwiedzający.
A teraz moimi słowami:
Wzorzec umożliwia przejście po strukturze danych, oraz zebranie jakichś informacji. Gdy zaistnieje potrzeba zaimplementowania nowej funkcjonalności, gdzie pobieranie danych jest zaimplementowane tak samo, ale rodzaj danych będzie się różnić, problem ten rozwiąże się tworząc nową klasę “odwiedzającą” strukturę danych, która zbierze nowe informacje.
Gdyby zastosować taki wzorzec np. do parsowania XML, pierwszy odwiedzający zbiera informacje o wszystkich linkach, które znajdują się w przeglądanym XML. Inna implementacja zlicza po prostu, wszystkie elementy, czy atrybuty takiego XML. W każdym przypadku, następuje przejście po całej strukturze, różnica jest natomiast w wyniku takiej operacji. Na tym właśnie polega “odseparowanie algorytmu od struktury obiektowej na której się operuje”.


Przykładowy kod:

Code Snippet
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace Visitor
  5. {
  6.     class SimpleExample
  7.     {
  8.         internal interface IElement
  9.         {
  10.             void Accept(IVisitor aVisitor);
  11.         }
  12.  
  13.         internal interface IVisitor
  14.         {
  15.             void Visit(IElement aElement);
  16.         }
  17.  
  18.         public class ElementClassA : IElement
  19.         {
  20.             public void Accept(IVisitor aVisitor)
  21.             {
  22.                 aVisitor.Visit(this);
  23.             }
  24.         }
  25.         public class ElementClassB : IElement
  26.         {
  27.             public void Accept(IVisitor aVisitor)
  28.             {
  29.                 aVisitor.Visit(this);
  30.             }
  31.         }
  32.  
  33.         public class ELementClassC : ElementClassB
  34.         {
  35.             new public void Accept(IVisitor aVisitor)
  36.             {
  37.                 aVisitor.Visit(this);
  38.             }
  39.         }
  40.  
  41.         public class RootElement : IElement
  42.         {
  43.             private ElementClassA _elementA;
  44.             private List<ElementClassB> _elementsBList;
  45.             private static ELementClassC _elementc = new ELementClassC();
  46.             public void Accept(IVisitor aVisitor)
  47.             {
  48.                 aVisitor.Visit(this);
  49.                 _elementA.Accept(aVisitor);
  50.                 foreach (var elementClassB in _elementsBList)
  51.                 {
  52.                     elementClassB.Accept(aVisitor);
  53.                 }
  54.                 RootElement._elementc.Accept(aVisitor);
  55.             }
  56.  
  57.             public RootElement()
  58.             {
  59.                 _elementA = new ElementClassA();
  60.                 _elementsBList = new List<ElementClassB>();
  61.                 for (int i = 0; i < 10; ++i)
  62.                 {
  63.                     _elementsBList.Add(new ElementClassB());
  64.                 }
  65.  
  66.             }
  67.         }
  68.  
  69.         public class VisitorToString : IVisitor
  70.         {
  71.             public int Count { get; set; }
  72.             public VisitorToString()
  73.             {
  74.                 Count = 0;
  75.             }
  76.  
  77.             public void Visit(IElement aElement)
  78.             {
  79.                 string s = string.Format(“Visited class {0}”, aElement.ToString());
  80.                 Count += s.Length;
  81.                 Console.WriteLine(s);
  82.             }
  83.         }
  84.  
  85.         public class VisitorHashString : IVisitor
  86.         {
  87.             public int Count { get; set; }
  88.             public VisitorHashString()
  89.             {
  90.                 Count = 0;
  91.             }
  92.             public void Visit(IElement aElement)
  93.             {
  94.                 string s = string.Format(“Visited class {0}, hash code {1}”, aElement.ToString(), aElement.GetHashCode());
  95.                 Count++;
  96.                 Console.WriteLine(s);
  97.             }
  98.         }
  99.         
  100.         public static void Main()
  101.         {
  102.             RootElement root = new RootElement();
  103.             VisitorToString vstring = new VisitorToString();
  104.             VisitorHashString vhstring = new VisitorHashString();
  105.             root.Accept(vstring);
  106.             Console.WriteLine(“Total written {0}”,vstring.Count);
  107.             root.Accept(vhstring);
  108.             Console.WriteLine(“Total written {0}”,vhstring.Count);
  109.         }
  110.     }
  111. }

W przykładzie jest dwóch odwiedzających. Jeden zlicza wszystkie literki, które zostały wykorzystane do wyświetlenia informacji o odwiedzanych elementach. Drugi zbiera informację o ilości odwiedzonych elementów. Oba wypisują jakieś tam informacje o odwiedzonych elementach, można to zignorować.
W przykładnie, klasy dziedziczące po IElement nie wykonują zbyt wiele poza akceptowaniem odwiedzającego, czy wysłaniem go do wszystkich swoich pól. IElement nie definiuje żadnej funkcjonalności, z której skorzystać mógłbym odwiedzający. Implementację odwiedzającego warto uodpornić na zmiany kolejności wywołać Accept (klasa agregująca), odwiedzający powinien poprawnie zadziałać bez względu na to czy przykładowy RootElement najpierw wyśle do odwiedzającego siebie, czy wcześniej przejdzie po wszystkich swoich polach i dopiero potem sama podda się odwiedzinom. Dlaczego warto tego przypilnować? Ponieważ nie zawsze mamy kontrolę na implementacją odwiedzanych elementów, np. zewnętrzna biblioteka. W nowszej wersji może się okazać, że zmieniono kolejność wywołania Accept ze względu na zwiększenie wydajności albo dodano nowe pola w odwiedzanej klasie.
Warto również zwrócić uwagę, że odwiedzający przyjmuje interfejs, nie będzie więc on w stanie wykonać innych operacji niż tam zdefiniowane. Można to rozwiązać na co najmniej dwa sposoby:
– Bardzo dobrze zdefiniować taki interfejs
– Dodać kolejne metody przeciążające metodę Accept, gdzie parametrem będą klasy na których odwiedzeniu nam zależy

Poniżej rozwiązanie drugie, troszkę rozbudowane:

Code Snippet
  1. using System;
  2.  
  3. namespace Visitor
  4. {
  5.     public interface IVisitor
  6.     {
  7.         void HandleVisit(IObject aObject);
  8.     }
  9.  
  10.     public interface IObject
  11.     {
  12.         void AcceptVisitor(IVisitor aVisitor);
  13.     }
  14.  
  15.     class GenericVisitor : IVisitor
  16.     {
  17.         void IVisitor.HandleVisit(IObject aObject)
  18.         {
  19.             throw new ArgumentException(
  20.                 string.Format(
  21.                     “Sorry but this visitor accepts only ConcreteObjectB types class. Please fix your code!. Error generated by instance of {0} class”,
  22.                     aObject));
  23.         }
  24.  
  25.         public void HandleVisit( ConcreteObjectB aObjectB)
  26.         {
  27.             Console.WriteLine(“Handle visit of class {0}”, aObjectB);
  28.         }
  29.     }
  30.  
  31.     class StronglyTypedVisitor : IVisitor
  32.     {
  33.         void IVisitor.HandleVisit(IObject aObject)
  34.         {
  35.             throw new ArgumentException(string.Format(“Just found new not properly handled visitor {0}- fix it”, aObject));
  36.         }
  37.  
  38.         public void HandleVisit(ConcreteObjectA aObject)
  39.         {
  40.             Console.WriteLine(“Visited by a strongly typed ObjectA instance”);
  41.         }
  42.  
  43.         public void HandleVisit(ConcreteObjectB aObject)
  44.         {
  45.             Console.WriteLine(“Visited by a strongly typed ObjectB instance”);
  46.         }
  47.     }
  48.  
  49.     class ConcreteObjectA : IObject
  50.     {
  51.         void IObject.AcceptVisitor(IVisitor aVisitor)
  52.         {
  53.             throw new ArgumentException(
  54.                 string.Format(
  55.                     “This object only accepts strongly typed objects. Fix your code. Class that generated exception {0}”,
  56.                     aVisitor));
  57.         }
  58.  
  59.         public void AcceptVisitor(StronglyTypedVisitor aVisitor)
  60.         {
  61.             aVisitor.HandleVisit(this);
  62.         }
  63.     }
  64.  
  65.     class StronglyTypedConcreteObject: IObject
  66.     {
  67.         public void AcceptVisitor(IVisitor aVisitor)
  68.         {
  69.             throw new ArgumentException(string.Format(“Consider using strongly typed methodsn. Please implement this method: public void AcceptVisitor({0} aVisitor)”, aVisitor));
  70.         }
  71.     }
  72.  
  73.     class ConcreteObjectB : IObject
  74.     {
  75.         void IObject.AcceptVisitor(IVisitor aVisitor)
  76.         {
  77.             throw new ArgumentException(
  78.                 string.Format(
  79.                     “ConcreteObjectB class accepts only StronglyTypedVisitor, please fix your code. Exception caused by instance of {0} class”,
  80.                     aVisitor));
  81.         }
  82.  
  83.         public void AcceptVisitor(StronglyTypedVisitor aVisitor)
  84.         {
  85.             aVisitor.HandleVisit(this);
  86.         }
  87.     }
  88.  
  89.     class Program
  90.     {
  91.         static void Main()
  92.         {
  93.             ConcreteObjectA a = new ConcreteObjectA();
  94.             ConcreteObjectB b = new ConcreteObjectB();
  95.             StronglyTypedVisitor sv = new StronglyTypedVisitor();
  96.  
  97.             //proper usage of code
  98.             a.AcceptVisitor(sv);
  99.             b.AcceptVisitor(sv);
  100.  
  101.             //now lets try to do some tricks
  102.             GenericVisitor gv = new GenericVisitor();
  103.  
  104.             try
  105.             {
  106.                 //a.AcceptVisitor(gv); this will generate compile error
  107.                 (a as IObject).AcceptVisitor(gv);       //oooo Im so great!
  108.             }
  109.             catch (ArgumentException ae)
  110.             {
  111.                 Console.WriteLine(“—————————————————————————————n{0}”,ae);
  112.             }
  113.  
  114.  
  115.             //example with synchronization lost!
  116.             try
  117.             {
  118.                 //Im sure it was agreed that the GeneralVisitor accepts ConcreteB, maybe its just a bug, I will try with the interface
  119.                 //b.AcceptVisitor(gv); //this will generate compile error
  120.                 (b as IObject).AcceptVisitor(gv);       //looks fine to me and the compilator, so it works!
  121.             }
  122.             catch (ArgumentException ae)
  123.             {
  124.                 Console.WriteLine(“—————————————————————————————n{0}”, ae);
  125.             }
  126.  
  127.         }
  128.     }
  129. }

C# oferuje możliwość zasłonięcia metody dziedziczonej po interfejsie, poprzez jej jawną implementacje (@17), oraz przeciążenie jej inną publiczną metodą, którą zadowoli kompilator (@25).
Wykorzystuje to do poinformowania użytkowników klas, że np. nie obsługuje ona innych typów klas, niż te dostępne publicznie (@19).
Skorzystałem z wyjątków, ze względu na czytelność kodu i przekazu dla użytkownika moich przykładowych klas. Innym sposobem jest np. zastosowanie asercji, które zadziałają jak należy, a w przypadku gdy aplikacja nie została dobrze przetestowana, nie wywalą wyjątku podczas oddawania aplikacji klientowi.
Niektórym może się nie spodobać takie przesłanianie metod, powiedzą że naruszona została zasada kontraktów i obiektowości. OK, ale! Zyskuje się na tym, wcześniejsze wykrywanie nie poprawnego korzystania z interfejsu. W dokumentacji można dodać odpowienie adnotacje, że dana implementacja odwiedzającego działa tylko z daną listą klas.
W części gdzie nie używam try/catch widać, że wszystko działa poprawnie, korzysta się z klas tak, jak osoba je pisząca sobie przewidziała. Nie potrzeba żadnych czarów, rzutowania etc. Wynikiem czego jest też poprawne działanie kodu. To akurat nie jest ciekawe.
Użytkownik decydując się na rzutowanie obiektów, korzysta w nie cywilizowany (@107, @120) sposób jest ciekawsza. Generowany jest czytelny komunikat i prośba o poprawienie kodu, oraz jedyny słuszny błąd w c# – wyjątek. I na koniec przykład z klasą GenericVisitor i ConcreteObjectB, widać jak można sobie rozsynchronizować kod. Co prawda przykład lekko naciągany, ale jednak.

Do czego się przydaje taki wzorzec, gdzie z niego skorzystać?
– Obiekty klas A i B można poddać walidacji, gdzie Wizytor będzie walidować ich poprawność. Warto też wtedy poprawniej nazwać poszczególne klasy.
– A i B zawierają jakieś zadania, które należy z nich wyciągnąć i zakolejkować, A pobiera informacje o zadaniach z sieciA a B pobiera z obserwowanego katalogu. Aplikacja tworzy odpowiednie klasy oczekujące na nowe zadanie, obiekty a lub b zgłaszają nadejście nowych zadań z odpowiednich źródeł, aplikacja przekazuje obiekt a lub b do obiektu zajmującego się zbieraniem takich zadań.
– A i B chcą uzyskać dostęp do strzeżonego obiektu, wcześniej muszą się zamedlować
u strażnika, aby sprawdzić czy mają odpowiednie uprawnienia dostępu
– Parsowanie skomplikowanych struktur

Bardziej życiowe porównanie, choć nie wiem czy najlepsze: organizujecie imprezę, wyklejacie plakaty: “Zapraszamy do nas na mega piwo”, przychodzą różne obiekty, klasa walidator przepuszcza część z nich, a innym grzecznie odmawia.

Cechy takiego wzorca:
– Trzeba napisać więcej kodu
– Może dojść do niesynchronizowania się klas odwiedzanych i odwiedzających, choć trzeba się o to porządnie postarać, dodałem go do przykładu (@120)
+ Czytelniejszy kod
+ Jasne określenie co jest wspierane przez klasy
+ Znika potrzeba rzutowania obiektów podczas ich obsługi
+ Jesteśmy zajebiści bo korzystamy ze wzorców projektowych

To tylko część z sytuacji, w których możliwe jest skorzystanie z tego wzorca. Jedynym ograniczeniem jest tutaj nasza wyobraźnia i zdrowy rozsądek.

JS

Wzorce: NVI / metoda szablonowa

Czytając mądrą książeczką o której pisałem tutaj, przeczytałem fragment o wzorcu NVI – Non Virtual Interface (nazywanym także metodą szablonową – polskie wiki[słaby art], wersja ang.).
Zamierzam się trzymać tej pierwszej nazwy, ponieważ pod taką nazwą ja go poznałem.
Cała idea polega na tym, że udostępnia się publiczną nie wirtualną metodę, z której może korzystać klient naszej (i potomnych) klasy.
Implementacja tej metody polega na wywołaniu kolejnej metody, która wykonuje właściwe zadanie. Metoda wykonująca właściwe zadanie oznaczona jest jako niepubliczna i wirtualna.
Klasy pochodne mogą i w zasadzie powinny ją przeciążać na własny użytek. Przykładowy kod można zmodyfikować tak, aby metoda była czysto wirtualna, co automatycznie wymusi jej implementacje w klasach potomnych. Ja pozostanę przy przykładzie z książki.

Jaki jest z tego pożytek?
Udostępniając metodę publiczną nie wirtualną, definiujemy jedyny dostęp do funkcjonalności na której zależy użytkownikowi, uniemożliwiamy zmianę tego domyślnego zachowania w klasach pochodnych (przecież nie jest wirtualna). I co najważniejsze (IMO) wszelkie zmiany następują w klasie bazowej, wpływając na wszystkie klasy potomne. A więc bugfix, dodatkowe logowanie, try/catch wszystkiego tego dokonujemy tylko w jednym miejscu. Czy to nie śliczne?

Oczywista oczywistość, jeżeli ktoś będzie chciał nadpisać metodę to ją nadpisze. Wzorce nie są idioto odporne.

Przykładowy kod c++

#include  <iostream> 
using  namespace  std;

class  A
{
public :
 void  DoWork()
 {
  //I can add some code here to bug fix something 
  DoCoreWork();
  //also I can add some log/comment here - all changes will affect me and my inheritace 
 }

private :
 virtual  void  DoCoreWork()
 {
  cout<<"Actually doing some work here!n" ;
 }
};

class  B : public  A
{
 virtual  void  DoCoreWork()
 {
  cout<<"Actually I refuse to workn" ;
 }
};

int  _tmain(int  argc, _TCHAR* argv[])
{
 A* a1 = new  A();
 A* a2 = new  B();

 a1->DoWork();
 a2->DoWork();

 return  0;
}

Oraz przykład dla c#

1: using  System;
2: namespace  Blog
3: {
4:     public  class  A 
5:     {
6:         public  void  DoWork()
7:         {
8:             //The same situation as befere. All fixes and updates can be put here 
9:             CoreDoWork();
10:             //Or here it depends on the case. 
11:         }
12:         protected  virtual  void  CoreDoWork()
13:         {
14:             Console .WriteLine("Actually doing some work" );
15:         }
16:     }
17:     public  class  B  : A 
18:     {
19:         protected  override  void  CoreDoWork()
20:         {
21:             Console .WriteLine("Refuse to work at all" );
22:         }
23:     }
24:     public  class  Program 
25:     {
26:         static  void  Main()
27:         {
28:             A  a1 = new  A ();
29:             A  a2 = new  B ();
30:             a1.DoWork();
31:             a2.DoWork();
32:         }
33:     }
34: }
35: 

Na koniec dodam, że wszelkie podobieństwo kodu do tego w książce nie jest przypadkowe, zostało on z niej zaczerpnięty.

Co o tym sądzicie? Wykorzystacie to kiedyś? Uważacie że jest do bani? Gdzieś się pomyliłem? Macie inne zdanie? Jak zawsze można śmiało komentować.

JS

Jak rysować w C#

Uczę się i uczę, sprawdzam wiedzę i sprawdzam i wyszło, że z rysowaniem sobie nie do końca poradziłem. Aby to poprawić chciałem coś napisać/narysować, od słowa (kluczowego) do słowa i zacząłem pisać prostego painta. W sumie nic skomplikowanego, a cieszy. Wyciosałem coś co może pretendować do miany prostego rysownika.

Można sobie wybrać kilka prostych opcji do rysowania plus kilka kolorów, nic fikuśnego. Później mnie trochę poniosło i dodałem opcje cofania edycji i zmiany rozmiaru okna do rysowania, co okazało się banalnie proste.
W zasadzie wszystko co powinna robić aplikacja to posiadanie listy kształtów i kolorów które trzeba narysować gdzieś na ekranie.
Potem pomyślałem o tym, że skoro ktoś spędzi przy mojej aplikacji tyle godzin rysując jakieś cuda, szkoda aby jego praca poszła na marne. Można więc zapisywać i odczytywać obrazek, ponad to można go nawet (wow!) wyeksportować do .png tak aby inne mniej zaawansowane programy mogły go odczytać. Mój paint nie zniży się do tego poziomu i działa tylko z własnym formatem pliku (zserializowana lista obiektów). Tak zamierzam wprowadzić nowy standard.

W między czasie przeczytałem krótki art o wzorcu odwiedzający (Visitor), jako że pasował trochę do koncepcji aplikacji, postanowiłem zrobić mały refactor, aby z niego skorzystać. Wzorzec działa całkiem sprytnie, ale wiadomo że nic nie przychodzi za darmo. Prosta zmiana z enum na odwiedzającego, spowodowała lawinę zmian, którą musiałem wprowadzić do aplikacji, aby przystosować do nowej logiki. Jeszcze jedno spostrzeżenie, ten wzorzec szybko zwiększa ilość klas w projekcie.
Od razu przychodzą rozważania nad oczywistą oczywistością – nic na siłę. Jeżeli rozwiązanie z którego korzystam jest zupełnie wystarczające, nie powoduje problemów, etc to nie widzę najmniejszej potrzeby zmiany. Może poza ciekawością lub celami czysto szkoleniowymi. Tak właśnie było w moim przypadku.

Przy okazji poćwiczyłem także XAML i UI, naprawdę sporą część aplikacji robi się właśnie w designerze – to dobre jest. Pisanie GUI całkowicie w kodzie, a potem zabawa w przesuwanie tego po ekranie, powiększanie i obsługa OnSize(…), OnMove(…), szkoda na to czasu, tym bardziej że można to wyklikać, dzięki czemu prawdopodobieństwo popełnienia błędu jest dużo mniejsze.

Jeżeli ktoś będzie ciekawy jak prosto napisać Painta w C# lub chciałby zobaczyć jak ja to zrobiłem. Lub chciałbym zobaczyć jak skorzystałem ze wzorca odwiedzający, lub chciałbym zobaczyć kod lub po prostu jest znudzony lub zbiera kod lub … To właśnie wtedy powinien skorzystać z tego linka xp-dev i zaciągnąć odpowiednie źródła.

Pytania, odpowiedz i drwiny w komentarzach (jak zawsze)

ps.
Poly nie dziala
ps2
Już weekend!