From 83efb925e7fa098803c5c97e995f7f4c2f80c8dc Mon Sep 17 00:00:00 2001 From: gbamber Date: Wed, 14 Dec 2016 12:44:01 +0000 Subject: [PATCH] Altered directory structure git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5486 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../latest_stable/aboutlazautoupdateunit.pas | 643 +++++ .../latest_stable/alt_lazautoupdate_icon.lrs | 2102 ++++++++++++++++ .../latest_stable/lazautoupdate.png | Bin 0 -> 365 bytes .../latest_stable/lazautoupdate_icon.lrs | 17 + .../lazautoupdate/latest_stable/lazupdate.lpk | 98 + .../lazautoupdate/latest_stable/lazupdate.pas | 23 + .../lazautoupdate/latest_stable/license.lrs | 72 + .../locale/aboutlazautoupdateunit.po | 35 + .../latest_stable/locale/ulazautoupdate.po | 149 ++ .../latest_stable/uappisrunning.pas | 169 ++ .../latest_stable/ulazautoupdate.pas | 2213 +++++++++++++++++ .../latest_stable/versionsupport.pas | 258 ++ 12 files changed, 5779 insertions(+) create mode 100644 components/lazautoupdate/latest_stable/aboutlazautoupdateunit.pas create mode 100644 components/lazautoupdate/latest_stable/alt_lazautoupdate_icon.lrs create mode 100644 components/lazautoupdate/latest_stable/lazautoupdate.png create mode 100644 components/lazautoupdate/latest_stable/lazautoupdate_icon.lrs create mode 100644 components/lazautoupdate/latest_stable/lazupdate.lpk create mode 100644 components/lazautoupdate/latest_stable/lazupdate.pas create mode 100644 components/lazautoupdate/latest_stable/license.lrs create mode 100644 components/lazautoupdate/latest_stable/locale/aboutlazautoupdateunit.po create mode 100644 components/lazautoupdate/latest_stable/locale/ulazautoupdate.po create mode 100644 components/lazautoupdate/latest_stable/uappisrunning.pas create mode 100644 components/lazautoupdate/latest_stable/ulazautoupdate.pas create mode 100644 components/lazautoupdate/latest_stable/versionsupport.pas diff --git a/components/lazautoupdate/latest_stable/aboutlazautoupdateunit.pas b/components/lazautoupdate/latest_stable/aboutlazautoupdateunit.pas new file mode 100644 index 000000000..2593aa4d4 --- /dev/null +++ b/components/lazautoupdate/latest_stable/aboutlazautoupdateunit.pas @@ -0,0 +1,643 @@ +{ TAboutLazAutoUpdate and TAboutBox Component License + + Copyright (C) 2014 Gordon Bamber minesadorada@charcodelvalle.com + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License + for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +unit aboutlazautoupdateunit; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, Controls, Dialogs, Forms, Graphics, LResources, SysUtils, + ExtCtrls, StdCtrls, StrUtils, Buttons, PropEdits; + +const + C_DEFAULTLICENSEFORMWIDTH = 500; + C_DEFAULTLICENSEFORMWIDTH_LINUX = C_DEFAULTLICENSEFORMWIDTH + 100; + C_DEFAULTLICENSEFORMHEIGHT = 400; + C_DEFAULTLICENSEFORMHEIGHT_LINUX = C_DEFAULTLICENSEFORMHEIGHT + 50; + +type + TLicenseType = (abNone, abGPL, abLGPL, abMIT, abModifiedGPL, abProprietry); + + TAboutbox = class(TComponent) + private + { Private declarations } + fDialog: TForm; + fBackgroundbitmap: TBitMap; + fBackgroundResourceName: string; + fDescription: TStrings; + fDialogTitle, fVersion, fAuthorname, fAuthorEmail, fOrganisation, + fComponentName: string; + fDialogHeight, fDialogWidth: integer; + fStretchBackground: boolean; + fFont: TFont; + fColor: TColor; + fLicenseType: TLicenseType; + procedure SetBackgroundBitmap(const AValue: TBitMap); + procedure SetDescriptionStrings(const AValue: TStrings); + procedure SetFont(const AValue: TFont); + procedure ShowLicense(Sender: TObject); + procedure SetDialogTitle(const AValue: string); + protected + { Protected declarations } + public + { Public declarations } + procedure ShowDialog; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + { Published declarations } + // Set these properties in your component Constructor method + property BackGround: TBitMap read fBackgroundbitmap write SetBackgroundBitmap; + property BackgroundResourceName: string + read fBackgroundResourceName write fBackgroundResourceName; + property Description: TStrings read fDescription write SetDescriptionStrings; + property Title: string read fDialogTitle write SetDialogTitle; + property Height: integer read fDialogHeight write fDialogHeight; + property Width: integer read fDialogWidth write fDialogWidth; + property Font: TFont read fFont write SetFont; + property BackGroundColor: TColor read fColor write fColor; + property StretchBackground: boolean read fStretchBackground + write fStretchBackground default False; + property Version: string read fVersion write fVersion; + property Authorname: string read fAuthorname write fAuthorname; + property Organisation: string read fOrganisation write fOrganisation; + property AuthorEmail: string read fAuthorEmail write fAuthorEmail; + property ComponentName: string read fComponentName write fComponentName; + property LicenseType: TLicenseType read fLicenseType write fLicenseType; + end; + + TAboutLazAutoUpdate = class(TComponent) + private + { Private declarations } + fAboutBox: tAboutBox; + procedure SetMyComponentName(const Avalue: string); + procedure SetAboutBoxWidth(const AValue: integer); + procedure SetAboutBoxHeight(const AValue: integer); + procedure SetAboutBoxDescription(const AValue: string); + procedure SetAboutBoxFontName(const AValue: string); + procedure SetAboutBoxFontSize(const AValue: integer); + procedure SetAboutBoxBitmap(const AValue: TBitmap); + procedure SetAboutBoxBackgroundColor(const AValue: TColor); + procedure SetAboutBoxTitle(const AValue: string); + + procedure SetAboutBoxVersion(const AValue: string); + procedure SetAboutBoxAuthorname(const AValue: string); + procedure SetAboutBoxOrganisation(const AValue: string); + procedure SetAboutBoxAuthorEmail(const AValue: string); + procedure SetAboutBoxBackgroundResourceName(const AValue: string); + procedure SetAboutBoxLicenseType(const AValue: string); + procedure SetAboutBoxStretchBackgroundImage(const AValue: boolean); + protected + { Protected declarations } + public + { Public declarations } + constructor Create(AOwner: TComponent); override; // Constructor must be public + destructor Destroy; override; // Destructor must be public + + // Set these (hidden) properties in your inherited component's Create procedure + property AboutBoxComponentName: string write SetMyComponentName; + property AboutBoxWidth: integer write SetAboutBoxWidth; + property AboutBoxHeight: integer write SetAboutBoxHeight; + property AboutBoxDescription: string write SetAboutBoxDescription; + property AboutBoxFontName: string write SetAboutBoxFontName; + property AboutBoxFontSize: integer write SetAboutBoxFontSize; + property AboutBoxBackgroundColor: TColor write SetAboutBoxBackgroundColor; + property AboutBoxTitle: string write SetAboutBoxTitle; + + property AboutBoxVersion: string write SetAboutBoxVersion; + property AboutBoxAuthorname: string write SetAboutBoxAuthorname; + property AboutBoxOrganisation: string write SetAboutBoxOrganisation; + property AboutBoxAuthorEmail: string write SetAboutBoxAuthorEmail; + property AboutBoxLicenseType: string write SetAboutBoxLicenseType; + property AboutBoxBackgroundResourceName: string + write SetAboutBoxBackgroundResourceName; + property AboutBoxStretchBackgroundImage: boolean + write SetAboutBoxStretchBackgroundImage; + published + // The clickable 'About' property will automaticcally appear in any component + // descended from TAboutLazAutoUpdate + + // About this component... + property About: tAboutBox read fAboutBox write fAboutBox; + end; + + // Declaration for the 'About' property editor + TAboutPropertyEditor = class(TClassPropertyEditor) + public + procedure Edit; override; + function GetAttributes: TPropertyAttributes; override; + end; + +procedure Register; + +{For i8n if required} +resourcestring + rs_Componentname = 'Component name'; + rs_About = 'About'; + rs_License = 'License'; + rs_By = 'By'; + rs_For = 'For'; + rs_DatafileMissing = 'Resource datafile license.lrs is missing'; + rs_LicenseTextError = 'There is something wrong with the Licence text'; + rs_AboutBoxError = 'Subcomponent TAboutBox Error'; + + +implementation + +{ TABoutBox} + +constructor TAboutbox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + fBackgroundbitmap := TBitMap.Create; + fDescription := TStringList.Create; + fFont := TFont.Create; + fColor := clDefault; + fLicenseType := abNone; + fComponentName := rs_Componentname; + fDialogTitle := rs_About + ' ' + fComponentName; + + fDialogWidth := 320; + fDialogHeight := 280; + fVersion := '1.0.0.1'; + fLicenseType := abNone; +end; + +destructor TAboutbox.Destroy; +begin + FreeAndNil(fFont); + FreeAndNil(fDescription); + FreeAndNil(fBackgroundbitmap); + inherited Destroy; +end; + +procedure TAboutbox.SetDialogTitle(const AValue: string); +begin + if AnsiContainsText(fDialogTitle, rs_About) then + fDialogTitle := AValue + else + fDialogTitle := rs_About + ' ' + Avalue; +end; + +procedure TAboutbox.ShowDialog; +var + OKbutton, LicenseButton: TBitBtn; + lbl_Description: TLabel; + img_BackGround: TImage; + sz: string; + iCount: integer; + r: TLResource; +begin + fDialog := TForm.CreateNew(nil); + try //.. finally FreeAndNil everything + with fDialog do + begin + // Set Dialog properties + position := poScreenCenter; + borderstyle := bsToolWindow; + Caption := fDialogTitle; + formstyle := fsSystemStayOnTop; + color := fColor; + font := fFont; + if (fDialogHeight > 0) then + Height := fDialogHeight + else + Height := 240; + if (fDialogWidth > 0) then + Width := fDialogWidth + else + Width := 320; + + // Create a background image + img_BackGround := Timage.Create(fDialog); + with img_BackGround do + // Set img_BackGround properties + begin + Align := alClient; + Stretch := fStretchBackground; + // Bitmap assigned? + if Assigned(fBackgroundbitmap) then + Picture.Assign(fBackgroundbitmap); + // Resource file? + r := LazarusResources.Find(fBackgroundResourceName); + if r <> nil then + img_BackGround.Picture.LoadFromLazarusResource(fBackgroundResourceName); + SendToBack; + parent := fDialog; + end; + + // Create a BitBtn button + okbutton := TBitBtn.Create(fDialog); + // Set BitBtn properties + with okButton do + begin + Kind := bkClose; + left := (fDialog.Width div 2) - Width div 2; + top := fDialog.Height - Height - 10; + ParentFont := False; + parent := fDialog; + end; + + // Create a License Button + LicenseButton := TBitBtn.Create(fDialog); + if (fLicenseType <> abNone) then + // Put it on the right + begin + LicenseButton.Top := OKButton.Top; + LicenseButton.Caption := rs_License + '...'; + LicenseButton.left := Width - LicenseButton.Width - 10; + LicenseButton.OnClick := @ShowLicense; + LicenseButton.ParentFont := False; + LicenseButton.Parent := fDialog; + end; + + + // Create a label control + lbl_Description := Tlabel.Create(fDialog); + // Set label properties + with lbl_Description do + begin + left := 8; + Top := 30; + Width := fDialog.Width - 8; + Height := fDialog.Height - 30; + Autosize := False; + ParentFont := True; + Alignment := taCenter; + end; + + // Build up Label text + sz := ''; + // Component name + if fComponentName <> '' then + sz += fComponentName + LineEnding; + // Author name (+Email) + if fAuthorname <> '' then + sz += rs_By + ': ' + fAuthorname + LineEnding; + if fAuthorEmail <> '' then + sz += ' (' + fAuthorEmail + ')' + LineEnding + else + sz += LineEnding; + + sz += LineEnding; + + // Version + if fVersion <> '' then + sz += 'Version: ' + fVersion + LineEnding; + // License + case fLicenseType of + abGPL: sz += rs_License + ': GPL' + LineEnding; + abLGPL: sz += rs_License + ': LGPL' + LineEnding; + abMIT: sz += rs_License + ': M.I.T.' + LineEnding; + abModifiedGPL: sz += rs_License + ': Modified GPL' + LineEnding; + abProprietry: sz += rs_License + ': Proprietry' + LineEnding; + end; + if fOrganisation <> '' then + sz += rs_For + ': ' + fOrganisation + LineEnding; + if fDescription.Count > 0 then + begin + sz += LineEnding; + for iCount := 1 to fDescription.Count do + sz += fDescription[iCount - 1] + LineEnding; + end; + + lbl_Description.Caption := sz; + lbl_Description.parent := fDialog; + // Display the dialog modally + ShowModal; + end; + finally + // Free all resources + FreeAndNil(img_BackGround); + FreeAndNil(lbl_Description); + FreeAndNil(LicenseButton); + FreeAndNil(okbutton); + end; +end; + +procedure TAboutbox.ShowLicense(Sender: TObject); +// Triggered by License button Click +var + sLicenseString: string; + theList: TStringList; + f: integer; + LicenceForm: TForm; + lblText: TLabel; + closebuttton: TBitBtn; + r: TLResource; + szLicenseFile: string; +begin + // Quit early? + if fLicenseType = abNone then + Exit; + + // Set to resource name in license.lrs + case fLicenseType of + abNone: szLicenseFile := ''; + abGPL: szLicenseFile := 'gpl.txt'; + abLGPL: szLicenseFile := 'lgpl.txt'; + abMIT: szLicenseFile := 'mit.txt'; + abModifiedgpl: szLicenseFile := 'modifiedgpl.txt'; + end; + + + // Use a string list to split the text file into lines + theList := TStringList.Create; + // Create a window, label and close button on-the-fly + LicenceForm := TForm.Create(nil); + lblText := TLabel.Create(LicenceForm); + closebuttton := TBitBtn.Create(LicenceForm); + // Load up the text into variable 'sLicenseString' + sLicenseString := LineEnding + LineEnding + fComponentName + LineEnding; + try + try + begin + // Load license text from resource string + r := LazarusResources.Find(szLicenseFile); + if r = nil then + raise Exception.Create(rs_DatafileMissing); + thelist.Add(r.Value); + for f := 0 to TheList.Count - 1 do + sLicenseString += TheList[f] + LineEnding; + end; + except + On e: Exception do + MessageDlg(rs_AboutBoxError, + rs_LicenseTextError, mtError, [mbOK], 0); + end; + + // Replace boilerplate text if possible + sLicenseString := AnsiReplaceText(sLicenseString, '', +{$I %DATE%} + ); + sLicenseString := AnsiReplaceText(sLicenseString, '', fAuthorname); + sLicenseString := AnsiReplaceText(sLicenseString, '', + '(' + fAuthorEmail + ')'); + sLicenseString := AnsiReplaceText(sLicenseString, '', + fOrganisation); + + // Make up the form window and controls + with LicenceForm do + begin + // Form + {$IFDEF WINDOWS} + // More compact GUI? + Width := C_DEFAULTLICENSEFORMWIDTH; + Height := C_DEFAULTLICENSEFORMHEIGHT; + {$ELSE WINDOWS} + Width := C_DEFAULTLICENSEFORMWIDTH_LINUX; + Height := C_DEFAULTLICENSEFORMHEIGHT_LINUX; + {$ENDIF} + // autosize:=true; + // If you enable autosize, the button placement goes awry! + + // The Modified GPL has an extra clause + if (szLicenseFile = 'modifiedgpl.txt') or + (Pos('As a special exception', sLicenseString) > 0) then + Height := Height + 100; + position := poScreenCenter; + borderstyle := bsToolWindow; + Caption := fComponentName + ': Licensing'; + formstyle := fsSystemStayOnTop; + + // Label + lblText.Align := alClient; + lblText.Alignment := taCenter; + lblText.Caption := sLicenseString; + lblText.Parent := LicenceForm; + + // Close Button + closebuttton.Kind := bkClose; + closebuttton.left := (Width div 2) - closebuttton.Width div 2; + closebuttton.top := Height - closebuttton.Height - 10; + closebuttton.parent := LicenceForm; + // Show modally over the existing modal form + PopupParent := TForm(Sender); + ShowModal; + end; + finally + // Free up all component created resources from memory + FreeAndNil(theList); + FreeAndNil(lblText); + FreeAndNil(closebuttton); + FreeAndNil(LicenceForm); + end; +end; + +procedure TAboutbox.SetBackgroundBitmap(const AValue: TBitMap); +begin + if Assigned(AValue) then + fBackgroundbitmap.Assign(AValue); +end; + +procedure TAboutbox.SetDescriptionStrings(const AValue: TStrings); +begin + if Assigned(AValue) then + fDescription.Assign(Avalue); +end; + +procedure TAboutbox.SetFont(const AValue: TFont); +begin + if Assigned(AValue) then + fFont.Assign(AValue); +end; + +{ TAboutLazAutoUpdate } + +procedure Register; +begin + RegisterPropertyEditor(TypeInfo(TAboutbox), + TAboutLazAutoUpdate, 'About', TAboutPropertyEditor); +end; + +procedure TAboutPropertyEditor.Edit; +// Communicate with the component properties +var + AAboutBox: TAboutBox; +begin + AAboutBox := TAboutBox(GetObjectValue(TAboutBox)); + AABoutBox.ShowDialog; +end; + +function TAboutPropertyEditor.GetAttributes: TPropertyAttributes; + // Show the ellipsis +begin + Result := [paDialog, paReadOnly]; +end; + +// Sets for AboutBox dialog properties +procedure TAboutLazAutoUpdate.SetMyComponentName(const Avalue: string); +begin + fAboutBox.ComponentName := AValue; + fAboutBox.Title := AValue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxWidth(const AValue: integer); +begin + fAboutBox.Width := Avalue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxHeight(const AValue: integer); +begin + fAboutBox.Height := Avalue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxDescription(const AValue: string); +begin + fAboutBox.Description.Clear; + fAboutBox.Description.Add(AValue); +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxFontName(const AValue: string); +begin + fAboutBox.Font.Name := AValue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxFontSize(const AValue: integer); +begin + if (AValue > 6) then + fAboutBox.Font.Size := AValue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxTitle(const AValue: string); +begin + fAboutBox.Title := AValue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxBitmap(const AValue: TBitmap); +begin + if Assigned(Avalue) then + fAboutBox.Assign(AValue); +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxBackgroundColor(const AValue: TColor); +begin + fAboutBox.BackGroundColor := AValue; + ; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxVersion(const AValue: string); +begin + fAboutBox.Version := AValue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxAuthorname(const AValue: string); +begin + fAboutBox.Authorname := AValue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxOrganisation(const AValue: string); +begin + fAboutBox.Organisation := AValue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxAuthorEmail(const AValue: string); +begin + fAboutBox.AuthorEmail := AValue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxBackgroundResourceName(const AValue: string); +begin + fAboutBox.BackgroundResourceName := AValue; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxLicenseType(const AValue: string); +begin + case Upcase(AValue) of + 'GPL': fAboutBox.LicenseType := abGPL; + 'LGPL': fAboutBox.LicenseType := abLGPL; + 'MIT': fAboutBox.LicenseType := abMIT; + 'MODIFIEDGPL': fAboutBox.LicenseType := abModifiedGPL; + 'PROPRIETRY': fAboutBox.LicenseType := abProprietry; + else + fAboutBox.LicenseType := abNone; + end; +end; + +procedure TAboutLazAutoUpdate.SetAboutBoxStretchBackgroundImage(const AValue: boolean); +begin + fAboutBox.StretchBackground := AValue; +end; + +// End Sets + +constructor TAboutLazAutoUpdate.Create(AOwner: TComponent); +var + TempImage: TPicture; + r: TLResource; +begin + // Inherit default properties + inherited Create(AOwner); + // Use tAboutBox as a subcomponent + fAboutBox := tAboutBox.Create(nil); + with fAboutBox do + begin + SetSubComponent(True); // Tell the IDE to store the modified properties + // Default of TAboutLazAutoUpdate values override TAbouBox.Create defaults + ComponentName := 'TAboutLazAutoUpdate'; + Description.Add('This is to demonstrate'); //TStrings + Description.Add('the use of TAboutLazAutoUpdate'); //TStrings + Description.Add('Set its properties in your Constructor'); //TStrings + Width := 320; //Integer + Height := 280; //Integer + // Set any Font properties or subproperties here + // Font.Name := 'Arial'; + Font.Color := clNavy; + Font.Size := 10; + // BackGroundColor shows if no BackGround image is set + BackGroundColor := clWindow; + Version := '1.0.0.0'; + AuthorName := 'Gordon Bamber'; + AuthorEmail := 'minesadorada@charcodelvalle.com'; + Organisation := 'Public Domain'; + + //Types available: abNone, abGPL, abLGPL, abMIT, abModifiedGPL, abProprietry + LicenseType := abLGPL; + + // BackGround image is optional + // It must be in a resouce file in the initialization section + + //== How to set a background image to your About dialog -- + // The BackGround property is a TBitmap + // Use a Temporary TPicture to load a JPG. + // NOTE a PNG file will create an error when your component is used in an application! + r := LazarusResources.Find(fAboutBox.BackgroundResourceName); + if r <> nil then + begin + TempImage := TPicture.Create; + // .lrs file is in the initialization section + TempImage.LoadFromLazarusResource(fAboutBox.BackgroundResourceName); + BackGround.Assign(TempImage.Bitmap); + TempImage.Free; + StretchBackground := fAboutBox.StretchBackground; //Boolean + end; + end; +end; + +destructor TAboutLazAutoUpdate.Destroy; +begin + FreeAndNil(fAboutBox); + inherited Destroy; +end; + +initialization +{$I license.lrs} + +end. diff --git a/components/lazautoupdate/latest_stable/alt_lazautoupdate_icon.lrs b/components/lazautoupdate/latest_stable/alt_lazautoupdate_icon.lrs new file mode 100644 index 000000000..32e95affd --- /dev/null +++ b/components/lazautoupdate/latest_stable/alt_lazautoupdate_icon.lrs @@ -0,0 +1,2102 @@ +LazarusResources.Add('TLazAutoUpdate','ICO',[ + #0#0#1#0#12#0#16#16#16#0#1#0#4#0'('#1#0#0#198#0#0#0#16#16#0#0#1#0#8#0'h'#5#0#0 + +#238#1#0#0#16#16#0#0#1#0#8#0'h'#5#0#0'V'#7#0#0#24#24#16#0#1#0#4#0#232#1#0#0 + +#190#12#0#0#24#24#0#0#1#0#8#0#200#6#0#0#166#14#0#0#24#24#0#0#1#0#8#0#200#6#0 + +#0'n'#21#0#0' '#16#0#1#0#4#0#232#2#0#0'6'#28#0#0' '#0#0#1#0#8#0#168#8#0#0 + +#30#31#0#0' '#0#0#1#0#24#0#168#12#0#0#198''''#0#0'00'#0#0#1#0#24#0#168#28#0 + +#0'n4'#0#0'@@'#0#0#1#0#24#0'(2'#0#0#22'Q'#0#0#0#0#0#0#1#0#24#0#23'K'#0#0'>' + +#131#0#0'('#0#0#0#16#0#0#0' '#0#0#0#1#0#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#128#128#0#0#128#0#0#128#128#128#0#192#192#192#0#0 + +#255#255#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#1#22'a'#16#0#0#0#1'ed'#21'f'#16#0#0'e'#22#22#22'1V'#0#1 + +#22#22#21'aV6'#16#1'deaaaa`'#22#22'166'#22'5'#22#22'E6TT'#21'3aa3FFCdV'#22#17 + +'5d3S'#22'D'#17'&33Sdd6'#22#17'5CD'#20'4S'#17#2'66V6A3`'#1'53356A '#0'#35341' + +#0#0#1'3D41 '#0#0#0#1'!2'#16#0#0#248#31#0#0#224#7#0#0#192#3#0#0#128#1#0#0#128 + +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#1#0#0#128#1#0#0 + +#192#3#0#0#224#7#0#0#248#31#0#0'('#0#0#0#16#0#0#0' '#0#0#0#1#0#8#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9#133'A'#0' '#142'Q'#0'.'#148 + +'\'#0'/'#148']'#0#31#141'Q'#0#8#133'@'#0#13#142'G'#0'D'#159'm'#0'}'#188#153#0 + +#142#197#166#0'z'#187#151#0'?'#157'i'#0#12#141'E'#0#14#144'H'#0'\'#175#129#0 + +'y'#190#152#0'['#175#129#0#16#145'J'#0#9#149'H'#0'='#165'k'#0'e'#184#138#0'I' + +#171'u'#0#10#149'H'#0'N'#178'{'#0'Q'#179'}'#0#27#156'U'#0#10#158'L'#0#10#154 + +'K'#0'S'#184#128#0'Y'#186#132#0'w'#199#155#0'u'#198#153#0'}'#201#159#0'p'#196 + +#149#0'B'#177't'#0'e'#192#142#0'p'#196#150#0#137#206#168#0'l'#194#147#0#131 + +#204#163#0#25#161'V'#0#10#162'N'#0#10#161'M'#0'['#192#136#0'i'#197#146#0'x' + +#203#157#0'o'#200#150#0'z'#204#158#0'.'#174'g'#0'{'#204#159#0'1'#176'j'#0's' + +#201#154#0'j'#198#147#0'6'#178'm'#0#10#168'Q'#0#10#167'P'#0'['#196#138#0'g' + +#200#146#0'p'#204#153#0'X'#195#136#0'J'#190'}'#0'k'#202#149#0#16#169'U'#0'U' + +#194#134#0'w'#206#158#0'_'#197#141#0#11#173'S'#0#11#174'T'#0'\'#201#140#0'{' + +#211#162#0'U'#199#136#0'Z'#200#139#0'c'#203#145#0#137#215#172#0#18#176'X'#0 + +'V'#199#136#0'g'#205#148#0'/'#186'm'#0#11#179'V'#0#11#180'W'#0'r'#212#158#0 + +'s'#212#159#0'\'#205#142#0'u'#213#160#0#128#216#167#0'g'#208#150#0'x'#214#162 + +#0'!'#187'f'#0'V'#203#138#0'q'#211#157#0'W'#203#139#0#12#183'X'#0#12#187'Z'#0 + +'9'#200'y'#0'<'#201'z'#0','#196'o'#0'A'#202'~'#0'1'#198's'#0','#196'p'#0#31 + +#192'g'#0#28#192'e'#0')'#195'n'#0'>'#201'|'#0'M'#206#134#0#12#193']'#0#12#192 + +'\'#0#13#200'`'#0#13#207'c'#0#13#201'a'#0#14#212'f'#0#14#213'f'#0#13#208'd'#0 + +#14#212'e'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0'pqnnqp'#0#0#0#0#0#0#0#0'mnoooooonm'#0#0#0#0#0'kllllllllll' + +'k'#0#0#0'jkkkkkkkkkkkkj'#0#0'iiiiiiiiiiiiii'#0'\]^_`]abcdefgh]\OPQRSPTUVWXY' + +'Z[POCDEEFGEHIJKLMNDC7899:;9<=>?@AB87*+,,-./0123456+*'#27#28#29#30#31' !"#$%' + +'&''()'#27#0#23#24#25#25#25#25#25#25#25#25#25#25#25#26#0#0#19#20#21#21#21#21 + +#21#21#21#21#21#21#22#23#0#0#0#14#15#16#16#16#16#16#16#16#16#17#18#0#0#0#0#0 + +#7#8#9#10#10#10#10#11#12#13#0#0#0#0#0#0#0#0#1#2#3#4#5#6#0#0#0#0#0#248#31#0#0 + +#224#7#0#0#192#3#0#0#128#1#0#0#128#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#128#1#0#0#128#1#0#0#192#3#0#0#224#7#0#0#248#31#0#0'('#0#0#0#16#0 + +#0#0' '#0#0#0#1#0#8#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#9#133'A'#0' '#142'Q'#0'.'#148'\'#0'/'#148']'#0#31#141'Q'#0#8#133'@'#0#13#142 + +'G'#0'D'#159'm'#0'}'#188#153#0#142#197#166#0'z'#187#151#0'?'#157'i'#0#12#141 + +'E'#0#14#144'H'#0'\'#175#129#0'y'#190#152#0'['#175#129#0#16#145'J'#0#9#149'H' + +#0'='#165'k'#0'e'#184#138#0'I'#171'u'#0#10#149'H'#0'N'#178'{'#0'Q'#179'}'#0 + +#27#156'U'#0#10#158'L'#0#10#154'K'#0'S'#184#128#0'Y'#186#132#0'w'#199#155#0 + +'u'#198#153#0'}'#201#159#0'p'#196#149#0'B'#177't'#0'e'#192#142#0'p'#196#150#0 + ,#137#206#168#0'l'#194#147#0#131#204#163#0#25#161'V'#0#10#162'N'#0#10#161'M'#0 + +'['#192#136#0'i'#197#146#0'x'#203#157#0'o'#200#150#0'z'#204#158#0'.'#174'g'#0 + +'{'#204#159#0'1'#176'j'#0's'#201#154#0'j'#198#147#0'6'#178'm'#0#10#168'Q'#0 + +#10#167'P'#0'['#196#138#0'g'#200#146#0'p'#204#153#0'X'#195#136#0'J'#190'}'#0 + +'k'#202#149#0#16#169'U'#0'U'#194#134#0'w'#206#158#0'_'#197#141#0#11#173'S'#0 + +#11#174'T'#0'\'#201#140#0'{'#211#162#0'U'#199#136#0'Z'#200#139#0'c'#203#145#0 + +#137#215#172#0#18#176'X'#0'V'#199#136#0'g'#205#148#0'/'#186'm'#0#11#179'V'#0 + +#11#180'W'#0'r'#212#158#0's'#212#159#0'\'#205#142#0'u'#213#160#0#128#216#167 + +#0'g'#208#150#0'x'#214#162#0'!'#187'f'#0'V'#203#138#0'q'#211#157#0'W'#203#139 + +#0#12#183'X'#0#12#187'Z'#0'9'#200'y'#0'<'#201'z'#0','#196'o'#0'A'#202'~'#0'1' + +#198's'#0','#196'p'#0#31#192'g'#0#28#192'e'#0')'#195'n'#0'>'#201'|'#0'M'#206 + +#134#0#12#193']'#0#12#192'\'#0#13#200'`'#0#13#207'c'#0#13#201'a'#0#14#212'f' + +#0#14#213'f'#0#13#208'd'#0#14#212'e'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'pqnnqp'#0#0#0#0#0#0#0#0'mnooooo' + +'onm'#0#0#0#0#0'kllllllllllk'#0#0#0'jkkkkkkkkkkkkj'#0#0'iiiiiiiiiiiiii'#0'\]' + +'^_`]abcdefgh]\OPQRSPTUVWXYZ[POCDEEFGEHIJKLMNDC7899:;9<=>?@AB87*+,,-./012345' + +'6+*'#27#28#29#30#31' !"#$%&''()'#27#0#23#24#25#25#25#25#25#25#25#25#25#25#25 + +#26#0#0#19#20#21#21#21#21#21#21#21#21#21#21#22#23#0#0#0#14#15#16#16#16#16#16 + +#16#16#16#17#18#0#0#0#0#0#7#8#9#10#10#10#10#11#12#13#0#0#0#0#0#0#0#0#1#2#3#4 + +#5#6#0#0#0#0#0#248#31#0#0#224#7#0#0#192#3#0#0#128#1#0#0#128#1#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#1#0#0#128#1#0#0#192#3#0#0#224#7#0#0 + +#248#31#0#0'('#0#0#0#24#0#0#0'0'#0#0#0#1#0#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#0#128#128#0#128#128#128#0#192#192#192#0 + +#0#255#255#0#0#255#0#0#128#128#0#0#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#6'Bc '#0#0#0#0#0#0#0'#Reebb'#0#0#0#0#0#2 + +'bf&&6V '#0#0#0#0'&V%6%b6R'#0#0#0#2'b"be&%bb`'#0#0'&5fV"dbe6V'#0#2'b&B&&&Q&&' + +'2`'#2'bbbd"b&Q&& '#2'eF6&VBc6SV &#EB$4VBVDBb&$dVd$$FB6&&b##43ddBFBQ""ddSE$%' + +'6R86&&$#6CddA6F2'#18'!$dSS4$eC5bb'#2'd$8DCd3D4B '#1'&B3c53ScS& '#2#19'6V5cc' + +'cW6A '#0'"33333S3S2'#0#0#1'3S3S3333`'#0#0#0'#B33S532'#0#0#0#0#1'4E444B'#16#0 + +#0#0#0#0'!3CC2'#18#0#0#0#0#0#0#0#1'!! '#0#0#0#0#255#129#255#0#252#0'?'#0#248 + +#0#31#0#240#0#15#0#224#0#7#0#192#0#3#0#128#0#1#0#128#0#1#0#128#0#1#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#1#0#128#0#1#0#128#0#1#0#192#0 + +#3#0#224#0#7#0#240#0#15#0#248#0#31#0#252#0'?'#0#255#129#255#0'('#0#0#0#24#0#0 + +#0'0'#0#0#0#1#0#8#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#8 + +#133'@'#0#8#130'?'#0#8#129'>'#0#9#139'C'#0#20#134'G'#0'B'#155'j'#0'g'#174#135 + +#0'~'#187#153#0#137#193#162#0#138#193#163#0'~'#187#154#0'e'#174#134#0'>'#153 + +'g'#0#16#132'D'#0#14#137'E'#0'O'#165'v'#0#134#193#161#0#138#196#164#0#131#192 + +#158#0'H'#161'p'#0#12#136'D'#0#21#141'J'#0'h'#181#139#0'}'#191#155#0'}'#191 + +#154#0'f'#179#137#0#22#141'K'#0#12#141'F'#0']'#178#131#0'o'#187#145#0'b'#180 + +#135#0#18#144'K'#0#9#145'F'#0'6'#163'f'#0'b'#183#136#0'K'#172'v'#0#10#145'F' + +#0#9#154'J'#0#10#147'G'#0'M'#177'z'#0'U'#180#127#0'T'#180#127#0#31#156'W'#0#9 + +#152'I'#0#13#152'K'#0'G'#177'v'#0'G'#177'w'#0'F'#177'v'#0'-'#166'c'#0#10#155 + +'K'#0'{'#201#158#0#29#163'Y'#0#133#205#165#0'|'#202#159#0#185#227#204#0'x' + +#200#156#0#137#207#168#0#185#226#203#0'm'#196#148#0':'#175'n'#0#132#205#165#0 + +'U'#186#130#0'q'#197#150#0#177#223#198#0#170#220#193#0'i'#194#145#0#178#223 + +#198#0#154#214#181#0#28#162'X'#0#10#162'N'#0#10#160'M'#0#132#207#165#0's'#200 + +#153#0'c'#195#141#0#154#216#181#0'c'#195#142#0#153#215#181#0#18#163'R'#0#144 + +#212#174#0'W'#189#133#0'2'#175'j'#0#145#212#175#0'b'#194#141#0'q'#200#152#0 + +'F'#183'x'#0#10#165'O'#0#10#164'O'#0#132#209#166#0's'#203#154#0#27#170'['#0 + +#133#210#167#0'|'#206#161#0#18#167'T'#0#134#210#168#0#11#164'O'#0#140#212#172 + ,#0'o'#201#151#0#31#172'^'#0'n'#201#150#0' '#172'_'#0#10#169'Q'#0#10#168'Q'#0 + +#132#211#167#0's'#205#155#0'W'#195#135#0#145#216#177#0'|'#209#162#0#18#171'V' + +#0'}'#209#163#0#25#173'['#0'x'#207#158#0#129#210#165#0'o'#204#152#0#31#176'`' + +#0'n'#203#151#0#178#227#200#0'w'#207#158#0#11#172'S'#0#11#173'S'#0#132#214 + +#168#0#132#213#168#0's'#208#157#0#183#231#204#0']'#200#141#0'}'#211#163#0#18 + +#175'X'#0#127#212#165#0'1'#185'n'#0'u'#208#157#0#140#216#174#0'p'#207#154#0 + +#31#180'a'#0'n'#206#153#0'^'#201#142#0'9'#188't'#0#11#175'T'#0#11#177'U'#0 + +#134#216#170#0's'#210#158#0#28#182'a'#0'}'#213#164#0#18#179'Z'#0#138#218#174 + +#0'I'#197#128#0#194#235#212#0#191#234#210#0#17#179'Y'#0'p'#209#155#0#31#184 + +'c'#0'n'#209#154#0'!'#184'd'#0#11#178'V'#0#11#181'W'#0'|'#215#165#0'y'#214 + +#163#0#130#217#169#0's'#213#159#0#28#186'c'#0'|'#216#165#0#144#221#178#0#140 + +#220#176#0'e'#208#149#0'7'#195'u'#0'n'#211#155#0')'#190'l'#0'p'#212#156#0' ' + +#188'e'#0'w'#214#161#0#12#186'Y'#0','#195'o'#0#152#226#185#0'1'#196'r'#0'I' + +#203#131#0#22#189'`'#0'N'#205#135#0'v'#216#162#0'M'#205#134#0#19#188'^'#0'6' + +#198'v'#0'*'#195'n'#0'G'#203#129#0#24#189'a'#0'F'#202#129#0'w'#217#163#0'i' + +#212#152#0#12#189'['#0#12#190'['#0#12#187'Z'#0#12#195']'#0#13#196'^'#0#13#199 + +'`'#0#13#202'a'#0#13#203'b'#0#13#206'c'#0#13#208'd'#0#13#207'd'#0#14#212'f'#0 + +#13#201'`'#0#14#213'f'#0#14#217'h'#0#13#207'c'#0#13#209'd'#0#13#210'e'#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#201#202#203#203#202#201#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#198#199#200#200#200#200#200#200#200#200#199#198 + +#0#0#0#0#0#0#0#0#0#0#0#196#197#197#197#197#197#197#197#197#197#197#197#197 + +#196#0#0#0#0#0#0#0#0#0#194#195#195#195#195#195#195#195#195#195#195#195#195 + +#195#195#194#0#0#0#0#0#0#0#192#193#193#193#193#193#193#193#193#193#193#193 + +#193#193#193#193#193#192#0#0#0#0#0#190#191#191#191#191#191#191#191#191#191 + +#191#191#191#191#191#191#191#191#191#190#0#0#0#188#189#189#189#189#189#189 + +#189#189#189#189#189#189#189#189#189#189#189#189#189#189#188#0#0#186#187#187 + +#187#187#187#187#187#187#187#187#187#187#187#187#187#187#187#187#187#187#186 + +#0#0#169#169#170#171#172#173#174#169#175#176#170#177#178#179#180#181#182#183 + +#184#185#169#169#0#152#153#153#154#155#156#157#158#153#159#160#161#162#163 + +#164#165#166#167#164#160#168#153#153#152#136#137#137#138#137#138#139#140#137 + +#141#142#143#144#145#146#147#148#149#150#151#137#137#137#136'vwwxwyz{|}~'#127 + +#128#129#130'w'#131#132#133#134#135'wwveffgfghijklmnopfqrstuffeVWWXWXYZ[\]^_' + +'`YWabcdWWWVFGGHGHIJKHLMNOPQRSTLUGGF'#0'223456789:;<=>?@ABCDE2'#0#0',-.///..' + +'........00..1,'#0#0'&''()))))))))))******+&'#0#0#0'!"################$%'#0#0 + +#0#0#0#28#29#30#30#30#30#30#30#30#30#30#30#30#30#30#30#31' '#0#0#0#0#0#0#0#22 + +#23#24#24#24#24#25#25#25#25#25#25#25#25#26#27#0#0#0#0#0#0#0#0#0#15#16#17#18 + +#18#18#18#18#18#18#18#19#20#21#0#0#0#0#0#0#0#0#0#0#0#4#5#6#7#8#9#10#11#12#13 + +#14#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#2#3#3#2#1#0#0#0#0#0#0#0#0#0#255#129#255 + +#0#252#0'?'#0#248#0#31#0#240#0#15#0#224#0#7#0#192#0#3#0#128#0#1#0#128#0#1#0 + +#128#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#1#0#128#0#1 + +#0#128#0#1#0#192#0#3#0#224#0#7#0#240#0#15#0#248#0#31#0#252#0'?'#0#255#129#255 + +#0'('#0#0#0#24#0#0#0'0'#0#0#0#1#0#8#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#8#133'@'#0#8#130'?'#0#8#129'>'#0#9#139'C'#0#20#134'G'#0'B' + +#155'j'#0'g'#174#135#0'~'#187#153#0#137#193#162#0#138#193#163#0'~'#187#154#0 + +'e'#174#134#0'>'#153'g'#0#16#132'D'#0#14#137'E'#0'O'#165'v'#0#134#193#161#0 + +#138#196#164#0#131#192#158#0'H'#161'p'#0#12#136'D'#0#21#141'J'#0'h'#181#139#0 + +'}'#191#155#0'}'#191#154#0'f'#179#137#0#22#141'K'#0#12#141'F'#0']'#178#131#0 + +'o'#187#145#0'b'#180#135#0#18#144'K'#0#9#145'F'#0'6'#163'f'#0'b'#183#136#0'K' + +#172'v'#0#10#145'F'#0#9#154'J'#0#10#147'G'#0'M'#177'z'#0'U'#180#127#0'T'#180 + +#127#0#31#156'W'#0#9#152'I'#0#13#152'K'#0'G'#177'v'#0'G'#177'w'#0'F'#177'v'#0 + +'-'#166'c'#0#10#155'K'#0'{'#201#158#0#29#163'Y'#0#133#205#165#0'|'#202#159#0 + +#185#227#204#0'x'#200#156#0#137#207#168#0#185#226#203#0'm'#196#148#0':'#175 + +'n'#0#132#205#165#0'U'#186#130#0'q'#197#150#0#177#223#198#0#170#220#193#0'i' + +#194#145#0#178#223#198#0#154#214#181#0#28#162'X'#0#10#162'N'#0#10#160'M'#0 + +#132#207#165#0's'#200#153#0'c'#195#141#0#154#216#181#0'c'#195#142#0#153#215 + +#181#0#18#163'R'#0#144#212#174#0'W'#189#133#0'2'#175'j'#0#145#212#175#0'b' + +#194#141#0'q'#200#152#0'F'#183'x'#0#10#165'O'#0#10#164'O'#0#132#209#166#0's' + +#203#154#0#27#170'['#0#133#210#167#0'|'#206#161#0#18#167'T'#0#134#210#168#0 + +#11#164'O'#0#140#212#172#0'o'#201#151#0#31#172'^'#0'n'#201#150#0' '#172'_'#0 + ,#10#169'Q'#0#10#168'Q'#0#132#211#167#0's'#205#155#0'W'#195#135#0#145#216#177 + +#0'|'#209#162#0#18#171'V'#0'}'#209#163#0#25#173'['#0'x'#207#158#0#129#210#165 + +#0'o'#204#152#0#31#176'`'#0'n'#203#151#0#178#227#200#0'w'#207#158#0#11#172'S' + +#0#11#173'S'#0#132#214#168#0#132#213#168#0's'#208#157#0#183#231#204#0']'#200 + +#141#0'}'#211#163#0#18#175'X'#0#127#212#165#0'1'#185'n'#0'u'#208#157#0#140 + +#216#174#0'p'#207#154#0#31#180'a'#0'n'#206#153#0'^'#201#142#0'9'#188't'#0#11 + +#175'T'#0#11#177'U'#0#134#216#170#0's'#210#158#0#28#182'a'#0'}'#213#164#0#18 + +#179'Z'#0#138#218#174#0'I'#197#128#0#194#235#212#0#191#234#210#0#17#179'Y'#0 + +'p'#209#155#0#31#184'c'#0'n'#209#154#0'!'#184'd'#0#11#178'V'#0#11#181'W'#0'|' + +#215#165#0'y'#214#163#0#130#217#169#0's'#213#159#0#28#186'c'#0'|'#216#165#0 + +#144#221#178#0#140#220#176#0'e'#208#149#0'7'#195'u'#0'n'#211#155#0')'#190'l' + +#0'p'#212#156#0' '#188'e'#0'w'#214#161#0#12#186'Y'#0','#195'o'#0#152#226#185 + +#0'1'#196'r'#0'I'#203#131#0#22#189'`'#0'N'#205#135#0'v'#216#162#0'M'#205#134 + +#0#19#188'^'#0'6'#198'v'#0'*'#195'n'#0'G'#203#129#0#24#189'a'#0'F'#202#129#0 + +'w'#217#163#0'i'#212#152#0#12#189'['#0#12#190'['#0#12#187'Z'#0#12#195']'#0#13 + +#196'^'#0#13#199'`'#0#13#202'a'#0#13#203'b'#0#13#206'c'#0#13#208'd'#0#13#207 + +'d'#0#14#212'f'#0#13#201'`'#0#14#213'f'#0#14#217'h'#0#13#207'c'#0#13#209'd'#0 + +#13#210'e'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#201#202 + +#203#203#202#201#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#198#199#200#200#200#200#200 + +#200#200#200#199#198#0#0#0#0#0#0#0#0#0#0#0#196#197#197#197#197#197#197#197 + +#197#197#197#197#197#196#0#0#0#0#0#0#0#0#0#194#195#195#195#195#195#195#195 + +#195#195#195#195#195#195#195#194#0#0#0#0#0#0#0#192#193#193#193#193#193#193 + +#193#193#193#193#193#193#193#193#193#193#192#0#0#0#0#0#190#191#191#191#191 + +#191#191#191#191#191#191#191#191#191#191#191#191#191#191#190#0#0#0#188#189 + +#189#189#189#189#189#189#189#189#189#189#189#189#189#189#189#189#189#189#189 + +#188#0#0#186#187#187#187#187#187#187#187#187#187#187#187#187#187#187#187#187 + +#187#187#187#187#186#0#0#169#169#170#171#172#173#174#169#175#176#170#177#178 + +#179#180#181#182#183#184#185#169#169#0#152#153#153#154#155#156#157#158#153 + +#159#160#161#162#163#164#165#166#167#164#160#168#153#153#152#136#137#137#138 + +#137#138#139#140#137#141#142#143#144#145#146#147#148#149#150#151#137#137#137 + +#136'vwwxwyz{|}~'#127#128#129#130'w'#131#132#133#134#135'wwveffgfghijklmnopf' + +'qrstuffeVWWXWXYZ[\]^_`YWabcdWWWVFGGHGHIJKHLMNOPQRSTLUGGF'#0'223456789:;<=>?' + +'@ABCDE2'#0#0',-.///..........00..1,'#0#0'&''()))))))))))******+&'#0#0#0'!"#' + +'###############$%'#0#0#0#0#0#28#29#30#30#30#30#30#30#30#30#30#30#30#30#30#30 + +#31' '#0#0#0#0#0#0#0#22#23#24#24#24#24#25#25#25#25#25#25#25#25#26#27#0#0#0#0 + +#0#0#0#0#0#15#16#17#18#18#18#18#18#18#18#18#19#20#21#0#0#0#0#0#0#0#0#0#0#0#4 + +#5#6#7#8#9#10#11#12#13#14#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#2#3#3#2#1#0#0#0#0 + +#0#0#0#0#0#255#129#255#0#252#0'?'#0#248#0#31#0#240#0#15#0#224#0#7#0#192#0#3#0 + +#128#0#1#0#128#0#1#0#128#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#128#0#1#0#128#0#1#0#128#0#1#0#192#0#3#0#224#0#7#0#240#0#15#0#248#0#31#0 + +#252#0'?'#0#255#129#255#0'('#0#0#0' '#0#0#0'@'#0#0#0#1#0#4#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#0#0#128#0#0#128#128#128#0 + +#192#192#192#0#0#255#255#0#0#255#0#0#128#128#0#0#255#255#255#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#22#21'ae'#0#0#0#0#0#0 + +#0#0#0#0#1#21'ece'#22#19'`'#0#0#0#0#0#0#0#1'ef'#22#22'V6V'#22'0'#0#0#0#0#0#0 + +#22#22#19'VQae'#22'V'#22#0#0#0#0#0#1'cVV'#22'6Qad'#22#21'`'#0#0#0#0#22'V'#22 + +#17'e'#22'6Qae'#22#17#0#0#0#1'a'#22'6V'#17'ea'#22'V'#17'ad`'#0#0#22#17'aV1da' + +#22'6'#19'de'#22'Q'#0#0'e6'#17'a'#22#22'Qe'#22'V'#22#17'aa'#0#6#17'eaaea'#22 + +#22#22#17'e'#22#22'A`'#1#22#22#21'a'#17'aaa'#17'aaaaf'#16#6#22#20'F3f4F5de64' + +'E'#17#16#17'a4CS'#17'TDSd'#17'FT'#132'aa'#22'1A'#20'dfA'#20'hH'#22#129'3a' + +#22'1a'#22'FE3Q4d'#20'DaFSaa'#22#17'aAd4FF'#24#20#20#17'A46'#17'a'#22#17'FS4' + +'45$dd'#22'FTD'#22#17#22#22'A35'#20'3h'#19'SaA4'#22'6'#22#18#17'F'#20'WdV'#20 + +'dA'#22'F'#19'a!'#18#22#22'Ad4T44'#17'AdE4'#21'aa'#1'!A4XD4'#131'd'#129'DDD' + +#132#17' '#2#22'666A513cdSc3a'#16#1#22'53363d'#17'53c5c6'#16#0'!3cV3S'#20'd3' + +'c5c5!'#0#0#18#19'S3VFF3e5s4'#19'a'#0#0#1'#33333S3356A '#0#0#0'!3533S33334' + +#18#0#0#0#0#1#19'44S44SE46'#16#0#0#0#0#0'!33433C3A!'#0#0#0#0#0#0#1'!4CECCC' + +#18#16#0#0#0#0#0#0#0#1'!#311! '#0#0#0#0#0#0#0#0#0#0#18#18#18#18#0#0#0#0#0#0 + +#255#240#15#255#255#128#1#255#254#0#0#127#252#0#0'?'#248#0#0#31#240#0#0#15 + +#224#0#0#7#192#0#0#3#192#0#0#3#128#0#0#1#128#0#0#1#128#0#0#1#0#0#0#0#0#0#0#0 + ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#1#128#0#0#1#128#0#0 + +#1#192#0#0#3#192#0#0#3#224#0#0#7#240#0#0#15#248#0#0#31#252#0#0'?'#254#0#0#127 + +#255#128#1#255#255#240#15#255'('#0#0#0' '#0#0#0'@'#0#0#0#1#0#8#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9#140'C'#0#8#134'A'#0#8#133'@'#0 + +#8#132'?'#0#8#142'E'#0#8#131'?'#0#10'|>'#0'$'#138'R'#0'>'#152'g'#0'O'#161't' + +#0'X'#166'{'#0'X'#166'|'#0'P'#162'u'#0'!'#137'P'#0#9'|='#0#9#150'H'#0'"'#140 + +'Q'#0'['#171#127#0#136#193#162#0#147#198#170#0#132#191#158#0'T'#166'x'#0#26 + +#136'K'#0#18#135'G'#0#137#195#163#0#134#194#161#0'Q'#166'w'#0#15#133'D'#0#30 + +#144'Q'#0'q'#185#145#0'~'#191#156#0'~'#191#155#0'm'#183#143#0#29#143'P'#0#25 + +#144'N'#0'l'#184#142#0't'#188#149#0'n'#185#143#0' '#148'T'#0#9#149'H'#0#11 + +#141'E'#0'Y'#177#128#0'j'#185#142#0'j'#185#141#0'c'#182#136#0#22#146'M'#0#10 + +#157'L'#0#10#143'E'#0'/'#160'a'#0'`'#183#135#0'L'#173'w'#0#10#156'K'#0#9#146 + +'F'#0'J'#174'w'#0'V'#180#128#0'"'#157'Y'#0#14#151'K'#0'L'#178'y'#0'L'#178'z' + +#0'K'#180'z'#0'7'#169'j'#0#9#155'K'#0#9#152'I'#0#11#153'K'#0'F'#178'w'#0'Q' + +#182#127#0'M'#180'{'#0'X'#185#131#0'S'#183#128#0'B'#176's'#0'O'#182'}'#0'C' + +#176't'#0'J'#179'y'#0'W'#185#131#0'U'#184#129#0'='#174'p'#0'7'#171'k'#0#134 + +#206#166#0'3'#173'i'#0'1'#172'h'#0#151#214#179#0'm'#196#148#0#203#234#217#0 + +#205#235#218#0'p'#199#151#0#130#204#163#0'c'#192#140#0'8'#175'm'#0'K'#182'z' + +#0'\'#189#135#0#194#230#210#0'^'#190#136#0#198#232#213#0#157#215#183#0#28#163 + +'X'#0#10#165'O'#0#10#159'L'#0#134#208#167#0'0'#174'h'#0''''#170'b'#0#143#211 + +#173#0'Y'#190#133#0#140#210#171#0#149#214#178#0#144#211#174#0#21#163'U'#0'@' + +#180't'#0'/'#173'g'#0'u'#201#155#0#179#225#199#0#152#215#180#0'R'#188#129#0 + +#10#162'N'#0#134#209#168#0'0'#177'j'#0''''#173'c'#0#143#213#174#0'Y'#192#135 + +#0'^'#194#139#0#25#168'Y'#0#163#221#189#0'd'#196#143#0#23#167'W'#0#170#223 + +#193#0#177#225#198#0'K'#187'}'#0#160#219#186#0'Q'#189#129#0#10#167'P'#0#10 + +#166'O'#0#134#211#168#0'0'#179'k'#0''''#176'd'#0#143#215#175#0'Y'#194#136#0 + +'^'#196#139#0#23#170'Y'#0#160#221#187#0'e'#198#144#0'R'#192#131#0#170#224#194 + +#0#13#167'R'#0'v'#205#157#0'}'#207#162#0'.'#179'i'#0#30#173'^'#0#11#169'Q'#0 + +#135#213#170#0'0'#182'l'#0'('#179'f'#0#140#214#173#0'|'#209#162#0'e'#202#146 + +#0'R'#194#132#0#163#222#189#0#19#172'W'#0#145#216#177#0'H'#191'}'#0#130#211 + +#166#0#23#173'Z'#0#157#221#186#0#194#233#211#0'o'#204#152#0#11#172'S'#0'1' + +#185'm'#0'('#182'g'#0#143#218#176#0'Y'#198#138#0#194#234#212#0'T'#197#134#0 + +#165#224#192#0#19#175'X'#0#29#178'_'#0#23#176'['#0#160#223#188#0'R'#197#134#0 + +#148#219#180#0'h'#204#149#0'>'#189'w'#0#11#175'T'#0#134#216#170#0'1'#188'o'#0 + +'('#185'i'#0'Y'#201#139#0'w'#211#159#0'3'#189'p'#0#12#176'U'#0'e'#205#147#0 + +'R'#201#135#0#11#178'V'#0#173#230#198#0#23#179']'#0#189#235#209#0#179#231#203 + +#0#182#231#204#0#160#226#189#0#11#182'W'#0'~'#215#166#0'B'#196'|'#0'9'#194'v' + +#0'Y'#203#140#0'^'#206#145#0'f'#207#149#0'/'#190'o'#0#29#184'b'#0#23#183'^'#0 + +#169#229#196#0#166#228#194#0'f'#210#150#0'Y'#205#141#0#183#232#205#0'r'#213 + +#158#0'J'#202#131#0'n'#212#155#0#129#218#169#0#23#186'`'#0'R'#203#136#0#186 + +#234#208#0#178#233#202#0#148#223#181#0#12#183'X'#0#12#185'Y'#0#27#190'c'#0' ' + +#191'g'#0'M'#204#134#0#155#226#187#0#142#223#178#0'G'#202#129#0'W'#207#140#0 + +'B'#201'~'#0#21#188'`'#0'D'#201#127#0#12#189'Z'#0#18#190'_'#0#12#193']'#0#13 + +#198'_'#0#13#199'`'#0#13#202'a'#0#13#205'b'#0#13#208'd'#0#13#213'f'#0#14#218 + +'h'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#236#239#240#240#239 + +#240#238#238#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#235#241#242#242#242 + +#242#242#242#242#242#242#242#240#235#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#235#241 + +#241#242#241#241#241#242#241#242#241#241#242#242#242#241#241#233#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#237#241#241#241#241#241#241#241#241#241#241#241#241#241#241 + +#241#241#241#241#237#0#0#0#0#0#0#0#0#0#0#0#236#240#240#240#240#240#240#240 + +#240#240#240#240#240#240#240#240#240#240#240#240#240#238#0#0#0#0#0#0#0#0#0 + +#236#239#239#239#239#239#239#239#239#239#239#239#239#239#239#239#239#239#239 + +#239#239#239#239#236#0#0#0#0#0#0#0#235#237#238#238#238#238#237#238#238#238 + +#238#238#238#238#238#238#238#238#238#238#238#238#238#238#238#235#0#0#0#0#0 + +#221#236#236#236#236#236#236#237#236#236#237#237#236#236#236#236#236#236#236 + +#237#236#236#236#236#236#237#236#221#0#0#0#0#235#235#235#235#235#236#235#235 + +#235#235#235#235#235#235#235#235#235#235#235#235#235#235#235#235#235#235#235 + +#233#0#0#0#197#235#235#235#235#233#235#235#235#235#235#235#235#235#235#235 + +#235#235#235#235#235#235#235#235#235#235#235#235#235#197#0#0#222#233#233#233 + +#234#234#233#233#233#233#233#233#233#233#233#233#233#233#233#233#233#233#233 + +#233#233#233#233#233#233#222#0#0#221#222#222#223#191#219#224#213#225#222#222 + +#217#226#227#224#225#228#221#229#230#231#215#222#232#226#226#215#222#222#222 + +#0#190#197#197#197#202#207#208#209#210#202#190#197#203#211#193#212#213#214 + ,#197#215#200#216#196#197#217#218#219#220#197#197#197#190#187#190#197#190#198 + +#199#200#181#201#202#197#197#203#189#204#155#204#194#161#195#205#206#196#190 + +#189#203#190#190#190#190#190#187#180#164#180#180#181#182#183#167#184#185#186 + +#187#188#189#190#191#192#193#194#195#187#192#196#187#170#188#180#180#187#187 + +#180#180#164#164#164#164#148#165#166#167#168#169#169#170#153#154#164#171#172 + +#171#173#161#164#174#175#164#176#177#178#179#164#164#164#164#147#147#147#147 + +#148#149#150#134#135#151#152#134#153#154#147#155#156#157#158#159#147#160#161 + +#147#154#162#162#163#147#147#147#147#129#130'`'#130#131#132#133#134#135#136 + +#137#138#139#140#130#141#142#143#144#139#130#137#127#130#140#143#145#146#130 + +#130#130#130'`qqqrstuvwxyzp{|qv}~q{'#127'q'#128'zqqqqq``aaabcdefQgQUhhijk[ll' + +'mnUfoUpaaa`'#0'444NOPQRSTUVTSWXYSOZ[[[\[]^_4>'#0#0'>?@'#0#0'/(9:;;;;;;;;;;<;;;;;:::::::=(/'#0#0#0'(567777777777777777777777' + +'78('#0#0#0#0'/012222222222222222222222304'#0#0#0#0#0'()*+++,+++++++,,,,,,,,' + +',-.('#0#0#0#0#0#0#0#5'#$%%%%%%%%%%%%%%%%%%&'''#5#0#0#0#0#0#0#0#0#0#1#29#30 + +#31#31#31#31#31#31' !"'#1#0#0#0#0#0#0#0#0#0#0#0#5#24#18#19#25#25#25 + +#25#25#25#25#25#25#25#25#25#26#27#28#5#0#0#0#0#0#0#0#0#0#0#0#0#0#16#6#17#18 + +#19#20#20#20#20#20#20#20#20#21#22#23#4#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#5#6 + +#7#8#9#10#11#12#13#9#14#15#6#5#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#2 + +#3#4#4#3#2#1#0#0#0#0#0#0#0#0#0#0#0#0#255#240#15#255#255#128#1#255#254#0#0#127 + +#252#0#0'?'#248#0#0#31#240#0#0#15#224#0#0#7#192#0#0#3#192#0#0#3#128#0#0#1#128 + +#0#0#1#128#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#128#0#0#1#128#0#0#1#128#0#0#1#192#0#0#3#192#0#0#3#224#0#0#7#240#0#0#15 + +#248#0#0#31#252#0#0'?'#254#0#0#127#255#128#1#255#255#240#15#255'('#0#0#0' '#0 + +#0#0'@'#0#0#0#1#0#24#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#199'`' + +#13#204'b'#13#206'c'#13#207'c'#13#207'c'#13#206'c'#13#204'b'#13#199'`'#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#197'^'#13#210'e'#14#218'i'#14 + +#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h' + +#14#218'i'#13#210'e'#13#197'^'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#190'['#14#210'e'#14#215 + +'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14 + +#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#210'e'#12#190'[' + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#12#199'`'#13#212'f'#13#212'f'#13#212'f'#13#212'f'#13#212'f'#13#212'f'#13 + +#212'f'#13#212'f'#13#212'f'#13#212'f'#13#212'f'#13#212'f'#13#212'f'#13#212'f' + +#13#212'f'#13#212'f'#13#212'f'#13#212'f'#12#199'`'#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#201'`'#13#208'd'#13#208'd'#13#208 + +'d'#13#208'd'#13#208'd'#13#208'd'#13#208'd'#13#208'd'#13#208'd'#13#208'd'#13 + +#208'd'#13#208'd'#13#208'd'#13#208'd'#13#208'd'#13#208'd'#13#208'd'#13#208'd' + +#13#208'd'#13#208'd'#13#201'`'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#13#198'_'#13#205'b'#13#205'b'#13#205'b'#13#205'b'#13#205'b'#13#205 + +'b'#13#205'b'#13#205'b'#13#205'b'#13#205'b'#13#205'b'#13#205'b'#13#205'b'#13 + +#205'b'#13#205'b'#13#205'b'#13#205'b'#13#205'b'#13#205'b'#13#205'b'#13#205'b' + +#13#205'b'#13#198'_'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#192'\'#13 + +#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a' + +#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202 + +'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13 + +#202'a'#12#192'\'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#183'X'#13#198'_'#13#198'_' + +#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198 + +'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13 + +#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_' + +#13#198'_'#12#183'X'#0#0#0#0#0#0#0#0#0#0#0#0#12#192'\'#12#195'^'#12#195'^'#12 + +#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^' + +#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195 + +'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12#195'^'#12 + +#195'^'#12#192'\'#0#0#0#0#0#0#0#0#0#11#182'W'#12#192'\'#12#192'\'#12#192'\' + +#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192 + +'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12 + +#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\'#12#192'\' + +#12#192'\'#12#192'\'#11#182'W'#0#0#0#0#0#0#12#185'Y'#12#189'Z'#12#189'Z'#12 + +#189'Z'#17#190'^'#18#190'_'#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z' + +#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12#189 + +'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12#189'Z'#12 + ,#189'Z'#12#189'Z'#12#189'Z'#12#185'Y'#0#0#0#0#0#0#12#185'Y'#12#185'Y'#12#185 + +'Y'#27#190'c'#173#231#199#177#233#201' '#191'gI'#203#131'M'#204#134#12#185'Y' + +#12#185'YR'#206#137#155#226#187#142#223#178' '#191'gQ'#205#136'G'#202#129#12 + +#185'YW'#207#140'B'#201'~'#21#188'`'#129#219#169#12#185'YD'#201#127#155#226 + +#187#155#226#187#129#219#169#12#185'Y'#12#185'Y'#12#185'Y'#0#0#0#11#177'U'#11 + +#182'W'#11#182'W'#11#182'W^'#207#145#169#229#196#166#228#194'g'#210#151'Y' + +#205#141'^'#207#145#11#182'W'#11#182'We'#209#149#184#234#206#188#235#209'r' + +#213#158'J'#201#131'n'#212#155#11#182'W'#130#217#169'8'#195'v'#23#186'`'#160 + +#227#190#11#182'WR'#203#136#186#234#208#178#232#202#148#223#181#11#182'W'#11 + +#182'W'#11#182'W'#11#177'U'#11#176'U'#11#179'V'#11#179'V'#11#179'V~'#215#166 + +'B'#196'|9'#193'v'#135#217#172'Y'#203#140'^'#205#144#11#179'V'#11#179'Ve'#207 + +#148'R'#201#135'/'#190'o'#161#226#190'.'#190'n'#179#231#203#154#224#185#183 + +#232#205#29#184'b'#23#183'^'#160#225#189#11#179'VR'#201#135'f'#207#149#11#179 + +'V'#11#179'V'#11#179'V'#11#179'V'#11#179'V'#11#176'U'#11#174'T'#11#175'T'#11 + +#175'T'#11#175'T'#134#216#170'1'#188'o('#185'i'#143#218#176'Y'#201#139'w'#211 + +#159'3'#189'p'#12#176'Ue'#205#147'R'#199#134#12#176'U'#172#228#197#22#179'\' + +#190#234#209#179#230#202#182#231#204#13#176'V'#23#179']'#160#224#188#11#175 + +'TR'#198#134'e'#205#147#11#175'T'#11#175'T'#11#175'T'#11#175'T'#11#175'T'#11 + +#174'T'#11#171'R'#11#172'S'#11#172'S'#11#172'S'#135#214#170'1'#185'm('#182'g' + +#143#217#176'Y'#199#138#194#234#212#194#234#212'T'#197#134'e'#203#146'R'#196 + +#133#11#172'S'#165#224#191#19#175'X'#165#224#192#29#178'_'#157#221#186#11#172 + +'S'#23#176'['#160#223#188#11#172'SR'#196#133#148#219#180'h'#204#149'>'#189'w' + +#11#172'S'#11#172'S'#11#172'S'#11#171'R'#11#169'Q'#11#169'Q'#11#169'Q'#11#169 + +'Q'#135#212#169'0'#182'l('#179'f'#143#215#175'Y'#196#137#140#214#173'|'#209 + +#162#141#215#174'e'#201#145'R'#194#132#10#169'Q'#163#222#189#19#172'W'#145 + +#216#177'H'#191'}'#130#211#166#11#169'Q'#23#173'Z'#160#221#187#10#169'QR'#194 + +#132#194#233#211#194#233#211'o'#204#152#11#169'Q'#11#169'Q'#11#169'Q'#11#169 + +'Q'#10#167'P'#10#166'O'#10#166'O'#10#166'O'#134#211#168'0'#179'k'''#176'd' + +#143#214#175'Y'#194#136'^'#196#139#23#170'Y'#162#221#188'd'#199#144'R'#192 + +#131#10#166'O'#170#224#194#13#167'Ru'#204#156'}'#207#162'f'#199#145#10#166'O' + +#22#170'X'#160#220#187#10#166'OQ'#191#130'w'#205#158'.'#179'i'#30#173'^'#10 + +#166'O'#10#166'O'#10#166'O'#10#167'P'#10#165'O'#10#162'N'#10#162'N'#10#162'N' + +#134#209#168'0'#177'j'''#173'c'#143#213#174'Y'#192#135'^'#194#139#25#168'Y' + +#163#220#189'd'#196#143'R'#189#130#23#167'W'#170#223#193#10#162'NY'#192#135 + +#177#225#198'K'#187'}'#10#162'N'#22#167'W'#160#219#186#10#162'NQ'#189#129'e' + +#197#144#10#162'N'#10#162'N'#10#162'N'#10#162'N'#10#162'N'#10#165'O'#10#164 + +'O'#10#159'L'#10#159'L'#10#159'L'#134#208#167'0'#174'h'''#170'b'#143#211#173 + +'Y'#190#133#149#214#178#140#210#171#151#214#179'p'#199#151#149#214#178#150 + +#214#178#144#211#174#21#163'U@'#180't'#194#231#210'/'#173'g/'#174'hu'#201#155 + +#179#225#199'p'#199#151'X'#190#133#152#215#180'p'#199#151'R'#188#129#10#159 + +'L'#10#159'L'#10#159'L'#10#164'O'#0#0#0#10#156'K'#10#156'K'#10#156'K'#134#206 + +#166'3'#173'i1'#172'h'#154#214#180'm'#196#148#204#234#218#205#235#218'q'#198 + +#151#130#204#163#205#235#218#203#234#217'c'#192#140'8'#175'mK'#182'z'#203#234 + +#216'3'#172'i\'#189#135#195#231#211#194#230#210#194#230#210'^'#190#136#194 + +#230#210#198#232#213#157#215#183#28#163'X'#10#156'K'#10#156'K'#0#0#0#0#0#0#9 + +#155'K'#9#152'I'#11#153'KK'#180'zF'#178'wF'#178'vR'#183#127'K'#180'zX'#185 + +#131'S'#183#128'B'#176'sM'#180'{X'#185#131'O'#182'}B'#176'sB'#176'sC'#176'tW' + +#184#131'B'#176'sJ'#179'yW'#185#131'U'#184#129'L'#180'{='#174'pU'#184#129'X' + +#185#131'Q'#182#127'7'#171'k'#9#152'I'#9#155'K'#0#0#0#0#0#0#10#158'L'#9#149 + +'H'#14#151'KL'#178'yL'#178'zL'#178'zL'#178'zL'#178'zL'#178'zL'#178'zL'#178'z' + +'L'#178'zL'#178'zL'#178'zL'#178'zL'#178'zL'#178'zL'#178'zL'#178'zL'#178'zL' + +#178'zL'#178'zL'#178'zL'#178'zL'#178'zL'#178'zL'#178'z7'#169'j'#9#149'H'#10 + +#158'L'#0#0#0#0#0#0#0#0#0#9#149'H'#9#146'FJ'#174'wV'#180#129'V'#180#129'V' + +#180#129'V'#180#128'V'#180#128'V'#180#128'V'#180#128'V'#180#128'V'#180#128'V' + +#180#128'V'#180#128'V'#180#128'V'#180#128'V'#180#128'V'#180#128'V'#180#128'V' + +#180#128'V'#180#128'V'#180#128'V'#180#128'V'#180#128'V'#180#128'V'#180#128'"' + +#157'Y'#9#149'H'#0#0#0#0#0#0#0#0#0#0#0#0#10#157'L'#9#143'E/'#160'aa'#183#135 + +'`'#183#135'`'#183#135'`'#183#135'`'#183#135'`'#183#135'`'#183#135'`'#183#135 + +'`'#183#135'`'#183#135'`'#183#135'`'#183#135'`'#183#135'`'#183#135'`'#183#135 + +'`'#183#135'`'#183#135'`'#183#135'`'#183#135'`'#183#135'`'#183#135'`'#183#135 + +'L'#173'w'#10#143'E'#10#157'L'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9#148'H'#11#141 + +'EY'#177#128'j'#185#142'j'#185#142'j'#185#142'j'#185#142'j'#185#142'j'#185 + +#142'j'#185#142'j'#185#142'j'#185#142'j'#185#142'j'#185#142'j'#185#142'j'#185 + +#141'j'#185#141'j'#185#141'j'#185#141'j'#185#141'j'#185#141'j'#185#141'j'#185 + ,#141'c'#182#136#22#146'M'#9#148'H'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#8#142'E'#25#144'Nl'#184#142't'#188#149't'#188#149't'#188#149't'#188#149't' + +#188#149't'#188#149't'#188#149't'#188#149't'#188#149't'#188#148't'#188#148't' + +#188#148't'#188#148't'#188#148't'#188#148't'#188#148't'#188#148't'#188#148'n' + +#185#143' '#148'T'#8#142'E'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#9#140'C'#30#144'Qq'#185#145'~'#191#156'~'#191#156'~'#191#156'~'#191#156 + +'~'#191#156'~'#191#156'~'#191#155'~'#191#155'~'#191#155'~'#191#155'~'#191#155 + +'~'#191#155'~'#191#155'~'#191#155'~'#191#155'~'#191#155'm'#183#143#29#143'P' + +#9#140'C'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9 + +#142'D'#18#135'G['#171#127#136#195#162#137#195#163#137#195#163#137#195#163 + +#137#195#163#137#195#163#137#195#163#137#195#163#137#195#163#137#195#163#137 + +#195#163#137#195#163#137#195#163#134#194#161'Q'#166'w'#15#133'D'#9#142'D'#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9 + +#150'H'#8#131'?"'#140'Q\'#170#127#136#193#162#147#198#170#147#198#170#147#198 + +#170#147#198#170#147#198#170#147#198#170#147#198#170#147#198#170#132#191#158 + +'T'#166'x'#26#136'K'#8#131'?'#9#150'H'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#8#143'E'#8#131'?' + +#10'|>$'#138'R>'#152'gO'#161'tX'#166'{X'#166'|P'#162'u>'#152'f!'#137'P'#9'|=' + +#8#131'?'#8#143'E'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#8#140'C' + +#8#134'A'#8#133'@'#8#132'?'#8#132'?'#8#133'@'#8#134'A'#8#140'C'#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#240#15#255#255 + +#128#1#255#254#0#0#127#252#0#0'?'#248#0#0#31#240#0#0#15#224#0#0#7#192#0#0#3 + +#192#0#0#3#128#0#0#1#128#0#0#1#128#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#1#128#0#0#1#128#0#0#1#192#0#0#3#192#0#0 + +#3#224#0#0#7#240#0#0#15#248#0#0#31#252#0#0'?'#254#0#0#127#255#128#1#255#255 + +#240#15#255'('#0#0#0'0'#0#0#0'`'#0#0#0#1#0#24#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#188'Z'#12#195'^' + +#13#198'_'#13#200'`'#13#201'a'#13#201'a'#13#200'`'#13#198'_'#12#195'^'#12#188 + +'Z'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#196'^'#13#210 + +'e'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14 + +#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#13#210'e'#12#196'^'#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#12#184'X'#13#205'b'#14#218'h'#14#218'h'#14#218'h'#14#218'h'#14 + +#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h' + +#14#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h'#14#218'h'#13#205'b'#12#184 + +'X'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#13#204'b'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215 + +'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14 + +#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g'#14#215'g' + +#13#204'b'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#192'\' + +#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213 + +'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14 + +#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f'#14#213'f' + +#14#213'f'#14#213'f'#14#213'f'#12#192'\'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#12#201'`'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13 + +#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e' + +#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211 + +'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#12#201'`'#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#13#204'b'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13 + +#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd' + +#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209 + +'d'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13 + +#209'd'#13#209'd'#13#209'd'#13#204'b'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#203'a'#13#207'c'#13#207 + +'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13 + ,#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c' + +#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207 + +'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13 + +#203'a'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#13#200'`'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204 + +'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13 + +#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b' + +#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204 + +'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#200'`'#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#194']'#13#202'a'#13 + +#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a' + +#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202 + +'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13 + +#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a'#13#202'a' + +#13#202'a'#13#202'a'#13#202'a'#13#202'a'#12#194']'#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#185'Y'#13#200'`'#13#200'`'#13#200'`'#13#200 + +'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13 + +#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`' + +#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200 + +'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13#200'`'#13 + +#200'`'#13#200'`'#13#200'`'#13#200'`'#12#185'Y'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198 + +'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13 + +#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_' + +#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198 + +'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13 + +#198'_'#13#198'_'#13#198'_'#13#198'_'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#12#189'['#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12 + +#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^' + +#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196 + +'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12 + +#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^' + +#12#196'^'#12#196'^'#12#196'^'#12#189'['#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#176 + +'U'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12 + +#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']' + +#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193 + +']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12 + +#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']' + +#12#193']'#12#193']'#12#193']'#12#193']'#11#176'U'#0#0#0#0#0#0#0#0#0#0#0#0#12 + +#185'Y'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\' + +#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191 + +'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12 + +#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\' + +#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191 + +'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#185'Y'#0#0#0#0#0#0#0#0#0#0#0#0 + +#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189 + +'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12 + +#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'[' + +#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189 + +'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12 + +#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#0#0#0#0#0#0#0#0#0 + +#11#179'V'#12#187'Z'#12#187'Z'#12#187'Z'#12#187'Z'#12#187'Z'#21#190'`l'#214 + +#155'p'#215#158#26#191'c'#12#187'Z'#16#188']-'#196'p'#18#189'^'#12#187'Z'#12 + +#187'Z'#12#187'Z'#20#189'_-'#196'p-'#196'p'''#195'l'#14#187'['#12#187'Z'#22 + +#190'`,'#196'p'#14#188'['#12#187'Z'#12#187'Z#'#194'j!'#193'h'#12#187'Z'#15 + +#188'\-'#196'p'#19#189'_'#12#187'Z'#15#188'\,'#196'p-'#196'p-'#196'p-'#196'p' + +'$'#194'j'#12#187'Z'#12#187'Z'#12#187'Z'#12#187'Z'#11#179'V'#0#0#0#0#0#0#12 + +#182'W'#12#185'Y'#12#185'Y'#12#185'Y'#12#185'Y'#12#185'Y'#132#219#171#194#237 + +#213#194#237#213#144#223#179#13#185'Y%'#192'j'#195#237#214'-'#194'o'#12#185 + +'Y'#12#185'Y'#12#185'Y7'#197'v'#194#237#213#194#237#213#194#237#213#136#221 + +#174#14#185'Z2'#196's'#194#237#213'%'#192'j'#12#185'Y'#12#185'Y'#157#227#188 + +'q'#214#158#12#185'Y'#30#190'e'#194#237#213'5'#196'u'#12#185'Y'#28#189'c'#193 + +#237#213#194#237#213#194#237#213#194#237#213#144#223#179#12#185'Y'#12#185'Y' + +#12#185'Y'#12#185'Y'#12#182'W'#0#0#0#0#0#0#11#183'X'#11#183'X'#11#183'X'#11 + ,#183'X'#11#183'X#'#190'h'#191#236#211#192#236#211#191#236#211#194#237#213'/' + +#193'p$'#190'i'#195#237#213'-'#192'n'#11#183'X'#11#183'X'#11#183'X7'#195'u' + +#194#237#213#194#237#213#194#237#213#194#237#213'<'#197'y'#24#186'`'#192#236 + +#211'>'#198'z'#11#183'X'#14#183'Z'#180#233#203'U'#205#138#11#183'X'#30#188'd' + +#194#237#213'4'#195't'#11#183'X'#27#187'b'#193#237#212#194#237#213#194#237 + +#213#194#237#213#144#222#178#11#183'X'#11#183'X'#11#183'X'#11#183'X'#11#183 + +'X'#0#0#0#11#173'S'#11#180'W'#11#180'W'#11#180'W'#11#180'W'#11#180'WL'#200 + +#131#193#236#213'8'#194'v/'#191'o'#190#235#210'Y'#204#141'$'#188'h'#195#236 + +#213','#190'n'#11#180'W'#11#180'W'#11#180'W6'#194'u'#194#236#213'Y'#204#140 + +'b'#207#147#190#235#210't'#212#159#13#181'X'#175#230#200'h'#209#151'+'#190'm' + +'6'#193't'#193#236#212':'#195'w'#11#180'W'#29#186'c'#194#236#213'4'#193's'#11 + +#180'W'#27#185'a'#193#236#212'k'#209#153'O'#201#134'O'#201#134'='#195'y'#11 + +#180'W'#11#180'W'#11#180'W'#11#180'W'#11#180'W'#11#173'S'#11#174'T'#11#178'V' + +#11#178'V'#11#178'V'#11#178'V'#11#178'Va'#205#145#174#229#199#11#178'V'#11 + +#178'V'#161#225#190'n'#209#154'$'#186'g'#195#236#213','#189'm'#11#178'V'#11 + +#178'V'#11#178'V6'#192't'#195#236#213#26#183'`'#11#178'V'#131#216#169#155#223 + +#185#11#178'V'#148#221#181#194#236#213#194#236#213#194#236#213#193#235#212' ' + +#185'd'#11#178'V'#29#184'b'#194#236#212'4'#191'r'#11#178'V'#27#183'`'#193#236 + +#212'7'#192't'#11#178'V'#11#178'V'#11#178'V'#11#178'V'#11#178'V'#11#178'V'#11 + +#178'V'#11#178'V'#11#174'T'#11#173'S'#11#176'U'#11#176'U'#11#176'U'#11#176'U' + +#11#176'Uh'#206#149#160#224#189#11#176'T'#11#176'U'#147#220#179'u'#210#158'$' + +#184'f'#195#235#212','#187'l'#11#176'U'#11#176'U'#11#176'U6'#190's'#195#235 + +#212#26#181'_'#11#176'UW'#201#138#181#231#203#11#176'Ux'#211#161#194#235#212 + +#194#235#212#194#235#212#182#231#204#15#177'X'#11#176'U'#29#182'a'#194#235 + +#212'4'#189'q'#11#176'U'#27#181'_'#193#235#211'7'#190's'#11#176'U'#11#176'U' + +#11#176'U'#11#176'U'#11#176'U'#11#176'U'#11#176'U'#11#176'U'#11#173'S'#11#172 + +'S'#11#174'T'#11#174'T'#11#174'T'#11#174'T'#11#174'Ti'#205#149#159#223#188#11 + +#174'S'#11#174'S'#146#219#178'v'#209#159'$'#182'e'#194#235#212#174#228#198 + +#169#226#194'q'#208#155#12#174'T6'#188'r'#195#235#212#26#179'^'#11#174'TB' + +#192'z'#192#234#210#17#176'X\'#201#141#180#230#202'R'#197#133#141#217#175#159 + +#223#187#11#174'T'#11#174'T'#29#180'`'#194#235#212'4'#187'p'#11#174'T'#27#179 + +'_'#193#234#211'7'#188'r'#11#174'T'#11#174'T'#11#174'T'#11#174'T'#11#174'T' + +#11#174'T'#11#174'T'#11#174'T'#11#172'S'#11#171'R'#11#172'R'#11#172'R'#11#172 + +'R'#11#172'R'#11#172'Ri'#204#149#159#222#187#11#172'R'#11#172'R'#146#218#178 + +'v'#208#158'$'#180'd'#194#234#212#194#234#212#194#234#212#193#234#211'6'#186 + +'q6'#186'q'#195#234#212#26#177']'#11#172'R9'#187's'#194#234#212#23#176'[@' + +#190'x'#187#232#207#18#174'W'#129#212#166#132#213#168#11#172'R'#11#172'R'#29 + +#178'_'#194#234#212'4'#186'o'#11#172'R'#27#177']'#193#234#211#161#223#189#150 + +#219#181#150#219#181'7'#187'r'#11#172'R'#11#172'R'#11#172'R'#11#172'R'#11#172 + +'R'#11#171'R'#11#169'R'#11#169'Q'#11#169'Q'#11#169'Q'#11#169'Q'#11#169'Qi' + +#202#148#159#221#187#11#169'Q'#11#169'Q'#146#217#177'v'#207#157'$'#178'c'#194 + +#234#212#148#217#179#146#217#177#193#233#211'k'#203#150'6'#185'p'#195#234#212 + +#26#175'\'#11#169'Q7'#185'q'#194#234#212#25#174'\%'#178'd'#194#233#211'%'#178 + +'d'#156#220#184'h'#202#148#11#169'Q'#11#169'Q'#29#176'^'#194#233#211'4'#184 + +'n'#11#169'Q'#27#175']'#193#233#211#194#233#211#194#233#211#194#233#211'E' + +#190'{'#11#169'Q'#11#169'Q'#11#169'Q'#11#169'Q'#11#169'Q'#11#169'R'#10#168'Q' + +#10#167'P'#10#167'P'#10#167'P'#10#167'P'#10#167'Ph'#201#147#159#221#186#10 + +#167'P'#10#167'P'#146#216#177'v'#206#157'#'#176'b'#195#233#211','#179'h'#10 + +#167'P'#145#215#176#136#212#170'6'#183'o'#195#233#211#25#173'['#10#167'P;' + +#185's'#193#233#210#20#171'X'#16#170'U'#185#230#204'?'#186'v'#181#229#202'L' + +#191#128#10#167'P'#10#167'P'#28#174']'#194#233#211'3'#182'n'#10#167'P'#26#173 + +'\'#193#233#210#166#223#191#157#219#184#157#219#184'9'#184'q'#10#167'P'#10 + +#167'P'#10#167'P'#10#167'P'#10#167'P'#10#168'Q'#10#167'P'#10#165'O'#10#165'O' + +#10#165'O'#10#165'O'#10#165'Oh'#200#147#159#219#186#10#165'O'#10#165'O'#146 + +#215#177'v'#204#156'#'#174'b'#195#232#211','#177'g'#10#165'Ot'#204#155#149 + +#216#179'6'#181'o'#195#232#211#25#170'Z'#10#165'OJ'#188'}'#188#230#207#13#166 + +'Q'#10#165'O'#163#221#189'h'#199#147#194#232#211'1'#179'k'#10#165'O'#10#165 + +'O'#28#172'\'#194#232#211'3'#180'm'#10#165'O'#26#171'Z'#193#232#210'6'#181'o' + +#10#165'O'#10#165'O'#10#165'O'#10#165'O'#10#165'O'#10#165'O'#10#165'O'#10#165 + +'O'#10#167'P'#10#166'P'#10#163'N'#10#163'N'#10#163'N'#10#163'N'#10#163'Nh' + +#198#146#159#219#186#10#163'N'#10#163'N'#146#214#176'v'#203#156'#'#172'a'#195 + +#232#211','#175'f'#10#163'Nv'#203#156#150#215#179'5'#179'n'#195#232#211#25 + +#169'Y'#10#163'Nf'#198#145#171#223#194#10#163'N'#10#163'N'#135#210#168#156 + +#218#184#191#231#209#25#168'Y'#10#163'N'#10#163'N'#28#170'\'#194#232#211'3' + ,#178'l'#10#163'N'#26#169'Z'#193#232#210'6'#180'n'#10#163'N'#10#163'N'#10#163 + +'N'#10#163'N'#10#163'N'#10#163'N'#10#163'N'#10#163'N'#10#166'P'#10#167'P'#10 + +#161'M'#10#161'M'#10#161'M'#10#161'M'#10#161'Mh'#197#146#159#218#185#10#161 + +'M'#10#161'M'#146#213#175'v'#202#155'#'#170'`'#195#231#211','#174'f'#12#161 + +'O'#154#216#181#139#210#171'6'#177'm'#195#231#211#25#167'X'#17#163'R'#163#219 + +#188#139#210#171#10#161'M'#10#161'Mk'#198#147#193#231#210#177#225#198#11#161 + +'N'#10#161'M'#10#161'M'#28#168'['#194#231#210'3'#177'k'#10#161'M'#26#167'Y' + +#193#231#210'6'#178'm'#10#161'M'#10#161'M'#10#161'M'#10#161'M'#10#161'M'#10 + +#161'M'#10#161'M'#10#161'M'#10#167'P'#0#0#0#10#158'L'#10#158'L'#10#158'L'#10 + +#158'L'#10#158'Lh'#196#145#159#217#185#10#158'L'#10#158'L'#146#212#175'v'#201 + +#154'#'#168'_'#194#231#210#168#221#192#171#222#194#198#232#213'~'#204#160'L' + +#185'}'#202#234#216#173#223#195#182#226#202#201#233#215'm'#198#148#29#166'Z' + +#22#163'US'#187#129#194#231#210#151#214#179#10#158'L'#20#162'S'#160#218#186 + +#166#220#190#194#231#210#170#221#192#163#219#188')'#171'c'#193#231#209#170 + +#222#193#163#219#187#163#219#187'`'#193#139#10#158'L'#10#158'L'#10#158'L'#10 + +#158'L'#10#158'L'#0#0#0#0#0#0#10#159'L'#10#156'K'#10#156'K'#10#156'K'#10#156 + +'Kh'#194#144#159#216#184#10#156'K'#10#156'K'#147#211#175'|'#202#159'5'#174'j' + +#202#233#216#204#234#217#205#235#218#204#235#218'Z'#189#134'Z'#189#134#205 + +#235#218#205#235#218#205#235#218#199#233#214'I'#182'y7'#174'l7'#174'lX'#188 + +#132#204#234#217#139#208#170#29#164'Y'#28#164'Y'#191#229#208#194#230#210#194 + +#230#210#194#230#210#194#230#210'-'#170'e'#193#230#209#194#230#210#194#230 + +#210#198#232#213#131#205#164#25#162'V'#10#156'K'#10#156'K'#10#156'K'#10#159 + +'L'#0#0#0#0#0#0#10#162'N'#10#154'J'#10#154'J'#10#154'J'#10#154'JZ'#187#133 + +#137#206#168','#168'c4'#172'j'#138#207#169'{'#201#158'L'#181'{'#167#219#190 + +#167#219#190#166#218#189'{'#201#158'='#176'pV'#186#131#167#219#190#167#219 + +#190#162#217#187'h'#193#144'='#175'p='#175'p='#175'pG'#179'x'#166#218#189'q' + +#196#150'='#175'pD'#178'u'#164#217#188#162#217#187#158#215#184#150#212#178 + +#144#209#173'#'#165']'#149#211#177#159#216#185#165#218#189#167#219#190'y'#200 + +#156'<'#175'o'#15#157'O'#10#154'J'#10#154'J'#10#162'N'#0#0#0#0#0#0#0#0#0#9 + +#152'I'#9#152'I'#9#152'I'#14#154'MC'#176'tD'#177'uD'#177'uD'#177'uD'#177'uD' + +#177'uD'#177'uD'#177'uD'#176'tD'#176'tD'#176'tD'#176'tD'#176'tD'#176'tD'#176 + +'tD'#176'tD'#176'tD'#176'tD'#176'tD'#176'tD'#176'tD'#176'tD'#176'tD'#176'tD' + +#176'tD'#176'tD'#176'tD'#176'tC'#176'tB'#175'sA'#175'sC'#176'tC'#176'tC'#176 + +'tC'#176'tC'#176'tD'#176't'#23#158'S'#9#152'I'#9#152'I'#0#0#0#0#0#0#0#0#0#0#0 + +#0#9#155'K'#9#150'H'#9#150'H'#18#154'OK'#178'yK'#178'yK'#178'yK'#178'yK'#178 + +'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178'yK' + +#178'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178'yK'#178 + +'yK'#178'yK'#178'yK'#178'yK'#178'yJ'#178'yJ'#178'yJ'#178'yJ'#178'yJ'#178'yJ' + +#178'yJ'#178'yJ'#178'yJ'#177'x'#16#153'N'#9#150'H'#9#155'K'#0#0#0#0#0#0#0#0#0 + +#0#0#0#10#164'O'#9#147'G'#9#147'G'#11#149'IM'#177'zQ'#179'}Q'#179'}Q'#179'}Q' + +#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179 + +'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q' + +#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179'}Q'#179 + +'}Q'#179'}Q'#179'}Q'#179'}C'#173'r'#9#148'G'#9#147'G'#10#164'O'#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#9#152'I'#9#145'F'#9#145'F?'#169'nX'#181#130'X'#181#130'X' + +#180#130'X'#180#130'X'#180#130'X'#180#130'X'#180#130'X'#180#130'X'#180#130'X' + +#180#130'X'#180#130'X'#180#130'X'#180#130'X'#180#130'X'#180#130'X'#180#130'X' + +#180#130'X'#180#130'X'#180#130'X'#180#130'X'#180#130'X'#180#130'X'#180#130'X' + +#180#130'X'#180#130'X'#180#129'X'#180#129'X'#180#129'X'#180#129'X'#180#129'X' + +#180#129'X'#180#129'X'#180#129'X'#180#129'X'#180#129''''#159']'#9#145'F'#9 + +#152'I'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9#143'E'#9#143'E!'#154'W_' + +#182#133'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_' + +#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_' + +#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_' + +#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_' + +#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'_'#182#134'N'#175'y'#11 + +#144'F'#9#143'E'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#155'K'#9 + +#141'D'#10#141'DN'#173'xf'#184#138'f'#184#138'f'#184#138'f'#184#138'f'#184 + +#138'f'#184#138'f'#184#138'f'#184#138'f'#184#138'f'#184#138'f'#184#138'f'#184 + +#138'f'#184#138'f'#184#138'f'#184#138'f'#184#138'f'#184#138'f'#184#138'f'#184 + +#138'e'#184#138'e'#184#138'e'#184#138'e'#184#138'e'#184#138'e'#184#138'e'#184 + +#138'e'#184#138'e'#184#138'e'#184#138'e'#184#138'e'#184#138'e'#184#138'b'#182 + +#136#28#150'R'#9#141'D'#10#155'K'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#9#146'G'#8#139'C'#24#146'Og'#184#139'l'#186#143'l'#186#143'l'#186 + ,#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186 + +#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186 + +#143'l'#186#143'l'#185#143'l'#185#143'l'#185#143'l'#185#143'l'#185#143'l'#185 + +#143'l'#185#143'l'#185#143'l'#185#143'l'#185#143'l'#185#143'l'#185#143'k'#185 + +#142'0'#158'a'#8#139'C'#9#146'G'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#8#141'D'#8#137'B.'#155'_r'#188#147's'#188#148's'#188 + +#148's'#188#148's'#188#148's'#188#148's'#188#148's'#188#148's'#188#148's'#188 + +#148's'#188#148's'#188#148's'#188#148's'#188#148'r'#188#147'r'#188#147'r'#188 + +#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188 + +#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'>'#162 + +'k'#8#137'B'#8#141'D'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#8#138'B'#8#134'A9'#158'gx'#189#151'y'#190#152'y'#190 + +#152'y'#190#152'y'#190#152'y'#190#152'y'#190#152'y'#190#152'y'#190#152'y'#190 + +#152'y'#190#152'y'#190#152'y'#190#152'y'#190#152'y'#190#152'y'#190#152'y'#190 + +#152'y'#190#152'y'#190#152'y'#190#152'y'#190#152'y'#190#152'y'#190#152'y'#190 + +#152'y'#190#152'y'#190#152'y'#190#152'x'#189#151'='#160'j'#8#134'A'#8#138'B' + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#8#137'B'#8#132'@4'#154'b{'#189#153#128#192#157#128#192#157#128 + +#192#157#128#192#157#128#192#157#128#192#157#128#192#157#128#192#157#128#192 + +#157#128#192#157#128#192#157#128#192#157#128#192#157#128#192#157#128#192#157 + +#128#192#157#128#192#157#128#192#157#128#192#157#128#192#157#128#192#157#128 + +#192#157#128#192#157#128#192#157'x'#188#150'/'#152'^'#8#132'@'#8#137'B'#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#9#140'C'#8#130'? '#142'Qn'#182#142#135#194#162#135#194 + +#162#135#194#162#135#194#162#135#194#162#135#194#162#135#194#162#135#194#161 + +#135#194#161#135#194#161#135#194#161#135#194#161#135#194#161#135#194#161#135 + +#194#161#135#194#161#135#194#161#135#194#161#135#194#161#135#194#161#135#194 + +#161#135#194#161'b'#175#132#24#138'K'#8#130'?'#9#140'C'#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#9#149'H'#8#128'>'#11#129'@='#155'g}'#188#153#142#197#166#142 + +#197#166#142#197#166#142#197#166#142#197#166#142#197#166#142#197#166#142#197 + +#166#142#197#166#142#197#166#142#197#166#142#197#166#142#197#166#142#197#166 + +#142#197#166#142#197#166#142#197#166#142#197#166'r'#182#144'/'#148'\'#9#128 + +'>'#8#128'>'#9#149'H'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#9#137'B'#8'~='#11#127'?5'#149'`h'#176#136#141#195#165#148#199#171#148#199 + +#171#148#199#171#148#199#171#148#199#171#148#199#171#148#199#171#148#199#171 + +#148#199#171#148#199#171#148#199#171#148#199#171#137#193#162'^'#170#128'(' + +#143'V'#8'~='#8'~='#9#137'B'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#9#156'K'#8#135'A'#7'|<'#7'|<'#13#127'@*'#142'WH' + +#158'n_'#170#129'p'#179#142'|'#185#151#129#188#156#131#189#157'}'#186#153'q' + +#180#143'_'#170#129'F'#157'm&'#140'T'#10'}>'#7'|<'#7'|<'#8#135'A'#9#156'K'#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#9#144'E'#8#130'?'#7'y;'#7'y;'#7'y;'#7'y;'#7'y:'#7'y:'#7 + +'y:'#7'y:'#7'y;'#7'y;'#7'y;'#7'y;'#8#130'?'#9#144'E'#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9#150'H'#9#143'E'#8#140'C'#8#138'C'#8#137 + +'B'#8#137'B'#8#138'C'#8#140'C'#9#143'E'#9#150'H'#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#255#255#224#7#255#255#0#0#255#255#0#0#255#255#0#0#255#248#0#0#31 + +#255#0#0#255#240#0#0#15#255#0#0#255#192#0#0#3#255#0#0#255#128#0#0#1#255#0#0 + +#255#0#0#0#0#255#0#0#254#0#0#0#0#127#0#0#252#0#0#0#0'?'#0#0#248#0#0#0#0#31#0 + +#0#240#0#0#0#0#15#0#0#240#0#0#0#0#15#0#0#224#0#0#0#0#7#0#0#192#0#0#0#0#3#0#0 + +#192#0#0#0#0#3#0#0#192#0#0#0#0#3#0#0#128#0#0#0#0#1#0#0#128#0#0#0#0#1#0#0#128 + +#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#128#0#0#0#0#1#0#0#128#0#0#0#0#1#0#0#128#0#0#0#0#1#0#0 + +#192#0#0#0#0#3#0#0#192#0#0#0#0#3#0#0#192#0#0#0#0#3#0#0#224#0#0#0#0#7#0#0#240 + +#0#0#0#0#15#0#0#240#0#0#0#0#15#0#0#248#0#0#0#0#31#0#0#252#0#0#0#0'?'#0#0#254 + +#0#0#0#0#127#0#0#255#0#0#0#0#255#0#0#255#128#0#0#1#255#0#0#255#192#0#0#3#255 + +#0#0#255#240#0#0#15#255#0#0#255#248#0#0#31#255#0#0#255#255#0#0#255#255#0#0 + ,#255#255#224#7#255#255#0#0'('#0#0#0'@'#0#0#0#128#0#0#0#1#0#24#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#173'S'#12#184'Y'#12#189'['#12#192 + +'\'#12#195'^'#12#196'^'#12#196'^'#12#195'^'#12#192'\'#12#189'['#12#184'Y'#11 + +#173'S'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#175'T' + +#12#191'\'#13#206'c'#14#217'h'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219 + +'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14 + +#217'h'#13#206'c'#12#191'\'#11#175'T'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#191'\'#13#211 + +'f'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14 + +#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i' + +#14#219'i'#14#219'i'#14#219'i'#14#219'i'#14#219'i'#13#211'f'#12#191'\'#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#169'Q'#13 + +#197'_'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h' + +#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217 + +'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14#217'h'#14 + +#217'h'#14#217'h'#14#217'h'#14#217'h'#13#197'_'#11#169'Q'#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#13#195']'#14#215'g'#14#216'g'#14#216'g'#14#216'g' + +#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216 + +'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14 + +#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g'#14#216'g' + +#14#216'g'#14#216'g'#14#215'g'#13#195']'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#182 + +'W'#14#210'e'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14 + +#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g' + +#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214 + +'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14#214'g'#14 + +#214'g'#14#214'g'#14#214'g'#14#210'e'#12#182'W'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#197'_'#14#212'f' + +#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212 + +'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14 + +#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f' + +#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#14#212 + +'f'#14#212'f'#14#212'f'#14#212'f'#14#212'f'#13#197'_'#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#169'Q'#13#205'b'#13#211'e'#13 + +#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e' + +#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211 + +'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13 + +#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e' + +#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#211'e'#13#205'b'#10#169 + +'Q'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#175'T'#13#207'c'#13 + +#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd' + +#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209 + +'d'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13 + +#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd' + +#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209'd'#13#209 + +'d'#13#209'd'#13#207'c'#11#175'T'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#176 + +'T'#13#206'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13 + +#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c' + ,#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207 + +'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13 + +#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c' + +#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#207'c'#13#206'c'#11#176'T'#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#11#174'T'#13#205'b'#13#206'c'#13#206'c'#13#206'c'#13#206 + +'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13 + +#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c' + +#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206 + +'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13 + +#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c'#13#206'c' + +#13#206'c'#13#206'c'#13#205'b'#11#174'T'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#169'Q'#13#202'a'#13 + +#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b' + +#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204 + +'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13 + +#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b' + +#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204 + +'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13#204'b'#13 + +#202'a'#11#169'Q'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#13#198'_'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13 + +#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a' + +#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203 + +'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13 + +#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a' + +#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203 + +'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#203'a'#13#198'_'#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#190'['#13 + +#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`' + +#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201 + +'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13 + +#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`' + +#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201 + +'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13#201'`'#13 + +#201'`'#13#201'`'#13#201'`'#13#201'`'#12#190'['#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#178'V'#13#199'`'#13#199'`'#13#199'`' + +#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199 + +'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13 + +#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`' + +#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199 + +'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13 + +#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`'#13#199'`' + +#13#199'`'#13#199'`'#13#199'`'#11#178'V'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#12#195'^'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13 + +#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_' + +#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198 + +'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13 + +#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_' + +#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198 + +'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13#198'_'#13 + +#198'_'#13#198'_'#12#195'^'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#11#184'X'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12 + +#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^' + +#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196 + +'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12 + +#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^' + +#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196 + +'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12#196'^'#12 + +#196'^'#12#196'^'#11#184'X'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#169 + +'Q'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12 + +#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']' + +#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194 + +']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12 + +#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']' + ,#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194 + +']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12#194']'#12 + +#194']'#12#194']'#12#194']'#11#169'Q'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11 + +#183'X'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']' + +#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193 + +']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12 + +#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']' + +#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193 + +']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12 + +#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']'#12#193']' + +#12#193']'#12#193']'#12#193']'#11#183'X'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191 + +'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12 + +#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\' + +#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191 + +'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12 + +#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\' + +#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#12#191 + +'\'#12#191'\'#12#191'\'#12#191'\'#12#191'\'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11 + +#178'U'#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'[' + +#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189 + +'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12 + +#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'[' + +#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189 + +'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12 + +#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#12#189'[' + +#12#189'['#12#189'['#12#189'['#12#189'['#12#189'['#11#178'U'#0#0#0#0#0#0#0#0 + +#0#0#0#0#12#185'Y'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188 + +'Z'#12#188'Z'#12#188'Z!'#194'h$'#195'j'#13#188'Z'#12#188'Z'#12#188'Z'#12#188 + +'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12 + +#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z' + +#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188 + +'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12 + +#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z' + +#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#188'Z'#12#185'Y'#0#0#0 + +#0#0#0#0#0#0#11#171'R'#12#186'Y'#12#186'Y'#12#186'Y'#12#186'Y'#12#186'Y'#12 + +#186'Y'#12#186'Y'#13#187'Zp'#215#158#192#237#212#193#238#213'}'#218#167#16 + +#187'\'#12#186'Y'#12#186'Ye'#212#150'k'#213#154#12#186'Z'#12#186'Y'#12#186'Y' + +#12#186'Y'#12#186'Y'#16#187'\o'#214#157'u'#216#160'u'#216#160'q'#215#158'C' + +#202#127#13#187'Z'#12#186'Y'#20#188'_q'#215#158'['#209#143#12#186'Y'#12#186 + +'Y'#12#186'Y'#15#187'[o'#214#157'c'#211#148#12#186'Y'#12#186'Y'#26#190'ct' + +#216#160'N'#205#134#12#186'Y'#12#186'Y'#12#186'Y]'#209#145'u'#216#160'u'#216 + +#160'u'#216#160'u'#216#160'u'#216#160'N'#205#134#12#186'Y'#12#186'Y'#12#186 + +'Y'#12#186'Y'#12#186'Y'#12#186'Y'#11#171'R'#0#0#0#0#0#0#11#176'U'#12#184'Y' + +#12#184'Y'#12#184'Y'#12#184'Y'#12#184'Y'#12#184'Y'#12#184'YG'#202#129#193#237 + +#213#194#237#213#194#237#213#194#237#213'X'#207#141#12#184'Y'#12#185'Y'#167 + +#229#194#177#232#202#13#185'Y'#12#184'Y'#12#184'Y'#12#184'Y'#12#184'Y'#18#186 + +']'#185#234#207#194#237#213#194#237#213#194#237#213#193#237#212'Z'#207#142#12 + +#184'Y'#15#185'['#176#232#201#170#230#197#12#184'Y'#12#184'Y'#12#184'Y'#31 + +#190'e'#191#236#211#142#222#178#12#184'Y'#12#184'Y$'#191'i'#194#237#213#127 + +#218#167#12#184'Y'#12#184'Y'#12#184'X'#154#225#185#194#237#213#194#237#213 + +#194#237#213#194#237#213#194#237#213#127#218#167#12#184'Y'#12#184'Y'#12#184 + +'Y'#12#184'Y'#12#184'Y'#12#184'Y'#11#176'U'#0#0#0#0#0#0#11#179'V'#12#183'X' + +#12#183'X'#12#183'X'#12#183'X'#12#183'X'#12#183'X'#12#183'X'#151#224#184#194 + +#237#213#194#237#213#194#237#213#194#237#213#167#229#194#15#184'Z'#12#183'X' + +#167#229#194#177#232#201#12#183'X'#12#183'X'#12#183'X'#12#183'X'#12#183'X'#18 + +#185'\'#185#234#207#194#237#213#194#237#213#194#237#213#194#237#213#178#232 + +#202#21#186'^'#11#183'X'#152#224#184#188#235#209#19#185']'#12#183'X'#12#183 + +'X5'#195't'#194#237#213's'#213#159#12#183'X'#12#183'X$'#190'h'#194#237#213 + +#127#217#167#11#183'X'#12#183'X'#11#183'W'#153#225#185#194#237#213#194#237 + +#213#194#237#213#194#237#213#194#237#213#127#217#167#11#183'X'#12#183'X'#12 + +#183'X'#12#183'X'#12#183'X'#12#183'X'#11#179'V'#0#0#0#0#0#0#11#180'W'#11#181 + +'W'#11#181'W'#11#181'W'#11#181'W'#11#181'W'#11#181'W'#25#185'`'#189#235#210 + +#191#235#211'b'#207#147'Y'#204#140#188#235#209#192#236#212'('#190'k'#11#181 + ,'W'#167#228#194#177#231#201#12#181'W'#11#181'W'#11#181'W'#11#181'W'#11#181'W' + +#18#183'\'#185#234#206#187#234#208#163#227#192#171#229#197#194#236#213#194 + +#236#213'A'#197'|'#11#181'W|'#215#165#194#236#213''''#190'k'#11#181'W'#11#181 + +'WN'#201#133#194#236#213'W'#204#139#11#181'W'#11#181'W#'#188'h'#194#236#213 + +#127#216#167#11#181'W'#11#181'W'#11#181'W'#153#224#185#193#236#212#164#227 + +#192#163#227#192#163#227#192#163#227#192'k'#210#153#11#181'W'#11#181'W'#11 + +#181'W'#11#181'W'#11#181'W'#11#181'W'#11#180'W'#0#0#0#11#170'R'#11#180'V'#11 + +#180'V'#11#180'V'#11#180'V'#11#180'V'#11#180'V'#11#180'V1'#192'q'#194#236#213 + +#140#219#176#11#180'V'#11#180'V{'#214#164#194#236#213'C'#197'}'#11#180'V'#167 + +#228#194#177#231#201#12#180'W'#11#180'V'#11#180'V'#11#180'V'#11#180'V'#18#182 + +'['#185#233#206#154#224#185#11#180'V'#13#180'Xz'#214#163#194#236#213'q'#211 + +#157#11#180'V_'#206#145#194#236#213#135#218#172'r'#211#158'r'#211#158#152#223 + +#184#194#236#213'<'#195'x'#11#180'V'#11#180'V#'#187'g'#194#236#213#127#215 + +#166#11#180'V'#11#180'V'#11#180'V'#153#223#184#188#234#209#15#181'Y'#11#180 + +'V'#11#180'V'#11#180'V'#11#180'V'#11#180'V'#11#180'V'#11#180'V'#11#180'V'#11 + +#180'V'#11#180'V'#11#180'V'#11#170'R'#11#172'S'#11#178'V'#11#178'V'#11#178'V' + +#11#178'V'#11#178'V'#11#178'V'#11#178'VC'#195'|'#194#236#213'e'#206#148#11 + +#178'V'#11#178'VT'#201#136#194#236#213'T'#201#136#11#178'V'#167#227#194#177 + +#230#201#12#178'V'#11#178'V'#11#178'V'#11#178'V'#11#178'V'#18#180'Z'#185#233 + +#206#154#223#184#11#178'U'#11#178'V)'#187'j'#192#235#211#147#221#180#11#178 + +'UC'#196'|'#194#236#213#194#236#213#194#236#213#194#236#213#194#236#213#192 + +#235#211'#'#185'f'#11#178'V'#11#178'V#'#186'f'#194#236#212#127#215#166#11#178 + +'U'#11#178'V'#11#178'U'#153#223#184#188#234#208#15#179'X'#11#178'V'#11#178'V' + +#11#178'V'#11#178'V'#11#178'V'#11#178'V'#11#178'V'#11#178'V'#11#178'V'#11#178 + +'V'#11#178'V'#11#172'S'#11#172'S'#11#176'U'#11#176'U'#11#176'U'#11#176'U'#11 + +#176'U'#11#176'U'#11#176'UI'#196#128#194#235#212'X'#201#139#11#176'U'#11#176 + +'UG'#196'~'#194#235#212'Z'#202#140#11#176'U'#167#226#193#177#230#200#12#176 + +'U'#11#176'U'#11#176'U'#11#176'U'#11#176'U'#18#178'Y'#185#232#205#154#222#184 + +#11#176'U'#11#176'U'#14#177'W'#175#229#199#174#228#198#11#176'U('#186'i'#193 + +#235#212#194#235#212#194#235#212#194#235#212#194#235#212#181#231#203#18#178 + +'Z'#11#176'U'#11#176'U#'#184'f'#194#235#212#127#214#165#11#176'U'#11#176'U' + +#11#176'U'#153#222#183#188#233#208#15#178'X'#11#176'U'#11#176'U'#11#176'U'#11 + +#176'U'#11#176'U'#11#176'U'#11#176'U'#11#176'U'#11#176'U'#11#176'U'#11#176'U' + +#11#172'S'#11#172'S'#11#175'T'#11#175'T'#11#175'T'#11#175'T'#11#175'T'#11#175 + +'T'#11#175'TK'#196#129#194#235#212'V'#200#137#11#175'T'#11#175'TE'#194'|'#194 + +#235#212'\'#202#141#11#175'T'#167#226#193#185#232#206'd'#204#147'd'#204#146 + +'R'#198#134#16#176'W'#11#175'T'#18#177'Y'#185#232#205#154#222#184#11#175'T' + +#11#175'T'#11#175'T'#154#222#184#188#233#208#15#176'W'#21#178'['#185#232#205 + +#188#233#208#164#225#191#165#226#192#193#235#211#160#224#188#11#175'T'#11#175 + +'T'#11#175'T#'#183'e'#194#235#212#127#213#165#11#175'T'#11#175'T'#11#175'T' + +#153#221#183#188#233#208#15#176'W'#11#175'T'#11#175'T'#11#175'T'#11#175'T'#11 + +#175'T'#11#175'T'#11#175'T'#11#175'T'#11#175'T'#11#175'T'#11#175'T'#11#172'S' + +#11#171'R'#11#173'S'#11#173'S'#11#173'S'#11#173'S'#11#173'S'#11#173'S'#11#173 + +'SK'#194#128#194#234#212'V'#198#136#11#173'S'#11#173'SE'#192'|'#194#234#212 + +'\'#200#141#11#173'S'#167#225#193#194#234#212#194#234#212#194#234#212#194#234 + +#212'p'#207#154#11#173'S'#18#175'X'#185#231#205#154#221#183#11#173'S'#11#173 + +'S'#11#173'S'#139#216#174#193#234#211#23#177'\'#13#173'T'#165#224#192#170#226 + +#195#14#174'U'#28#178'_'#192#233#211#134#214#170#11#173'S'#11#173'S'#11#173 + +'S#'#181'd'#194#234#212#127#212#165#11#173'S'#11#173'S'#11#173'S'#153#220#183 + +#188#232#208#25#178']'#21#176'Z'#21#176'Z'#21#176'Z'#12#173'T'#11#173'S'#11 + +#173'S'#11#173'S'#11#173'S'#11#173'S'#11#173'S'#11#173'S'#11#171'R'#11#171'R' + +#11#171'R'#11#171'R'#11#171'R'#11#171'R'#11#171'R'#11#171'R'#11#171'RK'#194 + +#128#194#234#212'V'#197#136#11#171'R'#11#171'RE'#191'{'#194#234#212'\'#199 + +#140#11#172'R'#167#225#193#194#234#212#194#234#212#194#234#212#194#234#212 + +#187#232#207#26#177']'#18#174'W'#185#231#205#154#220#183#11#171'R'#11#171'R' + +#11#171'R'#133#213#169#194#234#212#28#177'^'#11#171'R'#139#215#173#187#232 + +#207#22#175'Z3'#185'o'#194#234#212'j'#204#150#11#171'R'#11#171'R'#11#171'R#' + +#180'c'#194#234#212#127#211#164#11#171'R'#11#171'R'#11#171'R'#153#220#183#194 + +#234#212#186#231#207#186#231#207#186#231#207#185#231#206#28#177'_'#11#171'R' + +#11#171'R'#11#171'R'#11#171'R'#11#171'R'#11#171'R'#11#171'R'#11#171'R'#11#170 + +'R'#11#170'R'#11#170'R'#11#170'R'#11#170'R'#11#170'R'#11#170'R'#11#170'RK' + +#192#127#194#234#212'V'#196#135#11#170'R'#11#170'RE'#190'{'#194#234#212'\' + +#198#139#11#170'R'#167#224#192#192#233#210#176#227#199#178#228#201#193#233 + +#211#194#234#212'H'#191'}'#18#172'V'#185#230#205#154#220#183#11#170'Q'#11#170 + ,'R'#11#170'R'#130#212#167#195#234#212#31#176'_'#11#170'Rn'#204#152#194#234 + +#212'*'#180'gN'#193#129#194#234#212'O'#193#130#11#170'R'#11#170'R'#11#170'R#' + +#178'c'#194#233#211#127#210#164#11#170'R'#11#170'R'#11#169'Q'#153#219#182#194 + +#234#212#194#234#212#194#234#212#194#234#212#193#233#211#29#176'^'#11#170'R' + +#11#170'R'#11#170'R'#11#170'R'#11#170'R'#11#170'R'#11#170'R'#11#170'R'#10#169 + +'Q'#10#168'Q'#10#168'Q'#10#168'Q'#10#168'Q'#10#168'Q'#10#168'Q'#10#168'QK' + +#191#127#194#233#211'V'#195#135#10#168'Q'#10#168'QD'#189'z'#194#233#211'\' + +#197#139#10#168'Q'#167#223#192#177#227#199#15#170'T'#15#170'Tm'#203#150#194 + +#233#211'i'#201#148#17#170'V'#184#230#204#154#219#182#10#168'Q'#10#168'Q'#10 + +#168'Q'#133#212#168#194#233#211#26#173'\'#10#168'QR'#193#132#194#233#211'C' + +#188'yh'#201#147#194#233#211'3'#182'n'#10#168'Q'#10#168'Q'#10#168'Q#'#177'b' + +#194#233#211#127#209#163#10#168'Q'#10#168'Q'#10#168'Q'#153#218#182#194#233 + +#211#194#233#211#194#233#211#194#233#211#193#232#210#28#175'^'#10#168'Q'#10 + +#168'Q'#10#168'Q'#10#168'Q'#10#168'Q'#10#168'Q'#10#168'Q'#10#169'Q'#10#168'Q' + +#10#167'P'#10#167'P'#10#167'P'#10#167'P'#10#167'P'#10#167'P'#10#167'PK'#190 + +'~'#194#233#211'V'#194#134#10#167'P'#10#167'PD'#188'y'#194#233#211'\'#196#138 + +#10#167'P'#167#223#192#177#227#199#11#167'P'#10#167'P+'#178'g'#194#233#211'}' + +#208#162#16#169'U'#184#230#204#154#218#182#10#166'P'#10#167'P'#10#166'P'#143 + +#214#174#192#232#210#20#170'W'#10#167'P5'#182'o'#194#233#211']'#197#139#130 + +#210#165#192#232#209#26#172'['#10#167'P'#10#167'P'#10#167'P"'#175'a'#194#233 + +#211'~'#209#163#10#167'P'#10#167'P'#10#166'P'#153#218#181#190#232#208'U'#193 + +#133'R'#192#132'R'#192#132'R'#192#131#17#169'U'#10#167'P'#10#167'P'#10#167'P' + +#10#167'P'#10#167'P'#10#167'P'#10#167'P'#10#168'Q'#10#168'Q'#10#165'O'#10#165 + +'O'#10#165'O'#10#165'O'#10#165'O'#10#165'O'#10#165'OK'#188'}'#194#232#211'V' + +#193#134#10#165'O'#10#165'OD'#186'y'#194#232#211'\'#195#138#10#165'O'#167#222 + +#191#177#226#199#11#165'O'#10#165'O'#28#171'\'#193#232#210#135#210#168#16#167 + +'T'#184#229#204#154#217#182#10#165'O'#10#165'O'#10#165'O'#159#219#186#184#229 + +#204#12#166'Q'#10#165'O'#26#171'['#193#232#210'x'#205#158#156#218#184#177#226 + +#199#13#166'R'#10#165'O'#10#165'O'#10#165'O"'#174'a'#194#232#211'~'#208#162 + +#10#165'O'#10#165'O'#10#164'O'#153#217#181#188#230#207#14#166'R'#10#165'O'#10 + +#165'O'#10#165'O'#10#165'O'#10#165'O'#10#165'O'#10#165'O'#10#165'O'#10#165'O' + +#10#165'O'#10#165'O'#10#168'Q'#10#168'Q'#10#163'N'#10#163'N'#10#163'N'#10#163 + +'N'#10#163'N'#10#163'N'#10#163'NK'#187'}'#194#232#211'V'#192#133#10#163'N'#10 + +#163'ND'#185'x'#194#232#211'\'#194#137#10#163'O'#167#222#191#177#226#199#11 + +#163'O'#10#163'N'#30#171']'#193#232#211#136#210#169#16#166'S'#184#228#204#154 + +#217#182#10#163'N'#10#163'N'#17#166'T'#181#227#201#168#222#192#10#163'N'#10 + +#163'N'#12#164'P'#179#226#200#152#216#181#177#226#199#152#216#181#10#163'O' + +#10#163'N'#10#163'N'#10#163'N"'#172'`'#194#232#211'~'#207#162#10#163'N'#10 + +#163'N'#10#163'N'#153#217#181#188#230#207#14#165'Q'#10#163'N'#10#163'N'#10 + +#163'N'#10#163'N'#10#163'N'#10#163'N'#10#163'N'#10#163'N'#10#163'N'#10#163'N' + +#10#163'N'#10#168'Q'#10#170'R'#10#162'N'#10#162'N'#10#162'N'#10#162'N'#10#162 + +'N'#10#162'N'#10#162'NK'#186'|'#194#232#211'V'#190#133#10#162'N'#10#162'ND' + +#184'x'#194#232#211'\'#193#137#10#162'N'#167#221#191#177#225#198#11#162'N'#10 + +#162'N1'#176'j'#194#232#211#129#207#164#16#164'S'#184#228#204#154#216#181#10 + +#161'N'#10#162'N7'#178'n'#193#231#210#138#210#170#10#162'N'#10#162'N'#10#162 + +'N'#153#216#181#186#229#205#191#231#209'~'#205#161#10#162'N'#10#162'N'#10#162 + +'N'#10#162'N"'#171'_'#194#231#210'~'#206#162#10#162'N'#10#162'N'#10#161'M' + +#153#216#181#188#229#206#14#163'Q'#10#162'N'#10#162'N'#10#162'N'#10#162'N'#10 + +#162'N'#10#162'N'#10#162'N'#10#162'N'#10#162'N'#10#162'N'#10#162'N'#10#170'R' + +#0#0#0#10#160'M'#10#160'M'#10#160'M'#10#160'M'#10#160'M'#10#160'M'#10#160'MK' + +#185'|'#194#231#210'V'#189#132#10#160'M'#10#160'MD'#182'w'#194#231#210'\'#192 + +#136#10#160'M'#167#220#190#179#225#199' '#169']#'#170'_'#131#207#165#194#231 + +#210'n'#199#150#17#162'R'#185#228#203#159#217#185' '#169'])'#172'd'#154#215 + +#181#194#231#210'e'#195#143#10#160'M'#10#160'M'#10#160'M}'#204#160#194#231 + +#210#194#231#210'b'#194#140#10#160'M'#10#160'M'#26#166'Y'#31#169']5'#177'l' + +#194#231#210#134#208#167#31#169'] '#169']'#13#161'O'#153#215#180#189#229#206 + +'#'#170'_'#31#169']'#31#169']'#31#169']'#19#164'T'#10#160'M'#10#160'M'#10#160 + +'M'#10#160'M'#10#160'M'#10#160'M'#10#160'M'#0#0#0#0#0#0#10#161'N'#10#158'L' + +#10#158'L'#10#158'L'#10#158'L'#10#158'L'#10#158'LK'#184'{'#194#231#210'V'#188 + +#131#10#158'L'#10#158'LD'#181'v'#194#231#210'\'#191#136#10#158'L'#167#220#190 + +#194#231#210#192#230#209#194#231#210#198#233#213#200#233#215'e'#194#142'4' + +#175'j'#195#231#211#203#234#217#201#234#216#202#234#216#203#234#217#202#234 + +#216'M'#185'}$'#168'_'#30#166'Z'#22#163'Ue'#194#142#194#231#210#194#231#210 + +'F'#182'x'#10#158'L'#10#158'L'#143#211#173#192#230#209#192#230#209#194#231 + ,#210#193#231#209#192#230#209#193#230#209'#'#168'^'#153#215#180#194#231#210 + +#192#230#209#192#230#209#192#230#209#192#230#209'W'#189#132#10#158'L'#10#158 + +'L'#10#158'L'#10#158'L'#10#158'L'#10#158'L'#10#161'N'#0#0#0#0#0#0#11#164'O' + +#10#157'K'#10#157'K'#10#157'K'#10#157'K'#10#157'K'#10#157'KK'#182'{'#194#230 + +#210'V'#187#131#10#157'K'#10#157'KD'#180'v'#194#230#210'^'#190#136#19#160'R' + +#173#222#195#201#233#215#204#234#217#205#235#218#205#235#218#199#233#214'D' + +#180'v;'#177'p'#197#232#212#205#235#218#205#235#218#205#235#218#205#235#218 + +#180#225#200'9'#176'n6'#174'l6'#174'l6'#174'lf'#194#142#203#234#217#201#233 + +#215';'#176'o'#17#160'Q'#11#157'L'#144#210#174#194#230#210#194#230#210#194 + +#230#210#194#230#210#194#230#210#195#230#210'#'#166']'#153#214#180#194#230 + +#210#194#230#210#194#230#210#194#230#210#199#232#213'h'#194#144#21#161'S'#10 + +#157'K'#10#157'K'#10#157'K'#10#157'K'#10#157'K'#11#164'O'#0#0#0#0#0#0#11#169 + +'Q'#10#155'K'#10#155'K'#10#155'K'#10#155'K'#10#155'K'#10#155'KK'#181'z'#194 + +#230#210'Y'#187#133#21#159'S'#30#163'YZ'#187#133#204#234#217'{'#201#158'<' + +#175'o'#184#226#203#206#235#219#206#235#219#206#235#219#205#235#218#128#203 + +#162';'#175'o@'#177's'#198#232#213#206#235#219#206#235#219#206#235#219#198 + +#232#213'b'#191#139';'#175'o;'#175'o;'#175'o;'#175'oT'#185#129#205#235#218 + +#202#233#216'D'#178'u;'#175'o5'#172'j'#159#216#185#198#232#213#195#231#211 + +#194#230#210#194#230#210#194#230#210#195#230#210'#'#165']'#153#213#180#194 + +#230#210#194#230#210#198#232#213#204#234#218#206#235#219'y'#200#156':'#174'n' + +#22#160'T'#10#155'K'#10#155'K'#10#155'K'#10#155'K'#11#169'Q'#0#0#0#0#0#0#0#0 + +#0#9#156'K'#9#153'J'#9#153'J'#9#153'J'#9#153'J'#10#153'J<'#174'oj'#193#145'Q' + +#183#127'@'#176'r@'#176'rM'#181'|k'#194#146'S'#184#128'@'#176're'#191#141'k' + +#194#146'k'#194#146'k'#193#146'Z'#186#133'@'#176'r@'#176'rA'#176'si'#193#144 + +'k'#194#146'k'#194#146'h'#192#144'M'#181'|?'#176'r?'#176'r?'#176'r?'#176'r?' + +#176'rC'#177'uj'#193#145'h'#192#143'@'#176'r?'#176'r?'#176'r_'#189#137'k'#194 + +#146'k'#193#146'i'#193#144'a'#190#139'W'#185#131'Q'#183#127'!'#163'[J'#180'z' + +'a'#190#139'j'#193#145'k'#194#146'k'#194#146'k'#194#146'R'#183#127'?'#175'r*' + +#167'b'#9#153'J'#9#153'J'#9#153'J'#9#156'K'#0#0#0#0#0#0#0#0#0#0#0#0#10#162'N' + +#9#152'I'#9#152'I'#9#152'I'#9#152'I'#18#155'OD'#176'uE'#177'uE'#177'uE'#177 + +'uE'#177'uE'#177'uE'#177'uE'#177'uE'#177'uE'#177'uE'#177'uD'#176'uD'#176'uD' + +#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176 + +'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD' + +#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176 + +'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'uD'#176'u/'#168'e'#9#152'I' + +#9#152'I'#9#152'I'#10#162'N'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9#150'H'#9#150'H' + +#9#150'H'#9#150'H'#22#155'QJ'#178'xJ'#178'xJ'#178'xJ'#178'xJ'#178'xJ'#178'xJ' + +#178'xJ'#178'xJ'#178'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177 + +'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ' + +#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177'xJ'#177 + +'xJ'#177'xJ'#177'xI'#177'xI'#177'xI'#177'xI'#177'xI'#177'xI'#177'xI'#177'xI' + +#177'xI'#177'xI'#177'xI'#177'xI'#177'x*'#164'a'#9#150'H'#9#150'H'#9#150'H'#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#158'L'#9#148'G'#9#148'G'#9#148'G'#16 + +#151'LM'#178'zO'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179 + +'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O' + +#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179 + +'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O' + +#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179'{O'#179 + +'{O'#179'{N'#178'{'#27#156'U'#9#148'G'#9#148'G'#10#158'L'#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#10#171'R'#9#147'G'#9#147'G'#9#147'G'#10#147'GG'#174'uT'#180 + +#127'T'#180#127'T'#180#127'T'#180#127'T'#179#127'T'#179#127'T'#179#127'T'#179 + +#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179 + +#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179 + +#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179 + +#127'T'#179#127'T'#179#127'T'#179#127'T'#180#127'T'#179#127'T'#179#127'T'#179 + +#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'T'#179 + +#127'T'#179#127'T'#179#127'T'#179#127'T'#179#127'J'#175'w'#11#147'H'#9#147'G' + +#9#147'G'#10#171'R'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#156'K'#9#145 + +'F'#9#145'F'#9#145'F2'#163'eY'#181#130'Y'#181#130'Y'#181#130'Y'#181#130'Y' + +#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y' + +#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y' + +#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y' + +#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y' + +#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y' + ,#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y'#180#130'Y' + +#180#130'+'#160'`'#9#145'F'#9#145'F'#10#156'K'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#9#146'F'#9#143'E'#9#143'E'#21#149'N\'#181#131'^'#182 + +#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182 + +#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182 + +#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182 + +#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182 + +#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182 + +#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182#133'^'#182 + +#133'^'#182#133'^'#182#133'P'#176'{'#12#145'H'#9#143'E'#9#146'F'#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#162'N'#9#142'D'#9#142'D' + +#9#142'DA'#167'nc'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183 + +#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183 + +#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183 + +#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183 + +#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183 + +#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183#136'c'#183 + +#136'c'#183#136'c'#183#136'c'#183#136'a'#182#135'!'#153'V'#9#142'D'#9#142'D' + +#10#162'N'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#10#151'I'#9#140'D'#9#140'D'#19#145'Kb'#181#135'h'#184#140'h'#184#140'h'#184 + +#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184 + +#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184 + +#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184 + +#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184 + +#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184 + +#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'h'#184#140'<'#164'j'#9#140 + +'D'#9#140'D'#10#151'I'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#8#143'E'#8#139'C'#8#139'C.'#156'_l'#186#143'l'#186 + +#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186 + +#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186 + +#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186 + +#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186 + +#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'l'#186 + +#143'l'#186#143'l'#186#143'l'#186#143'l'#186#143'm'#186#143'O'#172'y'#10#140 + +'D'#8#139'C'#8#143'E'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#171'R'#8#139'C'#8#137'B'#9#137'CG'#167'rr' + +#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r' + +#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r' + +#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r'#188#147'r' + +#188#147'r'#187#147'r'#187#147'r'#187#147'r'#187#147'r'#187#147'r'#187#147'r' + +#187#147'r'#187#147'r'#187#147'r'#187#147'r'#187#147'r'#187#147'r'#187#147'r' + +#187#147'r'#187#147'r'#187#147'r'#187#147'r'#187#147'Z'#176#129#15#140'G'#8 + +#137'B'#8#139'C'#10#171'R'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#166'P'#8#136'B'#8#135'A'#11#137 + +'DV'#173'}w'#189#151'w'#189#151'w'#189#151'w'#189#151'w'#189#151'w'#189#151 + +'w'#189#151'w'#189#151'w'#189#151'w'#189#151'w'#189#151'w'#189#151'w'#189#151 + +'w'#189#151'w'#189#151'w'#189#151'w'#189#150'w'#189#150'w'#189#150'w'#189#150 + +'w'#189#150'w'#189#150'w'#189#150'w'#189#150'w'#189#150'w'#189#150'w'#189#150 + +'w'#189#150'w'#189#150'w'#189#150'w'#189#150'w'#189#150'w'#189#150'w'#189#150 + +'w'#189#150'w'#189#150'w'#189#150'w'#189#150']'#176#130#16#139'G'#8#135'A'#8 + +#136'B'#10#166'P'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#164'O'#8#135'A'#8#134'@'#12#136 + +'DX'#173'~|'#191#154'|'#191#154'|'#191#154'|'#191#154'|'#191#154'|'#191#154 + +'|'#191#154'|'#191#154'|'#191#154'|'#191#154'|'#191#154'|'#191#154'|'#191#154 + +'|'#191#154'|'#191#154'|'#191#154'|'#190#154'|'#190#154'|'#190#154'|'#190#154 + +'|'#190#154'|'#190#154'|'#190#154'|'#190#154'|'#190#154'|'#190#154'|'#190#154 + +'|'#190#154'|'#190#154'|'#190#154'|'#190#154'|'#190#154'|'#190#154'|'#190#154 + +'|'#190#154'{'#190#154'V'#172'}'#13#136'D'#8#134'@'#8#135'A'#10#164'O'#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#165'P'#8#134'A'#8#132'@'#11#134'BL'#166 + +'t'#128#192#157#129#192#158#129#192#158#129#192#158#129#192#158#129#192#158 + +#129#192#158#129#192#158#129#192#158#129#192#158#129#192#158#129#192#157#129 + +#192#157#129#192#157#129#192#157#129#192#157#129#192#157#129#192#157#129#192 + +#157#129#192#157#129#192#157#129#192#157#129#192#157#129#192#157#129#192#157 + ,#129#192#157#129#192#157#129#192#157#129#192#157#129#192#157#129#192#157#129 + +#192#157#129#192#157'}'#190#154'B'#161'l'#10#133'A'#8#132'@'#8#134'A'#10#165 + +'P'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#171'R'#8#136'B'#8#130 + +'?'#9#131'?1'#151'_{'#189#152#134#194#161#134#194#161#134#194#161#134#194#161 + +#134#194#161#134#194#161#134#194#161#134#194#161#134#194#161#134#194#161#134 + +#194#161#134#194#161#134#194#161#134#194#161#134#194#161#134#194#161#134#194 + +#161#134#194#161#134#194#161#134#194#161#134#194#161#134#194#161#134#194#161 + +#134#194#161#134#194#161#134#194#161#134#194#161#134#194#161#134#194#161#134 + +#194#161'o'#182#143'$'#144'U'#8#131'?'#8#130'?'#8#136'B'#11#171'R'#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9#143'E'#8#129'>' + +#8#129'>'#20#135'GV'#168'{'#136#194#162#139#196#164#139#196#164#139#196#164 + +#139#196#164#139#196#164#139#196#164#139#196#164#139#196#164#139#196#164#139 + +#196#164#139#196#164#139#196#164#139#196#164#139#196#164#139#196#164#139#196 + +#164#139#196#164#139#196#164#139#196#164#139#196#164#139#196#164#139#196#164 + +#139#196#164#139#196#164#139#196#164#139#196#164#128#190#156'B'#158'k'#12#131 + +'A'#8#129'>'#8#129'>'#9#143'E'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#10#158'L'#8#130'?'#8#127'='#8#127'=' + +#29#138'N['#170'~'#137#194#162#144#198#168#144#198#168#144#198#168#144#198 + +#168#144#198#168#144#198#168#144#198#168#144#198#168#144#198#168#144#198#168 + +#144#198#168#144#198#168#144#198#168#144#198#168#144#198#168#144#198#168#144 + +#198#168#144#198#168#144#198#168#144#198#168#144#198#168#144#198#168#127#189 + +#154'H'#160'p'#17#132'D'#8#127'='#8#127'='#8#130'?'#10#158'L'#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#9#145'F'#8'~='#8'}='#8'}='#20#132'FB'#156'jp'#180#143#144#196 + +#167#149#199#172#149#199#172#149#199#172#149#199#172#149#199#172#149#199#172 + +#149#199#172#149#199#172#149#199#172#149#199#172#149#199#172#149#199#172#149 + +#199#172#149#199#172#149#199#172#149#199#171#139#194#163'e'#174#134'3'#148'^' + +#13#128'@'#8'}='#8'}='#8'~='#9#145'F'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#10#170'R'#8#143'E'#7'|<'#7'|<'#7'|<'#7'|<'#18#130'D1'#146'\O'#162'uk' + +#176#138#127#187#154#143#196#167#151#200#173#153#201#175#154#202#176#154#202 + +#176#153#201#175#152#200#174#144#196#168#128#188#155'i'#175#137'L'#160'r+' + +#143'X'#13#127'A'#7'|<'#7'|<'#7'|<'#7'|<'#8#143'E'#10#170'R'#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9#149'H'#8#129'>'#7'z' + +';'#7'z;'#7'z;'#7'z;'#7'z;'#7'z;'#9'{='#13'}@'#20#129'E'#23#131'H'#25#132'I' + +#21#130'F'#16#127'B'#9'{='#7'z;'#7'z;'#7'z;'#7'z;'#7'z;'#7'z;'#8#129'>'#9#149 + +'H'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#10#164'O'#9#148'G'#8#133'@'#7'{;'#7'x:'#7'x:'#7'y' + +':'#7'y:'#7'y:'#7'y:'#7'y:'#7'y:'#7'y:'#7'y:'#7'x:'#7'x:'#7'{;'#8#133'@'#9 + +#148'G'#10#164'O'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#10#164'O'#9#154'J'#9#148'H'#9#146'F'#9#143'E'#9#142'E'#9#142'E'#9#143'E'#9 + +#146'F'#9#148'H'#9#154'J'#10#164'O'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#192#3#255#255#255#255#255 + +#252#0#0'?'#255#255#255#255#240#0#0#15#255#255#255#255#128#0#0#1#255#255#255 + +#255#0#0#0#0#255#255#255#252#0#0#0#0'?'#255#255#248#0#0#0#0#31#255#255#224#0 + +#0#0#0#7#255#255#192#0#0#0#0#3#255#255#128#0#0#0#0#1#255#255#0#0#0#0#0#0#255 + +#254#0#0#0#0#0#0#127#254#0#0#0#0#0#0#127#252#0#0#0#0#0#0'?'#248#0#0#0#0#0#0 + +#31#248#0#0#0#0#0#0#31#240#0#0#0#0#0#0#15#224#0#0#0#0#0#0#7#224#0#0#0#0#0#0#7 + +#224#0#0#0#0#0#0#7#192#0#0#0#0#0#0#3#192#0#0#0#0#0#0#3#128#0#0#0#0#0#0#1#128 + +#0#0#0#0#0#0#1#128#0#0#0#0#0#0#1#128#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#128#0#0#0#0#0#0#1#128#0#0#0#0#0#0#1#128#0#0#0#0#0#0#1#128#0#0 + +#0#0#0#0#1#192#0#0#0#0#0#0#3#192#0#0#0#0#0#0#3#224#0#0#0#0#0#0#7#224#0#0#0#0 + +#0#0#7#224#0#0#0#0#0#0#7#240#0#0#0#0#0#0#15#248#0#0#0#0#0#0#31#248#0#0#0#0#0 + +#0#31#252#0#0#0#0#0#0'?'#254#0#0#0#0#0#0#127#254#0#0#0#0#0#0#127#255#0#0#0#0 + +#0#0#255#255#128#0#0#0#0#1#255#255#192#0#0#0#0#3#255#255#224#0#0#0#0#7#255 + +#255#248#0#0#0#0#31#255#255#252#0#0#0#0'?'#255#255#255#0#0#0#0#255#255#255 + +#255#128#0#0#1#255#255#255#255#240#0#0#15#255#255#255#255#252#0#0'?'#255#255 + +#255#255#255#192#3#255#255#255#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#1#0#0 + +#0#1#0#8#6#0#0#0'\r'#168'f'#0#0' '#0'IDATx'#218#236#189'i'#144'd'#215'u'#30 + +#248#221#251#182'|'#185#214'^'#189'7'#26'+'#9#144' %'#138#162'D'#210#20')' + +#209#18'i-'#150'''46'#1#16#148#168']#'#141#195#26'Eh:P'#155'y'#8#241#211'O'#150'HD@'#20#16'D'#0#136 + +#16#136'h' + +#18#196'V8N'#173'zg'#211#129#201#208#163#17#11#131#252#12'GnR'#250#15#254#232 + +#187#149'0P'#2'`\O'#250#167'K'#228'U%'#211';k'#4'wC'#192#175#203#147#254#200 + +#235#245#3#164'N'#174#3'f'#137'!7)M'#132#220'$'#131'Ua'#248#131#239'P'#194'@' + +#9#128'19'#237#157#21#129#230'*'#193']'#23#240#235'2\G'#138#233#251'K'#168'L' + +#134#20#205#18#144#155#226'('#204'0'#216#179'\i'#5'J'#0#12#31#191#240'|'#153 + +#156#13#129#198'MBsI'#192#219'$D^'#172#226#143'T'#131#166#221#234't'#252#223 + +#148#146#0'h'#223#207#176'['#217#130'#&'#27#174'Ia`M0'#20#230'9'#138#167#24 + +#236'I'#174#156#135'J'#0#12#22'?'#255'l'#153#156'5'#129#234'U'#129#198#130 + +#128#223'$P8'#194#141'c'#12#12#12#26#215#183'_'#156'k'#208#185#1'S'#183'`'#25 + +'6L'#195#134#165'['#242'='#166#129'3'#14#206#227'?'#153#6#206'9'#24#227' !' + +#16#137#16#161#8#17#137#16#145#8#228#223#163#16'A'#228#195#13'Zp'#253#22#194 + +#200'G('#2'D'#145#252','#129#226#244#226#209#168'<,v'#30#22'OrT'#206'q'#216 + +#211#28#191#251#6'%'#8#148#0#232'#~'#250'oK'#228#174#11#212#174#9#212'o'#18 + +'Bw'#240#196'.S'#242'%'#179#234#154#1#131#155'0'#141#28'L='#135#156#145'G1WF' + +')7'#129'B'#174#130#188'UB'#206#204#195#210'mX'#241'g4'#166#131's'#14#206'8' + +#24#211#192'ba'#193#226#208#195#214#127'oS'#0'a'#155#153#137#8#4#17#255'I ' + +#18#16'"B'#24#5'p'#130#22#220#160#9#215#151#2#161#229'7Ps6Pm'#173#194#241#26 + +'p'#253#22#188#208#217#22#30#17'E '#18'C'#217'''='#199'P:'#197'P>+'#163#8'*' + +#3'Q'#9#128#3#225#167#190'Y"gM'#160'qS'#160#185'$'#16#186#232#187#23#159'@`' + +#196#192'8'#223'ur'#231#173#18#10'V'#25#229#252#20'&'#10'3('#229'&`'#155'E' + +#216'f'#1#150'aC'#215#12#232#241#169#30's'#245'n'#149#159#186')'#255'='#144 + +#10#219#249#232#242'oDb'#151#150#208#244'jh8U4'#220'MT'#157#13#212'Zkh'#184 + +#155'hy'#13'xA'#11'A'#20'@'#136#8#196#168#255#166'D'#188'7z'#14#177'i 5'#130 + +#255#246'=J'#16'('#1#144#1#31'~'#162'D'#205'E'#129#198#162'L'#214#9#28#153'c' + +#223#175#213'"'#16#24'c0'#184#137#156#153'G17'#129#137#194','#166#10's('#217 + +#147'('#218#21#20#172'2l'#179#8'K'#207'A'#211'tp'#198';'#216#233'4V$'#196#226 + +';'#18'"B$B)'#20#220#26'j'#206':'#170#173'5l6W'#177#217'\A'#221#221'D'#203 + +#171#195#15#221#29#26#2#235#159' '#224#128'a'#203'$'#163#226#9#142#194#9#229 + +'0T'#2#160#155#170#255#173#18'5'#151#4#26'7'#4#154'+'#132#200#233#151'7_'#186 + +#231'8'#227#176't[2{q'#14#211#165#19#152'('#204#162'lO'#161#144'+#g'#228#193 + +#185#14#30#171#231#131'9'#201#135'L^'#177#214' b3'#194#15'=8A'#3'ug'#19#27 + ,#141'%,'#215'n`'#181'v'#19#155#173'5xA'#11#130'D_5'#3#198#0#205'f('#204'2'#20 + +'Os'#20#230'9'#254#240'-J'#16'('#1#176#211#185#247'\'#153#154#139#2#155#175#9 + +#180#150#5'BW'#22#220#28#152#233#137#192#24'G'#206#200'c'#170'8'#143#147#147 + +#183#225#228#228'm'#152','#204'!o'#149'`h'#22#180#216'!w'#235#236'<'#250'$' + +#199#0#8#8'D"B'#16#186'hzul4'#151'qs'#253'2'#150#170'W'#177#222'X'#130#227'7' + +#227#245#235#15#137'2.}'#4#249'9'#142#137#219#164'F'#240#187#247')g'#225#177 + +'_'#128#15'}'#189'H'#155#151#4#234#215#5#194'>'#156#248#210#209'&'#153'~'#166 + +'|'#18'g'#166#238#192#201#201#11#152'*'#206#195'6'#11#146#217#183#136#154#198 + +'E'#141#31'%'#5'n'#249#18#164#179#209#13'ZXo,'#225#218#234'E\[{'#5#235#141'E' + +#248#161#11#209'''G"c'#178'l'#185't'#134'c'#226'v'#142'?yG'#131')'#1'p'#12 + +#241'S'#223',Q'#227#166#192#198'+'#2'~'#131#14#230#220'#@'#211't'#228#140'<&' + +#11#179'85u;'#206'N'#223#133#153#210')X'#134#189'C'#165#165#177#178#222#199 + +'W&0'#144#16'p'#252#6#150'j'#215'pe'#229'%,U'#175#162#214'Z'#135#27'8'#16'":' + +#24#229#198'{m'#22#25'&'#239#148#206#194#227#234'('#250#218#192#145#127#192#159#252 + +'z'#137#214'/F'#168#223'$D>'#245'hx'#19'rF'#1'gg'#238#194']'''#222#132#217 + +#242'i'#216'F'#1#156'k'#138'/GF'#184#12#4'B$B4'#189#26'nn\'#198#197#197'oca' + +#227'5'#4#161#223'{'#244#128#201'vf'#165'S'#12'Swi'#248#227'w'#28'm!pd'#31 + +#238'g'#158'*Q'#227'&a'#253#149#8'^'#181'7'#198'g'#140#195'6'#10'8=u;'#238'9' + +#245#157'81q'#30#134'f'#245#253'\S88'#17#19#8'^'#224#224#218#218#203'x'#233 + +#230#211'X'#169']'#135#23':'#183#218#160#247'pQ'#171#194'0u'#167#134#226')vd' + +#27#147#28#201#135#250#208#215'JT'#187#18#161'zU '#242'za|'#169#234#159#152 + +'8'#135';'#230#239#199#233#201#219'a'#25#249#152#210'H'#5'O'#199#218'R`p'#252 + +':'#174#173#191#130'KK'#207'b'#169'z'#13'n'#208#236'Y'#16'h'#22'P9'#199'Q>' + +#175#225'O'#222'y'#244#132#192#145'z'#160#159'}'#166'D'#141'EB'#245#178'@kU' + +#200'>{'#25'a'#233'9'#204'U'#206#226#206#19#247#227#212#212#29'(X'#165#145 + +#151#191'*'#244#230#179#169#187#27#184#186#250'2^[y'#30#203#181#27#8'B'#175 + +'7&'#209#128#252#12'G'#229#2'G'#241#196#209#242#13#28#153#7#249#240#19'%'#170 + +'_'#23#216#188#28#199#245'3'#130'3'#13#147#197'9\'#152#189#23#23'f_'#143#137 + +#252','#24#231'*'#148'w'#200'I;'#18'!6[+'#184#188#252'<^[}'#17#155#205#21#8 + +#234#173'q'#131'Yd'#152#184#192'Q:st'#234#10#142#196'C|'#232'k%'#170'^'#142 + +'P'#191#25'W'#236'e'#132'm'#22'pn'#230#30#220'1'#255'F'#204#150'N'#195#212'-' + +#28#159#212#220#227#1'?t'#177'Z'#191#137'KK'#207#225#202#234'Kh'#249#245#158 + +#174#163#231#128#210')'#142#202#133#163'a'#18#28#250#7#248#224#151#138#180'~' + +'1'#130#179#146#189'#'#15#17'a'#182'|'#26#247#157'y'#27'NO'#221#129#156'Q' + +#232'['#238#185#194'X'#218#5'p'#130'&n'#172#191#138#23'n<'#137#149#218#13'P' + +#15'e'#158'\'#3#236'Y'#25'%'#248#200'{'#14'w'#206#192#161#189#249#159'y'#186 + +'D'#141#235#132#245#139'Q'#15'*?C'#206#176'qn'#230#30#188#249#252#187'P'#202 + +'M'#168#179#254#152#161#225'n'#226#226#194#211'xi'#241#233#184#240'({'#173 + +#129'Y'#148'B'#160'x'#230#240'6)='#148'7'#253#225'''JT'#187'&'#243#248'#/' + +#155'W^'#227':&'#11#243#184#251#196#155'p'#219#236'}'#200#153#246#161#211#244 + +#149#176#234#3#225'3 '#138'B\_'#127#5'/-<'#141#229#234'5'#153'Q'#152'q#4K' + +#214#19#148#207#30'N'#191#192#161#187#225#15'}M2'#127#237#138'@'#20'dc'#5#203 + +#176'qz'#242'N'#220'}'#226'M'#152'-'#159#129#174#233#135'O'#139'U'#188#219'g' + +#171#128'Pm'#173#226#210#210#179'xm'#245#5#212#157#141#204'i'#220#154#193'P>' + +'/'#133#192'a'#243#11#28#170#155#253#224'_'#21#169'zE'#160#185'('#16#249')' + +#239'>'#222#203#188'U'#194#157#243#247#227#142#185'7'#162'lO'#202'F'#152#138 + +#157#20#192#0#2#220#176#137#155#235#151'pq'#241#219'X'#174'_'#207'VqHrRr'#225 + +#4'G'#229'<'#199'G'#222'}x'#252#2#135#230'F'#31#250'KY'#183#239#172#138#204 + +#206#190#146'='#137'7'#158'y;'#206'N'#221#13#203#200#29#221#211'Lq'#243#129 + +#24'!'#18'!6Z+'#184#184#248#12'./?'#135'@'#4#153#24#132'k'#128'=#'#251#12'|' + +#244#7#14#135#16'8'#20'7'#249#208#227'EZ'#127'I'#192']'#23#153#194#242#140'1' + +#204#150'N'#227#13'g'#222#142#147#147#183#201#6#154#10#10']'#196#168#23'8' + +#184#184#244'4^'#188#249#20#28#191#145#217#183#144#155#226#152#186#135#227 + ,#163#223'?'#254'B`'#236'o'#240#193'/'#22'i'#245#185#8'~='#155#179'O'#231'&' + +#206'N'#221#137#251#206'|'#15'&'#10#179#135'>'#155'O'#153'+'#195'd'#10#134'H' + +#132#184#177#254'*'#158#191#249#4#214#27#139#136#178'$'#15#145#28'g6s'#159 + +#134#143#189'w'#188#133#192'X'#223#220#7#30'+'#208#198'+r'#242'N'#150';'#181 + +#12#27#231#166#239#193#235'N'#190#5'e{'#10#135'>'#221'A'#229'$'#141#4#130'"' + +#172#214'o'#226#229#197#167'ps'#243#181'l'#169#196#4'X'#19'2B'#240#137#247'5' + +#153#18#0#25#240#225#191'-QkI6'#233#204'Z'#201'g'#25'y'#220'1'#247'F'#220'9' + +#127'?'#138#185#202#177#207#227#223#210#28'TzS'#175'B'#128'Ps'#214#241#234 + +#242#223#225#242#202#243#240#2''''#19'wY'#21#134#137#219'8'#242#243#28#127'4' + +#134#131'J'#198'2'#14#182#197#252'~'#141#226#17'X'#169#4'.L'#205#194#221'''' + +#223#140';'#231#238#135'm'#20#182''''#219'('#168'U8'#200#25'Y'#182#167#240 + +#250'S'#223#5'S'#207#225#229#197#167#225#6#173#212#2#213#175#17'6_'#19'c'#252 + +'tc'#134#7#30'-'#208#198'%'#1#175#150#237#228'75'#11'w'#158'x3'#238'9'#249#22 + +'XzN'#17#188'B'#223#225#135'..'#175'<'#143#139#139#223'B'#211#171'g'#226'2' + +#171#204'0y;'#199#199#223'?^'#230#192'X'#221#204#3'_('#208#250#203#242#228 + +#207#164#246#235'9'#220'9'#255'f'#220'y'#226#205#200#25'v'#223#199'w'#29'A' + +#133'@'#161'G'#4#194#199#245#245'W'#240#226#194#147#168'9'#27#136#27'@'#166 + +#226'4'#179#204'0u7'#199#199#255#225#248#8#129#177#185#145#135#254#178'@+' + +#207#9#4#141'l'#14#191#156'Q'#136#19'|'#238#135#165#219#138'B'#149#28#24#232 + +#138'10D'#20'a'#169'z'#5'/'#220'|'#18#27#205#165#244'3'#11'H6'#31#157#189#143 + +#227#163'?0'#30'B`,n'#226#193'/'#20'i'#227#213#8#238'F6'#146'4'#245#28'.'#204 + +#222#135#187#231#223#140#156'YP'#244#169'04'#8#18'X'#170'^'#197#139#11'Ob' + +#173#177#152#169#227'Pn'#146'a'#242#14#13#31#251#135#163#15#17#142#252#6#30 + +#250#203'"U_'#139';'#248'd'#224#127#141'k8?'#253'z'#220's'#242';Q'#176'*J' + +#227'W'#167#251#240#133#128#136#176'R'#191#142#231'o<'#129#245#230'RjW+cq' + +#135#161#219'F'#159'18'#210#31#127#248#203'E'#170']'#145#163#183#179#165#247 + +'2'#156#154#184#128'7'#156#249'^U'#202#171'0ZAK'#132#229#218'u<'#127#243'o' + +#176#209'\N-z'#185'&G'#152#151#207#143'v'#14#193#200'~'#248'C_/R'#237#170'@' + +#227#166#200#220#167#127#170'0'#143'7'#157'{'#23'&'#243's'#138#2'{'#210#14 + +#148#200#236#175#16#16'X'#170']'#195#11'7'#159#192'fk%'#245#247#184#14#20'Oq' + +#148#207#141'nF'#225'H~'#244#167#254#166'H'#245'k'#2#213#171#241'h'#174#12'(' + +#230'&'#240#134#211'o'#199'|'#229#156#234#222#163#236#131'1'#242#9'DX'#140'}' + +#2'5g='#189'&`'#200#174#195#165#179#28#255#237'm'#195#23#2'#I'#4'j.'#18'j' + +#215'(3'#243#219'f'#17'w'#204#189#17#179#165'SRr'#169#134#157'C'#151#27'J' + +#228'v`d'#198'1_>'#139'H'#4'xy'#233')'#212#221#205'T'#244')'#2#160'v'#141#192 + +#141#209#208#242#208#247#243#193'/'#20'h'#237'%'#129#160#149#237#129#13#205 + +#196#249#233#215#225#142#185'7'#201'X'#191#130#210#26#198#14#12#161#240'q}' + +#227#21'\\z&S'#227'Q#'#207'0}'#15#199#199#134#156'#0'#212#31'{'#232#241'"U/G' + +'p'#214'(S'#179#5#198'8'#230#202'g'#241#186#147#223#133'rnJ'#217#177#10'c,'#2 + +#24#130#200#199#149#181#23'pq'#233#25#132#145#159#186'q'#141'='#205'P'#185 + +#160#13#181#140#152#15#235#135#30#254'J'#145#26#11'qq'#15#203#180#162#200'[%' + +#156#155#186#7'Ek'#2#4#149#223'?'#182#26#130'z'#129#136#160'k'#6#206'N'#221 + +#141#211#147'w'#128's'#158#154#206#189'*'#161#177' '#240#240'W'#138'4<'#129 + +'5'#4#252#228'_'#23#169#177'@'#168'_'#143'd+'#175'L'#182#149#134#187'O|''n' + +#155#190#23#26#215#21#163')'#11#225#144'h'#2'@'#211#171#226#249#133''''#176 + +'\'#187#150'z'#133'4'#19'('#157#209'P<'#201#240#199'o'#31#188'&0'#20#142'r' + +#215#145#173#143#223#14#138#154'-'#159#193#217#169#187#193#185#166'N~'#197 + +#226#135'j'#181'l'#171#132';'#231#238'G'#24'y'#216'h.'#131'X'#247'5'#140'|' + +#201'+'#186'5'#156#238'U'#3#151'0'#15'}'#177'H'#155#175#201#166#30'YI(o'#150 + +#240#198#211#239#192't'#241#132#162'('#197#250#135's'#237#226#28#129#139'KO' + +#161#225'US3'#165'5!'#251#8'|t'#192#29#133#6'z'#241#135#191'Z'#164#250'uBsA ' + +#235#220#5#141#235#184'm'#230'>'#220'>{'#31'4f(J:'#180#194#227'x'#7#15#25#8 + +'A'#228#227#234#250'K'#184#178#246#2#252#148#179#235#24#7#10'''9Jg'#24#254 + +#244#31#12'N'#8#12#212#4'p'#215#9#173#149'8'#199#159'eY4'#134#137#194','#230 + +#203'g'#193#153#22#143'oR8'#188#218#1#29#235#245#209'5'#3'''*'#183#161#233'W' + +#177'X'#189#146'j8)'#17#208'Z'#17'0'#242#131#245#211#15'L'#178'<'#248#197'"m' + +#188#26#151#247'f'#132#165#219#184'c'#246'~'#156#154#184']u'#242#29#251#211 + +']!-'#170#206'*^Z'#252#22#170#206'j'#234#239#24'E'#134#201';'#248#192#154#139 + +#14'D'#3'x'#248#171'E'#170'^!'#132'M'#202',b'#24#24'&'#242'3'#152'*'#206#131 + +'1'#166'N'#127#133'#'#131'rn'#10'g&'#239'B'#221#219'H=x$l'#18#26#139#132#135 + +#191'Z'#164'A'#152#2#3#17#0#173'U'#130#187'!z:'#31'rf'#1#243#149#243#176#140 + +#130':_'#142#189#233'p'#196#252#1#140'a'#174'r'#22#27#206'2'#22#170#151'R' + +#245#16' '#0#238#134#128'Q'#24#140')'#208'w'#1#240#192'cE'#170']'#19#160'0' + +#251'w9'#227#152#204#207'b'#194#158#141#31'^'#157#254#10'GK'#232'i'#140#227 + ,#204#228#157'hz'#27#168#185#235#169':'#138'Q'#8#184#171#132#7#30'+'#210#199 + +#223#215'_-'#160#175#2#224#131'_*Qc'#241'V'#158#127#214'b='#211#176'0S<'#5']' + +'7'#1#197#252#10'GT'#8#228#205#18'NV.'#192#13'['#240'C7'#149#149#28#180#8#206 + +#6#225#131'_*'#209'G'#222#211#191#246#226'}'#21#0'^]'#192#219#204#30#242#219 + +'B%7'#131#178'='#13#16'A('#3'@'#225#8#155#2#147#133'yl8+X'#169'_Kg'#10#8#192 + +#219#20'0'#250#220#249#174'o'#2#224#193'/J'#213'?'#244#208'Sl'#129'3'#13'3' + +#165#211#208'5'#19'B'#157#254#199#151'9'#142#201'sZz'#14#179#197#211'h'#184 + +#235'h'#5#233#230#15#134#30#224#172#17#30#252'b'#145#250#21#21#232#155#0#240 + +#170#4#191#209#219#169'M '#216'F'#17#21'{&'#165#18#165'p'#168'u`'#181#187#0 + +#24'*'#246'4&'#11#243#240#170'N'#234#217#131'~'#131'dA'#221'8'#9#220#7'>/GwG' + +'.'#245'x'#19#12'g'#167#238#193'm'#211#247')'#6'W8V'#168#185'kxe'#229#219'h' + +#184#155#169#191#163#229#24'&n'#231#248#248#15#30'\'#11'8'#176#6#240#240'WJT' + +#191'.'#16'y'#212#179'81'#244#28'&'#242'3C'#240#250#171#158'6'#135'U58'#170 + +#199'B'#222',c2?'#143'VP'#151#185#1')'#16'y'#4'g'#149#240#240'WJ'#244#167#239 + +':'#152'C'#240#192#2#192#175#19#220#3#170'$'#165#220#4'l'#163'('#5#0#141#150 + +#208#20#20#134#9#206'9'#166#139''''#176#222'Z@'#211#171#165#254#158'[%X'#149 + +#131#211#242#129#4#192'C'#143#23#168'qC@'#4#189#159#254#26#215'Q'#177'g'#192 + +'5]'#166#150'2'#234#153#175#21'k+'#28'>'#197#135#193'6J'#152'*'#156'D'#211'O' + +'/'#0'D@p'#215#5#30'z'#188'@'#31#253#254#222#219#136#29'('#189#200#175#161'g' + +#199#223#22'rF>'#30#236#193#228'4_Bo/EJ'#10#135#212#244'a'#140'a'#170'p'#2 + +#166#158#203#164#161#250#13'B'#6#153#209'_'#13#224#193'/'#20#168#177'@'#16'a' + +#246#132#159#157#210'/o'#148'2?'#184'2'#10#148'o'#224#168#193'6'#10#152#176 + +'g'#176'R'#191'.'#255'!'#5'O'#137#16#240'j'#132#7#191'P'#160'^'#155#137#246 + +','#0#252#6'2w'#246'mS?4'#142#156'Y'#128#198'4'#136#129#182#248'V,~('#193#142 + +#207#214'1'#0#211#133#19#216'tV'#16'D^'#234#239#5'-'#130#127#128'`@O&'#192 + +#131#159'/P'#208#160#204#19'}'#218#237#127#3'9-'#15#6#6#153#250';'#168#151 + +#234'VyH;l'#30#155'g%'#16'l'#179#132#130'U'#201#196'C"'#4#130#6#225#193#207 + +#23'z'#18#149'=i'#0'A'#11#240'['#7'7'#188#13#205#132'aX'#0#27#215#218'r'#165 + +'9('#12#15#156#235'(Y'#19#168#185'k'#169'C'#130' '#201#139'f'#171'7- '#179#0 + +'x'#240#11'Ej,'#198#243#252#14#16#129'd`'#176#244#28#12#205#140#153#159#20'{' + +'+'#28#235#13'd`'#176#173#18'L'#221#130#27#180'2i'#1'^'#157#240#224#23#138 + +#148'u'#228'xf'#1#16#186#212's'#181#223#174#135'e'#12#166#158#131#198#141#145 + +#9#0'%'#4#142#128#225'|'#196'`'#233'6l'#179#8'/t'#144#165#225'Z'#208'"'#132 + +'=d'#226'f'#18#0#31'|'#188'H'#245#5'Y'#235#127#208#181#231#140#195#208','#233 + +#231'!U'#252#163#160#0#0':'#211'a'#235'E'#212#216'Z'#170#222#129'[r'#144#226 + +#136#192#7#31'/'#210'G2L'#22#202'$'#0#2#135'z'#234#241#151#172#1'p'#232'\'#31 + +'c'#251'?'#141#222#160#210#138#149'm'#208'g'#165#134's'#228#140'<4M'#135#8 + +#163'L'#223#13#26#132#192#201#246#236#169#5#192'C'#143#23#169#185'L'#16'Q' + +#127#232#158'1'#6#206'5`'#132#234#191'2 '#20#198#17#134'n'#193#208#204'L'#225 + +'@'#0#16#17#224#213'%'#175#166#157'/'#152'Z'#0#132'.'#16'4'#251'H'#240'l''' + +#11#145#226'k'#5#133#24#26'7'#160's'#11'@#31'#6'MB'#232#166'?'#161#245','#23 + +#22#1#29#200#241#151#192#255#202#254'WP'#216'+'#0#24#135#161#233'`,{&'#148#8 + +'('#211'A'#157'J'#0'<'#240'X'#129#154#203#253'N'#184''''#8'D'#135#238#184'U' + +#189#240#21#6#238#7'`'#12#186'f'#128'3@Pf'#2'E'#232#16#30'x'#172'@'#31#127'_' + +#247#244#224'T'#2' p'#129#200#239'/'#225#11#16'"'#17#28#190#246'_'#138#255#21 + +#134'@b'#156#233'`'#140#163#151#6#155#145'O'#8'R'#154#1']'#5#192#3#159'+'#146 + +#179'N'#160'>9'#255#182#31#146'"'#248#145#11'A'#225#225#154#254#195#148#224 + +'P'#24#188#8'`,'#166#181#30#232#141'" t$'#239'~'#252#135#246'w'#6#234'i'#164 + +'I'#228#201'2'#221#190'>"'#17#188#176#133' '#242'aj'#185'c'#176#165'J'#2'(' + +#12#227#164#145'%'#20#145'G'#136#252'>h'#0#145'O'#16'a'#255#156#127';'#25#194 + +#11'[p'#195'&'#12#205#196#177'*'#253'R'#24'2'#19#145#236'5'#1#130' '#1#162'h' + +#187#21'7'#129#192#192#192#24#3'c'#28#156'q'#0'l'#251#207'Q'#168'p'#180#211 + +'?'#198'z'#19#5'"'#236#131#0#248#192'#Er7z'#239#243#223'mk'#2#225#161#230#174 + +#194#210'r0'#244#28#246'U3z'#145'@'#157#174#199#186'H'#216#131#170';Y'#239 + +#149#250'i+'#12';9'#137#6'p?tp'#6#162#8#145#8#17'D>'#130#200'E <'#132'"D$B' + +#136#29#2#0#0'x'#204#252'R'#0'h'#208#152#6#131'['#208'5'#19#134'fA'#231'&4' + +#174#197'U'#171#3'>'#225#153#140#140#9#17'JS'#160#215'5'#16'@'#228'J'#30#254 + +#196'?'#234'l'#6#232#253#144'"'#7'1'#3#26#158#236#134'zv'#226'u8Y'#185#144 + +#176'8'#132#166'_'#195#166#187#156')dh'#27'%L'#216's'#208#218#252#11#12#173 + +#160#142#170#179#140'(a~Y'#209#156'D'#197#158#233'i'#179#5#9#184'a'#19'N'#208 + +#128#23#182#16#197#221'RX7Zg'#210#196'2'#184#137#169#194'I'#152#154#157#137#9 + +#4#9#132'"'#128#27'4'#224#4'u'#4#194#7#145'<'#217#228#143#211'@'#248'>g'#148 + +'0'#153#159'OX'#227'x'#157#253'*'#214#157'%I'#141','#13'='#0#134'fa'#210#158 + +#135#165#219'='#172#127#132'P'#4#240'#'#15'~'#232' '#136'<'#132#20'@'#136#8 + ,'D"'#161#230#132'a'#163#181#136#181#214'B,'#243'e{'#250#19#229#11'04'#11#156 + +'q'#232#220#128#161'Y'#176#244'<,='#15#157#27#7#20#4#183#214'%'#145#158#137 + +#201#231' '#255#192'fc'#228'K'#30#238'Y'#3#136#2#130#136'h'#160#7#139'@'#132 + +#170#183#138#215'['#21#188#231#174#15#0#216#146#198#12#12#242#207#151#150#159 + +#196'_'#191#246#23#136'('#218'&'#234#173'MHz<'#14#142#19#229#11#248#158#243 + +'?'#138#188'Y'#218#253')'#2'.'#175'?'#139'o^'#249'4'#26'~'#181'M&'#159#159 + +#186#23'o='#247'>h\'#239'A'#160#1#145#8#224#133'-,5'#174#226#133#165'o`'#165 + +'q'#13#161#8':o'#230#142'u'#181#173#18#190#231#182#31#193'\'#241'\'#166#205 + +#151'm'#209'$'#241'W'#221#21'\'#219'|'#25'W'#214#159#195#166#179#140#144#130 + +#129'i'#215#167''''#238#196#247#156#255'Q'#228#140'|'#194#219#28'W6'#158#199 + +#151'.~'#12'~'#134#140#182#130'Y'#193'w'#159#127'?N'#150'o'#223'w'#13'd'#251 + +'8'#146#167'%'#162#248'T'#23'R'#197#143'O'#206#142#138#21#187'E''_'#185#244 + +'gx'#252#226#199'@'#144'Z'#193'L'#241'4~'#252#141#191#130#9'{vW'#194#183#244 + +#204'oi'#8':8'#215#182#233'3'#155'r'#200'qq'#249'['#248#234#165'?G'#152#152 + +#235'O'#177#0's'#227#30#153#7#224#173#136#16#5'='#154#0#31'x4'#246#254#15'#J' + +'G'#4'0'#14']3w'#169'f,>'#189#28#191#142#229#250'U'#16#145'T'#201'4'#19':' + +#215#161'1'#29#140'i'#224#236#214'F00'#16'#p'#166#193#212#172#4#7'#A'#215#12 + +#0#12'Db'#151'4'#167'8='#217#212'd'#149'bo'#176'Q'#176#202#152#202#159#192 + +#233#202#29'x~'#241#155'xa'#233#155'h'#238#17'6'#137'NBb'#208#185#9'S'#207 + +#165#26#23#181#151#229#24#128'Rn'#18''''#203'w'#224#206#233'7'#225#249#165'o' + +#226#213#181'o'#163'u'#208#198'q'#9'w'#203#153#134#146'5'#5#219#200#195'Hp' + +#226'2'#198'0'#145#155#129#174'Y'#240'"'#23#140'Xj'#193#162's'#19#166#150#219 + +'%'#0'(n'#14#178#197#228#130#137#237#247'9'#180#158'"I'#156'i'#208#249#150 + +#255#137#1#140#192#152#134#156#158'G'#206'(v'#217#3#233''''#224'\'#3#135#150 + +'Z'#16'0'#198'c'#250#163'm'#255'C'#155'o,r'#224#11#255#192#167'.'#9' t'#25'>' + +#240'h'#145'>'#241#254'd3@'#239#172#254#3#194#167#225#153#148',Y'#202#3#128 + +'/<'#212#189#13#4#194#3#7#7#231#28#26'7'#160'1#V'#209#12'h'#220#132#206#13 + +#232#154#1#157#155#16#20#238' Jt'#179#236#245#205#179#237#127'9X}'#194#22 + +#221#148#172')'#220#127#234']'#224#156#227#217#197#175#163#233'U'#247#215#169 + +#153'8'#16'S'#198'Z,8'#227#152')'#158#193'['#204#31#132'm'#150#240#247#11'_E' + +#203#175#246'Q'#141'#p'#174#161'`'#150#193#153#222'q'#13'L'#221#134'm'#20#209 + +#240'73='#197#246#255'H'#196'''||'#178#147#216'v'#230#245#147#238#182'y'#151 + +#216#246'i'#223'M'#254#18#9#132'$'#192'D'#8#198'4h\'#250#14#24#227#153#158'q' + +'/B'#225#163#21#212#16#137#160'/'#219'%|'#130#8'Yv'#13' '#242'e'#225#207'0' + +#248#191#219#184#14#182'C'#27' '#8'DBH'#251#26#206#246'i#'#213'3'#29'Z|'#130 + +#215'J'#183'#'#136'<'#233'La'#177#151'wW'#1'B'#187'p'#216#218#244'~Z'#204#182 + +'Q'#196#235#231#222#6'''h'#224#133#165'o"'#136#220#237#167#221'I'#0#12#172 + +#239#150'z'#193','#227#190#19'o'#135#31':'#248#246#205#191'J'#244'y'#244#10 + +'C3a'#27#165'}'#8'^jk'#5#179#132#149#134#0#237'9!'#247#158'|;'#253#24#210'i' + +#231'K'#219#29#162#7'm('#251#185#195'z'#244'YJA'#21#130'D'#4#17';'#16'e'#18 + +#15#235#226#227#148'-'#207'vi9 '#180#130#26#28#191'~ '#7#224'n3`'#255'$'#190 + +'D'#1#240#129#207#21#201']'#163#161#13#210'ai>'#176'OR'#4#129#16'Q'#132#136 + +'"'#4#2#240'C'#15#173#160#138' '#242#16#8'o'#219'&'#221#10#245#4#194'G'#16'y' + +#136'D('#195'='#219#230#195'`'#28'fEk'#2'w'#205'|'''#22'k'#151#177#212#184 + +#130'[%P'#180#199#4#144#2#174#211#233#208#11#242'F'#9'o8'#249'N,'#212'/'#225 + +'f'#245#213#190#237#167#169#217#200#25#5'0'#198':'#222#171#174#153#176#205#10 + +'h'#143'#'#146#129#201'S]D'#8#133#15'?r'#225#135#14#188#200'A(|8A'#19#145#8 + +#135'S'''#194#250'C'#227'D'#132#136'B'#8#22#129#179'h'#219'O'#144'H'#173'q'#9 + +'<'#237#153#129#225#248'uT'#221#21#132#228#247'SYC'#228'I'#158#254'DBRP'#162 + +#0#160'0'#150#26#195#140'('#245'9'#194'B13'#137#237#198#146#183#166#14'5'#253 + +'*'#150#27#215#208#12'6aj6'#12'-'#7'S'#147'%'#152#146#232#168#239#137';3'#197 + +'3'#184'}'#230'~'#172'9'#11#177#22#208#190'S'#131'H'#139'&'#16#202#185#25#220 + +'w'#226#29'Xm^'#135#159#248#219#217#175'i'#234'R'#0#236'oc3'#20#173#10'8'#227 + +#219#161#183#136'Bx'#161#11'/jm{'#234'#'#17'n'#171#252'%'#211#143'''D'#141'(' + +''''#132#245'I'#16' '#2#135#14'}+'#165'w'#143'q'#190'3"!H'#192#241#235#216'p' + +#150'29L'#211'>O'#228#19#168#131#25#160'w'#178#27'('#194#225#198'>'#27')(' + +#130'/\'#180#252':'#154#168'm'''#128#232#220#196#237'S+'#8'"'#127';'#18'!' + +#207#171#131'K'''#157#155#184's'#250';'#240#202#234'3X'#172'_Nt'#254#208#192 + +#242#5#9#231''''#239#197#185#201#215#227#226#202'S}'#210','#138')28'#229#220 + +#7'7l'#162#225'm"'#136'\'#248#161#139#144#130'X'#208#178#193#30#4'#<'#132#8 + +#132'('#10' '#16'A'#227#26'8'#215#193'cmI'#154';>'#188#176#21'k'#171'58a'#29 + +'B'#12'F'#227#161'('#246#231#165#17#0#15'[ '#191'~'#204#11'W{'#169'9'#218#10#235'm'''#18 + +'D'#219#202'.c'#0#131'&'#11'N 3'#13#167#236#19'`'#140#239'q'#132'%'#153#1#253 + +#5#7#199#164'='#135#162'YF'#213']'#1'm'#153'8"@$'#130']'#166#205#150'yC'#177 + +#214#179#147'*L-'#135#130'Y'#1#7#239#170#181#24#154#137'Rn'#10#156'k'#233#167 + +#221#140'r'#187'G'#193#156'C'#0#197#218#253'?'#251'l'#129#254#251#15#223#234 + +#20#164#183'y'#11#163#17#217'bi'#28'vY'#13#252#172'R'#184#203#245#133#136':' + +#230#214'3'#200#180'P-.#'#221'bf)'#19#4'"'#138'm`b('#230'&'#209#244'7'#225'E' + +#14'tn@'#227':8'#211#224#11#7#17#133#210#216'`'#237#246'C('#130#228#216'8cq' + +#2#138#22#135'@wn;ve'#207'Yz'#1#134#150#195#186's'#19'A'#228'o'#171#248#251 + +'&}'#176#157#127#149#161#189#188#153'n'#134#157#174'Y('#231#166#161's'#3'~' + +#138#208#146't'#154#201#220#128'n'#194'E'#139#211#193#147#16#137#176'k'#226 + +#19'g'#26'B'#145'~'#200#5#17'!'#20#222#129'D3g'#28'a'#156#229'7l?'#168#136 + +#208#22#221#211#247'~`'#28';t'#141#131'Pf`X'#168#191#138'g'#151#190'*O'#250 + +'='#165#226#166#186#243#181#236#0#0' '#0'IDAT'#150#195#132'='#143#211#229#187 + +'0]8'#13'='#161#150'`'#235'4-'#154#19#208#184#142#166#179#185#171#160#132'3' + +#13'^'#212#138#25's'#235''''#228#255#183#252'*'#158'['#254':'#214#154'7'#218 + +'V'#195#208'LTr'#179#152'/]'#192#137#226#5#153'k'#190'+'#171'q'#247#233'=' + +#157'?'#5#141#233#240#200#201#172#250'p'#198#145'7+'#176#141'b*F'#208#160#161 + +'hN'#192#208','#248#145#211#245'wZ~'#21'O'#221#248#2'^]'#127'f_-'#136#17#195 + +#157'3o'#193#237#211'oj'#243#184'D"'#194#213#205#231#240#202#234#211'R'#8#176 + +#206'{zu'#243#197'8-'#28#177#182#214#25'N'#216#192'7'#175'~'#26'~'#216#236 + +#153'{'#25#24#150#234'W ('#28'>U'#11#180'9'#2'wk'#0'q'#254#5#27#5#135#167'|?' + +#205#189#165'i'#167#148#180#217#251'*'#13#140'a'#169'q'#5#127'}'#229#147#137 + +#19'['#24'8,'#221#198#217#137#215#227'{'#207#253'c'#220'>'#253#166#196#211 + +#137'b?@97'#141#149#230'5l5'#171#144#161#200'p'#187#154'M'#158#218#183#174 + +#222#8#170#248#187#197'/'#227#213#213'g'#218'h'#143#197'9'#12's'#133'sx'#219 + +#185#31#193'}'#243#239#236'XR'#172'q'#29#243#165#243'(Z'#19'p'#194'zfK'#131 + +'s'#142#146'5'#25#231#0'P'#138#189#224'('#152#21#228#140#2#154#254'f'#215#253 + +'s'#194':'#158']'#250'J'#10'sFC'#206'('#226#246#169#251#219#152'Q '#194#245 + +#234#203#248#198#213#191#216#206#4#221#239'T'#199#206#234'A'#214'y'#255#221 + +#160#129''''#175'}'#22#13'o'#227'@LB'#132'8'#154'2d3'#128#218']6{L'#128#225 + +#165#255#182#25'('#163'P'#3#18'$'#0#235'B,'#210'>'#22#137#226#181#25#212'pq' + +#245'['#0#128'I{'#30'3'#133'3'#29#236'b'#11#182#17#151')3'#150'N'#4'Q'#252 + +#251#136#218'+'#235'H '#18#1#174'U_'#132#243'j'#29#6#183'p'#223#252';'#18#243 + +#244#25#24'&'#237'y'#148's'#211'Xm]'#207#28'y'#208#184#129#146'5'#221'Q'#245 + +'Nb'#156#188'Y'#134#173#23'R'#31#154'"M'#10'0'#195#246#201#157#236#149#161 + +#237'2'#225'T'#132#147#178'!'#149' q'#171',}'#4#254#166#131#242#25'E'#180'G' + +#144#198#248#167#127'Q '#18';'#164#224#184'%'#2'$'#217#239#7'I'#4#232'E'#176 + +#176#253#239#131'1'#217#204#225#242#198#223#227#226#218#183':R'#148#198#13#20 + +#204#242'-'#6'e'#25#233#161'S'#2#3#3#214#156#155'x'#226#250'#q'#152'1Y'#214 + +#230#205#10#202#214#180'4=2'#238#147#198'uTr'#211#169#251'%00'#216'z'#17'y' + +#179#12#6#222'_'#154'I'''#129#250'{]vx_q'#4#27#255#244'/'#10#212'&'#0#4#1'#' + +#155#209#145'r'#225#179'8'#1#247#221#211#164'7YF'#7#226'>'#239'{a'#19'/'#173 + +'>'#1'/t'#18'O'#10#30#171#197#154#166#165#250']'#150#210#172#217':'#251#174 + ,#215'^'#198#11#203#223'@'#152#216#206#137'`p'#11#19#249#19#29'Ky'#247'{6K' + +#207#163'hMej'#132'a'#233'6'#138#230#4#24#231#253#165#25#214#7#186#234#240#29 + +'6'#14''''#246' '#148#0#177'{'#214#0#223#233' '#216'j@2*'#5' '#141#130#208 + +#139' O}/'#172'OB'#158'1,'#212'^'#197#166#187#156'x'#0'm'#9#0#14'=Q'#14#177 + +'}dT'#154#151#31#181'py'#227#239#176#225'.$'#190#175's'#29#211#246#9#24#220 + +#200#252'ly'#163#136#178'5'#149'p'#143#132'H'#248'q'#147#149#221#255'.'#133 + +#198'd'#220'Wo'#140#15'I'#182#15'MR'#252#234'A'#169#24#167#215'V]\'#155#0#216 + +'JB'#25#197']'#177#174#170'u'#143#234'WV'#142#234#147#170#199#24#131#23'5' + +#177#238#220'lWG'#226#247'M'#205#6#231#183#222'c'#221'T'#205','#247'F'#132 + +#149#214'5'#220#172'_'#146#221'e'#247#254'>g'#152#176#231'`m'#181#242#202#240 + +'ly'#179#132#130'Qn'#251'^('#2#172#181#22#224'E'#205#182#239#232#220'@'#201 + +#154#148#145#145'~'#155#0#29#222#163'^h'#166#235#26'S'#246#147'h'#220#204#0 + +#194#238#134#168#183'T'#3'6'#218#174#220'iT'#239'~'#153#22#157'~'#139#237'P' + +#181#15#136'P'#248#178#0#166#131'.'#169#241'=m'#164'X'#23'5?'#163#157#218#242 + +'kX'#172'_'#234'X'#254'['#201#205#192'6Jm5'#233#221'.\'#182'f`'#234#237'U' + +#128#129#240#176#212'|'#13#205#160#189#243#16'g'#28'Ek2'#177'u'#216'@'#232 + +#133'uo'#252#156#249#186'{U'#196'Ck'#3#196#188#190'7'#10'@'#132#241#171#0#236 + +'U'#8'd'#177#15#217'`'#238'C'#16#193#141#154#137'9'#189#140'!'#238'9'#200'z' + +#187#151#20#159#139'('#192'Z'#235#6#156#160#129#156'^h#'#130#188'QA97-+'#19 + +'3'#212'XL'#216's'#208#184#217#22'='#8'"'#23#203#205#171#152#200#205#1#249 + +#189#207'+s'#1'L='#7#248'#'#160#149'At'#243'f'#135#150#255'w'#145'$'#7#128 + +#159#248#31#133#241#31#210#203#134'pM'#214#223#251#240'B'#167'C'#235'g'#196 + +#26#0#223'u='#234#227':'#8#8'l'#186'Kh'#248#235#9#29#17#227#246#219#185#249 + +'La@'#198'5Tr'#179#137'm'#192#221#176#137#13'g'#1#173#160#218#22#158#147#190 + +#131'2l'#189'84z'#160#172#17#158'c'#4#18#146#231'wi'#0#24'l'#247#239#238#155 + +#213#167#131'}'#144'B'#156'eHH'#218'r'#198'mu'#134'i'#143#4#200'F'#146#136';' + +#195#14'b'#13#170#222'*'#170#238'*N'#151#197#158#156#0'Y'#154'\'#206'M!m'#239 + +'9'#2#193#226#150'<'#225#25'k'#211'l'#220#176#137#245#214#2#26#254#166't'#4 + +#238#16#18'2'#244'XF'#222','#201#166#24'C'#232#246'3'#168#154#155#157'N'#192 + +#195#170#1#236'$6}'#235'_'#25'hd='#26#24#186#135#248#178#216#230#140#245'v' + +#189#180#223'K'#187'Ln'#232' "'#1#222'6'#231#157#197#141'L'#217'.'#179#146'w' + +#249#253'Lk'#0#134' rQ'#243'V!('#138'G]'#237'V'#203#11'F'#5''#216#190'M!w$'#201#164'-'#7'f]'#24'=i#Y'#138 + +#204#176#180'N@'#6' '#167#231#193'8O'#8#5#18'"'#242#129#189#142#215#253#138 + +#163'vf'#242'eXW?r'#16#145'/'#29#247'm&J'#14#182'QD'#221'_'#199#254#131'ld' + +#253#192'T'#254'D'#219'u'#24#0'/j'#161#238#173#130'1'#6''''#172#163#21#214'd' + +'Q'#233#158'k'#150#172')'#228#141'"'#214#221#131#147'Z'#170#189#234#133'Y' + +#187'&c'#209#173#223'?'#228#248#137'?/'#144#190#183#221#211#200#205#0#234#176 + +#217#253'>'#2#6#188#129#156'k'#176#141'bG'#134#242'#'#183'm'#16#8'uY'#135'^' + +#214#192#143'\'#217#129#166'Co'#0#219'('#165'Z'#11'S'#207#161#146#148'7'#192 + +'d'#163#140'fP'#139'5'#142'&Z'#254'f\'#239#190'[['#144#13'B'''#128'z'#223#14 + +#176#254#238'q'#23'3'#148'1'#6'K'#207'#'#232'yp''!'#20'~<'#214'n'#212#10'@<' + +#140#150#182#140'R'#208'H5'#0'J'#243#30#235'3'#243#15'('#11'PV'#220#229'0' + +#153';'#209#209'6o'#5'u'#16'E'#187'{'#210#15'@'#191#13#132#23#19'l'#251#154 + +'2'#166#193#208'-'#180#247'%h'#255'p'#193#172#192'6'#202#9#247#201'P'#243'Ve' + +#227#13#6#132#228#163#225'o'#198#161'Gm'#23#193#233#220'D%7'#215#253#247#250 + +#185#4',#'#17'v'#26'?G'#4'[/'#225'{'#207#254#19#248#145#219#19#233'D'#20#225 + +#197#213'o'#224'z'#245#197#209#170#16'$y'#158#0#232#227#18#1'`'#221'N'#189'A' + ,'7'#3#217'c'#231#29't}'#11'f'#5#147#246#201#196#248#170' '#1''''#172#237#246 + +#206#167#137'k'#247#224#212#138'('#148#253#245#18#146'w'#24'X'#202'1'#232#132 + +#146'9'#13'K'#179#219'4'#0#6'l'#207#179#219#234#135' '#29#130'al&'#13' '#7#160#27',='#143#239':'#253#254#158#201'-'#16'>6' + +#220'E\'#171#190'8Zv'#219'q'#232#232#7'V'#181#251'!'#144'('#157#234';'#8#7 + +#204#246' '#16#202'FP'#140'u~'#22#6#224't'#249'n'#148#172#169'D'#243'*'#162 + +#16#173#160#6#130#216'N'#208'I'#243#251','#235#26#16'@'#136#16#8''''#241'M' + +#198#24#244'8'#15'`'#223#231'a'#12#229#220'L'#226'(0"'#129#170#183#2'A!'#24 + +'8"'#10#209#240#215#17'R'#0'k'#175'Y'#196'4T'#172'Yh\'#147#3'1'#216#193'i8' + +#203#30#31#220#10'`'#233#243'&'#18#190#173#177'x'#191#217#136#21#128']'#181#0 + +'#'#206#2'Ls'#178'm'#191#157'!'#19'0U'#23'('#214#238'8L'#149#9#200#246#231':' + +#219'('#225#158#153#239#238'8;/'#136'<8acw'#4#144#165'$'#204#204'1m'#234'hsr' + +'p'#232'\'#239#218';Q'#227':*'#214'l'#194#180'['#134'P'#4#168'y+;'#214#144 + +#208#240'7'#225#135'N'#226#245'*'#185#25#24#154#181'g'#10'Ho4'#211'-\'#203 + +#216'x:'#235'F'#222#224#150'me'#3#2'|P'#211#232#250#200#255';V'#141#245'e' + +#145#247#237#20#148#214#31#177#143#179#236#190#185#127#128#187#166#223#218 + +#241#20#241#163#22#154#254'F'#251']'#12' vEq'#179'Q'#150'X'#149'(M'#128'n?' + +#171's'#3#19#246#188'l'#233#213#166#214'z'#216't'#151'nu>b'#12#13#127#3#238 + +#30#1#183#181'z'#19#185#249#184'a'#233'0'#28#129#138#251#247'u'#3'`'#219#4'`' + +#163#21#3#187'bv'#212#151#149#163'n'#223#217#167'WX'#167#177#157#134'f'#162 + +'hN&6'#154#228#140#195'6'#138#184'}'#226#205'x'#235#169#31'FQ'#239#220'7'#191 + +#225'o'#160#30'lth'#8#202'R'#172'S'#182'u'#136#182#7#144#236#181#223'9'#180 + +#20#137'9'#166'f'#203'4'#222#4#129#229#134'M4'#131#205']*J+'#172#163#21#214 + +#219'w'#146#128#156'^@'#209#154'D'#221'_; '#201#176'Lm'#201#210#159'Dl8'#164 + +'>&'#146'h'#135#19'p'#148'FI'#151'j'#184']'#189#154#210#234#246#172#251#201 + +#193#210#159#192'D'#132'S'#165#187#240#222#219#127'*QH'#233#220'D'#217#154 + +#193'l'#254#28#242'F'#169#227#197#24'cXsn'#192#143#156'='#4#220#197'3'#206'z' + +#161#160#173#193' Q'#199'{'#145#205'=;'#235#202#4#146']}'#141'R'#194'g'#228 + +'i'#239'm?'#139#172'k'#12#133#135#186#191#158'x-C'#179'P'#201#205'b'#161#254 + +#202#129'h'#142#210#244#175#201#202#208'4,'#198#27#19#219'd'#219#9'8'#226'F' + +''';'#147'FX'#198'^'#254#137'{'#184#195#254#219'{='#162#221#242#129#237'Q' + +#251#169#195'}'#16#8#211#249'S'#152#178'O'#238's"'#241#174'TD '#172#182#174 + +'#'#20'>'#192'X'#251'd'#234'}'#214#129#165#181#127'w}'#137#226#182'`IEIq'#20 + +#160'C'#130#209'V'#233'h'#222#156#216#206#237#223'['#18']'#247#215#227#16#224 + +#214#160'u'#134'h'#203'/'#144'pM'#157#153#168'X'#179#219#155#201#14#194'F'#29 + +'xi'#23#223#179#140#226'r'#192#190#131#157#191'1J'#245#127'{?'#198#201'R'#218 + +'w6h/'#147#129#187#8#145#189#196#204#152#204#141#238#204'|'#221#212#206#238 + +'GH(|'#172':'#178#31#255'N'#149'z'#175'C'#144'(Yu'#204'R'#142#188'-\H'#196'g' + +'3'#181';'#248#216#214#16#211'N'#235#206'P2''a'#233'v'#130'P'#20#168#251#171 + +#8#133#191'KA'#137#16#162#230#173#202#206#19'{'#202#144'9'#227#152#204#205'A' + +#143'#'#1#7#181#165#187'u'#239#205#234'3'#29'$/06'#30#189#4'v'#254'>'#31#135 + +'2'#224'Q'#13'i'#29#182'&'#200'b'#7#217'J'#243'J'#178' a'#3'Z'#219'}4'#19'A' + +#209#190'1H'#206'4'#148#204'I'#24'{b'#250#128#156#191'W'#243'V'#219'C'#157'D' + +#168'yk'#29#18#144'H'#22#21'%\'#175#223#190#180'q'#204#214#29#167'{'#162#189 + +'&'#192'XH'#129#253#198#131#143'x8h?t'#175'+'#213'gQ'#245'W'#179';'#176'zhqC' + +#241#177#163'q'#173#227''''#182'g'#231'u'#184#174#174#25#168#228'f'#19#25'6$' + +#31#27#222'2'#218#179'H'#25#170#222'2'#130#200'IH'#30'"T'#226'H'#128#215#230 + +#7#233#243#169'1'#168'*'#210'~'#208#249'8'#240#28#1#28#10'C'#163#1'?rq'#165 + +#250'l'#215#169#181#253'}'#22#6#14'-'#241#169'('#158'8'#188#31#133#152'<'#135 + +#162'1'#145'X'#5#232'E'#14#154#254'Fb}@3'#216#132#27#181#18#137#206#214#139 + +'('#152#229#190#217#177#135#9#227#214'x'#135'c\l'#128'~2'#230'A'#236#172#1'q' + +'?c'#12#27#222'"n4.v'#156'+'#215#239#250#165'm'#191#6#215#18#25#134'@'#136 + +#208'yz.'#1#176#140#2#242'f%1'#7#160#21#212'd'#233'o'#130#19#206#23#174#140#4 + +'$8S'#183#166#11#29'$'#25#168#235'!:'#160#211#159#245#252#191'-G'#241#24#217 + +#1'D'#183'R'#129'G'#157#154'H]'#25'(=c'#179#180#220#196#144')'#27#239' '#8'E' + +#128'K'#27#207'`'#211']'#236#252';)#'#156'Y'#188#218#178#247' O4'#175#136#196 + +'v'#150'`'#167'{'#202#27'%'#228#141'r'#162#170#222#10#170'p'#163'f'#194'z3' + +#132#194#147#142#192#132#31'6'#181#28'J'#230'TG'#231'cZfMU:'#146#229'0'#232 + +#18#137#141'D'#128#13'w1q:t'#26'D'#20#192#9#235'c'#209'S`wK'#176'11'#255#143 + +#238'o2l'#184#139#184#184#254'$'#252#168'9'#244''''#237#148#191'.'#179#4#131 + +#142#235#192#193#145'7'#202#200'i'#197'6F&'#144#236#255''''#220#142#204'R' + +#245'V'#18'u^'#141#233'([3'#208#152#222'33'#13#202#5#176#223#201#223#12#171 + +'x'#236#210#239#193#9'j'#189'q0'#17'6'#189#165#254'''0'#29#0':'#1#227#161#150 + +#244's7'#15#210'.'#138#245#191';B$|\'#218'x'#26#11#205'W!'#186#149']'#247#185 + ,'5'#26'g'#188#195'D'#30'&5'#128'}'#156#128#140#241'x'#160#135#157'p'#154'E' + +#168#251#235#210#135#192#146#181#143#170#191#140#144#194'X'#0#209#142#235'j' + +#168'X3'#208'4'#29'"'#234'M'#0#16#235'R'#17'x'#144'i'#209#157#180#184'('#192 + +'B'#243#21'4'#252#245#158#199#131#143#211#240#29'B\'#12'4'#14#30#21#26#182'@' + +#217#199'v'#232#231#254#8#18'x'#173#250#247'xj'#233#243#241#216#172#225#250 + +#31'4'#174#195#210#242#137#181#0#4'BH'#193#190#223'-'#26#211#176'x'#174'm' + +#135#132#8'P'#243'Ve'#231#227#14#143#178#233'.#'#20'^'#219'cq0'#148#204'i' + +#152#220#238'y'#231#7'zf'#165#24':'#210#235'kl'#16#223#16'o'#155#20'0'#162 + +#211#159#165#216'i'#214'/*'#25'RB6A`'#169'u'#25'O,|'#26'K'#205#203']'#215#153 + +#245'Y00'#200#9'@'#186'f$'#190'''('#146#13'C;'#168#164#6#183#226#169#190'z' + +#155'#" _'#218#179'q:q'#251#203'@+'#168'!'#136#220#132#249#11'L'#182#24'7J'#7 + +'?0'#250'9O2'#165#246'u4'#250#140#210#173'T'#224'Q;%'#136#246'L'#0#238#180 + +#246'i'#29':i'#226#251',cO'#192#29#182'`'#247#165'%'#4#194#195#205#198'E'#27'p' + +#164'B'#137#201'4'#201'N)8'#26'3'#178'E'#231#153'<'#253#146#199'r'#201#10#184 + +#158#210'}'#6#184#241#172#239'Ub'#4#147'[2'#229#22'Z'#162#175#194#9'k'#29#133 + +#174#206'u'#148#204#153#3't'#193#237'n'#158#228#141#138#156#158'4'#10#191'R' + +#143'G'#251'Q'#177#0#218#167#3#19'FW'#27'H'#178'U6'#145#0'K`Z'#141#27#219#26 + +'@'#234#243#133'k'#137'u'#240#4#25#255'n'#27#204#153'vw'#199'=cr'#199's'#22 + +#205'I'#148#205#25#240#4'N'#136'D'#136'F'#176#209'Q'#170#25#186#29#231#235 + +#243#142'a'#190#131'='#6#131'm'#20#227'Vc'#221';)%'#10#204'~'#235#235#177#26 + +'F'#253#30'T;n'#16'{4'#128#157'a'#129'Q!'#162'@'#250#1#18'J'#203'L'#158#203 + +'4W'#158'1'#6#131'[q'#25'l'#251'.'#139#253'4'#0'6'#254#204#157#150#193'*'#214 + +'<'#138#230'4'#146'$]H~'#156#151#158#252#253#156'V@'#193#156#196#160#146#196 + +#8#128#165#21'd('#240'0'#12#218';BS'#134'iGZ'#162'~K'#29#160#145'f'#3#133#20 + +#128#152'H,-'#181't'#27#150#158#135#19#214'Rm'#132#198#228#204';'#206#181#132 + +#207'o'#153#0#251'h'#0#251#12#156#28#26'!'#28#240#247'5n`&'#127'&q'#246#31#3 + +#208#10#171#168#249'+'#137'{N'#4#216'F'#9'Ecb'#160#196'oiy'#20'L'#217'k B6-' + +#131#186'%m'#29#160#22#160#163'/'#140#29#21#129'@'#187'M'#0#162#29#201'@#'#18 + +#175'B'#4#210'1'#151#240#174#169#217#176#245'"6S'#174#187#206'u'#228#141#178 + +#236'w'#151'hn'#200'a'#153'Y'#232'f'#208#205#131#182'u'#31#150'<&'#141'e'#164 + +#233#130'^'#198#137#252#5'X'#154#221'~'#239#140#161#234'/'#195#137#157'oI' + +#174#210#138'5'#11'S'#207#13#144#214#9':7P2'#166#160's'#3'"'#10'z'#150#143'l' + +#31#243#160'W'#231#226'~'#25#228#236#176';'#1'wh'#252#28#0'>'#245'p'#139'A' + +#140#240#142#24#224'F'#205#142'1'#233#156'^@'#201#156#202#144#253'f'#161'lN' + +''''#154#13#4#1'?r '#18#186#242't'#139#130#12'R'#9#232'g'#162'#c'#12'3'#246 + +#25#156'('#222#9#141'%;'#0'k'#222#138'lM'#222'!'#247'z'#194#154#131#206'L'#12 + +#178'ND'#219#167#223'`jf'#237#194#200#253'R'#243#251#158#136':b'#31#192#167 + +#30'n'#177'm'#13#0#144#13'\'#9#163#179#2'Za'#13#129#240'`'#163#152#160'*'#218 + +#152#204#157#220#158')'#215#13'y'#189#140#138'5'#151#216#9'7'#162#16'n'#212 + +#144#131'9'#199#205#9#216#167#242'VC'#203#225'l'#249'^LZ'#243#29#252'-!6'#189 + ,'EY'#9#152'p='#14#142#138'5'#7#141'i'#29'|%'#12#217#163'kI'#147#137'8'#10#230 + +'$L='#135'f'#152'U'#200#13#192'vO'#19#139'='#228'N@"'#201#235#219#218#242#173 + +'7'#216#232'"'#1#4#4#194#133#19#213'Q'#198't'#187'J'#207'L'#204#216#231'`jv' + +#156#187#206#246'u~M'#228'N'#160'l'#206'$'#190#27#8#15'n'#216'h'#247#1'P'#219 + +'_'#134'+'#8#250'5'#30#156#128#249#252'm'#184'{'#242'm'#29'Gp'#133#194#199 + +#166#183','#243'!'#18#134#1#24#154'u'#171'w?'#237#141#162#200#193#31'Y'#178 + +#247#24'8tnn'#15'B'#221#185'W'#249'8'#23' '#235#154'v'#171#171#167#3#216#235 + +'4'#138#253#31#226#233'O;'#22'g'#135#6'@ b#y.'#198'$Q6'#131'M '#223'Nt'#156 + +#235#152'/\@'#197#154#135#19'5'#246#189'G'#141#233'8[~}'#156#194#218'>'#202 + +':'#16#30#156#168#9'b{2'#15#211'Vy'#12','#17#224#224#167#15#129#144'7*'#248 + +#142#185#247#225'D'#225#142#142#2#210#9#235#168#249'k'#16#9'v'#31'19'#189#167 + +'l'#205'&'#178'B3'#216#192#19#139#159#198#138's%'#229'b'#16'*'#214'<'#222'2' + +#247'~'#204#218#231#218#181'5'#163','#135#142#176'l'#227#233'R'#13'S'#237#241 + +#180'fG'#149#249#183'5'#0'j'#23#0#16#242'5'#138'g#0'#132#20#160#153'0Nj'#139 + +'hg'#236#211#184#173#252'F'#172#187#241'T'#157#14#12'0e'#159#198']'#19'o'#133 + +#198#181'8'#172#184'['#178#251#145'#5'#0#18#237#207#202#250'H$'#7'p'#2'v'#250 + +'='#30#255#143#181#23#216#131#131#163'l'#205#226#29#167#254'g'#188'q'#230#221 + +'q'#250'/%'#254#206#186#187#128#154#191#140'N'#142#208#188'^'#145#17#128#4'~' + +'l'#248#27'xi'#227#27'Xn]N'#167'.'#18'a'#210'>'#137#11#229'7a'#198'>'#187#235 + +#222#9#4'[+'#162'`L'#128'3'#214#182'_'#131#182#170'z'#178#194'X'#135'='#200 + +#186#223'lD'#177#247#152#207#19'4'#128#221#182#193#144'}'#128#16#20'`'#211'_' + +#142#231#216#181'/'#174#173#151'q'#239#244';'#177#208'z'#5'7'#234'/$'#250#2 + +'rZ'#17'o'#153'{'#31'frg;'#16#19#193#9#235'p'#163'z'#162#193#215#213'q'#196#6 + +#239#4#236'$'#30'L-'#143#219'+o'#138'Cs'#187#221#220#6#183'0i'#157#192#217 + +#210'}8]|]'#236#252#164#14#246#127#128#229#214'e4'#131'M'#176#142''''#246#28 + +#12#158'\@'#228'D'#13#180#130'Zz?'#0#3#130#200'E+'#168'&&z'#233#220'D'#201 + +#156#6#7#207#28#10#236#170','#245#200#253#157#190'fj6'#238#157'z'#135'4C'#15 + +'@'#5#4#194#170's'#21#139#173'K'#3'I'#178#218#247#183'E'#7#31#192#167'~'#178 + +#197#254#167#255'^'#160'Q:'#2#151'[W'#224#11#23'&'#207#163'}'#146'-'#195#169 + +#194#221#248#238#19'?'#134''''#1',6_'#141''''#207#16'x\Xr'#223#212#187#240 + +#134#233'w'#199#25#128#9#194#143'"T'#189'e'#153'{'#222#235'd'#158#17'9'#1#11 + +#198#4#222'z'#226#199#19#7'}2'#198#161'3#f'#174#253#154'O1'#184'a'#3#203#206 + +'k'#178#153'g'#135'1'#200#21'k'#6#6'7'#19#29#128#141'`'#29#1#185#153#178'2'#3 + +#225#162#21'V'#17'Q'#212#22#153#185'Us'#160'mw(Nm'#2#244#179#132'|'#135#26 + +#214#169#133'z^'#175#224#7#206'~'#24#7#237#26#25'Q'#136''''#22'?'#133'e'#231 + +'J_'#133'^*'#245'?'#146#188#222'n'#2#0#16#130#164#247'${ff_'#168#127#221#187 + +#137'fP'#133#149#203''''#254#188#174#153#184'g'#242'm('#27#211'x'#181#246#20 + +#214#221#155#16'"B'#209#156#194#153#226'='#184#173#242'f'#228#245'J'#199'M' + +#15'#'#15#27#254#2#188'};'#243#210'h'#237#188#14#149#153#12#12#134'f'#166#252 + +'r'#231#247'k'#254#10#214#220#235#29#135#147'p'#166#161'b'#205#203'2'#221'=' + +#196'ID'#168#249#171#136'D'#144'I'#5#142#16#162#25'V'#17#145#15#131#153'm' + +#191'W2'#167#161'qC'#14#25#205#234#168#235' '#8#232#160#2#184'C'#143#132'N' + +#154'Q&'#1' '#2#232'[CYih'#236#5#136#152#199#145#160#1#0#128#136#226'y'#142 + +#218#240#25#128#129#161#17#172'c'#211'['#196'T'#238'd'#199#207#233#220#194 + +#153#242#189#152'+\'#128#31'9r'#228'4'#183'`jv'#215#194#21'O8Xso'#202'D '#182 + +#207#209#194#186'8'#224'F'#233#8'<'#136#249'G'#17#214#189#155#168'zK'#232#148 + +#249#169's'#3#19#214#156#244#162'S'#251')X'#243'W'#17'R'#152'IK'#20#20#161#25 + +'l '#16#30'r'#9'a'#222#146'1'#5'K'#179'c'#211','#221#133#187#181#237#234#201 + +#9'H'#24'Z'#152#143'F'#144'X@B'#242#248'.'#1#188#235#3'['#2'`D'#135#159#31'5' + +#177#230'^'#151#227#172#187#8#11'K'#203#163'dN'#163'l'#206#192#214'K'#169#170 + +#214'Za'#13#155#222'B'#231#142'>#6'#1#216#128#133'@(<,'#183'^'#131#19'u'#234 + +'k/'#133'i'#197#156'KtPE'#228#163#238#175#238#246'"'#165#226'+'#129'VXM>'#225 + +#25'P4'#167'`'#233#249#254#250'M'#198#217'S'#207#134#223#135#147'm'#217#255 + +'{XKo'#19#0'!'#0'k4~'#128'@'#184#184#218'x'#22#175#159'z'''#10'[y'#232'};' + +#253#4#22#155#175'`'#221#189#209#177#248'$]& '#27'L'#223#4#194#192#235#204 + +#171#254#10#174'5'#158'C('#130#196#253'%'#146#190#134#130'9'#145'(t'#253#200 + +'E='#144#131'MY'#198#152'}+'#172#194'Ir'#190#146#12#5#22#141'I,'#227'r'#234 + +#194' '#150'v'#140'W'#214'^'#131'CN'#243#29#26#159#145#228'm'#218'O'#3#248 + +#204'O'#183#152#136#182#130'C'#195#127#9#16#150'Z'#175'a'#217#185#220#247#231 + +#247'D'#11#151#235#207#192#141#154#157#239#129#165','#8'g'#3'x'#254#1'S'#130 + +#160#8'7'#27'/c'#217#185#178'G'#213#216#157'bX2'#167'ai'#201'>'#24'/j'#201#18 + +#226#30#158#223#13#27#210'{'#158'`V'#232#204'D'#197#156#139#223'Jw='#162'4-' + +#150#247#218'V'#221'^CT'#29#6'EG'#157#214#11#12'"'#146'<'#222'Q'#0#0'@'#228 + +'g'#214#240#250#138#186#191#138#235#141#23#225'w'#24'9'#213#171#127'a'#221 + ,#189#129'k'#245#23'@c=Wvp'#196#215#10#171'xy'#243'o'#224'D'#251#132#176#152 + +#28#216'a$v'#242'eh'#134#155#240#146'&'#254#166'x*W'#180#224#132'u9'#25')' + +#193#239'P'#177#230'2'#9'A'#198#6#176#166#140#245#238'@'#28'w'#136#152#183 + +#177#143#6#0#0'"$D!aDJ'#0'|'#225#226'z'#227#5#212#188#229'>j?'#2#175'V'#191 + +#133'Z'#176'r'#171#177'H'#167#3' '#139#179#174#223#175#1':X_'#171'}'#27'W'#27 + +#207'b;'#219'+'#225#165#177#184#11'PB'#27'0'#198#128#154#191#130#144#252#253 + +#215'0'#241'%'#251#15'4'#130#141#14'aL'#13'ekN'#134#8#251#185'fc'#178#254'#' + +#161#165'='#175'($'#136'0A'#248#182#9#128#136' '#2#6#150#27#157#168'Zh]'#196 + +#229#218'3'#168'X'#243'qK'#235#131#173#240#138'{'#21#207#175#127'E'#246#191 + +#235#152#254#146#129#168'hP'#165#0'4'#16#10#171#250'+xj'#229#177#184#247'^' + +#231#231#215#184#142#138'9'#155#216'H'#133#0#25#2#140#195#135'Y'#157#235#130 + +'"4'#130'5'#8'D'#208#208#222#164#180'b'#202#220#131' a'#148#216'>'#11'6'#16 + +#189#138#13#139#239#7'DK'#137'\'#21'H'#222#238#170#1'<'#242's'#14#139'<'#218 + +#205#16'C~'#181#194'*'#158#219#248'2'#214#220'k}p,:xf'#229'sXs'#175#239'{r1' + +#150'n'#230'6'#252#165#3'%'#192'6'#194#245#142'>'#4'{' + +#159#250#131#225#131#14#211'Vw'#127#154'P'#242't'#18#18#5#128#216#250#194#8 + +#25'BP'#136#23'6'#191#134#151'6'#255#26#17'z'#152#28#3#129'E'#231#21'<'#179 + +#250'y4'#195#141#30'6g'#248#158#250#221#3#13#178#189'dhN'#246'?'#240#133#131 + +#133#214'E|}'#241#255#195'S+'#143#196#185#235#221'!'#7#129#148#18#140'S '#23 + +#141'`'#173#247'5`'#12#205#160#10'/j'#197#2'f'#135#135#154#1#166'f'#161'l' + +#206#166#158#187#192#182'['#247'$'#175'EO'#177#218#29#235#207'z'#220#135#177 + +'s60'#201#203#157#178#172#19#179'g'#30#249'y'#135#253#248#199#243#164#23#216 + +#8#219#4'24'#130#13'|c'#233#207#144'7+'#184'P'#250#14#153'>'#153#146#249#151 + +'[W'#240#228#242#167'q'#173#249#188'LiM'#249#28#1'yh'#134#155'q7'#156#157#4 + +#199'e'#10#241' 3'#245#226#185#130#205'p#Se'#28#197#141'N}'#225#160#234#173 + +'`'#161#249'2.'#213#158#198'B'#235#149#206'9'#255#9#142'BS'#179'eUfX'#221'u' + +#10'2&'#211#180'e'#13'E'#239#207#215#138#170#168#5#203'('#134#147#9#149#154 + +'$'#133'O'#134#174#199'~'#228#160#25'n'#180#153',!'#249'2'#138#196'('#179#179 + +'BP'#136'VX'#133#222#161#22#162#31#136'('#136#163'\'#131'?d'#137#128#208'#<' + +#242#243#14'K-'#0#0' '#242#164#234#208'c'#183#166#190'a'#205#189#134#175#222 + +#252#24#220#185':'#238#170#188'->'#161':'#23#187#8#10'q'#163#245#18#254'v' + +#249'3'#184#184#249#4#2#225#166'"'#218#173#198#168'W'#27#207#194#191#225#128 + +#239'U'#142#24#195#186'{s'#155'('#250'-'#24#137#24#156#176#134''''#151'?'#133 + +#188'QIh'#196#177'{'#142#233#206#191#19#4'"'#17#192#141#26#168#249'kh'#4'kq' + +#154'42<'#187'\'#235#175'-~'#2':3'#247#12#243#149'S'#132#156#176#182#227't' + +#204#250#128#12'n'#212#192#223',}R'#182'w'#163#246'#}'#209'yu'#219'I'#217#245 + +'7'#136#240'j'#237'['#168#5#171#219')'#245'l'#135' ]u'#175'o'#183'}'#203#18 + +'2'#220#12#150#241#181#197'O'#196'CM'#187#175#127'/'#239#11#8'9b.6K'#7'y'#200 + +#138'@'#242'rfK'#228#135#127#223'&{'#154#195','#142'>'#167#146#129'c'#194#154 + +#195'='#19'o'#199#189#147#239#194#156'}'#30#198#158'n7'#210#203#188#129#139 + +#213'o'#226#219#171'_'#196#146's'#169'c'#223#128'n''!'#146#154#137#198#167 + +#212#160#203'7e'#215#156'lk'#190#21'A'#144#167#170#232'Y'#205'd['#234's'#135 + +#167#23'}xv'#198':'#215#210#19#137'L'#167'.'#3'O'#204#28#148#178'\'#244'x' + +#130#199#230#212#128#143'f'#234#249#254#178#193'o'#16#156'5'#129#207#254'l' + +#178#6#176#239'S'#254#248#199#11'dO10'#142#177#128#206'e'#198#216#153#194#235 + +'p'#170'p'#15'J'#230#12'88'#156#168#142'U'#247#26#174'5'#158#195'R'#235#18 + +#188#200#193#17'M'#231'PPH/d'#4#224#172#19'>'#249'@'#179'#'#159#239'[A'#179 + +#229'<'#208',6'#22#252#20#146#143'U'#247#26'V'#221#171#248#187#245#191#148#19 + +#131#136'!'#162'pG|'#154#13#183#204'RAa'#28#193#226#164'>'#127#127'F'#208#247 + +#183#31#8#145#207#160#153#24#155#234#170'-'#21'u'#171'9'#229'N'#181'-'#189'n' + +#163#160'p'#212#143#127#153#250'+'#130#253#5#192#190#202#253'g'#127#214'a' + +#161';'#186'Va'#169#196#156#226't'#5#133'D'#245'?t'#209#209#246'O'#165#1#0'2' + +#131'H'#4#128#174'+FSP8,'#136#2'B'#228'u'#183#131#187#186#247'B'#143#16'z4' + +#198'Z'#128#130#130'B'#219#233#31#243'm'#26#29#186'+'#254#241'G'#242#148#159 + +#229'H'#153#135#163#160#160'0B'#136#0'h'#173#8#252#197#7'[]'#249';'#161#211 + +#195#219#0#0#10#198'IDATU'#128'/p'#208#213#155#168#160#160'0&'#234#191'O'#8 + +#156't'#159'M%'#0#30#249#185#22#11'Z4'#146'9'#6#10#10#10#25#212#127#2#130#22 + +#225#145#159'k'#165#210#238#245#180#23#246#27#4#171'B'#208'-'#229#12'TP'#24 + ,#231#211#223'o'#164'?'#169'S'#231#248#133#14#16'4'#148#10#160#160'0'#206#8#26 + +#132#208'I'#255#249'L'#199#249#143#252'A'#158#202#231'9'#184#174#22'ZAa'#220 + +' B'#160'vE'#224'3?'#211'J'#205#215#153#178#252#3#135#224#215#149#22#160#160 + +'0'#142#240#235#132#192#201#198#159#153#4#192#231'~'#197'a^'#173'ss'#1#5#5 + +#133#209#157#254'^'#141#240#185'_q2i'#245#153#149#249#208'!'#4'MB'#174#194'T' + +#22#174#130#194'8'#128#128#160'I'#8#157#236#218'y'#230'B'#223'G'#127#209'a~' + +#157#16')-@Aa,'#16#133'R'#253#127#244#23#157#204'GrO'#238#188#160')%'#142'6' + +#161#180#0#5#133'q8'#253#131#30'{'#231#246#212#234#227#145'_h1'#191#174'|'#1 + +#10#10#227'`'#251#251'u'#194'#'#191#208#234#233'('#238'9'#160#231#215#1#191 + +'D'#176'&G'#217'8TA'#225#24#31#254'$'#19#244#252'z'#239#215#232#185#217#215 + +#163#191#212'b^M'#206#15'P'#252#175#160'0\0'#200#166#189'^'#141#240#232'/' + +#181'zf'#193#3#165#244#248'5'#192'/'#19#236')'#166#132#128#130#194#144#225 + +#215#9'~'#237#224#130#228'@'#248#145'?'#204'S'#229'6.'#219#134')(('#12#5#145 + +#15'T_'#19'm'#227#190#135'f'#2#220#210#2#8#238#166#202#14'TP'#24'&'#220'M' + +#130'_;8'#223#29'X'#0'|'#254'_8'#204'Y'#17#178#251#136#178#3#20#20#6'n'#252 + +#135#30#193'Y'#17#248#252#191'pX'#31'.'#215#31#252#147#143#231#169't'#154#131 + +'ij'#143#20#20#6#5#138#128#250#13#129#255#241'@'#171'/'#188#219#183#145#31 + +#238'&'#193'S'#133'B'#10#10#3#133'W'#239#175#201#221'W'#165#253#199#254'8O' + +#165#179#28'zN'#217#2#10#10#253'F'#232#18#234#215#4'>'#245#147#173#190'1X_' + +#135'~yu'#130#187'A'#160'Hm'#150#130'B'#191'U'#127'w'#163#255'Zv'#223#143#234 + +#127#244'{y'#170#156#227'0K'#170'N@A'#161'?'#220'/c'#254#213#171'"u'#175#191 + +#145#9#0#0#248#241#143#230#169'|VSm'#196#21#20#250#0#17#0#181'k'#17'>'#249'P' + +#171#239#252':'#144#185#191#173#21#130#179'.'#212'|N'#5#133#131#31#254'p'#214 + +#5'Z+'#131#225#166#129')'#233#239#255#207'6M'#222#165#193',*;@A'#161'W'#248 + +#13#194#198#197#8#143#254#146'3'#16'F'#226#131#186#241'G'#127#201'a'#141#5#1 + +#17#168'MTP'#232'U'#245'o,'#136#129'1?p'#192'b'#160'npV'#9'F^'#160'x'#138#131 + +'q'#181#161#10#10#169'U'#127#1'4'#151#5#156#213#193#26#210#3'e'#203'/'#252 + +#170#195#154#203#2'^Uy'#3#20#20#178#192#171#18#154#203#2'_'#248'Ug'#160'6' + +#244'P'#12#244#31#253'#'#155'*'#23'4'#24'y'#229#15'PP'#232#134#160'E'#168'^' + +#142#240#233#15';'#3'g'#152#161'('#230#206#186#180'e"_m'#174#130#194'~'#136 + +'|'#201'+'#206#250'p~o('#2#224#139#191#230#176#230'2'#161#181'" T'#150#160 + +#130'B"D$'#199'z7'#151#9'_'#252'5g('#234#242'Pu'#242#247#253#142'M'#19#183'k' + +#176'g'#148')'#160#160#208#166')'#175#18'6/Ex'#236#151#157#161'1'#200#208'9' + +#241#253#255'5O'#211#175#227'0'#149'?@Aa'#27'~'#139#176#246#162#192#163#191 + +#208#26'*c'#140#132#11#127#236'O'#242'4y'''#135'f*!'#160#160#16#249#132#141 + +'W'#4'>'#245#161#214#208#25'b$'#209#249#198'"'#161'v'#133'T'#146#144#130#178 + +#251#3#160'v'#133#208'X'#28'M'#168'|$'#2#224#241'_wX'#253#166'@'#253#134#202 + +#20'T8'#222#204'_'#191'!P'#191')'#240#248#175';#Q'#135'G'#170#131#255#224#127 + +#178#169'r'#27'G'#225#4#7#231'P'#229#195#10#199#3#4#8#1'4'#23#5#170#175#9'|' + +#254#159';#'#163#252#145#179#156#140#12'p'#228'g'#185#154'0'#164'p<'#248#159 + +'d'#184'o'#243#146#24#170#199#127','#5#0#0#188#255#191#216'4y'#167#6'{JI'#0 + +#133#163#15'g'#157#176#241'J'#212#211'4'#223'#'#225#3#216#139'G'#127#209'a' + +#235'/'#11#248#13#213'Z\'#225#8#131#201#242#222#245#151#197'X0'#255#216'h'#0 + +#183'4'#1#153'#`'#149#149#20'P8z'#240'jq'#172#255#23'[cC'#224'c'#199'i?'#252 + +#251'2G'#192','#171#169#195#10'G'#199#230#247'k2'#214#255#217#159'm'#141#21 + +'U'#143'%'#139#253#200#31#229'i'#226'B'#172#9'(!'#160'p'#168#185'_'#158#252 + +#155#151#5'>'#243#225#214#216'Q'#179'>'#142'k'#214'\'#20#0#128#137#11#28#185 + +#138#18#2#10#135#151#249#221#152#249#183'hz'#12#221#18#227#139#31#254#189'G'#249#25#142#210'i'#25'1'#208'm'#220'r'#22#170#213#27#163'c~'#199 + +'~'#144#172#216'k.I'#231'^kU'#224#241'_W'#140#175#4#192'A4'#130#127#155#163 + +#220#148#172'-('#157'a'#170#190'`L'#17#186'2'#131#175'vU'#192']?~!=%'#0#6#140 + +'w'#254#134'E'#246#12#199#196#249'8'#153#168#168#178#10'G'#13#17#2'AC&'#241 + +'l^'#17'pV'#5#190#246#155#202#185#167#4#192#0#241#142#127'e'#145'='#197'Q:' + +#205'P8'#193#145#155#144#14'C'#174#169#181#25#10#211'G'#210#177#231'n'#18#154 + +#139#2#245#27#4'g]'#224#235#255'F1'#190#18#0#195'6'#15#254']'#142#10's'#210 + +'YhOq'#152'e@'#179'T>A'#223#205'|'#146#13'8'#253#26#224#172#11#180#150'eHO9' + +#246#148#0#24#11'|'#223'o'#230#200#170'0'#216'S'#12#246#12#131'=)'#199#153'q' + +#29#187#29#135#10#233')'#147#164#138#239#215#8#206#134#128#179'Jp'#214#9'^' + +#149#142'E'#161#142#18#0#135'U+'#248#237#28#153#5#134#220'$C~'#150#195#158'f' + +#210'_'#160')a'#144#138#233'#i'#215';k'#132#214#138#128#187'A'#240#155't(' + +#219'n+'#1'p'#220'5'#131#223#202#145'Y'#0#236'i'#25'J'#180'g'#24#204#130#212 + +#12#8'J'#24' .'#195#16'!'#224'7'#9#206'*'#161#185'$'#224#172#9#248'M'#224#203 + +'*iG'#9#128#163#130'w'#252'+'#139#12'['#154#8#249'Y'#142#252#12#131'Y'#146'a' + +'E'#166#1#224'G'#127'C'#8#0#132#236#179#23#186#4#191'Nh'#173#202#147#222'Y%' + +#4#14')g'#158#18#0'G'#31'o'#255#151#22#25'y'#192#170'p'#228'&'#25'r'#21#6#179 + +#194#160#231#25't'#11#208#12')'#20#24';'#196#187'D'#210'yG'#17#16#5#132#208#3 + +#194#22#193#175#18#220'*'#193#221' xU'#129#160#5#252#245'o+'#166'W'#2#224#24 + +#227#157#191#145'##'#15#152'E'#233'/'#176#138#12'F'#129'A'#183#1#221#150#145 + +#5#205#0#152'.'#235#19#182#5#3#141#1#5'm1'#186#0'($D'#129#244#216#135#142#204 + +#202#11#154#4#175'A'#8#26#4#191'A'#8'Z'#192#215'~S'#169#246'J'#0'('#236#139 + +'w'#255#155#28#233#22#131#150#3#244#28#160#231#24't;~'#229#0#221#2#184#193 + +#160'Y'#0#215#1#198'w'#11#135#253'B'#145#148#129#16#136#246'0'#185' '#136#16 + +#136'<@l'#157#236#174#172#182#11#29#194#255#223#206#217#228' '#16#131'P'#248 + +#181'dt'#238#172'K'#227#185'f'#225#161':3'#133#231#2'jz'#0#19#19#3#27'H'#219 + +#237#247#10#244#167'7'#162'7@'#27#208'wb'#187'%'#236')'#0'i'#223#19#134#231 + +#202'*^&'#212#197#225#151#171#11#129'\W;K!k!7Ok~}h=7Qo)OBml8FJ3B zZJX)_nCF=gv8hTTf|QbK0rqhS~> z|5@wa`?EstJ(cT3bPi?};M0AiloW&12229rC+Yo!B9@v=LPVD-eGO1n@4crUAxLAy zmUj1j@3UwDpi5d}j7ln_Jiu{B*ECI3H9MZbnj^M`G)tx#OWxlM-IKiaoq~?zfOTD) zIvK~2j4@RzRqq2*<6KUCsX*0YxkLmx=ZjKGC+&XpB}mJI^DprSu;;p+vtjqC00000 LNkvXXu0mjfY)PQ) literal 0 HcmV?d00001 diff --git a/components/lazautoupdate/latest_stable/lazautoupdate_icon.lrs b/components/lazautoupdate/latest_stable/lazautoupdate_icon.lrs new file mode 100644 index 000000000..b15098a3f --- /dev/null +++ b/components/lazautoupdate/latest_stable/lazautoupdate_icon.lrs @@ -0,0 +1,17 @@ +LazarusResources.Add('TLazAutoUpdate','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0 + +#0#1'4IDATH'#199#197'UA'#146#132' '#12#12#17'~!('#252#255'M'#160#190'C'#201 + +#158'b'#165#16#29#176'fjsS '#157'4'#157#6#224#199#161#158#22#173#181#132#136 + +#128#136#160#212'uk'#206#25'r'#206#176'm'#155#234#6#152#231#153#16#177#169'J' + +'"'#130#148#146'j'#2#176#214#146'1'#230#252#142'1>v'#25'B '#217#209#178',' + +#234#22#160'7y'#11#136#150#27'9yk'#226#178#144#16#194#133'V'#148#156#127'K9' + +#178'#'#5#0#224#156'#'#173'uw'#245#165#16'b'#140#138#147#243#197'k'#0#0#222 + +#244'&yy'#134'AX'#214'('#1'z'#130#168#141'Q]'#251#233#156#163'a'#24'.'#255'Y' + +#235#222#251#179'B'#239'='#149#235'Dt'#14'f'#21#224#211'}'#164#148#20#131#212 + +#6'L'#2#224''''#233#253#132'"'#150#154'LBD'#151')}'#13'PV'#239#189#167#30'!H' + +'c'#196#150'v'#247'}'#239#179'h'#1#160'KZb'#140'J*'#163'<'#192'qG'#215'4MT5;' + +#158#192#154'#'#182#134'4K'#166#25'K'#222#223#12#221#147#188#245#157#130#142 + +#227#128'u]'#155':'#25#199#145#140'1U*U'#239#3'R'#227'\N}'#169'@'#213'b'#185 + +'D'#4'9'#231#139'RJ'''#237'~'#244'%H'#203#131#243'/'#241#7#176#231#186#157 + +#179'a'#247#169#0#0#0#0'IEND'#174'B`'#130 +]); diff --git a/components/lazautoupdate/latest_stable/lazupdate.lpk b/components/lazautoupdate/latest_stable/lazupdate.lpk new file mode 100644 index 000000000..76cc624a9 --- /dev/null +++ b/components/lazautoupdate/latest_stable/lazupdate.lpk @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/lazautoupdate/latest_stable/lazupdate.pas b/components/lazautoupdate/latest_stable/lazupdate.pas new file mode 100644 index 000000000..d62c4cbd8 --- /dev/null +++ b/components/lazautoupdate/latest_stable/lazupdate.pas @@ -0,0 +1,23 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit lazupdate; + +interface + +uses + ulazautoupdate, aboutlazautoupdateunit, VersionSupport, uappisrunning, + LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('ulazautoupdate', @ulazautoupdate.Register); + RegisterUnit('aboutlazautoupdateunit', @aboutlazautoupdateunit.Register); +end; + +initialization + RegisterPackage('lazupdate', @Register); +end. diff --git a/components/lazautoupdate/latest_stable/license.lrs b/components/lazautoupdate/latest_stable/license.lrs new file mode 100644 index 000000000..49eaf6f05 --- /dev/null +++ b/components/lazautoupdate/latest_stable/license.lrs @@ -0,0 +1,72 @@ +LazarusResources.Add('gpl.txt','TXT',[ + ' Copyright (C) '#13#10#13#10' This source' + +' is free software; you can redistribute it and/or modify it under'#13#10' ' + +'the terms of the GNU General Public License as published by the Free'#13#10 + +' Software Foundation; either version 2 of the License, or (at your option)' + +#13#10' any later version.'#13#10#13#10' This code is distributed in the h' + +'ope that it will be useful, but WITHOUT ANY'#13#10' WARRANTY; without even' + +' the implied warranty of MERCHANTABILITY or FITNESS'#13#10' FOR A PARTICUL' + +'AR PURPOSE. See the GNU General Public License for more'#13#10' details.' + +#13#10#13#10' A copy of the GNU General Public License is available on the ' + +'World Wide Web'#13#10' at . You can ' + +'also obtain it by writing'#13#10' to the Free Software Foundation, Inc., 5' + +'9 Temple Place - Suite 330, Boston,'#13#10' MA 02111-1307, USA.' +]); +LazarusResources.Add('lgpl.txt','TXT',[ + ' Copyright (C) '#13#10#13#10' This librar' + +'y is free software; you can redistribute it and/or modify it'#13#10' under' + +' the terms of the GNU Library General Public License as published by'#13#10 + +' the Free Software Foundation; either version 2 of the License, or (at you' + +'r'#13#10' option) any later version.'#13#10#13#10' This program is distri' + +'buted in the hope that it will be useful, but WITHOUT'#13#10' ANY WARRANTY' + +'; without even the implied warranty of MERCHANTABILITY or'#13#10' FITNESS ' + +'FOR A PARTICULAR PURPOSE. See the GNU Library General Public License'#13#10 + +' for more details.'#13#10#13#10' You should have received a copy of the G' + +'NU Library General Public License'#13#10' along with this library; if not,' + +' write to the Free Software Foundation,'#13#10' Inc., 59 Temple Place - Su' + +'ite 330, Boston, MA 02111-1307, USA.' +]); +LazarusResources.Add('mit.txt','TXT',[ + ' Copyright (c) '#13#10#13#10' Permission is here' + +'by granted, free of charge, to any person obtaining a copy'#13#10' of this' + +' software and associated documentation files (the "Software"), to'#13#10' ' + +'deal in the Software without restriction, including without limitation the' + +#13#10' rights to use, copy, modify, merge, publish, distribute, sublicense' + +', and/or'#13#10' sell copies of the Software, and to permit persons to who' + +'m the Software is'#13#10' furnished to do so, subject to the following con' + +'ditions:'#13#10#13#10' The above copyright notice and this permission noti' + +'ce shall be included in'#13#10' all copies or substantial portions of the ' + +'Software.'#13#10#13#10' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY' + +' OF ANY KIND, EXPRESS OR'#13#10' IMPLIED, INCLUDING BUT NOT LIMITED TO THE' + +' WARRANTIES OF MERCHANTABILITY,'#13#10' FITNESS FOR A PARTICULAR PURPOSE A' + +'ND NONINFRINGEMENT. IN NO EVENT SHALL THE'#13#10' AUTHORS OR COPYRIGHT HOL' + +'DERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER'#13#10' LIABILITY, WHETHER ' + +'IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING'#13#10' FROM, OUT OF ' + +'OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS'#13#10' IN' + +' THE SOFTWARE.' +]); +LazarusResources.Add('modifiedgpl.txt','TXT',[ + ' Copyright (C) '#13#10#13#10' This librar' + +'y is free software; you can redistribute it and/or modify it'#13#10' under' + +' the terms of the GNU Library General Public License as published by'#13#10 + +' the Free Software Foundation; either version 2 of the License, or (at you' + +'r'#13#10' option) any later version with the following modification:'#13#10 + +#13#10' As a special exception, the copyright holders of this library give ' + +'you'#13#10' permission to link this library with independent modules to pr' + +'oduce an'#13#10' executable, regardless of the license terms of these inde' + +'pendent modules,and'#13#10' to copy and distribute the resulting executabl' + +'e under terms of your choice,'#13#10' provided that you also meet, for eac' + +'h linked independent module, the terms'#13#10' and conditions of the licen' + +'se of that module. An independent module is a'#13#10' module which is not ' + +'derived from or based on this library. If you modify'#13#10' this library,' + +' you may extend this exception to your version of the library,'#13#10' but' + +' you are not obligated to do so. If you do not wish to do so, delete this' + +#13#10' exception statement from your version.'#13#10#13#10' This program ' + +'is distributed in the hope that it will be useful, but WITHOUT'#13#10' ANY' + +' WARRANTY; without even the implied warranty of MERCHANTABILITY or'#13#10' ' + +' FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public Licen' + +'se'#13#10' for more details.'#13#10#13#10' You should have received a cop' + +'y of the GNU Library General Public License'#13#10' along with this librar' + +'y; if not, write to the Free Software Foundation,'#13#10' Inc., 59 Temple ' + +'Place - Suite 330, Boston, MA 02111-1307, USA.' +]); diff --git a/components/lazautoupdate/latest_stable/locale/aboutlazautoupdateunit.po b/components/lazautoupdate/latest_stable/locale/aboutlazautoupdateunit.po new file mode 100644 index 000000000..be25b288a --- /dev/null +++ b/components/lazautoupdate/latest_stable/locale/aboutlazautoupdateunit.po @@ -0,0 +1,35 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: aboutlazautoupdateunit.rs_about +msgid "About" +msgstr "" + +#: aboutlazautoupdateunit.rs_aboutboxerror +msgid "Subcomponent TAboutBox Error" +msgstr "" + +#: aboutlazautoupdateunit.rs_by +msgid "By" +msgstr "" + +#: aboutlazautoupdateunit.rs_componentname +msgid "Component name" +msgstr "" + +#: aboutlazautoupdateunit.rs_datafilemissing +msgid "Resource datafile license.lrs is missing" +msgstr "" + +#: aboutlazautoupdateunit.rs_for +msgid "For" +msgstr "" + +#: aboutlazautoupdateunit.rs_license +msgid "License" +msgstr "" + +#: aboutlazautoupdateunit.rs_licensetexterror +msgid "There is something wrong with the Licence text" +msgstr "" + diff --git a/components/lazautoupdate/latest_stable/locale/ulazautoupdate.po b/components/lazautoupdate/latest_stable/locale/ulazautoupdate.po new file mode 100644 index 000000000..f354150ea --- /dev/null +++ b/components/lazautoupdate/latest_stable/locale/ulazautoupdate.po @@ -0,0 +1,149 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: ulazautoupdate.c_cannotloadfromremote +msgid "Cannot load document from remote server" +msgstr "" + +#: ulazautoupdate.c_checking +msgid "Checking for updates..." +msgstr "" + +#: ulazautoupdate.c_componentprettyname +msgid "Lazarus Auto-Update Component" +msgstr "" + +#: ulazautoupdate.c_consoletitle +msgid "Updating %s" +msgstr "" + +#: ulazautoupdate.c_directoryproblems +msgid "Problems with the % directory" +msgstr "" + +#: ulazautoupdate.c_downloadedbytes +msgid "Downloaded %s: %d bytes" +msgstr "" + +#: ulazautoupdate.c_downloadfailederrorcode +msgid "Download failed with error code " +msgstr "" + +#: ulazautoupdate.c_downloading +msgid "Please wait. Downloading new version... " +msgstr "" + +#: ulazautoupdate.c_downloadisempty +msgid "Downloaded document is empty." +msgstr "" + +#: ulazautoupdate.c_downloadsuccess +msgid "Downloaded new version %s sucessfully." +msgstr "" + +#: ulazautoupdate.c_error404 +msgid "Cannot find the file at this time. (error %d) Try again later?" +msgstr "" + +#: ulazautoupdate.c_error500 +msgid "There is a problem with the Internet connection (error %d) Try again later?" +msgstr "" + +#: ulazautoupdate.c_foldermissing +msgid "Missing %s folder" +msgstr "" + +#: ulazautoupdate.c_nosftypes +msgid "Sorry only ProjectType = auSourceForge is supported in this version" +msgstr "" + +#: ulazautoupdate.c_notapplicable +msgid "" +msgstr "" + +#: ulazautoupdate.c_notproperfilename +msgid "This is not a proper file name" +msgstr "" + +#: ulazautoupdate.c_ok +msgid "OK" +msgstr "" + +#: ulazautoupdate.c_pleasewaitprocessing +msgid "Please wait. Processing...." +msgstr "" + +#: ulazautoupdate.c_propisempty +msgid "Property SFProjectName is empty!" +msgstr "" + +#: ulazautoupdate.c_sourceforgedownload +msgid "SourceForge download" +msgstr "" + +#: ulazautoupdate.c_takingtoolong +msgid "Check is taking too long (bad/slow internet connection?). Try again later?" +msgstr "" + +#: ulazautoupdate.c_tempversionsininame +msgid "new%s" +msgstr "" + +#: ulazautoupdate.c_threaddownloadcrash +msgctxt "ulazautoupdate.c_threaddownloadcrash" +msgid "ThreadDownloadHTTP Crashed! (NewVersionAvailable)" +msgstr "" + +#: ulazautoupdate.c_threaddownloadhttpcrash +msgctxt "ulazautoupdate.c_threaddownloadhttpcrash" +msgid "ThreadDownloadHTTP Crashed! (NewVersionAvailable)" +msgstr "" + +#: ulazautoupdate.c_threadstarted +msgid "Thread Started" +msgstr "" + +#: ulazautoupdate.c_unabletodelete +msgid "Sorry, unable to delete %s%sPlease delete it manually" +msgstr "" + +#: ulazautoupdate.c_unabletodeleteold +msgid "Unable to delete old files in %s" +msgstr "" + +#: ulazautoupdate.c_unabletodownload +msgid "Unable to download new version%sReturn code was %d" +msgstr "" + +#: ulazautoupdate.c_updatermissing +msgid "Missing %s" +msgstr "" + +#: ulazautoupdate.c_whatsnewinversion +msgid "What's new in version %s" +msgstr "" + +#: ulazautoupdate.rsanewversions +msgid "A new version %s is available. Would you like to download it?" +msgstr "" + +#: ulazautoupdate.rscancelledyou +msgid "Cancelled. You can download and update to the new version later." +msgstr "" + +#: ulazautoupdate.rscancelledyou2 +msgid "Cancelled. You can download the new version later." +msgstr "" + +#: ulazautoupdate.rsdownloadfail +msgid "Download failed. (HTTP Errorcode %d) Try again later" +msgstr "" + +#: ulazautoupdate.rsthisapplicat +msgid "This application is up-to-date" +msgstr "" + +#: ulazautoupdate.rsvewversionsh +msgid "Vew version %s has downloaded. Click OK to update now." +msgstr "" + diff --git a/components/lazautoupdate/latest_stable/uappisrunning.pas b/components/lazautoupdate/latest_stable/uappisrunning.pas new file mode 100644 index 000000000..a88d9cd29 --- /dev/null +++ b/components/lazautoupdate/latest_stable/uappisrunning.pas @@ -0,0 +1,169 @@ +unit uappisrunning; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils,LazUTF8,LazFileUtils,FileUtil + {$IFDEF WINDOWS}, Windows, JwaTlHelp32{$ENDIF} + {$IFDEF LINUX},process{$ENDIF}; +// JwaTlHelp32 is in fpc\packages\winunits-jedi\src\jwatlhelp32.pas + +// Returns TRUE if EXEName is running under Windows or Linux +// Don't pass an .exe extension to Linux! +function AppIsRunning(const ExeName: string):Boolean; +procedure KillApp(const ExeName: string); +Function GetUserName:String; + +implementation +// These functions return Zero if app is NOT running +// Override them if you have a better implementation +{$IFDEF WINDOWS} + +function WindowsGetUserName: string; +var + nsize: DWORD; + sz: ansistring; +begin + Result := 'unknown'; + nsize := 255; + SetLength(sz, nsize); + windows.GetUsername(PChar(sz), nsize); + SetLength(sz, nsize); + Result := Trim(sz); +end; + +function WindowsAppIsRunning(const ExeName: string): integer; +var + ContinueLoop: BOOL; + FSnapshotHandle: THandle; + FProcessEntry32: TProcessEntry32; +begin + FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + FProcessEntry32.dwSize := SizeOf(FProcessEntry32); + ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); + Result := 0; + while integer(ContinueLoop) <> 0 do + begin + if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = + UpperCase(ExeName)) or (UpperCase(FProcessEntry32.szExeFile) = + UpperCase(ExeName))) then + begin + Inc(Result); + end; + ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); + end; + CloseHandle(FSnapshotHandle); +end; +Procedure KillWindowsApp(const ExeName:String); +var + ContinueLoop: BOOL; + FSnapshotHandle: THandle; + FProcessEntry32: TProcessEntry32; + AHandle: THandle; + ID: dword; +begin + FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + FProcessEntry32.dwSize := SizeOf(FProcessEntry32); + ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); + while integer(ContinueLoop) <> 0 do + begin + if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = + UpperCase(ExeName)) or (UpperCase(FProcessEntry32.szExeFile) = + UpperCase(ExeName))) then + begin + ID:=FProcessEntry32.th32ProcessID; + AHandle := OpenProcess(PROCESS_ALL_ACCESS,False,ID); //uses windows + TerminateProcess(AHandle,255); + end; + ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); + end; + CloseHandle(FSnapshotHandle); +end; +{$ENDIF} +{$IFDEF LINUX} +function LinuxGetUserName: string; +begin + Result:=GetEnvironmentVariableUTF8('USER'); +end; +function LinuxAppIsRunning(const ExeName: string): integer; +var + t: TProcess; + s: TStringList; +begin + Result := 0; + t := tprocess.Create(nil); + t.CommandLine := 'ps -C ' + ExeName; + t.Options := [poUsePipes, poWaitonexit]; + try + t.Execute; + s := TStringList.Create; + try + s.LoadFromStream(t.Output); + Result := Pos(ExeName, s.Text); + finally + s.Free; + end; + finally + t.Free; + end; +end; +procedure KillLinuxApp(const ExeName: string); +// killall -9 processname +// or pidof EXEName gives PID then kill PID +var + t: TProcess; + s: TStringList; +begin + t := tprocess.Create(nil); + t.CommandLine := 'killall -9 ' + ExeName; + t.Options := [poUsePipes, poWaitonexit]; + try + t.Execute; + { + s := TStringList.Create; + try + s.LoadFromStream(t.Output); + Result := Pos(ExeName, s.Text); + finally + s.Free; + end; + } + finally + t.Free; + end; +end; +{$ENDIF} +Function GetUserName:String; +begin +{$IFDEF WINDOWS} + Result:=WindowsGetUserName; +{$ENDIF} +{$IFDEF LINUX} +Result:=LinuxGetUserName; +{$ENDIF} +end; + +procedure KillApp(const ExeName: string); +begin +{$IFDEF WINDOWS} + KillWindowsApp(ExeName); +{$ENDIF} +{$IFDEF LINUX} + KillLinuxApp(ExeName); +{$ENDIF} +end; + +function AppIsRunning(const ExeName: string):Boolean; +begin +{$IFDEF WINDOWS} + Result:=(WindowsAppIsRunning(ExeName) > 0); +{$ENDIF} +{$IFDEF LINUX} + Result:=(LinuxAppIsRunning(ExeName) > 0); +{$ENDIF} +end; + +end. + diff --git a/components/lazautoupdate/latest_stable/ulazautoupdate.pas b/components/lazautoupdate/latest_stable/ulazautoupdate.pas new file mode 100644 index 000000000..f2c238c24 --- /dev/null +++ b/components/lazautoupdate/latest_stable/ulazautoupdate.pas @@ -0,0 +1,2213 @@ +unit ulazautoupdate; + +{ + Original DownloadHTTP code: wiki.freepascal.org + Thread source: http://freepascalanswers.wordpress.com/2012/06/15/synapas-http-thread/ + VersionSupport: Mike Thompson - mike.cornflake@gmail.com + Added to and modified by minesadorada@charcodelvalle.com + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version with the following modification: + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules,and + to copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the terms + and conditions of the license of that module. An independent module is a + module which is not derived from or based on this library. If you modify + this library, you may extend this exception to your version of the library, + but you are not obligated to do so. If you do not wish to do so, delete this + exception statement from your version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License + for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +{$mode objfpc}{$H+} + +interface + + +uses + Forms, Classes, SysUtils, strutils, LazUTF8,FileUtil,LazFileUtils, Dialogs, StdCtrls, + Buttons, httpsend, DateUtils, asyncprocess, zipper, LResources, + VersionSupport, inifiles, aboutlazautoupdateunit, uappisrunning, LCLProc, + fileinfo , winpeimagereader {need this for reading exe info} + , elfreader {needed for reading ELF executables} + , machoreader {needed for reading MACH-O executables} + ; + +const +// C_OnlineAppPath = +//'https://sourceforge.net/project/%s/files/%s/%s/download'; +// https://sourceforge.net/projects/lazautoupdate/files/updates/updatepackwin32.zip/download +// https://heanet.dl.sourceforge.net/project/lazautoupdate/updates/dboxmonitorwin64.zip + C_OnlineAppPath = + 'http://sourceforge.net/projects/%s/files/%s/%s/download'; + // [updatepath,projectname,filename] + C_TLazAutoUpdateComponentVersion = '0.2.0'; + C_LAUTRayINI = 'lauimport.ini'; + +{ + V0.0.1: Initial alpha + V0.0.2: Added auOther properties + V0.0.3: Limit to download time + auOther code working + V0.0.4: Added Events + V0.0.5: Improved error handling in DownloadNewVersion + Added LastError property + Added VersionCountLimit rpoerty + Added DownloadCountLimit property + V0.0.6: Linux implementation + Property CopyTree added + V0.0.7: Added Sleep(1) to download code + V0.0.8: UpdateToNewVersion now shells AppFileWithPath + V0.0.9: AutoUpdate method added + V0.1.0: Added WaitFor routine to simulate Sleep in Linux + V0.1.1: Tidied up Debugmode + Improved version comparison + V0.1.3: Fixed bug whereby Setting AppVersion property gave incorrect value + V0.1.4: Added public AppVersionNumber property + V0.1.5: Added Scrollbars to the WhatsNew memo + V0.1.6: Added Public ResetAppVersion method + Added Private VersionStringToNumber function + V0.1.7: Added Public SilentUpdate method + Added public properties: + LCLVersion,WidgetSet, FPCVersion,LastCompiled,TargetOS + V0.1.8: Bugfix: Removed Parent Form code if fSilentMode=TRUE + V0.1.9: Added public AppRunningSilentUpdate method + V0.1.10:Added uAppIsRunning unit + Added IsAppActive public function + V0.1.11:SilentInstall method + V0.1.12:Moved ProgramDir references to fAppFileName references + V0.1.13:Bugfix Update + V0.1.14:Added debug messages in DoSilentUpdate method + V0.1.15:DoSilentUpdate: Added code for CopyTree=TRUE/FALSE + Changed some Ansi functions to UTF8 + V0.1.16:$IFDEF WINDOWS UpdateToNewVersion kills app if running + V0.1.17:Added public methods CreateLocalLauImportFile and RelocateLauImportFile + V0.1.18:Added public method RemoteUpdateToNewVersion + V0.1.19:Improved VersionStringToNumber + V0.1.20:Bugfix: 'No Build Information Available' -> '0.0.0.0' + V0.1.21:Bugfix: RemoteUpdate killed app too soon + V0.1.22:lauimport file is not re-created if it already exists + V0.1.23:Bugfix: PrettyName in lauimport sometimes contained duplicated OS info + V0.1.24:Bugfix to CreateLocalLauImportFile + More checks on PrettyName + V0.1.25:Changed default: CopyTree = TRUE + V0.1.26:Updated uses clause for FileUtils. + V0.2.0: ?? +} + C_TThreadedDownloadComponentVersion = '0.0.2'; +{ + V0.0.1: Initial alpha + V0.0.2: Added fDebugmode to all classes and functions + V0.0.3: ?? +} + C_OnlineVersionsININame = 'versions.ini'; // User can change + C_UpdatesFolder = 'updates'; // User can change + C_WhatsNewFilename = 'whatsnew.txt'; + C_INISection = 'versions'; + C_GUIEntry = 'GUI'; + C_ModuleEntry = 'Module'; + {$IFDEF WINDOWS} + C_Updater = 'updatehm.exe'; + C_LOCALUPDATER = 'lauupdate.exe'; + {$ELSE} + C_Updater = 'updatehm'; + C_LOCALUPDATER = 'lauupdate'; + {$ENDIF} + +resourcestring + C_ComponentPrettyName = 'Lazarus Auto-Update Component'; + C_TempVersionsININame = 'new%s'; // [C_OnlineVersionsININame] + C_Checking = 'Checking for updates...'; + C_NoSFTypes = 'Sorry only ProjectType = auSourceForge is supported in this version'; + C_Downloading = 'Please wait. Downloading new version... '; + C_ConsoleTitle = 'Updating %s'; //[fAppFileName] + C_TakingTooLong = + 'Check is taking too long (bad/slow internet connection?). Try again later?'; + C_Error500 = 'There is a problem with the Internet connection (error %d) Try again later?'; + C_Error404 = 'Cannot find the file at this time. (error %d) Try again later?'; + C_UnableToDelete = 'Sorry, unable to delete %s%sPlease delete it manually'; + C_OK = 'OK'; + C_NotProperFileName = 'This is not a proper file name'; + C_WhatsNewInVersion = 'What''s new in version %s'; + C_PropIsEmpty = 'Property SFProjectName is empty!'; + C_ThreadDownloadCrash = 'ThreadDownloadHTTP Crashed! (NewVersionAvailable)'; + C_DownloadedBytes = 'Downloaded %s: %d bytes'; + C_UnableToDeleteOld = 'Unable to delete old files in %s'; + C_DirectoryProblems = 'Problems with the % directory'; + C_ThreadDownloadHTTPCrash = 'ThreadDownloadHTTP Crashed! (NewVersionAvailable)'; + C_DownloadSuccess = 'Downloaded new version %s sucessfully.'; + C_UnableToDownload = 'Unable to download new version%sReturn code was %d'; + C_PleaseWaitProcessing = 'Please wait. Processing....'; + C_UpdaterMissing = 'Missing %s'; + C_FolderMissing = 'Missing %s folder'; + C_NotApplicable = ''; + C_ThreadStarted = 'Thread Started'; + C_SourceForgeDownload = 'SourceForge download'; + C_CannotLoadFromRemote = 'Cannot load document from remote server'; + C_DownloadIsEmpty = 'Downloaded document is empty.'; + C_DownloadFailedErrorCode = 'Download failed with error code '; + rsANewVersionS = 'A new version %s is available. Would you like to download it?'; + rsVewVersionSH = 'Vew version %s has downloaded. Click OK to update now.'; + rsCancelledYou = 'Cancelled. You can download and update to the new version' + + ' later.'; + rsDownloadFail = 'Download failed. (HTTP Errorcode %d) Try again later'; + rsCancelledYou2 = 'Cancelled. You can download the new version later.'; + rsThisApplicat = 'This application is up-to-date'; + +type + tc = class(tthread) + procedure Execute; override; + end; + + +type + + TProjectType = (auSourceForge, auOther); + // Array of these records used for multiple updates + UpdateListRecord = record + PrettyName: string; + Path: string; + VersionString: string; + VersionNumber: cardinal; + end; + TThreadedDownload = class; // Forward declaration + {TLAZAUTOUPDATE} + TOnNewVersionAvailable = procedure(Sender: TObject; Newer: boolean; + OnlineVersion: string) of object; + TOnDownloaded = procedure(Sender: TObject; ResultCode, BytesDownloaded: integer) of + object; + TOnDebugEvent = procedure(Sender: TObject; lauMethodName, lauMessage: string) of object; + + TLazAutoUpdate = class(TAboutLazAutoUpdate) + private + fSourceForgeProjectName: string; + fApplicationVersionString: string; + fApplicationVersionQuad: TVersionQuad; + fGuiQuad:TVersionQuad; + fProjectType: TProjectType; + fThreadDownload: TThreadedDownload; + fAppFileName: string; + fComponentVersion: string; + fShowUpdateInCaption: boolean; + fUpdateList: array of UpdateListRecord; + fUpdateListCount: integer; + fUpdatesFolder: string; + fDownloadZipName: string; + fVersionsININame: string; + fParentApplication: TApplication; + fParentForm: TForm; + fGUIOnlineVersion: string; + fShowDialogs: boolean; + fDownloadInprogress: boolean; + FUpdateHMProcess: TAsyncProcess; + fauOtherSourceURL: string; + fauOtherSourceFilename: string; + WhatsNewForm: TForm; + WhatsNewMemo: TMemo; + cmdClose: TBitBtn; + FOnNewVersionAvailable: TOnNewVersionAvailable; + FOnDownloaded: TOnDownloaded; + fOnDebugEvent: TOnDebugEvent; + fLastError: string; + fVersionCountLimit, fDownloadCountLimit: cardinal; + fZipfileName: string; + fCopyTree: boolean; + fDebugMode, fFireDebugEvent: boolean; + fSilentMode: boolean; + fLCLVersion, fWidgetSet, fFPCVersion, fLastCompiled, fTargetOS: string; + fQuad: TVersionQuad; + fProgVersion:TProgramVersion; + objFileVerInfo: TFileVersionInfo; + procedure SetProjectType(AValue: TProjectType); + // projectype=auOther property Sets + procedure SetauOtherSourceFilename(AValue: string); + procedure SetauOtherSourceURL(AValue: string); + + procedure SetSourceForgeProjectName(Avalue: string); + procedure SetAppFilename(Avalue: string); + procedure SetApplicationVersionString(Avalue: string); + procedure SetShowDialogs(AValue: boolean); + procedure SetDebugMode(AValue: boolean); + function GetThreadDownloadReturnCode: integer; + function IsSourceForgeVersionNewer(const sznewINIPath: string): boolean; + function VersionStringToNumber(AVersionString: string): integer; + function DoSilentUpdate: boolean; + protected + + public + constructor Create(AOwner: TComponent); override; + Procedure DebugTest; + {Main functions} + // If NewVersionAvailable then DownloadNewVersion then UpdateToNewVersion + // Returns TRUE if GUIVersion > AppVersion + function NewVersionAvailable: boolean; + // Returns TRUE if successful + function DownloadNewVersion: boolean; + // Returns TRUE if successful + function UpdateToNewVersion: boolean; + // Put in form.activate. Shows only if in ProgramDirectory then deletes it. Exits otherwise + procedure ShowWhatsNewIfAvailable; + // Checks for new version then shows dialogs to update + procedure AutoUpdate; + // No dialogs - what it says on the tin. + function SilentUpdate: boolean; + // Used in SilentUpdate. Shells to local lauupdate(.exe) + function RemoteUpdateToNewVersion: boolean; + // Returns TRUE if EXEName is running under Windows or Linux + function AppIsActive(const ExeName: string): boolean; + + // Resets AppVersion property to the ownling application version + procedure ResetAppVersion; + // Create a new lauimport.ini in the App folder + function CreateLocalLauImportFile: boolean; + // If lauimport.ini is found in the app folder, move it to the AppData folder + procedure RelocateLauImportFile; + // Download lists (now superceded by CopyTree) + // TODO: Use Indexed properties to handle list access + function AddToUpdateList(APrettyName, APath, AVersionString: string; + AVersionNumber: cardinal): integer; + procedure ClearUpdateList; + property UpdateListCount: integer read fUpdateListCount; + + + // GUI can use these properties during and after downloads + // NewVersionAvailable sets this. It is the online version + property GUIOnlineVersion: string read fGUIOnlineVersion; + // Set by NewVersionAvailable and DownLoadNewVersion + property ReturnCode: integer read GetThreadDownloadReturnCode; + // Set by NewVersionAvailable and DownLoadNewVersion when running + property DownloadInprogress: boolean read fDownloadInprogress; + + // The name of the zipfile in the remote directory + property DownloadZipName: string read fDownloadZipName; + // The Path + Filename of the app to overwite and then run + property AppFileWithPath: string read fAppFilename write SetAppFilename; + // The version string of the app to be updated. You can set this to '0.0.0.0' for a definite update. + property AppVersion: string read fApplicationVersionString + write SetApplicationVersionString; + // Can be queried + property LastError: string read fLastError; + // Debugging use only + property DebugMode: boolean read fDebugMode write SetDebugMode; +// property AppVersionNumber: integer read fApplicationVersionQuad; + + // Info useful for About dialogs + property LCLVersion: string read fLCLVersion; + property WidgetSet: string read fWidgetSet; + property FPCVersion: string read fFPCVersion; + property LastCompiled: string read fLastCompiled; + property TargetOS: string read fTargetOS; + published + // Events + property OnNewVersionAvailable: TOnNewVersionAvailable + read FOnNewVersionAvailable write FOnNewVersionAvailable; + property OnDownloaded: TOnDownloaded read fOnDownloaded write fOnDownloaded; + property OnDebugEvent: TOnDebugEvent read fOnDebugEvent write fOnDebugEvent; + + // Embedded class + property ThreadDownload: TThreadedDownload read fThreadDownload write fThreadDownload; + // Set this property before using methods + property SFProjectName: string read fSourceForgeProjectName + write SetSourceForgeProjectName; + // Only auSourceForge at V0.0.1 + // For when fProjectType = auOther + // Fully qualified URL (not including the filename). + property auOtherSourceURL: string read fauOtherSourceURL write SetauOtherSourceURL; + // Just the filename of the file to be downloaded (can be zipped) + property auOtherSourceFilename: string read fauOtherSourceFilename + write SetauOtherSourceFilename; + + property ProjectType: TProjectType + read fProjectType write SetProjectType default auSourceForge; + // Version of this component + property AutoUpdateVersion: string read fComponentVersion; + // Zipfile contains a whole directory tree (relative to App Directory) + property CopyTree: boolean read fCopyTree write fCopyTree default TRUE; + // Default is 'updates' *must be the same in SourceForge file section* + property UpdatesFolder: string read fUpdatesFolder write fUpdatesFolder; + // Default=versions.ini File in SourceForge /updates folder + property VersionsININame: string read fVersionsININame write fVersionsININame; + // Default is to modify parent form's caption during downloads + property ShowUpdateInCaption: boolean read fShowUpdateInCaption + write fShowUpdateInCaption default False; + // Set to FALSE if you want to handle them in form code + property ShowDialogs: boolean read fShowDialogs write SetShowDialogs default False; + // How many counts to wait until 'Too long' meesage quits out + property VersionCountLimit: cardinal read fVersionCountLimit write fVersionCountLimit; + // How many counts to wait until 'Too long' meesage quits out + property DownloadCountLimit: cardinal read fDownloadCountLimit + write fDownloadCountLimit; + // Default is application filename.zip + property ZipfileName: string read fZipfileName write fZipfileName; + + end; + + {TThreadedDownload } + TThreadedDownload = class(TPersistent) + private + fURL: string; + fFileName: string; + fReturnCode: integer; + fThreadFinished: boolean; + fDownloadSize: integer; + fUnzipAfter: boolean; + fComponentVersion: string; + fApplicationVersionString: string; + fIsSourceForge: boolean; + public + fDebugMode: boolean; + fShowDialogs: boolean; + fLastError: string; // Propagated to TLazAutoUpdate + constructor Create; + // Starts the thread + function ThreadDownloadHTTP: boolean; + // Called when the thread is done + procedure DownloadTerminiated(Sender: TObject); + // Passed to the thread + property URL: string read fURL write fURL; + // Passed to the thread + property Filename: string read fFileName write fFileName; + // From TLazAutoUpdate + property AppVersion: string read fApplicationVersionString + write fApplicationVersionString; + // From the thread + property ReturnCode: integer read fReturnCode write fReturnCode; + // From DownloadTerminated + property ThreadFinished: boolean read fThreadFinished write fThreadFinished; + // From the thread + property DownloadSize: integer read fDownloadSize write fDownloadSize; + // From TLazAutoUpdate + property UnzipAfter: boolean read fUnzipAfter; + // From TLazAutoUpdate + property IsSourceForge: boolean read fIsSourceForge; + published + // Version of the underlying thread class + property ThreadDownloadVersion: string read fComponentVersion; + end; + + {TDownloadThreadClass } + TDownloadThreadClass = class(TThread) + private + fURL: string; + fFileName: string; + public + fIsSourceForge: boolean; // Propagated from TLazAutoUpdate + fDebugMode: boolean; // propagated from TLazAutoUpdate + fShowDialogs: boolean; // propagated from TLazAutoUpdate + fDownloadSize: integer; // propagated to TThreadedDownload + fReturnCode: integer; // Propagated to TThreadedDownload + fLastError: string; // Propagated to TThreadedDownload + constructor Create(URL, FileName: string); + procedure Execute; override; // Starts thread + end; + + + +// Non-threaded version (redundant v0.0.1) +function DownloadHTTP(URL, TargetFile: string; + var ReturnCode, DownloadSize: integer; bIsSourceForge, fDebugMode: boolean): boolean; + +procedure Register; + +implementation + +procedure Register; +begin + {$I lazautoupdate_icon.lrs} + RegisterComponents('System', [TLazAutoUpdate]); +end; + +procedure tc.Execute; +begin + +end; + +procedure WaitFor(const MillisecondDelay: longword); +// Linux - this proc is intentionally thread-blocking +var + ThisSecond: longword; +begin + ThisSecond := MilliSecondOfTheDay(Now); + while MilliSecondOfTheDay(Now) < (ThisSecond + MillisecondDelay) do ; +end; + +Procedure TLazAutoUpdate.DebugTest; +begin + ShowMessage(fApplicationVersionString); +end; + +constructor TLazAutoUpdate.Create(AOwner: TComponent); +var + sz: string; +begin + inherited Create(AOwner); // TComponent method; + + { initialise threading system } + with tc.Create(False) do + begin + waitfor; + Free; + end; + + + fThreadDownload := TThreadedDownload.Create(); + // Leave URL and Filename to be set via properties + fComponentVersion := C_TLazAutoUpdateComponentVersion; + ClearUpdateList; + fUpdateListCount := 0; + // Grab the application and form objects from the application + fParentApplication := Tapplication(AOwner.Owner); + fParentForm := TForm(AOwner); + fApplicationVersionString:='No build information available'; + objFileVerInfo:=TFileVersionInfo.Create(fParentApplication); + TRY + Try + objFileVerInfo.Filename:=ParamStrUTF8(0); + objFileVerInfo.ReadFileInfo; + fApplicationVersionString:=objFileVerInfo.VersionStrings.Values['FileVersion']; + fileinfo.GetProgramVersion(fApplicationVersionQuad); + fileinfo.GetProgramVersion(fProgVersion); + Except + // Eat other Exceptions? + On E:EResNotFound do + ShowMessage('There is no version information in your project!'); + On E:Exception do Application.Terminate; + end; + finally + objFileVerInfo.Free; + end; + // fApplicationVersionString := GetFileVersion; + if (fApplicationVersionString = 'No build information available') then + fApplicationVersionString := '0.0.0.0'; + + fCopyTree := TRUE; // User can change + // UpdateList: Redundant? + AddToUpdateList('', LazUTF8.ParamStrUTF8(0), GetFileVersion, 0); + + fProjectType := auSourceForge; // User can change + fUpdatesFolder := C_UpdatesFolder; // User can change + fVersionsININame := C_OnlineVersionsININame; // User can change + fShowUpdateInCaption := False; // User can change + fShowDialogs := False; // User can change + fDebugMode := False; + fFireDebugEvent := False; + fSilentMode := False; + + // Propagate down + fThreadDownload.fDebugmode := fDebugMode; + if fProjectType = auSourceForge then + fThreadDownload.fIsSourceForge := True + else + fThreadDownload.fIsSourceForge := False; + + fApplicationVersionQuad := StrToVersionQuad(fApplicationVersionString); + + fLastError := C_OK; + + fVersionCountLimit := 1000000; // default + fDownloadCountLimit := 10000000; // default + + + fZipfileName := ''; // assign later + + // Assorted versioninfo properties + fLCLVersion := GetLCLVersion; + fWidgetSet := GetWidgetSet; + fFPCVersion := GetCompilerInfo; + fLastCompiled := GetCompiledDate; + fTargetOS := GetOS; + + + // AboutBox properties + AboutBoxComponentName := Format('Laz Auto-update v%s', + [C_TLazAutoUpdateComponentVersion]); + ; + AboutBoxWidth := 400; + AboutBoxHeight := 450; + sz := 'A component for updating your application' + LineEnding; + sz += 'Designed for projects hosted by SourceForge' + LineEnding + LineEnding; + sz += 'Main methods:' + LineEnding; + sz += 'Procedure AutoUpdate' + LineEnding; + sz += 'Function NewVersionAvailable: Boolean' + LineEnding; + sz += 'Function DownloadNewVersion: Boolean' + LineEnding; + sz += 'Function UpdateToNewVersion: Boolean' + LineEnding; + sz += 'Procedure ShowWhatsNewIfAvailable' + LineEnding; + sz += 'For troubleshooting, set DebugMode=TRUE'; + AboutBoxTitle := 'LazAutoUpdate'; + AboutBoxDescription := sz; + // AboutBoxBackgroundColor:=clWindow; + //AboutBoxFontName (string) + //AboutBoxFontSize (integer) + AboutBoxVersion := C_TLazAutoUpdateComponentVersion; + AboutBoxAuthorname := 'Gordon Bamber'; + //AboutBoxOrganisation (string) + AboutBoxAuthorEmail := 'minesadorada@gmail.com'; + AboutBoxLicenseType := 'MODIFIEDGPL'; +end; + +function TLazAutoUpdate.AppIsActive(const ExeName: string): boolean; +begin + Result := AppIsRunning(ExeName); +end; + +function TLazAutoUpdate.VersionStringToNumber(AVersionString: string): integer; + // Converts 'n.n.n.n' into an integer +var + s: string; + i: integer; +begin + Result := 0; + // Fetch the 4 (or less) version elements and make into an Integer + s := ExtractDelimited(1, AVersionString, ['.']); + if TryStrToInt(s, i) then + Result := Result + (i * 10000); + s := ExtractDelimited(2, AVersionString, ['.']); + if TryStrToInt(s, i) then + Result := Result + (i * 1000); + s := ExtractDelimited(3, AVersionString, ['.']); + if TryStrToInt(s, i) then + Result := Result + (i * 100); + s := ExtractDelimited(4, AVersionString, ['.']); + if TryStrToInt(s, i) then + Result := Result + i; +end; + +procedure TLazAutoUpdate.ResetAppVersion; +begin + fApplicationVersionString := GetFileVersion; + if (fApplicationVersionString = 'No build information available') then + fApplicationVersionString := '0.0.0.0'; + fApplicationVersionQuad := StrToVersionQuad(fApplicationVersionString); +end; + +procedure TLazAutoUpdate.SetShowDialogs(AValue: boolean); +begin + fShowDialogs := AValue; + if fThreadDownload <> nil then + fThreadDownload.fShowDialogs := AValue; +end; + +procedure TLazAutoUpdate.SetDebugMode(AValue: boolean); +begin + fDebugMode := AValue; + // Fire the OnDebugEvent event handler? + if Assigned(fOndebugEvent) then + fFireDebugEvent := fDebugMode; + if fThreadDownload <> nil then + fThreadDownload.fDebugMode := AValue; +end; + +procedure TLazAutoUpdate.SetauOtherSourceURL(AValue: string); +// Must end in '/' +begin + if ((AValue <> fauOtherSourceURL) and (AValue <> '')) then + begin + if not AnsiEndsStr('/', AValue) then + AValue += '/'; + fauOtherSourceURL := AValue; + end; +end; + +procedure TLazAutoUpdate.SetauOtherSourceFilename(AValue: string); +begin + if ((AValue <> fauOtherSourceFilename) and (AValue <> '')) then + begin + try + fauOtherSourceFilename := ExtractFileName(AValue); + except + ShowMessage(C_NotProperFileName); + end; + end; +end; + + +procedure TLazAutoUpdate.ShowWhatsNewIfAvailable; +begin + // Should be called on form.activate + // Afer an update, the 'whatsnew.txt' is copied into the application's folder + // This routine shows it, then deletes it + // If it isn't there, then it exits early + + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + + if not FileExistsUTF8(ProgramDirectory + C_WhatsNewFilename) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'ShowWhatsNewIfAvailable', 'Unable to locate ' + + C_WhatsNewFilename); + Exit; + end; + // Create the form, memo and close button + if fParentForm <> nil then + WhatsNewForm := TForm.CreateNew(fParentForm) + else + WhatsNewForm := TForm.CreateNew(fParentApplication); + + WhatsNewMemo := TMemo.Create(WhatsNewForm); + cmdClose := TBitBtn.Create(WhatsNewForm); + + try // ..finally destroy all + with WhatsNewForm do + begin + Height := 480; + Width := 640; + // BorderStyle:=bsToolWindow; + Caption := Format(C_WhatsNewInVersion, [GetFileVersion]); + DefaultMonitor := dmActiveForm; + // FormStyle:=fsStayOnTop; + Position := poScreenCenter; + ShowInTaskBar := stNever; + end; + with WhatsNewMemo do + begin + Height := WhatsNewForm.Height - 80; + Width := WhatsNewForm.ClientWidth; + ReadOnly := True; + ScrollBars := ssAutoBoth; + WordWrap := True; + Parent := WhatsNewForm; + Lines.LoadFromFile(ProgramDirectory + C_WhatsNewFilename); + end; + with cmdClose do + begin + Top := WhatsNewForm.Height - Height - 20; + Left := (WhatsNewForm.Width div 2) - (Width div 2); + Kind := bkClose; + Parent := WhatsNewForm; + end; + // Show the window modally (cmdClose will close it) + WhatsNewForm.ShowModal; + try + // Delete the whatsnew.txt now the user has seen it + if not SysUtils.DeleteFile(ProgramDirectory + C_WhatsNewFilename) then + if fShowDialogs then + ShowMessageFmt(C_UnableToDelete, + [C_WhatsNewFilename, LineEnding]); + except + // Ignore Exceptions + end; + finally + { + cmdClose.Free; // Not needed + WhatsNewMemo.Free; // Not needed + } + FreeAndNil(WhatsNewForm); // Free the form and its minions + end; +end; + +function TLazAutoUpdate.SilentUpdate: boolean; +begin + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + + Result := False; + fSilentMode := True; + fShowUpdateInCaption := False; + fShowDialogs := False; + if fFireDebugEvent then + fOndebugEvent(Self, 'SilentUpdate', 'Calling UpdateToNewVersion'); + + // Use the local lauupdate if available + if FileExistsUTF8(ProgramDirectory + C_LOCALUPDATER) then + begin + if RemoteUpdateToNewVersion then + // If IsAppRunning=FALSE, then calls DoSilentUpdate + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'SilentUpdate', 'UpdateToNewVersion succeeded'); + fSilentMode := False; + Result := True; + end; + + end + else + begin + if UpdateToNewVersion then + // If IsAppRunning=FALSE, then calls DoSilentUpdate + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'SilentUpdate', 'UpdateToNewVersion succeeded'); + fSilentMode := False; + Result := True; + end; + end; +end; + +procedure TLazAutoUpdate.AutoUpdate; +// Do-all proc that user can drop into a menu +begin + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + + if fFireDebugEvent then + fOndebugEvent(Self, 'AutoUpdate', 'Calling NewVersionAvailable'); + if NewVersionAvailable then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'AutoUpdate', 'NewVersionAvailable succeeded'); + + if MessageDlg(fParentApplication.Title, Format(rsANewVersionS, + [fGUIOnlineVersion]), mtConfirmation, [mbYes, mbNo], 0, mbYes) = 6 then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'AutoUpdate', 'Calling DownloadNewVersion'); + + if DownloadNewVersion then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'AutoUpdate', 'DownloadNewVersion suceeded'); + if MessageDlg(fParentApplication.Title, + Format(rsVewVersionSH, [fGUIOnlineVersion]), mtConfirmation, + [mbOK, mbCancel], 0, mbOK) = 1 then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'AutoUpdate', 'Calling UpdateToNewVersion'); + UpdateToNewVersion; + end + else + MessageDlg(fParentApplication.Title, + rsCancelledYou, + mtInformation, [mbOK], 0); + end + else + MessageDlg(fParentApplication.Title, + Format(rsDownloadFail, [GetThreadDownloadReturnCode]), + mtInformation, [mbOK], 0); + end + else + MessageDlg(fParentApplication.Title, + rsCancelledYou2, + mtInformation, [mbOK], 0); + end + else + MessageDlg(fParentApplication.Title, + rsThisApplicat, + mtInformation, [mbOK], 0); +end; + +function TLazAutoUpdate.IsSourceForgeVersionNewer(const sznewINIPath: string): boolean; + // Compares version contained in szTempXMLPath INI file + // to fApplicationVersionNumber +var + VersionINI: TIniFile; + iGUIVersion: integer; +{ +C_INISection = 'versions'; +C_GUIEntry ='GUI'; +C_ModuleEntry = 'Module'; +} +begin + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + + Result := False; + VersionINI := TIniFile.Create(sznewINIPath); + try + fGUIOnlineVersion := VersionINI.ReadString(C_INISection, C_GUIEntry, '0.0.0.0'); + if NOT TryStrToVersionQuad(fGUIOnlineVersion,fGuiQuad) then fGUIQuad:=StrToVersionQuad('0.0.0.0'); + finally + VersionINI.Free; + end; + if fFireDebugEvent then + fOndebugEvent(Self, 'IsSourceForgeVersionNewer', + Format('fGUIOnlineVersion=%s, fApplicationVersionString=%s, szTempXMLPath=%s', + [fGUIOnlineVersion, fApplicationVersionString, sznewINIPath])); + + // Fetch the 4 (or less) version elements and make into an Integer + // so 1.10 > 1.9.9.9 + // iGUIVersion := VersionStringToNumber(fGUIOnlineVersion); + +{ + if fFireDebugEvent then + fOndebugEvent(Self, 'IsSourceForgeVersionNewer', + Format('iGUIVersion=%d, fApplicationVersionNumber=%d', + [iGUIVersion, fApplicationVersionQuad])); +} + // Test: Is the online version newer? + if NewerVersion(fGUIQuad,fApplicationVersionQuad) then Result:=TRUE; +// if (iGUIVersion > fApplicationVersionQuad) then +// Result := True; +end; + + +function TLazAutoUpdate.NewVersionAvailable: boolean; + // Returns TRUE is a new version is available +var + szURL, szTargetPath: string; + cCount: cardinal; + szOldCaption: string; +begin + Result := False; + + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + + if fSourceForgeProjectName = '' then + begin + if fShowDialogs then + ShowMessage(C_PropIsEmpty); + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', C_PropIsEmpty); + Exit; + end; + if fZipFileName = '' then + begin + fZipfileName := ChangeFileExt(ExtractFilename(fAppFilename), '.zip'); + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('Assigning ZipFile name %s', [fZipfileName])); + end; + + if fProjectType = auSourceForge then + begin + szURL := Format(C_OnlineAppPath, [fSourceForgeProjectName, + fUpdatesFolder, fVersionsININame]); + + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('SourceForgeURL is %s', [szURL])); + + szTargetPath := AppendPathDelim(ExtractFilePath(fAppFilename)) + + Format(C_TempVersionsININame, [fVersionsININame]); + + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('Target Path %s', [szTargetPath])); + + if fProjectType = auOther then + // fauOtherSourceURL ends with '/' + begin + szURL := fauOtherSourceURL + fVersionsININame; + end; + + // Delete any old versions + try + if FileExistsUTF8(szTargetPath) then + begin + SysUtils.DeleteFile(szTargetPath); + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('Deleted old file %s', [szTargetPath])); + end; + except + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('Failed to delete old file %s', [szTargetPath])); + // No error if the delete can't be done + end; + with fThreadDownload do + begin + URL := szURL; + Filename := szTargetPath; + if not fSilentMode then + szOldCaption := fParentForm.Caption; + // Initialise fields + ThreadFinished := False; + ReturnCode := 0; + DownloadSize := 0; + fDownloadInprogress := True; + if not fSilentMode then + fParentForm.Caption := C_Checking; + // Start the thread + ThreadDownloadHTTP; + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('ThreadDownloadHTTP return Code was %d', [fReturnCode])); + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('ThreadDownloadHTTP Last Error was %s', [fLastError])); + + cCount := 0; + // Update the GUI during the thread + try + while (ThreadFinished = False) do + begin + Inc(cCount); + Sleep(1); + fParentApplication.ProcessMessages; + ThreadSwitch(); + {$IFDEF WINDOWS} + if fShowUpdateInCaption then + fParentForm.Caption := Format(C_Checking + ' %d', [cCount]) + else + Sleep(10); + {$ENDIF} + fParentApplication.ProcessMessages; + if (cCount > fVersionCountLimit) then + begin + if fShowDialogs then + ShowMessage(C_TakingTooLong); + ThreadFinished := True; + fDownloadSize := 0; + fDownloadInprogress := False; + if not fSilentMode then + fParentForm.Caption := szOldCaption; + Exit; + end; + end; + except + ThreadFinished := True; + fDownloadSize := 0; + fDownloadInprogress := False; + if not fSilentMode then + fParentForm.Caption := szOldCaption; + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + C_ThreadDownloadCrash); + Exit; + end; + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('After Threadfinished: Return Code was %d', [fReturnCode])); + Sleep(1); + fDownloadInprogress := False; + if fDownloadSize > 0 then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('Downloaded %s OK', [szTargetPath])); + fParentApplication.ProcessMessages; + Result := IsSourceForgeVersionNewer(szTargetPath); + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format(C_DownloadedBytes, [szTargetPath, fDownloadSize])); + end + else + if fFireDebugEvent then + fOndebugEvent(Self, 'NewVersionAvailable', + Format('DownloadSize was %d', [fDownloadSize])); + + end; + end; + if not fSilentMode then + fParentForm.Caption := szOldCaption; + if Assigned(fOnNewVersionAvailable) then + fOnNewVersionAvailable(Self, Result, fGUIOnlineVersion); +end; + +function TLazAutoUpdate.DownloadNewVersion: boolean; + // Returns TRUE is download succeeded + // If FALSE. then examine ReturnCode property +var + szURL, szTargetPath, szUpdatesFolder: string; + cCount: cardinal; + szOldCaption: string; + iDownloadedSize: integer; + FileStringList: TStringList; + iCount: integer; +begin + Result := False; + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + iDownloadedSize := 0; + if fZipFileName = '' then + begin + fZipfileName := ChangeFileExt(ExtractFilename(fAppFilename), '.zip'); + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', + Format('ZipFilename was empty. Assigned %s', [fZipfileName])); + end; + szTargetPath := fZipfileName; + szURL := Format(C_OnlineAppPath, [fSourceForgeProjectName, fUpdatesFolder, + ExtractFileName(szTargetPath)]); + szUpdatesFolder := AppendPathDelim(ExtractFilePath(fAppFilename)) + fUpdatesFolder; + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', + Format('Download parameters: TargetPath=%s%sURL=%s%sUpdatesFolder=%s', + [szTargetPath, LineEnding, szURL, LineEnding, szUpdatesFolder])); + + + // If updates folder exists, delete previous contents + // If not, then create updates folder + try + if DirPathExists(szUpdatesFolder) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', + Format('Files already exist in %s. They will be deleted.', + [szUpdatesFolder])); + + FileStringList := TStringList.Create; + try + FileStringList := FindAllFiles(szUpdatesFolder, '*.*', True); + try + for iCount := 0 to FileStringList.Count - 1 do + SysUtils.DeleteFile(FileStringList[iCount]); + except + fLastError := Format(C_UnableToDeleteOld, [szUpdatesFolder]); + if fDebugMode then + ShowMessage(fLastError); + end; + finally + FileStringList.Free; + end; + end + else + begin + if ForceDirectory(szUpdatesFolder) then + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', + Format('New directory %s was created', [szUpdatesFolder])); + end; + except + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', + Format(C_DirectoryProblems, [szUpdatesFolder])); + raise Exception.CreateFmt(C_DirectoryProblems, [szUpdatesFolder]); + end; + + // Set target to the updates folder + szTargetPath := AppendPathDelim(szUpdatesFolder) + ExtractFileName(szTargetPath); + + if fProjectType = auOther then + // fauOtherSourceURL ends with PathDelimiter + begin + szURL := fauOtherSourceURL + fauOtherSourceFilename; + szTargetPath := szUpdatesFolder + PathDelim + fauOtherSourceFilename; + end; + + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', + Format('szURL=%s, szTargetPath=%s', [szURL, szTargetPath])); + + // Double-check: Delete any earlier updates? + try + if FileExistsUTF8(szTargetPath) then + begin + SysUtils.DeleteFile(szTargetPath); + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', + Format('Deleting old file %s', [szTargetPath])); + end; + except + // Ignore exceptions + end; + + fDownloadInprogress := True; + // Do the download + with fThreadDownload do + begin + // Initialise fields + URL := szURL; + Filename := szTargetPath; + ThreadFinished := False; + ReturnCode := 0; + DownloadSize := 0; + fUnzipAfter := True; + if not fSilentMode then + szOldCaption := fParentForm.Caption; + if not fSilentMode then + fParentForm.Caption := C_Downloading; + // Start the thread + ThreadDownloadHTTP; + cCount := 0; + begin + // The thread is running.... + cCount := 0; + try + while (ThreadFinished = False) do + begin + Inc(cCount); + Sleep(1); + fParentApplication.ProcessMessages; + {$IFDEF WINDOWS} + if fShowUpdateInCaption then + fParentForm.Caption := Format(C_Downloading + ' %d', [cCount]) + else + sleep(10); + fParentApplication.ProcessMessages; // Keep GUI responsive + + if (cCount > fDownloadCountLimit) then // Download taking too long? + begin + fDownloadInprogress := False; + if not fSilentMode then + fParentForm.Caption := szOldCaption; + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', C_TakingTooLong); + ThreadFinished := True; + fDownloadSize := 0; + Exit; + end; + {$ENDIF} + end; + iDownloadedSize := fDownloadSize; + except + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', C_ThreadDownloadHTTPCrash); + end; + fDownloadInprogress := False; + Sleep(1); + // We have the HTTP return code in MyThreadDownload.ReturnCode. Normal=200 + if (ReturnCode <> 0) and (ReturnCode < 400) then + begin + // Success! New version is unzipped and ready in the /updates folder + // Shell into the updater app here + // 1) Closes this app + // 2) Copies the szUpdateFolder/downloadedexe to the .exe + // 3) Restarts this (updated) app (showing C_WhatsNewFilename?) + Result := (fDownloadSize > 0); + if fFireDebugEvent then + begin + fOndebugEvent(Self, 'DownloadNewVersion', + Format(C_DownloadedBytes, [ExtractFilename(szTargetPath), + fDownloadSize])); + fOndebugEvent(Self, 'DownloadNewVersion', + Format(C_DownloadSuccess, [fGUIOnlineVersion])); + end; + end + else + begin + Result := False; + if fFireDebugEvent then + fOndebugEvent(Self, 'DownloadNewVersion', + Format(C_UnableToDownload, [LineEnding, ReturnCode])); + Free; + end; + end; + end; + // Fire the event? + if not fSilentMode then + fParentForm.Caption := C_PleaseWaitProcessing; + if Assigned(fOnDownloaded) then + fOnDownloaded(Self, ReturnCode, iDownloadedSize); + if not fSilentMode then + fParentForm.Caption := szOldCaption; +end; + +function UTF8StringReplace(const S, OldPattern, NewPattern: string; + Flags: TReplaceFlags): string; +var + uS, uOld: string; + // Warning! Always changes string to UPPERCASE +begin + if rfIgnoreCase in Flags then + begin + uS := LazUTF8.UTF8UpperCase(S); + uOld := LazUTF8.UTF8UpperCase(OldPattern); + Flags := Flags - [rfIgnoreCase]; //no point uppercasing again + Result := StringReplace(uS, uOld, NewPattern, Flags); + end + else + Result := StringReplace(S, OldPattern, NewPattern, Flags); +end; + +function TLazAutoUpdate.CreateLocalLauImportFile: boolean; +var + LAUTRayINI: TIniFile; + szSection: string; + szSuffix:String; +begin + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + if fFireDebugEvent then + fOndebugEvent(Self, 'CreateLocalLauImportFile', 'CreateLocalLauImportFile called'); + if FileExistsUTF8(ProgramDirectory + C_LAUTRayINI) then + begin + Result := True; + Exit; + end; + // Make up OS-Bitness suffix + {$IFDEF WINDOWS} + szSuffix:='win'; + {$ELSE} + szSuffix:='linux'; + {$ENDIF} + {$IFDEF CPU64} + szSuffix+='64'; + {$ELSE} + szSuffix+='32'; + {$ENDIF} + Result := False; + LAUTRayINI := TIniFile.Create(ProgramDirectory + C_LAUTRayINI); + try + with LAUTRayINI do + begin + if fParentApplication <> nil then + szSection := fParentApplication.Title + else + if fParentForm <> nil then + szSection := fParentForm.Caption + else + szSection := 'My Application'; + If ((AnsiContainsText(szSection,{$I %FPCTARGETOS%}) = FALSE) + AND (AnsiContainsText(szSection,szSuffix) = FALSE)) then + szSection += szSuffix; + WriteString(szSection, 'AppPrettyName', szSection); + WriteString(szSection, 'AppPath', ExtractFilename(fAppFilename)); + WriteString(szSection, 'INIPath', fVersionsININame); + WriteString(szSection, 'ZipPath', fZipfileName); + WriteString(szSection, 'AppVersion', fApplicationVersionString); + WriteString(szSection, 'SFProjectName', fSourceForgeProjectName); + WriteString(szSection, 'SFUpdatesDirectory', fUpdatesFolder); + WriteString(szSection, 'Location', ExtractFilePath(fAppFilename)); + //Suggest a schedule + WriteInteger(szSection, 'IntervalType', 0); + WriteInteger(szSection, 'IntervalDay', 0); + WriteInteger(szSection, 'IntervalDate', 1); + WriteInteger(szSection, 'IntervalHour', 9); + WriteInteger(szSection, 'Update', 0); + WriteString(szSection, 'LastCheckDateTime', '2000-01-01 00-00'); + UpdateFile; + Result := True; + end; + finally + FreeAndNil(LAUTRayINI); + end; +end; + +procedure TLazAutoUpdate.RelocateLauImportFile; +// If C_LAUTRayINI is found in the App Folder, it is moved to the /updatehm folder +var + szSourceLAUTrayPath, szDestLAUTrayPath, szDestLAUTrayDirectory: string; +begin + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + szSourceLAUTrayPath := ExtractFilePath(fAppFilename) + C_LAUTRayINI; + if fFireDebugEvent then + fOndebugEvent(Self, 'RelocateLauImportFile', + Format('Looking for %s.', [szSourceLAUTrayPath])); + + if FileExistsUTF8(szSourceLAUTrayPath) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'RelocateLauImportFile', + Format('Found %s.', [szSourceLAUTrayPath])); + // Make up local /updatehm/C_LAUTRayINI path + szDestLAUTrayPath := GetAppConfigDirUTF8(False, False); // Don't create it yet + {$IFDEF WINDOWS} + szDestLAUTrayPath := StringReplace(szDestLAUTrayPath, Application.Title, + 'updatehm', [rfReplaceAll]); + {$ELSE} + szDestLAUTrayPath := UTF8StringReplace(szDestLAUTrayPath, + Application.Title, 'updatehm', [rfReplaceAll]); + {$ENDIF} + end + else + Exit; // Nothing to do + // szDestLAUTrayPath := LowerCase(szDestLAUTrayPath); + szDestLAUTrayDirectory := ExtractFilePath(szDestLAUTrayPath); + + if DirectoryExistsUTF8(szDestLAUTrayDirectory) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'RelocateLauImportFile', + Format('%s already exists.', [szDestLAUTrayDirectory])); + end + else + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'RelocateLauImportFile', + Format('%s does not previously exist.', [szDestLAUTrayDirectory])); + if ForceDirectory(szDestLAUTrayDirectory) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'RelocateLauImportFile', + Format('Created folder %s.', [szDestLAUTrayDirectory])); + end + else + if fFireDebugEvent then + fOndebugEvent(Self, 'RelocateLauImportFile', + Format('Unable to create folder %s.', [szDestLAUTrayDirectory])); + end; + + // Don't copy over an existing file + if not FileExistsUTF8(szDestLAUTrayPath + C_LAUTRayINI) then + begin + // Move C_LAUTRayINI from app folder to local folder + if CopyFile(szSourceLAUTrayPath, szDestLAUTrayPath + C_LAUTRayINI, + [cffOverwriteFile]) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'RelocateLauImportFile', + Format('Relocated %s from %s to %s', [C_LAUTRayINI, + szSourceLAUTrayPath, szDestLAUTrayPath])); + DeleteFile(szSourceLAUTrayPath); + end + else + if fFireDebugEvent then + fOndebugEvent(Self, 'RelocateLauImportFile', + Format('Failed to relocate %s from %s to %s', + [C_LAUTRayINI, szSourceLAUTrayPath, szDestLAUTrayPath])); + end; +end; + +function TLazAutoUpdate.DoSilentUpdate: boolean; + // Called from UpdateToNewVersion when the app is not running + // Updates the app, and also copies over and updates C_LAUTRayINI +var + szAppFolder: string; + szLAUTrayAppPath: string; + INI: TINIFile; + SectionStringList: TStrings; + szTempUpdatesFolder: string; +begin + Result := False; + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', 'Starting DoSilentUpdate'); + + + if not FileExistsUTF8(fAppFilename) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('AppFilename %s is missing. Exiting routine', [fAppFilename])); + Exit; + + end; + // uses fUpdatesFolder + szTempUpdatesFolder := AppendPathDelim(ExtractFilePath(fAppFilename) + fUpdatesFolder); + + if not DirectoryExistsUTF8(szTempUpdatesFolder) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Updates folder %s was missing.', [szTempUpdatesFolder])); + if ForceDirectory(szTempUpdatesFolder) then + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Created folder %s.', [szTempUpdatesFolder])); + end; + + szAppFolder := AppendPathDelim(ExtractFilePath(fAppFilename)); + // Copy over everything from the updates folder + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('About to copy from %s to %s', [szTempUpdatesFolder, szAppFolder])); + + if fCopyTree then + begin + if CopyDirTree(szTempUpdatesFolder, szAppFolder, + [cffOverwriteFile, cffCreateDestDirectory]) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('CopyTree successful from %s to %s', + [szTempUpdatesFolder, szAppFolder])); + end + else + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Error: CopyTree unsuccessful from %s to %s', + [szTempUpdatesFolder, szAppFolder])); + end + else + begin + // Copy over app + if FileUtil.CopyFile(szTempUpdatesFolder + ExtractFileName(fAppFilename), + szAppFolder + ExtractFileName(fAppFilename), [cffOverwriteFile]) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Copied app from %s to %s', [szTempUpdatesFolder + + ExtractFileName(fAppFilename), szAppFolder + ExtractFileName(fAppFilename)])); + end + else + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Failed to copy app from %s to %s', + [szTempUpdatesFolder + ExtractFileName(fAppFilename), + szAppFolder + ExtractFileName(fAppFilename)])); + + // Copy over WhatsNew + if FileUtil.CopyFile(szTempUpdatesFolder + 'whatsnew.txt', + szAppFolder + 'whatsnew.txt', [cffOverwriteFile]) then + begin + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Copied whatsnew.txt from %s to %s', + [szTempUpdatesFolder + 'whatsnew.txt', szAppFolder + 'whatsnew.txt'])); + end + else + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Failed to copy whatsnew.txt from %s to %s', + [szTempUpdatesFolder + 'whatsnew.txt', szAppFolder + 'whatsnew.txt'])); + + end; + // Deal with C_LAUTRayINI + // Copied to the global application data folder + // Add entry 'Location' + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', 'About to process ' + + szTempUpdatesFolder + C_LAUTRayINI); + + if FileExistsUTF8(szTempUpdatesFolder + C_LAUTRayINI) then + begin + szLAUTrayAppPath := GetAppConfigDirUTF8(False, True); // Create it if necessary + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('App data directory is %s', [szLAUTrayAppPath])); + // AppDataDirectory/LazAutoUpdater/ + szLAUTrayAppPath := UTF8StringReplace(szLAUTrayAppPath, Application.Title, + 'updatehm', [rfIgnoreCase, rfReplaceAll]); + szLAUTrayAppPath := LowerCase(szLAUTrayAppPath); + + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('App data directory changed to %s', [szLAUTrayAppPath])); + // Now AppDataDirectory/updatehm/ + try + if ForceDirectory(szLAUTrayAppPath) then + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Made directory %s', [szLAUTrayAppPath])); + + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('About to copy %s to %s', [szTempUpdatesFolder + + C_LAUTRayINI, szLAUTrayAppPath])); + + Fileutil.CopyFile(szTempUpdatesFolder + C_LAUTRayINI, szLAUTrayAppPath + + C_LAUTRayINI, [cffOverWriteFile]); + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Successfully copied %s to %s ', + [C_LAUTRayINI, szLAUTrayAppPath])); + + if FileExistsUTF8(szLAUTrayAppPath + C_LAUTRayINI) then + begin + INI := TINIFile.Create(szLAUTrayAppPath + C_LAUTRayINI); + SectionStringList := TStringList.Create; + try + INI.ReadSections(SectionStringList); + if SectionStringList.Count > 0 then + begin + INI.WriteString(SectionStringList[0], 'Location', + ExtractFilePath(fAppFilename)); + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Wrote new entry in section %s. Location=%s', + [SectionStringList[0], ExtractFilePath(fAppFilename)])); + end + else + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + 'Failed to find a valid section in ' + C_LAUTRayINI); + finally + FreeAndNil(SectionStringList); + FreeAndNil(INI); + end; + Result := True; + end + else + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + 'Failed to copy ' + C_LAUTRayINI + ' to ' + szLAUTrayAppPath); + except + On E: Exception do + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', + Format('Could not update %s. Error: %s ', [C_LAUTRayINI, E.Message])); + end; + end; + if fFireDebugEvent then + fOndebugEvent(Self, 'DoSilentUpdate', 'Leaving DoSilentUpdate'); + +end; + +function TLazAutoUpdate.RemoteUpdateToNewVersion: boolean; + // Shells to 'lauupdate' console app in ProgramDirectory to remotely update an app +var + cCount: cardinal; + szAppDir: string; +begin + Result := False; + szAppDir := AppendPathDelim(ExtractFilePath(fAppFilename)); + + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + if fFireDebugEvent then + fOndebugEvent(Self, 'RemoteUpdateToNewVersion', + 'Entering RemoteUpdateToNewVersion'); + + // Running update using updatehm? + if ((AppIsRunning(ExtractFileName(fAppFilename)) = False) and + (ExtractFileName(fAppFilename) <> ExtractFileName(fparentApplication.EXEname))) then + Result := DoSilentUpdate + else + begin + cCount := 0; + if not FileExistsUTF8(ProgramDirectory + C_LOCALUPDATER) then + begin + if fShowDialogs then + ShowMessageFmt(C_UpdaterMissing, [ProgramDirectory + C_LOCALUPDATER]); + if fFireDebugEvent then + fOndebugEvent(Self, 'RemoteUpdateToNewVersion', + Format(C_UpdaterMissing, [ProgramDirectory + C_LOCALUPDATER])); + Exit; + end; + + if not DirectoryExistsUTF8(szAppDir + fUpdatesFolder) then + begin + if fShowDialogs then + ShowMessageFmt(C_FolderMissing, [szAppDir + fUpdatesFolder]); + if fFireDebugEvent then + fOndebugEvent(Self, 'RemoteUpdateToNewVersion', + Format(C_FolderMissing, [szAppDir + fUpdatesFolder])); + Exit; + end; + + + + // Update and re-start the app + FUpdateHMProcess := TAsyncProcess.Create(nil); + try + FUpdateHMProcess.Executable := ProgramDirectory + C_LOCALUPDATER; + FUpdateHMProcess.CurrentDirectory := ProgramDirectory; + if not fSilentMode then + FUpdateHMProcess.ConsoleTitle := + Format(C_ConsoleTitle, [fParentApplication.Title]); + FUpdateHMProcess.Parameters.Clear; + FUpdateHMProcess.Parameters.Add(fAppFilename); //Param 1 = EXEname + FUpdateHMProcess.Parameters.Add(fUpdatesFolder); // Param 2 = updates + FUpdateHMProcess.Parameters.Add(C_WhatsNewFilename); // Param 3 = whatsnew.txt + FUpdateHMProcess.Parameters.Add(fParentApplication.Title); // Param 4 = Prettyname + if (fCopyTree = True) then + FUpdateHMProcess.Parameters.Add('copytree'); + // Param 5 = Copy the whole of /updates to the App Folder + if fFireDebugEvent then + fOndebugEvent(Self, 'RemoteUpdateToNewVersion', + Format('Executing %s', [ProgramDirectory + C_LOCALUPDATER])); + FUpdateHMProcess.Execute; + + // Check for C_WhatsNewFilename in the app directory in a LOOP + if fFireDebugEvent then + fOndebugEvent(Self, 'RemoteUpdateToNewVersion', + Format('Waiting for %s', [szAppDir + C_WhatsNewFilename])); + while not FileExistsUTF8(szAppDir + C_WhatsNewFilename) do + begin + fParentApplication.ProcessMessages; + Inc(CCount); + if cCount > 10000000 then + Break; // Get out of jail in case updatehm.exe fails to copy file + end; + + // remotely shut down the app? + if fSilentMode then + begin + If AppIsRunning(ExtractFileName(fAppFilename)) then KillApp(ExtractFileName(fAppFilename)); + if fFireDebugEvent then + fOndebugEvent(Self, 'RemoteUpdateToNewVersion', + Format('Killing %s ready for update', [fAppFilename])); + end; + + finally + FUpdateHMProcess.Free; + if not fSilentMode then + fParentForm.Close; + end; + if fFireDebugEvent then + fOndebugEvent(Self, 'RemoteUpdateToNewVersion', + 'Success'); + Result := True; + end; +end; + +function TLazAutoUpdate.UpdateToNewVersion: boolean; +var + cCount: cardinal; + szAppDir: string; +begin + Result := False; + szAppDir := AppendPathDelim(ExtractFilePath(fAppFilename)); + + // read the VMT once + if Assigned(fOndebugEvent) then + fFireDebugEvent := True; + if fFireDebugEvent then + fOndebugEvent(Self, 'UpdateToNewVersion', + 'Entering UpdateToNewVersion'); + + + // Running update using updatehm? + if not AppIsRunning(ExtractFileName(fAppFilename)) then + Result := DoSilentUpdate + else + begin + cCount := 0; + if not FileExistsUTF8(szAppDir + C_Updater) then + begin + if fShowDialogs then + ShowMessageFmt(C_UpdaterMissing, [szAppDir + C_Updater]); + if fFireDebugEvent then + fOndebugEvent(Self, 'UpdateToNewVersion', + Format(C_UpdaterMissing, [szAppDir + C_Updater])); + Exit; + end; + if not DirectoryExistsUTF8(szAppDir + fUpdatesFolder) then + begin + if fShowDialogs then + ShowMessageFmt(C_FolderMissing, [szAppDir + fUpdatesFolder]); + if fFireDebugEvent then + fOndebugEvent(Self, 'UpdateToNewVersion', + Format(C_FolderMissing, [szAppDir + fUpdatesFolder])); + Exit; + end; + + + // remotely shut down the app? + if fSilentMode then + begin + If AppIsRunning(ExtractFileName(fAppFilename)) then KillApp(ExtractFileName(fAppFilename)); + if fFireDebugEvent then + fOndebugEvent(Self, 'UpdateToNewVersion', + Format('Killing %s ready for update', [fAppFilename])); + end; + + // Update and re-start the app + FUpdateHMProcess := TAsyncProcess.Create(nil); + try + FUpdateHMProcess.Executable := szAppDir + C_UPDATER; + FUpdateHMProcess.CurrentDirectory := szAppDir; + if not fSilentMode then + FUpdateHMProcess.ConsoleTitle := + Format(C_ConsoleTitle, [fParentApplication.Title]); + FUpdateHMProcess.Parameters.Clear; + FUpdateHMProcess.Parameters.Add(ExtractFileName(fAppFilename)); //Param 1 = EXEname + FUpdateHMProcess.Parameters.Add(fUpdatesFolder); // Param 2 = updates + FUpdateHMProcess.Parameters.Add(C_WhatsNewFilename); // Param 3 = whatsnew.txt + FUpdateHMProcess.Parameters.Add(fParentApplication.Title); // Param 4 = Prettyname + if (fCopyTree = True) then + FUpdateHMProcess.Parameters.Add('copytree'); + // Param 5 = Copy the whole of /updates to the App Folder + if fFireDebugEvent then + fOndebugEvent(Self, 'UpdateToNewVersion', + Format('Executing %s', [szAppDir + C_UPDATER])); + FUpdateHMProcess.Execute; + + // Check for C_WhatsNewFilename in the app directory in a LOOP + if fFireDebugEvent then + fOndebugEvent(Self, 'UpdateToNewVersion', + Format('Waiting for %s', [szAppDir + C_WhatsNewFilename])); + while not FileExistsUTF8(szAppDir + C_WhatsNewFilename) do + begin + fParentApplication.ProcessMessages; + Inc(CCount); + if cCount > 10000000 then + Break; // Get out of jail in case updatehm.exe fails to copy file + end; + + finally + FUpdateHMProcess.Free; + if not fSilentMode then + fParentForm.Close; + end; + if fFireDebugEvent then + fOndebugEvent(Self, 'UpdateToNewVersion', + 'Success'); + Result := True; + end; +end; + + +procedure TLazAutoUpdate.ClearUpdateList; +begin + Setlength(fUpdateList, 0); +end; + +function TLazAutoUpdate.AddToUpdateList(APrettyName, APath, AVersionString: string; + AVersionNumber: cardinal): integer; +var + iLast: integer; + TheRec: UpdateListRecord; +begin + Setlength(fUpdateList, 0); + iLast := High(fUpdateList); + if (iLast = -1) then + iLast := 0; // For when array is empty + if (iLast = 1) then + Exit; // TEMP: Only one entry allowed + + + try + Inc(iLast); + Setlength(fUpdateList, iLast); + with TheRec do + begin + PrettyName := APrettyName; + Path := APath; + VersionString := AVersionString; + VersionNumber := AVersionNumber; + end; + fUpdateList[iLast - 1] := TheRec; // Remember array is zero-based + finally + Result := High(fUpdateList); // 0 = one element + fUpdateListCount := Result + 1; // 1 = one element + end; + if (Result = 0) then + begin + fAppFilename := fUpdateList[iLast - 1].Path; + fDownloadZipName := ChangeFileExt(fAppFilename, '.zip'); + fZipfileName := fDownloadZipName; + fApplicationVersionString := fUpdateList[iLast - 1].VersionString; + end; + +end; + +function TLazAutoUpdate.GetThreadDownloadReturnCode: integer; +begin + Result := 0; + if ThreadDownload.ThreadFinished then + Result := fThreadDownload.fReturnCode; +end; + +procedure TLazAutoUpdate.SetProjectType(AValue: TProjectType); +begin + if (AValue <> fProjectType) then + fProjectType := AValue; + if fProjectType = auOther then + begin + fSourceForgeProjectName := C_NotApplicable; + end + else + begin + fUpdatesFolder := C_UpdatesFolder; + fSourceForgeProjectName := ''; + fauOtherSourceFilename := C_NotApplicable; + fauOtherSourceURL := C_NotApplicable; + end; +end; + +procedure TLazAutoUpdate.SetSourceForgeProjectName(Avalue: string); +begin + fSourceForgeProjectName := LowerCase(AValue); +end; + +procedure TLazAutoUpdate.SetAppFilename(Avalue: string); +begin + fAppFilename := AValue; + // Set a default value? + if (fDownloadZipName = '') then + fDownloadZipName := ChangeFileExt(ExtractFilename(fAppFilename), '.zip'); + fThreadDownload.Filename := fUpdatesFolder + PathDelim + fDownloadZipName; +end; + +procedure TLazAutoUpdate.SetApplicationVersionString(Avalue: string); +begin + if AValue = '' then + Exit; + fApplicationVersionString := AValue; + fApplicationVersionQuad := StrToVersionQuad(fApplicationVersionString); +end; + +// Threaded version +// ================ +// Var bDownloadIsPresent:Boolean; +// MyTheadDownload:TThreadedDownload; +// Begin +// MyTheadDownload:=TThreadedDownload.Create(sourceforgedownloadURL,Localfilepath); +// { +// Note the Localfilepath MUST be specified, and can be a different filename and path +// than the filename specified in the sourceforgedownloadURL +// } +// bDownloadIsPresent:=MyTheadDownload.ThreadDownloadHTTP; +// MyTheadDownload.UnzipAfter:=FALSE; // True *by default* if targetfile is a zip file +// If NOT bDownloadIsPresent then Exit; {BailOut ->} +// WHILE NOT MyThreadDownload.ThreadFinished do +// begin +// {.. show the user it is downloading in the background} +// Application.ProcessMessages; // <- Very Important; else the app will freeze! +// end; +// {File has now downloaded OK to Localfilepath (and is optionally unzipped)} +// MyTheadDownload.Free; +// End; + + +{ TDownloadThreadClass } + +constructor TDownloadThreadClass.Create(URL, FileName: string); +begin + inherited Create(True); + fURL := URL; + fFileName := FileName; + fReturnCode := 0; // Failure code + fDownloadSize := 0; + FreeOnTerminate := True; + fLastError := C_OK; +end; + +procedure TDownloadThreadClass.Execute; +begin + // Start the download procedure + DownloadHTTP(fURL, fFileName, fReturnCode, fDownloadSize, fIsSourceForge, fDebugMode); +end; + +//constructor TThreadedDownload.Create(URL, FileName: string); +constructor TThreadedDownload.Create(); +begin + inherited Create; + fThreadFinished := False; + fAppLicationVersionString := '0.0.1'; + fComponentVersion := C_TThreadedDownloadComponentVersion; + fLastError := C_OK; +end; + +{ TThreadedDownload } + +function TThreadedDownload.ThreadDownloadHTTP: boolean; +var + download: TDownloadThreadClass; +begin + if (CompareFileExt(ExtractFilename(fFileName), 'zip', False) = 0) then + fUnzipAfter := True + else + fUnzipAfter := False; + + download := TDownloadThreadClass.Create(fURL, fFileName); + download.OnTerminate := @DownloadTerminiated; + download.fIsSourceForge := fIsSourceForge; + download.fDebugMode := fDebugMode; + download.fLastError := fLastError; + download.FreeOnTerminate := True; + download.start; + Result := True; +end; + +procedure TThreadedDownload.DownloadTerminiated(Sender: TObject); +// Unzips all files ready for updatehm to copy them over +var + UnZipper: TUnZipper; +begin + fReturnCode := (Sender as TDownloadThreadClass).fReturnCode; + fDownloadSize := (Sender as TDownloadThreadClass).fDownloadSize; + fLastError := (Sender as TDownloadThreadClass).fLastError; + fThreadFinished := True; + if (FileExistsUTF8(fFileName) = True) and + (CompareFileExt(fFileName, '.zip', False) = 0) then + if fUnzipAfter then + begin + UnZipper := TUnZipper.Create; + try + UnZipper.FileName := fFileName; + UnZipper.OutputPath := ExtractFileDir(fFileName); + UnZipper.Examine; + UnZipper.UnZipAllFiles; + SysUtils.DeleteFile(fFileName); + finally + UnZipper.Free; + end; + end; +end; + +{ End of class members} + +function DownloadHTTPStream(URL: string; Buffer: TStream; fDebugMode: boolean): boolean; + // Download file; retry if necessary. +const + MaxRetries = 3; +var + RetryAttempt: integer; + HTTPGetResult: boolean; +begin + Result := False; + RetryAttempt := 1; + HTTPGetResult := False; + while ((HTTPGetResult = False) and (RetryAttempt < MaxRetries)) do + begin + HTTPGetResult := HttpGetBinary(URL, Buffer); + //Application.ProcessMessages; + WaitFor(100 * RetryAttempt); + // Sleep(100 * RetryAttempt); + RetryAttempt := RetryAttempt + 1; + end; + if HTTPGetResult = False then + if fDebugmode then + raise Exception.Create(C_CannotLoadFromRemote); + Buffer.Position := 0; + if Buffer.Size = 0 then + if fDebugmode then + raise Exception.Create(C_DownloadIsEmpty) + else + Result := True; +end; + +function SFDirectLinkURL(URL: string; Document: TMemoryStream): string; +{ +Transform this part of the body: + +into a valid URL: +http://downloads.sourceforge.net/project/base64decoder/base64decoder/version%202.0/b64util.zip?r=&ts=1329648745&use_mirror=kent +} +const + Refresh = ' 0 then + begin + URLStart := AnsiPos(URLMarker, HTMLBody[Counter]) + Length(URLMarker); + if URLStart > RefreshStart then + begin + // Look for closing " + URL := Copy(HTMLBody[Counter], URLStart, + PosEx('"', HTMLBody[Counter], URLStart + 1) - URLStart); + //infoln('debug: new url after sf noscript:'); + //infoln(URL); + break; + end; + end; + end; + finally + HTMLBody.Free; + end; + Result := URL; +end; + +function SourceForgeURL(URL: string; fDebugmode: boolean; + var AReturnCode: integer): string; + // Detects sourceforge download and tries to deal with + // redirection, and extracting direct download link. + // Thanks to + // Ocye: http://lazarus.freepascal.org/index.php/topic,13425.msg70575.html#msg70575 +// http://downloads.sourceforge.net/project/lazautoupdate/updates/updatepackwin32.ini?r=&ts=1481210267&use_mirror=heanet +const + SFProjectPart = '//sourceforge.net/projects/'; + SFFilesPart = '/files/'; + SFDownloadPart ='/download'; +var + HTTPSender: THTTPSend; + i, j: integer; + FoundCorrectURL: boolean; + SFDirectory: string; //Sourceforge directory + SFDirectoryBegin: integer; + SFFileBegin: integer; + SFFilename: string; //Sourceforge name of file + SFProject: string; + SFProjectBegin: integer; +begin + // Detect SourceForge download; e.g. from URL + // 1 2 3 4 5 6 7 8 9 + // 1234557890123456789012345578901234567890123455789012345678901234557890123456789012345578901234567890 + // http://sourceforge.net/projects/base64decoder/files/base64decoder/version%202.0/b64util.zip/download + // ^^^project^^^ ^^^directory............^^^ ^^^file^^^ + FoundCorrectURL := True; //Assume not a SF download + i := Pos(SFProjectPart, URL); + if i > 0 then + begin + // Possibly found project; now extract project, directory and filename parts. + SFProjectBegin := i + Length(SFProjectPart); + j := PosEx(SFFilesPart, URL, SFProjectBegin); + if (j > 0) then + begin + SFProject := Copy(URL, SFProjectBegin, j - SFProjectBegin); + SFDirectoryBegin := PosEx(SFFilesPart, URL, SFProjectBegin) + Length(SFFilesPart); + if SFDirectoryBegin > 0 then + begin + // Find file + // URL might have trailing arguments... so: search for first + // /download coming up from the right, but it should be after + // /files/ + i := RPos(SFDownloadPart, URL); + // Now look for previous / so we can make out the file + // This might perhaps be the trailing / in /files/ + SFFileBegin := RPosEx('/', URL, i - 1) + 1; + + if SFFileBegin > 0 then + begin + SFFilename := Copy(URL, SFFileBegin, i - SFFileBegin); + //Include trailing / + SFDirectory := Copy(URL, SFDirectoryBegin, SFFileBegin - SFDirectoryBegin); + // if fdebugmode then SHowMessage('SFFilename=' + SFFilename); + // if fdebugmode then SHowMessage('SFDirectory=' + SFDirectory); + FoundCorrectURL := False; + end; + end; + end; + end; + + if not FoundCorrectURL then + begin + try + // Rewrite URL if needed for Sourceforge download redirection + // Detect direct link in HTML body and get URL from that + HTTPSender := THTTPSend.Create; + //Who knows, this might help: + HTTPSender.UserAgent := + 'curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18'; + while not FoundCorrectURL do + begin + HTTPSender.HTTPMethod('GET', URL); + // if fdebugmode then showmessagefmt('Return code is %d',[HTTPSender.Resultcode]); + // SEE: http_ReturnCodes.txt + case HTTPSender.Resultcode of + 301, 302, 307: + begin + for i := 0 to HTTPSender.Headers.Count - 1 do + Begin + // if fdebugmode then SHowMessage('Header string=' + HTTPSender.Headers.Strings[i]); + if (Pos('Location: ', HTTPSender.Headers.Strings[i]) > 0) or + (Pos('location: ', HTTPSender.Headers.Strings[i]) > 0) then + begin + // if fdebugmode then SHowMessage('Header string=' + LeftStr(HTTPSender.Headers.Strings[i],Length( HTTPSender.Headers.Strings[i]) div 2)); + //if fdebugmode then SHowMessage('Header string=' + RightStr(HTTPSender.Headers.Strings[i],Length( HTTPSender.Headers.Strings[i]) div 2)); + j := Pos('use_mirror=', HTTPSender.Headers.Strings[i]); + if j > 0 then + URL := + 'http://' + RightStr(HTTPSender.Headers.Strings[i], + length(HTTPSender.Headers.Strings[i]) - j - 10) + + 'downloads.sourceforge.net/project/' + SFProject + + '/' + SFDirectory + SFFilename + else + URL := StringReplace(HTTPSender.Headers.Strings[i], + 'Location: ', '', []); + HTTPSender.Clear;//httpsend + FoundCorrectURL := True; + AReturnCode := HTTPSender.Resultcode; + break; //out of rewriting loop + end; + end; + end; + 100..200: + begin + //Could be a sourceforge timer/direct link page, but... + if AnsiPos('Content-Type: text/html', HTTPSender.Headers.Text) > 0 then + begin + // find out... it's at least not a binary + URL := SFDirectLinkURL(URL, HTTPSender.Document); + end; + FoundCorrectURL := True; //We're done by now + AReturnCode := HTTPSender.Resultcode; + end; + 500: + begin + // if fDebugMode then ShowMessageFmt(C_Error500, [HTTPSender.ResultCode]); + AReturnCode := HTTPSender.Resultcode; + Break; + end; + //Raise Exception.Create('No internet connection available'); + //Internal Server Error ('+aURL+')'); + 404: + begin + // if fDebugMode then ShowMessageFmt(C_Error404, [HTTPSender.ResultCode]); + AReturnCode := HTTPSender.Resultcode; + Break; + end; + else + raise Exception.Create(C_DownloadFailedErrorCode + + IntToStr(HTTPSender.ResultCode) + ' (' + HTTPSender.ResultString + ')'); + end;//case + end;//while + finally + AReturnCode := HTTPSender.Resultcode; + HTTPSender.Free; + end; + end; + Result := URL; +end; + +function DownloadHTTP(URL, TargetFile: string; var ReturnCode, DownloadSize: integer; +bIsSourceForge, fDebugmode: boolean): boolean; + // Download file; retry if necessary. + // Deals with SourceForge download links + // Could use Synapse HttpGetBinary, but that doesn't deal + // with result codes (i.e. it happily downloads a 404 error document) +const + MaxRetries = 3; +var + HTTPGetResult : boolean; + HTTPSender : THTTPSend; + RetryAttempt,i : integer; +begin + Result := False; + RetryAttempt := 1; + //Optional: mangling of Sourceforge file download URLs; see below. + if bIsSourceForge then + begin + URL := SourceForgeURL(URL, fDebugMode, ReturnCode); //Deal with sourceforge URLs + // if fDebugMode then ShowMessage(LeftStr(URL,Length(URL) div 2)); + // if fDebugMode then ShowMessage(RightStr(URL,Length(URL) div 2)); + end; + + // ReturnCode may not be useful, but it's provided here + HTTPSender := THTTPSend.Create; + try + try + // Try to get the file + HTTPGetResult := HTTPSender.HTTPMethod('GET', URL); + + while (HTTPGetResult = False) and (RetryAttempt < MaxRetries) do + begin + WaitFor(500 * RetryAttempt); + // sleep(500 * RetryAttempt); + HTTPGetResult := HTTPSender.HTTPMethod('GET', URL); + RetryAttempt := RetryAttempt + 1; + end; + // If we have an answer from the server, check if the file + // was sent to us + ReturnCode := HTTPSender.Resultcode; + DownloadSize := HTTPSender.DownloadSize; + ShowMessageFmt('DownloadHTTP Return code=%d',[HTTPSender.Resultcode]); + ShowMessageFmt('DownloadHTTP Download Size=%d',[HTTPSender.DownloadSize]); + case HTTPSender.Resultcode of + 100..299: + begin + with TFileStream.Create(TargetFile, fmCreate or fmOpenWrite) do + try + Seek(0, soFromBeginning); + CopyFrom(HTTPSender.Document, 0); + finally + Free; + end; + Result := True; + end; //informational, success + 301: // moved permanently + begin + URL:=SourceForgeURL(URL,TRUE,ReturnCode); + ShowMessage(URL); + end; + 302..399: + Result := False; //redirection. Not implemented, but could be. + 400..499: Result := False; //client error; 404 not found etc + 500..599: Result := False; //internal server error + else + Result := False; //unknown code + end; + except + // We don't care for the reason for this error; the download failed. + Result := False; + end; + finally + HTTPSender.Free; + end; + +end; + + +end. diff --git a/components/lazautoupdate/latest_stable/versionsupport.pas b/components/lazautoupdate/latest_stable/versionsupport.pas new file mode 100644 index 000000000..c5acc0fb4 --- /dev/null +++ b/components/lazautoupdate/latest_stable/versionsupport.pas @@ -0,0 +1,258 @@ +Unit VersionSupport; + +{$mode objfpc} + +Interface + +(* + Building on the excellent vinfo.pas supplied by Paul Ishenin and available elsewhere on these Lazarus + Forums + - I hid the TVersionInfo class from the end user to simplify their (mine) number of required Uses... + - Added defensive code to TVersionInfo if no build info is compiled into the exe + - Deduced GetResourceStrings - works under Linux 64/GTK2 with Lazarus 0.9.30, but fails under + Win XP 32bit/Lazarus 0.9.29 - suspecting my install as the lazresexplorer example also fails + for me under Lazarus 0.9.29, but works with Lazarus 0.9.30 + + Trawled through IDE source code, FPC source code and Lazarus supplied example program lasresexplorer + to find the other defines and lookups... + + End user only needs to use VersionSupport - no other units necessary for their project. + + Jedi CodeFormatter seems to fail on the {$I %VARIABLE%} references, so sticking them all in here + means end user code can be neatly formatted using Jedi CodeFormatter + + Other interesting includes I picked up in my travels are... + // {$I %HOME%} = User Home Directory + // {$I %FILE%} = Current pas file + // {$I %LINE%} = current line number + + Mike Thompson - mike.cornflake@gmail.com + July 24 2011 +*) + +Uses + Classes, SysUtils; + +Function GetFileVersion: String; +Function GetProductVersion: String; +Function GetCompiledDate: String; +Function GetCompilerInfo: String; +Function GetTargetInfo: String; +Function GetOS: String; +Function GetResourceStrings(oStringList : TStringList) : Boolean; +Function GetLCLVersion: String; +function GetWidgetSet: string; + +Const + WIDGETSET_GTK = 'GTK widget set'; + WIDGETSET_GTK2 = 'GTK 2 widget set'; + WIDGETSET_WIN = 'Win32/Win64 widget set'; + WIDGETSET_WINCE = 'WinCE widget set'; + WIDGETSET_CARBON = 'Carbon widget set'; + WIDGETSET_QT = 'QT widget set'; + WIDGETSET_fpGUI = 'fpGUI widget set'; + WIDGETSET_OTHER = 'Other gui'; + +Implementation + +Uses + resource, versiontypes, versionresource, LCLVersion, InterfaceBase; + +Type + TVersionInfo = Class + private + FBuildInfoAvailable: Boolean; + FVersResource: TVersionResource; + Function GetFixedInfo: TVersionFixedInfo; + Function GetStringFileInfo: TVersionStringFileInfo; + Function GetVarFileInfo: TVersionVarFileInfo; + public + Constructor Create; + Destructor Destroy; override; + + Procedure Load(Instance: THandle); + + Property BuildInfoAvailable: Boolean Read FBuildInfoAvailable; + + Property FixedInfo: TVersionFixedInfo Read GetFixedInfo; + Property StringFileInfo: TVersionStringFileInfo Read GetStringFileInfo; + Property VarFileInfo: TVersionVarFileInfo Read GetVarFileInfo; + End; + +function GetWidgetSet: string; +begin + case WidgetSet.LCLPlatform of + lpGtk: Result := WIDGETSET_GTK; + lpGtk2: Result := WIDGETSET_GTK2; + lpWin32: Result := WIDGETSET_WIN; + lpWinCE: Result := WIDGETSET_WINCE; + lpCarbon:Result := WIDGETSET_CARBON; + lpQT: Result := WIDGETSET_QT; + lpfpGUI: Result := WIDGETSET_fpGUI; + else + Result:=WIDGETSET_OTHER; + end; +end; + +Function GetCompilerInfo: String; +begin + Result := 'FPC '+{$I %FPCVERSION%}; +end; + +Function GetTargetInfo: String; +begin + Result := {$I %FPCTARGETCPU%}+' - '+{$I %FPCTARGETOS%}; +end; + +Function GetOS: String; +Begin + Result := {$I %FPCTARGETOS%}; +End; + +Function GetLCLVersion: String; +begin + Result := 'LCL '+lcl_version; +end; + +Function GetCompiledDate: String; +Var + sDate, sTime: String; +Begin + sDate := {$I %DATE%}; + sTime := {$I %TIME%}; + + Result := sDate + ' at ' + sTime; +End; + +{ Routines to expose TVersionInfo data } + +Var + FInfo: TVersionInfo; + +Procedure CreateInfo; +Begin + If Not Assigned(FInfo) Then + Begin + FInfo := TVersionInfo.Create; + FInfo.Load(HINSTANCE); + End; +End; + +Function GetResourceStrings(oStringList: TStringList): Boolean; +Var + i, j : Integer; + oTable : TVersionStringTable; +begin + CreateInfo; + + oStringList.Clear; + Result := False; + + If FInfo.BuildInfoAvailable Then + Begin + Result := True; + For i := 0 To FInfo.StringFileInfo.Count-1 Do + Begin + oTable := FInfo.StringFileInfo.Items[i]; + + For j := 0 To oTable.Count-1 Do + If Trim(oTable.ValuesByIndex[j])<>'' Then + oStringList.Values[oTable.Keys[j]] := oTable.ValuesByIndex[j]; + end; + end; +end; + +Function ProductVersionToString(PV: TFileProductVersion): String; +Begin + Result := Format('%d.%d.%d.%d', [PV[0], PV[1], PV[2], PV[3]]); +End; + +Function GetProductVersion: String; +Begin + CreateInfo; + + If FInfo.BuildInfoAvailable Then + Result := ProductVersionToString(FInfo.FixedInfo.ProductVersion) + Else + Result := 'No build information available'; +End; + +Function GetFileVersion: String; +Begin + CreateInfo; + + If FInfo.BuildInfoAvailable Then + Result := ProductVersionToString(FInfo.FixedInfo.FileVersion) + Else + Result := 'No build information available'; +End; + +{ TVersionInfo } + +Function TVersionInfo.GetFixedInfo: TVersionFixedInfo; +Begin + Result := FVersResource.FixedInfo; +End; + +Function TVersionInfo.GetStringFileInfo: TVersionStringFileInfo; +Begin + Result := FVersResource.StringFileInfo; +End; + +Function TVersionInfo.GetVarFileInfo: TVersionVarFileInfo; +Begin + Result := FVersResource.VarFileInfo; +End; + +Constructor TVersionInfo.Create; +Begin + Inherited Create; + + FVersResource := TVersionResource.Create; + FBuildInfoAvailable := False; +End; + +Destructor TVersionInfo.Destroy; +Begin + FVersResource.Free; + + Inherited Destroy; +End; + +Procedure TVersionInfo.Load(Instance: THandle); +Var + Stream: TResourceStream; + ResID: Integer; + Res: TFPResourceHandle; +Begin + FBuildInfoAvailable := False; + ResID := 1; + + // Defensive code to prevent failure if no resource available... + Res := FindResource(Instance, PChar(PtrInt(ResID)), PChar(RT_VERSION)); + If Res = 0 Then + Exit; + + Stream := TResourceStream.CreateFromID(Instance, ResID, PChar(RT_VERSION)); + Try + FVersResource.SetCustomRawDataStream(Stream); + + // access some property to load from the stream + FVersResource.FixedInfo; + + // clear the stream + FVersResource.SetCustomRawDataStream(nil); + + FBuildInfoAvailable := True; + Finally + Stream.Free; + End; +End; + +Initialization + FInfo := nil; + +Finalization + If Assigned(FInfo) Then + FInfo.Free; +End.