This commit is contained in:
f1iwq2
2025-08-07 09:53:54 +02:00
parent 037e56f666
commit 659c39512c
20 changed files with 4357 additions and 4190 deletions
+14 -3
View File
@@ -1,6 +1,6 @@
object FormAnalyseCDM: TFormAnalyseCDM
Left = 193
Top = 60
Left = 206
Top = 145
AutoScroll = False
Caption = 'Fen'#234'tre r'#233'seau CDM'
ClientHeight = 596
@@ -11,9 +11,11 @@ object FormAnalyseCDM: TFormAnalyseCDM
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
KeyPreview = True
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
OnKeyDown = FormKeyDown
OnMouseWheel = FormMouseWheel
OnResize = FormResize
DesignSize = (
@@ -23,11 +25,12 @@ object FormAnalyseCDM: TFormAnalyseCDM
TextHeight = 13
object Label4: TLabel
Left = 1001
Top = 520
Top = 512
Width = 27
Height = 13
Anchors = [akTop, akRight]
Caption = 'Zoom'
WordWrap = True
end
object ImageLoco: TImage
Left = 688
@@ -56,6 +59,14 @@ object FormAnalyseCDM: TFormAnalyseCDM
Transparent = True
Visible = False
end
object Label5: TLabel
Left = 1005
Top = 528
Width = 24
Height = 13
Anchors = [akTop, akRight]
Caption = '+ -'
end
object ScrollBox1: TScrollBox
Left = 8
Top = 16
+20 -1
View File
@@ -53,6 +53,7 @@ type
ButtonAnime: TButton;
ImageLoco: TImage;
CheckBoxAutres: TCheckBox;
Label5: TLabel;
procedure FormResize(Sender: TObject);
procedure CheckSegmentsClick(Sender: TObject);
procedure CheckConnexionsClick(Sender: TObject);
@@ -77,6 +78,8 @@ type
Shift: TShiftState; X, Y: Integer);
procedure ImageCDMMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Déclarations privées }
public
@@ -4717,7 +4720,7 @@ begin
CheckDet.checked:=true;
LabelPorts.Width:=160;
LabelPorts.Height:=23;
KeyPreview:=true; // pour avtiver l'evt onKeyPressed
ImageCDM.Top:=0;
ImageCDM.Left:=0;
formAnalyseCDM.Caption:=NomModuleCDM;
@@ -5579,6 +5582,22 @@ begin
SourisBas:=false;
end;
procedure TFormAnalyseCDM.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var i : integer;
begin
if key=109 then
begin
i:=trackbar1.position;
if i<90 then trackBar1.Position:=i+1;
end;
if key=107 then
begin
i:=trackbar1.position;
if i>50 then trackBar1.Position:=i-1;
end;
end;
end.
+2 -1
View File
@@ -668,6 +668,7 @@ begin
end;
with CompteurT[i] do
begin
tb.Height:=15;
gb.Width:=LargComptC;
gb.height:=ofsGBH+him+CompteurT[i].tb.Height+ofsGBB;
gb.Top:=(gb.Height+5)*((i-1) div NbreCompteursPLigne);
@@ -769,7 +770,7 @@ begin
// imageC <-- FCBitMap (on écrit les vitesses) <- ImageCompteur (grande)
// créer un bitmap réduit qui sert de référence
Scompteur[i].FCBitMap.Free; // zizi
Scompteur[i].FCBitMap.Free;
Scompteur[i].fcBitMap:=tbitmap.Create;
with Scompteur[i].FCBitMap do
begin
+933 -15
View File
File diff suppressed because it is too large Load Diff
+99 -77
View File
@@ -7426,6 +7426,7 @@ var i,j,x,y,l,k,LongestLength,PixelLength : integer;
begin
if AffEvt or (debug=1) then Affiche('Création fenêtre config',clLime);
editAdrIPCDM.Hint:='Adresse IP du PC sur lequel CDM rail s''exécute'+#13+'ou 127.0.0.1 pour indiquer ce pc';
ValueListEditor.Visible:=true;
// liste des paramètres du mode expert de la ValueListEditor
@@ -7482,8 +7483,8 @@ begin
with Liste[5] do
begin
nom:='5. Utilisation de l''anti timeout Ethernet';
aide:='Si 1, envoie un caractère chaque minute à la centrale '+#13+
'pour éviter sa déconnexion (uniquement en Ethernet)';
aide:='Si avec, envoie un caractère chaque minute à la centrale '+#13+
'pour éviter sa déconnexion (uniquement en Ethernet XpressNet)';
typ:= PickList;
variable:=@AntiTimeoutEthLenz;
typeVar:=Bool;
@@ -7713,47 +7714,7 @@ begin
TreeViewL.HideSelection:=false;
TreeViewL.Images:=ImageListLogic;
with SpinEditEtat do
begin
Top:=19;
Left:=160;
Visible:=false;
text:='1';
MaxValue:=2;
Hint:='Etat de l''accessoire'+#13+
'1=dévié'+#13+
'2=droit';
ShowHint:=true;
end;
LabelEtat.Top:=4;
LabelEtat.Left:=160;
LabelEtat.Visible:=false;
with ComboBoxOperateur do
begin
Style:=csOwnerDrawFixed;
clear;
itemHeight:=18; // hauteur des icones
items.add(nomopET);
items.add(NomOpOU);
items.add(NomOpNonET);
items.add(NomOpNonOU);
end;
RadioGroupOP.visible:=false;
with ComboBoxVar do
begin
Style:=csOwnerDrawFixed;
clear;
itemHeight:=18; // hauteur des icones
items.add(NomEtatDCC);
items.add(NomEtatDet);
items.add(NomEtatBoutonTCO);
items.add(NomEtatMemoire);
end;
s:=GetCurrentDir;
if not(directoryExists(rep_icones)) then CreateDir(rep_icones);
ChDir(s); // revient au rep initial
@@ -8164,7 +8125,7 @@ begin
with LbZTitre do
begin
Left:=64;Top:=20;Width:=50;Height:=12;
caption:='Zone ferme Zone ouvre';
caption:='Zone ferme Zone ouvre';
name:='LbZTitre';
parent:=GroupBoxPNZ;
end;
@@ -8548,6 +8509,53 @@ begin
// marche pas!!
SendMessage(ListBoxActions.Handle,LB_SETHORIZONTALEXTENT,PixelLength,0);
// fonctions
LabeledEditEtatACC.Left:=LabeledEditDCC.Left+LabeledEditDCC.editlabel.Width+10;
LabeledEditTrain.Left:=LabeledEditEtatACC.Left;
RadioGroupOP.Left:=LabeledEditEtatACC.Left+LabeledEditEtatACC.editLabel.width+10;
with SpinEditEtat do
begin
Top:=22;
Left:=LabeledEditEtatACC.left;
Visible:=false;
text:='1';
MaxValue:=2;
Hint:='Etat de l''accessoire'+#13+
'1=dévié'+#13+
'2=droit';
ShowHint:=true;
end;
LabelEtat.Top:=4;
LabelEtat.Left:=SpinEditEtat.left;
LabelEtat.Visible:=false;
with ComboBoxOperateur do
begin
Style:=csOwnerDrawFixed;
clear;
itemHeight:=18; // hauteur des icones
items.add(nomopET);
items.add(NomOpOU);
items.add(NomOpNonET);
items.add(NomOpNonOU);
end;
RadioGroupOP.visible:=false;
with ComboBoxVar do
begin
Style:=csOwnerDrawFixed;
clear;
itemHeight:=18; // hauteur des icones
items.add(NomEtatDCC);
items.add(NomEtatDet);
items.add(NomEtatBoutonTCO);
items.add(NomEtatMemoire);
end;
// actionneurs PN
ListBoxPN.Clear;
longestLength:=0;
@@ -8626,6 +8634,7 @@ begin
'Le nombre de crans à 128 est validé par la mise à 1 du bit 1 du CV29 du décodeur';
LabeledEditCrans.ShowHint:=true;
// compteurs
ComboBoxCompt.ItemIndex:=0;
@@ -8679,8 +8688,6 @@ begin
ButtonCouleur.Visible:=false;
{$IFEND}
ImageSignaux.picture.Assign(formpilote.ImageSignaux.Picture);
EditComUSB.Hint:='COMX:vitesse,parité,nombre de bits,bits de stop,protocole'+#13+
'procotole = 0 : sans protocole, avec temporisation d''envoi entre trames (LZV200)'+#13+
' = 1 : protocole logiciel XON-XOFF avec temporisation d''envoi'+#13+
@@ -8726,24 +8733,8 @@ begin
label72.caption:='La rotation de bouton changera la vitesse du train. L''appui sur le bouton stoppe le train.'+#13+
'Les évènements clavier sont interceptés par signaux complexes ce qui ne nécessite pas d''activer la fenêtre';
{
with GroupBoxBr do
begin
Left:=312;
top:=170;
Width:=260;
Height:=140;
visible:=true;
end;
with GroupBoxBT do
begin
Left:=312;
top:=170;
Width:=260;
Height:=140;
Visible:=false;
end;}
GroupBoxBT.Visible:=false;
clic_BRM;
PageControl.ActivePage:=Formconfig.TabSheetCDM; // force le premier onglet sur la page
couleurs_config;
@@ -17521,7 +17512,7 @@ end;
procedure calculs;
var vitesse,erreur,distArret : integer;
coeff,vitR,TempsArret : single;
vitR,TempsArret : single;
begin
val(FormConfig.LabeledEditCalcV.text,vitesse,erreur);
vitesse:=abs(vitesse);
@@ -17977,7 +17968,7 @@ begin
LabeledEditDCC.text:=intToSTR(fonction[foncCourante,iNode].adresse);
end;
if i=EtatDet then
if i=EtatDet then // actionneur détecteur
begin
RadioGroupOP.Visible:=false;
LabelEtat.Visible:=false;
@@ -17993,7 +17984,7 @@ begin
if i=EtatBoutonTCO then
begin
RadioGroupOP.Visible:=false;
LabelEtat.Visible:=true;
//LabelEtat.Visible:=true;
SpinEditEtat.Visible:=false;
LabeledEditEtatACC.Visible:=true;
LabeledEditTrain.visible:=false;
@@ -18009,7 +18000,7 @@ begin
with RadioGroupOP do
begin
Visible:=true;
left:=208;
left:=LabeledEditEtatACC.Left+LabeledEditEtatACC.width+10;
top:=8;
end;
LabeledEditDCC.Visible:=true;
@@ -18980,7 +18971,6 @@ end;
procedure TFormConfig.ValueListEditorMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var BarInfo: TScrollInfo;
begin
exit;
y:=y div (ValueListEditor.RowHeights[0]+1);
@@ -19123,10 +19113,10 @@ begin
shapeB7.Brush.Color:=clGray;
shapeB8.Brush.Color:=clGray;
GroupBoxBt.visible:=true;
GroupBoxBT.Top:=GroupBoxBloc.Top+GroupBoxBloc.Height+10;
GroupBoxBr.visible:=false;
GroupBoxBT.caption:='Bouton n°'+intToSTR(BoutonBloc);
end;
end;
procedure rotatif;
@@ -19144,6 +19134,7 @@ begin
shapeB8.Brush.Color:=clGray;
GroupBoxBR.visible:=true;
GroupBoxBT.Visible:=false;
GroupBoxBR.Top:=GroupBoxBloc.Top+GroupBoxBloc.Height+10;
end;
end;
@@ -19264,7 +19255,12 @@ procedure TFormConfig.LabeledEditCTChange(Sender: TObject);
var i,erreur : integer;
begin
val(LabeledEditCT.Text,i,erreur);
if (erreur<>0) or (i<0) or (i>255) then exit;
if (erreur<>0) or (i<0) or (i>255) then
begin
labelInfo.Caption:='Erreur : valeur de 1 à 255';
exit;
end;
labelInfo.Caption:='';
case BoutonBloc of
1 : blocUSB[NumBlocUSB].Bp1:=i;
2 : blocUSB[NumBlocUSB].Bp2:=i;
@@ -19283,7 +19279,12 @@ procedure TFormConfig.LabeledEditRmChange(Sender: TObject);
var i,erreur : integer;
begin
val(LabeledEditRm.Text,i,erreur);
if (erreur<>0) or (i<0) or (i>255) then exit;
if (erreur<>0) or (i<0) or (i>255) then
begin
labelInfo.Caption:='Erreur : valeur de 1 à 255';
exit;
end;
labelInfo.Caption:='';
blocUSB[NumBlocUSB].rotatifM:=i;
end;
@@ -19291,7 +19292,12 @@ procedure TFormConfig.LabeledEditRpChange(Sender: TObject);
var i,erreur : integer;
begin
val(LabeledEditRp.Text,i,erreur);
if (erreur<>0) or (i<0) or (i>255) then exit;
if (erreur<>0) or (i<0) or (i>255) then
begin
labelInfo.Caption:='Erreur : valeur de 1 à 255';
exit;
end;
labelInfo.Caption:='';
blocUSB[NumBlocUSB].rotatifP:=i;
end;
@@ -19299,7 +19305,12 @@ procedure TFormConfig.LabeledEditClicChange(Sender: TObject);
var i,erreur : integer;
begin
val(LabeledEditClic.Text,i,erreur);
if (erreur<>0) or (i<0) or (i>255) then exit;
if (erreur<>0) or (i<0) or (i>255) then
begin
labelInfo.Caption:='Erreur : valeur de 1 à 255';
exit;
end;
labelInfo.Caption:='';
blocUSB[NumBlocUSB].clic:=i;
end;
@@ -19308,7 +19319,12 @@ procedure TFormConfig.LabeledEditNUMChange(Sender: TObject);
var i,erreur : integer;
begin
val(LabeledEditNUM.Text,i,erreur);
if (erreur<>0) or (i<1) or (i>10) then exit;
if (erreur<>0) or (i<1) or (i>10) then
begin
labelInfo.Caption:='Erreur : valeur de 1 à 10';
exit;
end;
labelInfo.Caption:='';
NumBlocUSB:=i;
LabeledEditCT.Text:='';
LabeledEditRM.Text:='';
@@ -19326,13 +19342,19 @@ begin
i:=index_train_nom(BlocUSB[NumBlocUSB].AffTrain);
ComboBoxUSBTr.ItemIndex:=i;
label72.caption:='';
clic_BRM;
end;
procedure TFormConfig.LabeledEditFChange(Sender: TObject);
var i,erreur : integer;
begin
val(LabeledEditF.Text,i,erreur);
if (erreur<>0) or (i<0) or (i>30) then exit;
if (erreur<>0) or (i<0) or (i>30) then
begin
labelInfo.Caption:='Erreur : valeur de 0 à 30';
exit;
end;
labelInfo.Caption:='';
case boutonbloc of
1 : blocUSB[NumBlocUSB].Fbp1:=i;
2 : blocUSB[NumBlocUSB].Fbp2:=i;
@@ -19602,7 +19624,6 @@ begin
ListBoxTrains.items[ligneclicTrain]:=encode_train(ligneclicTrain+1);
ListBoxTrains.selected[ligneclicTrain]:=true;
calcul_equations_coeff(ligneclicTrain+1);
end;
procedure TFormConfig.LabeledEditVit3Change(Sender: TObject);
@@ -19626,9 +19647,10 @@ begin
ListBoxTrains.selected[ligneclicTrain]:=true;
calcul_equations_coeff(ligneclicTrain+1);
end;
end.
+6 -6
View File
@@ -485,10 +485,10 @@ object FormConfCellTCO: TFormConfCellTCO
OnClick = CheckPinvClick
end
object GroupBoxAction: TGroupBox
Left = 312
Left = 320
Top = 152
Width = 273
Height = 145
Height = 153
Caption = 'Actions'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
@@ -497,8 +497,8 @@ object FormConfCellTCO: TFormConfCellTCO
Font.Style = []
ParentFont = False
TabOrder = 3
object Label3: TLabel
Left = 16
object LabelAction: TLabel
Left = 8
Top = 122
Width = 110
Height = 13
@@ -523,7 +523,7 @@ object FormConfCellTCO: TFormConfCellTCO
OnMouseDown = ListBoxActionMouseDown
end
object EditParam1: TEdit
Left = 144
Left = 128
Top = 118
Width = 33
Height = 21
@@ -534,7 +534,7 @@ object FormConfCellTCO: TFormConfCellTCO
OnChange = EditParam1Change
end
object EditParam2: TEdit
Left = 184
Left = 168
Top = 118
Width = 33
Height = 21
+11 -5
View File
@@ -36,7 +36,7 @@ type
ListBoxAction: TListBox;
EditParam1: TEdit;
EditParam2: TEdit;
Label3: TLabel;
LabelAction: TLabel;
ImageListIcones: TImageList;
BitBtnOk: TBitBtn;
BitBtnAnnule: TBitBtn;
@@ -792,7 +792,7 @@ begin
top:=140;
width:=273;
height:=145;
end;
end;
with GroupBoxOrientation do
begin
left:=8;
@@ -803,15 +803,18 @@ begin
left:=16;
top:=140;
width:=273;
height:=145;
height:=ListBoxAction.Height+60;;
end;
with GroupBoxCanton do
begin
left:=16;
top:=140;
width:=273;
height:=145;
height:=130;
end;
LabelAction.top:=ListBoxAction.top+ListBoxAction.Height+10;
EditParam1.Top:=ListBoxAction.top+ListBoxAction.Height+6;
EditParam2.Top:=ListBoxAction.top+ListBoxAction.Height+6;
With StringGridDet do
begin
@@ -858,6 +861,7 @@ begin
// une imagelist c'est 16x16 maxi
with ListBoxAction do
begin
Font.Size:=round(8*RedFonte);
Items.Add(Format('%d%s', [0, 'Afficher TCO'])); // valeur d'index de l'icone dans la ImagelistIcones
itemHeight:=16;
Items.Add(Format('%d%s', [1, 'Afficher Signaux Complexes']));
@@ -878,6 +882,8 @@ begin
itemHeight:=16;
Items.Add(Format('%d%s', [26, 'Bouton bistable']));
itemHeight:=16;
//height:=GroupBoxEl.Height-ListBoxAction.top;
end;
// calcul des éléments en fonction de la taille de GroupBoxEL à cause du dimensionnement enn % des textes windows
@@ -888,7 +894,7 @@ begin
GroupBoxCanton.Width:=GroupBoxEL.Width-10;
GroupBoxDet.top:=RadioGroupSEl.Height+RadioGroupSel.Top+10;
GroupBoxDet.Width:=GroupBoxEL.Width-10;
GroupBoxAction.top:=RadioGroupSEl.Height+RadioGroupSel.Top+10;
GroupBoxAction.top:=RadioGroupSEl.Height+RadioGroupSel.Top+5;
GroupBoxAction.Width:=GroupBoxEL.Width-10;
GroupBoxOrientation.top:=RadioGroupSEl.Height+RadioGroupSel.Top+10;
+3 -3
View File
@@ -3,7 +3,7 @@ object FormIntro: TFormIntro
Top = 150
BorderStyle = bsDialog
Caption = 'Introduction de donn'#233'es'
ClientHeight = 106
ClientHeight = 103
ClientWidth = 188
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
@@ -19,9 +19,9 @@ object FormIntro: TFormIntro
Top = 24
Width = 57
Height = 21
EditLabel.Width = 47
EditLabel.Width = 102
EditLabel.Height = 13
EditLabel.Caption = 'D'#233'tecteur'
EditLabel.Caption = 'D'#233'tecteur / aiguillage'
TabOrder = 0
end
object ButtonTrCanton: TButton
+4 -2
View File
@@ -22,7 +22,7 @@ type
var
FormIntro: TFormIntro;
AchercherDet,AchercherCanton : integer;
AchercherDetAig,AchercherCanton : integer;
implementation
@@ -35,10 +35,12 @@ begin
close;
end;
procedure TFormIntro.ButtonTrDetClick(Sender: TObject);
var erreur : integer;
begin
val(LabeledEditDetAig.text,AchercherDet,erreur);
val(LabeledEditDetAig.text,AchercherDetAig,erreur);
close;
end;
-910
View File
@@ -68,916 +68,6 @@ object FormPilote: TFormPilote
Height = 13
Caption = 'D'#233'codeur:'
end
object ImageSignaux: TImage
Left = 168
Top = 72
Width = 153
Height = 105
Picture.Data = {
0A544A504547496D6167659A700000FFD8FFE000104A46494600010101006000
600000FFFE003C43524541544F523A2067642D6A7065672076312E3020287573
696E6720494A47204A50454720763632292C207175616C697479203D2039300A
00FFDB0043000201010201010202020202020202030503030303030604040305
070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C07090E0F0D
0C0E0B0C0C0CFFDB004301020202030303060303060C0807080C0C0C0C0C0C0C
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
0C0C0C0C0C0C0C0C0C0C0CFFC000110800B400FA03012200021101031101FFC4
001F0000010501010101010100000000000000000102030405060708090A0BFF
C400B5100002010303020403050504040000017D010203000411051221314106
13516107227114328191A1082342B1C11552D1F02433627282090A161718191A
25262728292A3435363738393A434445464748494A535455565758595A636465
666768696A737475767778797A838485868788898A92939495969798999AA2A3
A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8
D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F010003010101
0101010101010000000000000102030405060708090A0BFFC400B51100020102
0404030407050404000102770001020311040521310612415107617113223281
08144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A
35363738393A434445464748494A535455565758595A636465666768696A7374
75767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9
AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5
E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00F6609F28
14A1702A5F2B28BED4F58706BF63B9F94B5A9E05FB54FEDF7E0CFD98BC6B63E1
5D622D56F356D434D9B56B85B24461A7DA44923EF7DC46E67F29D5507271938E
33E7BFB497C61F09C3F0847C4EF03F86AE3E2678DEE6C65D33C3D0DA1926D2F4
684ED93FB52EE25FF5F2832324300FDDFCB2198905623EA3FB697EC79E09FDA2
7C09A96A1ACE9E2DFC4D6DA5CB6163ADDB3797776D1C990518F2B247F3B7CAE0
E3736D2A4935F8E3F013C57E3CF837F1635883C27ACF972785C5E6A1A858CB79
E4DAEA70596E7B85D84ED6631A3B0C7CE003B482057C1711D4C43AEE936B95D9
AB7657DFE6D9F6590D1C3BA3ED127CCB7BF99F437C17FF0082BD7C44F06F8266
F86FE3EF1778FF004DF0A8998ABF86EE868D7FA797FBE92A42B1F9F177DAE095
E42F0401DA4FFB2FDAF8EBE1E4FF00103C1BF10AC7C51A248CCE26BB8A64BC69
3201472371F303100EE0A4672428E6BC6BFE0A85AA5BFC69BFF04FC44F0FC135
F689AA68496F73A8C71EF4826F3246486775E1660AC46D639F94E381537EC7FF
00B74F84FF00668F1AEBDA6C3A0F896E3E1AF89ADED659AC0DCC7717BA65F7D9
E34BA963DC5564467F300048628B0E4E4115F331E6E5E687DC7D24A2AF662F88
BE227F6AE856275286EF546BC9E78A6BA689609E154588A793759632C87CC3B9
268D95004C64B9D9EFDFF04B6D357C1DFB7EFC19D58EA9E5E91797CF2DF26A68
2CE6974A786E60BC7EA639A23109D18AB64EC73B140207CDD71A9FF6824DA3D8
FF00A6697717C6E2CA378375CAB728AC801CA332150CA321B626725148FA013C
0F7BFF0004C9FD9ABC51F10BC6D6EDA0FC5BF8A3A1DCF873C05E19B91E5EA5A5
E9F7B1182FF5CBA8BEF401AD8CB6D6EAFB59CCF2C980A8A5AA6ECB953D5F4335
1EC6C7FC12EBF6B3B8D13F693B4F006A9E75AAEBD149A74B6F701A3922B98636
9226656E4310AE9EFBFE95FA49E2ADCBE16D47692185B4841F43B4F3D0D7E23F
FC13A7C61E24F18FED8DF0C7C3FF006A5D4157584FB34F771F9D73A5C71A3C8E
F04D912C615118EC0E10E39535FACDE22F89FA9784EE6E74DFF849341F11DA49
1496EC5889AEADEE3692B1B3DB01E57CA19B12C440087337391F5996660E1809
C2AAF77549FAADBBEFF99F3399E0D3C6C2517AE8DFC99E8BA1E8B6FA6D905B78
63B78E43E6948D022EF6E59B03B92724F52493EF56DADBE9D6B17C19E2AB8D67
C27A7DF4D64DB6E23E44254952095276EE231C646189C11C03915B9697B0EA24
88A45665E590F0EBF553C8FC457A94AA45C138F63CF9D36A4FD4F37F87E638BE
31F8D34DB8B3B75BA98C774B24518DB35B12C17CC381962E5F8F9BA3735E9DE1
C81603711C6D36D42AC11DB72C590785E720719C741DAA8E95079D25D961CC77
5228E31C616B53C3B1EEBDBE3C9C141FA1AD32B4E3CBAF57F8DD91983E64DF92
FC2C5EF2F9EF404C03EFC558F230697C9C8FEA2BDE3C6E52B797C534C78FFF00
555AF2B07F0E2B90F8C9737F67A05AAE9BA9DC68D70D74AFF69816195880AC3C
B314AAC24466652DB7691B47CEB9ACEA54508F33F2FC5D8BA74DC9D933C3BC76
DE6FECEFF142D556391ED5FC4A634650EB9FB55EB2F07BE477FEA2BC7F4BFF00
82617C21F8CBF0F3C35E205B5D63C337FA96916B7772DA45E848E777854B3797
2ABAAEE249C2803AF15D27C6FF001B7C44F86FA2F8A2E2EBC25A7F8CBC37AC41
746E27F0F492457D652CE192590DAC9B8B445DF790ACE532F9936E02C7FB03FC
704F8CDF0134CB792EB4B3AD787E03A64D6369725AE043022A24CD1B7CCBB942
F2328B9EB9381F332A387AF5FD9555ADB66BB76FBFA1EFC2B57A541D5A6F4BF4
7DFBFDDD4F25F8F1FF000490F877F0F7E16EA9E22F0DEB9E20B6D63C376771A9
192E5E29D6F446858465511020246370CF539071C78F7ECDFF0003BC53FB407C
27F889E19B8F121F0FF817C23A55D78A7FB36D74E8B6EB1790A79896C5C2AE23
53E5BBA316C130B0439C8FBE7E38DA7DAFE05F8D23E0EFD12EF1E9CC0E33FD05
7C97FB05EB9A6E907C5174DAE87B7F195BEB9E1AFECCDE0F9139D32DA4B798A7
DE51232CF0E4F0CFE50193D38F1597E1E9E22114AD16B5D5AFBF53B30B8EAF53
0F3937769AB5F5F53BBF8F9A541FB387C18F84FE27FED9F1A78AA1F146991CDA
B5A6B3AEDDDD5ACF18B384A20B78D910450ACF2C81140CF96A18902BE77F087E
D61E28F09DEF899B42F0ADBE8F3788A1B6F3ADAC50C3268F1C324D2AF92AE8DF
BB91EE1988704EC2AAACA3691F497ED95E30B8F09FEC25FB38788AD5566963D3
ED2D1D18FCB2C771A3F952A13FED47BD73DB39AE13C63FB5EF807E25FC31F116
A76B6B30F1B6ADE2F9AF21B496DCB470599B0B7B2F25E6040283C913284DD878
A3240C607899D51B627DD5BA8FE48F5B29ACDD0F79ECDFE67BC7ECB7A96A167E
17B3BDD72E56DECADF556934D9AE36431AE96CEAF6CDBB81B446D8DC793B393C
57D6F0F85AF2F7E1CC3E38F11789BC2BF087E1ADD00D67E29F179612EB208DCA
DA7E9E1925B8565E55D99038219164539AFC06F8A5F18BC41E2C9AD2CF53BEB8
B8B6D2605B2B4B790FEEED228FE5540BD323B9EA7D7A0AD8F875FB48CD7CF61A
1F8DB57D5EFB43B38BECBA6CF3DC4971FD840B16DB12B121606624B228C67E60
01CE63079957A149D1A2F96EF7EBA7636C465B4AB4D54AAAF6E9D0FD9ABBFDA3
FF0065196FBEC775FB4C7C609AEF38FB7D878420B7D3D4E472226B36936E403C
927DEBACD77E0E78913E193FC48F863E3AF0E7ED19F0E347266D41F45B6165E2
3D26318662F6AA4ACA555492B88E5C6488C819AFCA73FB3EF89B50D21753D22D
A1D7B49954490DE58CE8EB2A9E410370393EC0E7B135D7FEC49FB66F8CBF605F
DA174DF18787A7BC85ACE658759D25DDA38B56B50DFBCB7953D7192AC7947018
74C542C66214B9A35257D1BBB6EF6DAE9972C1D06B97917DD6DF73F45FE1F7C4
AD0FE2B787E3D4B41D421BEB57018EDE248F23A32F507F4EB5E67F1CB48D79BC
510F88B446934E9A2B98EDF56892EDFF00D32D536C48E91056577550088C8058
9EAA496307EDF363A4FEC9DFB6668BE36F87BB21F87BF1A342B6F1CE8F6F18F2
EDD7ED3F35CDB851C2AB1DB2851C279E00C6D18EDAE35A87C43A03EA969E635A
DE2FDAA167653B94A8618DBD00CF43C8C1F515F472CC219961796AAB496F6FC1
AFB8F06182960311CF4DFBAFFA68E7343F1ED8E97A65BE9BE20B4BBF0D6A51C1
1C5FE913B5C5BCDB50007CEE32C4F04B60163C126A8DEDC789A1BD9921965112
BB2A0F291B0A0F1C9193F535D76B7A0D9F8A34AB9B4BEB58AF2D26DC1A390707
390483D4120E323079C7B578FDDFEC5FA7BDD48D6FE34F1FD9DBB3931411EAC7
640B9E107CBD00E07D2BA70B56BAA514D732B269DECFE7D0CB134E9BA8DA6E2E
FDAFFA9F52227C8B9A72A61454823CA85FE21D29CAB8FAFD2BE9E4F53E5CC1F8
81A3C7E20F09DCE9F33C91C37E8D6F23C67E655656048F719C8F7AFCAAFF0082
88FEC0FA5DCFC65B1D53E145BE9DA5EA9A96971DC78A3C2736AA9672E91A90DD
15C4F686EE506E2C2E8A1B88DD1DBCB170D130528547EB1F8A5CA410A7FCF473
91EC0579CFC41F855E18F8C3349A6F8ABC3FA3F88AC63B48C245A85A24E2262F
2E4A161946F7520FBD7CC66D83589A8ADA493B7FE4B7FD0FA0CAB18F0F06FA35
7FC6C7E567817FE09C777E13F85DAC788BC75F103C23E09B5BA86286C2CE2F37
56B9D5F3201298DA01F65C44A392F3819600726B6FE09FC35FD9C3C3FACDADA6
A7378BBE236A91DD19534B544B48F5011A6F653E4C8BB632AAC38BBC8E4E3A57
D41F1ABFE08E1E11F881AF2EA9E15F12EB1E1692344B76B2BA53A9593458D823
5DCCB246A14003E66C76C62BC0BE0CFF00C12DFF00E321345F07F8824D37C557
4CB7D757B6926AB3E996F0AC0AA12390C76EF2E779F315918092329FEAF764FC
B4B2EC4297235BBB5FFE1BFC8FA48E61425073E6D95EDFD7F99E8FE3BFF82E20
F865E1EBDF0FFC15F86361FB3F6A8AA161BDD134DD364B864383FBC965B76BCC
95E43ADDF707E615F17FC43B6F899FB40FC478F5EF157FC24DE2EF1178B2E088
AFEEE299EE7509490001BC65C92CA06D279603B8AF7EFDAABC3967FB2C7ED9F0
69AFA0F84593C3B6E6EA5BBD2B44F32669AE22FB5A3C82EA5904CD1B3A22C929
24AA31237649FAFBF66CD17C59FB516A5E07D534ED33C53AFDF683E2BB6D4D2C
2C239EEA33A6ED475956D631E5C691A4AA9B82800C4C3764E2B86541D1ADEC1D
92BD9BEDDFEE3AA35F9E97B68ABE97472FFF0004DCFF0082482FC14BC97C5DF1
5B4FD2F52D7AFE036D61A1BEDBA874C46C179663CA34CC06D0AB95552F924B61
7ECDD7BC37A7F85345BAB4D2EC6CF4BB34D1AF02C16702C11A0C274550056DFC
59BED4BE0CC7A7CDE29F0AF8C3414B8B958A06BFD29EDE2B966046C499F10B3E
327CBF3048403B558E14E1EA9E33D17C6B1EA16B637BE65E43A55D8B8B3914DA
5F40ACABCB45326F407B3346573EBD2BED68C7094E84E961E49EAACEE9B774BA
FDFA23E46ACF1352B46AD74D68FC96EFFE00FB3F0FDBDDDA43710BCB6B712448
4CF030567E060BAE0A3F1FDE071DB1D6926B6B98B6FDB2DE3BE8D7959EDD3122
7FC0324FE28C49CFDD159BE03D4B5BD3BC19A4B6AB602F646B64334967283342
48CED28C1436DCED055B242E719AE8B4EF10D8EB32F976F708D70ADB5A09018A
607D363004E3D46455C250714BE17D9FF567F22674E49B6B55E5FD5FEF393F87
3E256F15C5AF4DA3EA36B7D058EB1359B452AB66268D630D1B37DF570DBB3BC3
11D31C1AEE3C10D25CC9A97996EF6B22C88BB5983071B01CA90795E71C80783C
573FE1FF000B5A5CDE6B6CD03413FF006948C25899A2990B244C70E30D863C91
9C1F4C715D078623D4B4DB9D40AAC7A9C2B2A0209586E40F2C1F411B1E7A1F2F
EA6B6CBE4D38C9EDAEDF3E9BFDD733C76D25E9FA1D01872D9A0C3934DD3F57B5
D4EE1A18D9A3B955DCD6F3218E651EBB5B048FF68657D09AB861E3A7E95F4119
A6AF1678CE2D6E5336F5CEFC4CF05DE78CBC2F35AE9D796BA76A05488A79ED7E
D11AE4824150C8C036304AB0383DC818EB7C8C1A468703A1A9A91538F2CB61C6
6E2EE8F977C67AA78BBE11C6F75E25F06EA13D8C243B6ADE1B2753B6840FE278
B6ACF1803D51946492DC64F88E85FB35781FE31CF6BA87847C651FF6569B79F6
9B64D3ADE15D474B2771F2D6E0E2E238C336424808C9E3B1AFD1044F2A4565E0
A11CF4AF907E247EC97E15D7755F3A3B7D43C3FE20D3CB1875CD267363A88E48
2CEEB9127FB4640F9E80815E3E330FEF462FDE5ABD747A5B66ADE5A7E27A984A
C92725EEBD36D575E8FF0047D5E8799F8FBC6FF10BC1FAC78B3C1B1DB43F1134
98F407BA96E6E268EC357B58655923DC3AC771E5E0EE040761CA91F747CEFF00
F04EFF0087FA07ED33ACF8B3C1DA969661D5EC0DEEBB6DAEDA5DB477D69B2DD2
3840451F3471CF1C6D96623748A300B06AEE3E25786BE2DFC32FDA75AF2EAEF5
2F8896ABE1BBDF3D34A68AC6EAFF004E1BE34F3E0385774964495963DC4A8EBF
7B15FF00E09EFF0006BC7B69E0BF106A1E07F0C4DE20F12EA73DC456F6D1697A
81D4EC1D62222B8865B5864DD1B348434330113F94BBB2335F3F88AF0F6D1F6F
7514DDD4BB69B3FC376CF730F49FB17ECAD7925671EFE6BFE024745FB5F6B967
E34FF82507C0BD42D248E54B1D4F4FD3E6D9C7952C76B730C88476C3478FA60F
422BE39F855E1D5D4E3BC9DB6EE9AF6708A3B0F3769FE607E35FA45E17FF0082
2BFED3DF153E04E9BE11D53C2DA1F83FC176F716BAACCDAE5CC5A7C715DC1018
04CC0CBE7AE63C6FC200CCA0ED073BA2F0FF00FC122FE0BFECF0D19F895FB5A7
C2DD125B47324BA678514EBD2839C9F9630B206CFF007C3F3D8D7978CC7D3AB3
528DDFBA96DA5D2B1E96130B3A51717D5B7F267867FC17FF00F663F047ECC5F1
4BE1AF85FC27A2E9FA2EB5E1DF87BA3A78AAE2D90A9D67529BCD792790671E66
029DC06487C1276AE3F34FC4578F35C470C7F2B49D48F4AFD1AFF83817F6A2F0
87ED73FB5F6A5E2EF00DF5E6ADE1B934ED36C85DCF6725A996482DDA373B2401
82EEC60B019AFCEF9BC6574DE18BAD0F6C0D6726A316A0ACC999239238E48885
6ECAE241B87731A7A73E6C60BD0F4B999F577FC12ABE385EFC35F892BE11BEB9
B893C37E260D6D0073BA2B4BA6FBA39E02CBCA91D37943EB5E9DFB637C3EBFF0
27C55B36D4354D435ABBBED320336A57F299AE6FDE35F2BCC91CF2CCC8B193F5
C57C1BA378F2F3C3FA7BC76BFBAB8C868A70C43DBB0390C873F7811907B1AFB1
75FF00DB7D7F6C9F865E1F875AF0F9D2FC6BE177686F6FED48FB0EA904883E70
A4EF8E5DF1825794E490470A08C5A95C6ECD1F66FF00C144249356FF00825DFE
C4DAE6E669E1D035AD34C87A858A7B7445FC0262B4BF625F10B78C7F65EB3691
B75C5BCF756CFF0079881BB2B9C8F4230013DBA722A87ED98A353FF82237EC8F
75F785AEA7E22B2CFB1BB90FFEC959BFF04F5D7E3D2BF67D5B7B9323473EBAF6
90E264608D228FE0C8645E0E49CE7271DC57A5954946AFBDE7F91E766316E969
DD1EFF00A49FB5D942DCE2401BEB9E7FCFE353344DB8E3CCC678C74AAFE1619D
16DFEEE7CA4CE06D19DAB9FF003F4AB8E30C7EE75EEF83F88AFA5C0BFDCC7D11
E2627F8B2F565A6D7FC59E1A9F17DA2DAEB1663FE5E74F9FF7B1A8EED195DCEC
7FBB1A607A9AD2D1BE24E91AA6E59266D3E68F1E6C578BE51873D03364A06FF6
4B6E1DC03C574623C81506A3A1DAEB2ABF6AB7867F2FEE33AE5A33EAADD54FB8
20D7BB2A3561FC39DFCA5AFE3BFE67CEFB483F8A3F77F96C721E36F1D69F6FA9
450CD24D1C36FE62BCE6DD9E3CFCBC295C9EA083C7627903359DE19D66D3C43A
AEA5716338BAB78C44AB2A2B796CB83C86230C0B6EE5491C1A8FC5BF03E6B28D
A4D22EF51B7B7F3CCFE5C32B3143B8B1F9460B939C6496C8E0A919CF9ADAF8B7
45D1BC6775711DE69363AB5C2F98D73672C50DC4990546F0C0B4921238002A1C
119E08AF9AC463AAD3C45AB46DADFD74B68D2FD3D4F76861613A17A6EFA5BD35
BEABFE0AF99ECC8BBA1B8F518C7D42822BE7FF008D571A87C3CFDB7FE1C78934
6BCD2B4E97C4D1DFF87EE5F50B27B9B6674B58E685E5F2E44745DA64432296D8
36B32B2AFCBDDFC35F891AA1F05E91797DAA697AACD756705C5C99D45BEF91E2
563E5CD1028DBB04AAEC66231CF7AB17DFB277C52F8C7E28F08F89B5DF86DABE
8BA4F85B5CBBBC6935E6B6D1ED6EEC2748ADC82D79346AE1ECDAE2320E0166CE
00C1A55B30A16837249DEFF8A7D3C8AA385A8E535157D2DF83FD4FCE9FF82AE7
8FBC75E15FDB33C4D21B68740BE934CB18F526D1EEDAEE3319B458F1E73451B8
89D33B91940CB10770009EF7E057FC147AFBE3C7ECEFE17F82B1F8AA1F85F75A
4AB43F61D3E1FB0E99E30B8762566B9922C3BCE72AA11CB20DA0469D87D37E3C
F861A7FC0397E3E7C4EF1A7C50F84FAAF88BC41F0875BF05F87F41D17C49FDBD
AC5D5C4D63F64B67945BC4F179CD016591BCDC17909030723F15AD3ECB05B4D3
3497906AD63750B5B04E136FEF3CC278C89158445791C6FEE057CCE32A46AD79
D485ED776763E9307074E846125AA48FD6AFD9DFE36F8D7F621F8ADA7683E32B
A8FC49F0BFC6B20D3FC51E1B7D43ED5A76AD61215599FCACEE8678C3EF8A5011
C3A603101C57B7FC31D52E3E14FED5BE3EF833AB6A126AADE099359D2747BBBA
C35C3411B703BE0491469215FBA190FAD7C61A7FED3FE1BFDABBC01E0CF26E48
F1969B770C5AC58496CD1B3EF015A646C6C68DA45CE03646EC1515F4AFC4EBA9
752FF82FAFC4C64DDB1358D7D5C2F4F92C6E5727F103B8ABCB6A4E35E37EAD5F
CF52730A717465E8FF0023EB1F0943E778634D931F33DA44C7F1406ADEA7E1DB
3D62D7CABBB786EA31C2AC89BB67D0F51F85677C3BD4E6BCF0769AE1AD6F952D
61490DB931B23F9484AE18907191CEE1F4CD6F5BDE43733F97B8C72B748DD4A3
1FA03D7F0C8AFB184E2E093DBCCF939464A4DA389F0F786F5ED33C43AFC90EA5
6ED6FF006958AD2DEE6269A3F29628F8660E195B2CC370FE100107031DB7804D
C5D595E3DE5B456975F69DAF14571E7C6308982AFB5490410795041C8E7A9A1A
1E5351D755BA2DF8DA3D8C109FE64D6F7844F9ADA87B5C2FFE8A4ABCAE9C60E3
6DB5D3A75FEB433CC2A39295FCBF42D6A1A45BEAD0F977104770AA772875CED6
F553D8FB8E6AA7F65DFE98736773F6A8874B7BD624FE13005FFEFB0E4FA8EB5B
4211FF00D6A511F3E95EECA317AF5EE7931BA31A2D7E012AC3751CBA7DC390AA
97185590F6092025189F40777A815A0D0E3A8C7D7B54F359A5C44D1C8AB24720
C3A30CAB0F423A1ACEFF00846DF4D19D36E1AD57B4120335BE3D02E4141E8119
40F43D2A79A715AEBF9FF97E41CA9EDA13345B7EBDB15E27F109ADF469AFEF2E
2486DED6D5E632CB83B2345624B1EF85C1E31C9E9D2BD91B5B6D387FC4CAD5AC
F1F7A743E75B7E2E00280772EAA07A9EB5C8787B5AD0FC33F113C51E39F10C29
A97857E0D68F3F8F2F6D9986CD4AF232134AB52791896E49743D336A99C8635E
56698C8D18AABD55F4F376B1E9E5B85759BA5DEDFA9E55F1C75FF863FB09C5A5
78ABE2E785D3C79F18356D303E81F0E669CC367A0D8C8C1D6E35B619DF248CAA
E2D082A36852A48F353E73F8ABFF0005D2FDA27C7B64D61A678D2DFC07A228DB
6FA5784F4D834BB7B44EC91BAAB4E001FF004D6BE6DF8A1E3BF167ED15F103C5
FE3CD7A6BCD6F5ABF965D6F5CBEC164803380CE7B244995451F75542A8C002BC
4EF3C75ACDF4866D3F4B87EC39CA1BB98C734CBEA17F873DB7738F4AF83A9375
26EA54D5BEA7DCD1A51A7054E1B23D63E297ED01E2FF008BF78F71E2CF157893
C51331CEFD5F539EF981F6F359B15C4CDADED1D781E95912EB71DE6976B711C9
F3DC2132C2410F6AE1994C6D918246DCE46410473DAB32EB58C1EBC52B1A16BC
47AE2C42691B695442C41E84019AF15B3F0C2CB62970C1A38DB2598AFCB90718
1EBDB8F7AEEBC69ACE34AB9F9BEFA6CEBEBC7F5AE6E1D566B8F09DADAB4D33DB
DACEDE5C4CC4A445B2720741939CE3AF14D225C8A71786F2A1820618CE09F98F
F9FAD7B2FC1AD00695E0A86E86337B712AF078C22C78FD59ABCB6C67690AA80C
CCC76AA8E49F6AFA1F4DD174DD13E1B78420D3EF9F50125B4B35C486DDA1D933
49FBC8C0639608C0AEEE036DC8029C9590A326D9F787ED1B746FFF00E080FF00
B38C91A34D35BF8FF58D3D114649324B78C140F7C0AE07F663F105C7C39FD9FA
7BB96CC2CDA4F8A374D1C9959C32C1BC031E012A32D904E4EEE31B70C7ED11E2
D96FFF00E080DF09EC6DA465B8D2BE2CDFAEE46C3266DAE64C823A1F987D0D79
37ECF1F1EB5AD53F6789B47D726BAD5F6EB36BA7D9DF4E91C50C710B49CAC265
003BC8A2263B79243027A739C25C916FD4551733B79A3EDBFD9DFE2C45F15FC3
12DC2C7676CD6EE1638A09A79B29D0317921883F2083E56F5071F39AEF1D0063
FBC8D79E854923F1AE2FE054F0F8A3E16E936F7D343A85D5BC3B8B799BDCFEF2
451206E082769F9800460F7AEA4F872653F26ADAD22FF0AA946551E809524FD4
926BE9F2DA927878BDF43C1C6462AAB47A481D3F4A7AA73EBED595FF00097476
43FE26167A96960725E683CC8547A99622E883DDD96B534CBDB6D62D45C59DC5
BDDDB938F360904887FE04A48AFAEE64DE87C9F2B451F191F23C1FAB37A59CDD
B3FC07B57CCFFB42FECFBE15F187827589F59D16CE49A1B0B89E0BC84F917116
C42E0874C1EA070723AF06BE96F8889FF1426A9DF741E5F0339DC42FF5AF94FF
00E0A43FB5669FFB2C7C21B496E34B9358BEF13CD36996B6FE67950AA988F9B2
48F8246148C2819627B004D795984E0AF2A9B25D7E67760E139351A6DDEFFE47
1BF13BE2C5E7FC13FBE057877E17F872EAFADFE226A9A45BEB5E25D7B5094497
FE1582E638E7B6D2EC1F005A3985A3B89A58F12833471071E5316F9B6D7F6909
BE200921BC6B7F135BDAAE4FDAA275961463CBC6E401F331E64DAC493F7B915D
E6AFF11A1FF8295FC48F1B7C42D2756B3D1F5CF185E5F5F6ABE183A818A6B1DF
978AD4B10AB73684AC4AAC420FBBB941422BCFBC57F0E359F87CAADAF787F57D
3E69976DB4D345E5C49CE5B2483BB701C0561C8CF2073F9DBE596FAB3EFF0096
CAC69E9F17877C4516E5BABAD0AEA4521D2746B9B71D30A8C32C7B7CCFB00CF4
039AF09F1FFECEBADDF6B5A96BD676F69E20B1BCBD90ADD6952A5D2819C2A7CA
72CD8033B030072326AE78CBE3C3782BC68BA69D33CEB5B708D39F30C72CCAD8
24C47955E38CB0619078E2BB4F037EC4DE2ED76CAD7C51F067C47178E747B898
091B49BCFECFD7B4C126DDF15C5B96C96031911BB93B73B429A4BDD7A3FBFF00
CC528CBA1A1FB0FF0080A6B4F1469724B6B716F36A1E21B4B25F3A228D88E45D
E3040E8CE01F75F6AFB53C5FE28D1FC3BFF05AFF008B7AA5EEBBA25BC8DE2BF1
1D8496979706DEE1039B8891A3DCBB6505815DA84B0C0C800827CCFE13EA9E24
B4FDA07E1BF84F5AD325B1B893C4563676F06A76A7CDD33CCB9890344080396F
9892ADB8E7A5770DE11F06FC5DFF0082A0FC594F1168F75E23D423D675FBAD42
DA440D6F2CF15DB9FB541B3E70E8FF00BC1CA019E2B6C3549FB78B4B5D3CD7F9
FE06189B7B1929763EA8F809E37B1D52D5B498E4DD3320BAB7995C3C77881235
93611FC71B140EA7040910E3078F49FB325CB796EAB223E32A572A7F0AF04F84
9F0AF43D43C1DBB4BD6AF346D734BBC379A55CBDFCCD1432C90A91E644EC6275
667954A005B6123200E3D03C39E2EF175CF8625BB86D74ED6B51D3E616D7BA63
C66D6F2D6752BBD3218C720DAC1D4E230E8CAC3A815F4984C55A8A525D1EDAFE
1BFE07CF62282955728BB7AE858F8657571E238B53BE8E46B36BA9ADEE05B91E
6C51EFB2B76D872013824FDD23823A6315DDF82629D4EA3E72C6ADF695C7979D
AC3CA8F9E7A679E3F53D6BCABF67CF895FDA1A0CB1EA5A56A5A5C82686DD5CD9
4F242E5618D013208F0B9C00093B4F627A57B3785E3FDFEA0BDC4EA0FF00DFA4
AEFCA2A46718496FADFF0013933384A0E49F97E85D11739C52F927DAAC08368E
FC75A7345FE457D0DCF10ABE591DA93CAC1FBBF855B68700FD29AF167FCF4A77
029F9783C706BE1EFF00828A7ED91E05FD9C3E0A7ED09F0EAF27BBFF0084DFE2
9DCF85DECAD6CE0DEA2D2CE479E492790E1635382A1012C5981DBB72C3EEA68B
9AFC96FF0082CE7EC01E3AF1BFC50F8AFF0018BC370C7AC7857C276BA0DEF88A
269BCBBBD345DC6D651491C6DFEBA1DF6803143BD5A61F2155671F37C4F6FABC
5BFE6FD19F41C3AFFDA24BCBF547CBBF0E75CD0BE30EA1716ED72B1496D63792
C504B288F337D965F281C9C32B485539E85C67039AE5352BB749995B706CF20F
07E86BC32DFC4179E1FD563BAB39E4B6B8B763B2443C8EC7EA08E3D0835EA9F0
BBE3D3788F528ED754B1B3B8B82A5419230D1DC01C95F5463CF438FA74AF8D8D
BA9F612BF43535CD574C86C6D56CE6BE92FB0E7501340B1C31C99F9444C18990
6CDBB8B05C3640040CD73B75AC7DEC56C7C5CB9D2D05BDD695A7DC69EA5CC730
79C491CA480CAC83195C7CCA412412B901738AF3F9F522D9E6B5E546674EFA65
BDD58ACB7DBDE37F99514E323D7FCFA52695E15B2D6AEE4B5D36E23B3B999711
C176DBA0B93D76EEC655B8C8CE727D2B16C3C52D244B6F32B371B6361DBEB597
E28D63FB2E3DCBF7F385E7BD73734E333A3962E27A8FC2ED2B5AF056B53B4DA3
B5ADE03B6398C45F62E0E5A37E460E71953FD6BD4358D5649AD2CE4B8CEE58D9
C9273DC7FF005EB8BFD8B3F6A2D5BE1E78DAC6CF5F65D4349BC7547F346707B0
6F53D8370C09EBE9EC5FB704A74CD3F4FD616D748B6B7BF92E61B696C0102E6D
B28D0492924E662A5C31000CA74E335A3A9CCCCF91A3D87411FF00096FFC10AA
FB5398EE8742F8CFE4267F8449A6313FAC82B96FD80E3B76F016B5A6CEB1C82D
FC59A7DC1431BB3BC4CA490A4E22C65390C73F771F2EE0777E16DC797FF06F4F
8D6CDBFD649F196DAE109EE4E9F6A08FC326B9DFF827C5C6A975E15F17DE58BF
99A5E9FA8690DA9C610B794185DAACCD8FE1565552082079809C2A961A42EEE9
18D4B5B5F23EACF1F5A5F7C379EDBC45E1B8868763A5DCB596A30C912B450DB4
F223873147BF72AC8724AB8386E0004E3D13FE124F1AA7CBFF00088F8667C71E
62EBD322C9FED05C700F5C76A6E9D7DA2F8BB58D734937961AAC1A944EEF046F
E679D06C8924639180BF38049EE78AF2AFF8573F193C3BFF0012FD2754D3E6D2
6C7FD1ECA4942891E04F9632DFBA3C95009E4F35E9518F227283934DBF85F54F
EED4F3EA4B99F2C924D25F12F23EA74B1D6B4CE60BEB3D4917A25DC5E44C7FED
AC436FE1E57E3546FED6C6EAF7ED1AA7876F2CEEBA1BEB3432B9F612DB9F3C0F
52CAA2B7A2D7AC8BAC724C2DE46E152E54C0CC7D83E377D5722B4563FF003E95
F7124A5B3BFE27C4F335BFF91C078AB17FE0FBCFEC7F112EA491C90A496D7023
BA31E654C02CBB2453FF005D198F5E3BD792FED27A3E93F10FE06EB9A7F89BC3
D63ACE9975107DADB6E2385B700241B82BA380C70F182C3B11D6BDCFE2EE8D69
AC787EDFED36B6F70DF6A863579230CF18DE18ED6EAB9DBD411EB5F3FF00C76D
0BFE118F056A86DF52D4A387ED16F1A5B4D37DA166CDC47C03206907CB93F2B8
0003C57958F8FBB3BF45FD6E7A3837AC12EAFF00CBB1F941FB5E7C1BD3FE047F
C149FE2E7813C0BAB4DE10D37C13E33D7F4CF0FDCC97B2F99691D9CD702DE113
E7CCDEDE5244AE49259D4B13C9AFAD3C05F1E61FDA9BF61192F64D53CDF13787
E08E2D5AC96E70F23C52C59BA685481B5D36B6EDBB433380460D788FFC167B43
D217FE0A5DF1B24B6B4812F2E3C6BAEDC3BC670B216D4A40AEC31839F98F6CE7
249AF16FD9EFC17FDA1E2D9353658DBFB26232E4B00C19888C60673FC67240C0
E338C8CFC23A6A4933EEF9ADA1E87F1D74BB3BDF85DA8DCDC411C93D922B5BCA
47CF1333A8F94F5E73C8E86BCEBF661F8A7ABFECEBE39D1FE25697ABA2AE8FAD
43A7EA3A4A5C18E6D42DA48DA46575E8D132C722E4E76B853D715F627C34FD82
BE2D7ED19A1DBC9E1DF84FE39F1468F7855E3B987439DEC651D41F38A888AF71
96C1C7B57CF973FF0004F8F15689757175E228BC23E07B792795C0D7BC516167
E4217254797E7349C2E380A4F1D0D115195C4E5CACFD3FF0DE8DA5FED0FF00B7
5FECF3E2AD0759B6D63C3371A826B779A925EF9D05A5969AF05EDCB39DCCB16C
B7462C9F2E1B391B98E7C2FF00E0989F1CA0F8F3FF00053AF899E2BFDDD9E95F
64D675C9AEA67090DBC32DE44A0B3B602F32E727B035F3E683FB49F84BF643FD
97FC59F0C7E0FCD71E25F89FF159C693E26F17D9DB491431E97942BA5E9A8C04
CFE749BBCC95954C802AAAEDFBDEEDFF0004F7FF008274C5F0B561D5FC59690C
DE309ACFCEBCB2BBD3EDF52B6D20CCF135B5B98E456C5CAA46F24841055678C7
03E66ECCAE8CD57528ABF2BF438B32A90F60E3376E6D0FAF7E06F83EDBE2A69D
AA78B17519E4B5F105E4D2E9B22DB40616B6F930CA1E2DCD1B4A26646241D8C8
5481B6B67C5BF0EBC55E074B8D5B41D6BEC91A40CB7D2DBC0F752B4414E2616B
23E25993939F372CB940BCA95E675DF88DAFF82FC4674B8B5BD275CD69905CC7
A5DBF872E649E3B7DDB4EE68AE0AC2A5810AF200090C06EDA71B7E1DF8BFF132
F85CC72F82B47D3DF67FA1DE5DEB43C80C73832C48AF2F1C12A339E9B876F6FE
AB8771E4B352EE95F5F95D2FC0F0FEB35AFCD74E3E6FA7CEC3FF0067EF8BAB3E
9B32C71D8EA10DC3C6B6EF05DC70CB7402004C713B65DBA0281B703C63D3D9FC
13E3AD365BFD42DAE276D2EFBCC566B4D410DACD10F2D0721B8FC89EBEB5C87C
3CD074CD03C056BE1DB811EA76B0DBA4371F68815A2BC7E4C8ED19CA80CCCC76
F20671D3AF67F0CFC35A443A4DEE8F6F676B269565324B0DB36258AD59D72511
49223C7DE0A0003CCC800115D781C3E228B8C7993F55FE5F9BBFA1CB8CC452AA
9C92B7A33AF681A33F32B03DA831FB7B56245F0DA2D1D7FE24B7FA868BDC471C
9E75BE7D4C526474E38200F4CF3486F7C4DA2498B8D3ECF5AB7E865B193C8B80
075631C876B13D95587D457B1F58947F8916BCD6ABFCFF0003C9F6717F04BEFD
3FE07E26E343F351E5607E95856BF14F4596FBECB7571368F7854B791A940D6A
71FEF37C9CF61BB279C0C574617CE89645656471B9181CABAFA83DEB68558CD7
BACCE5171D245578F3FD2BE12FF829F7EDF1E0FF00D9C7C33F1CFE17DFDBDFEA
5E24F8AFE1AF0CDBD98B578CC1A69B3BEBBBA77B925B7216468B622A9DC1F71D
A304FDE7B0927D6BF263FE0B17FF0004D3F187C40F8D9F127E29F8366B7D634D
D27C3D6BE2BF10D85C4BE4DCD94018593BDBE7E59954C28ECB9575126155EBC5
E234FEAA9F9AFD4F7387ADF5977ECFF43F353C27F0CAD7C4FE2FB159AF9AEB47
5BB8BFB516D87977B15AB3A89648D4EE0C554923193903E539ACB8113C0DE2FB
AB4942E74DBA916325B3BF6B90AE18750700861C1ACF1ACDC68B789716F3496F
7109F95D1B04763FE4D74DA3FC406F88314763AB5BC46660441729F2927B023B
67DB8ED8AF8B8EDE67D93DF4363C49AF5AF8C7C1B25C5ACF1C8F0ED95E10DF3C
673B5B23AE39383E95C686C0FC0D59D6B408F4C8924F255668A4D8CE18FEF01C
F51D0118C71EA2AA2727F5ADB733D8B1A5AF9BAA43F5CD3B55D56CC5BEAD6D73
A7C77D71736AA965334ACA6C6613C6E6400101B3124B1E1B23F7B9EAA08AA599
1F746CCAC3A106923D264D42292E1BF7877EC6FC856728DDDCD23B1A5E08F184
3A1CAFF6A4976EDF97628DC0FA73FCEBD97C41F19ACBE307C06D334B9353B78F
54D26E92596C6662920E76B1889E1D4862D8524AE4E46315E2F63E07B8D4DA28
ED639AE2EA7216386242F248DE800E49AFB0BF63BFD92BC2DFB2688FE337ED11
0FD8749F0FA7DB7C3DE0B970352F14DF291E547244798EDD5B0CFBC7601C053B
5E7979751B9773D3BF6C1BE6FD943FE097BF08FE13DD2B5BF8A3C617D3FC40D6
6CCFCB25A24D1B5BDA0917A863130CA9E4340C0F22B88FF826B78635FF001EF8
6358D264D2AE23F06F89B5ED363D57593284DA2CC4D22DA46ADFEB1A569D7715
E630A87F8857CFBFB457C7FF00187EDC3FB45EA5E2AD694DC6BDE27BA0B6D688
FB62B48BA470A963858D1001B98F0AA598E4B13F7CFECE9F0A7C79FB2A78434E
F0FEA10F877C45A4F87C5C4F6FE4EB634FB78A5725A79A559A240EC43940D2B3
796870768C29D693D5A5D9EDF71CD5B44969BA3DE3E10FECCAD65E31BCFF0084
5FC59AF6832DE299E0DAD15C0573B41F34BAEE9A145880557214191FE66C8C7A
D2FC0EF8AC146DD7BE165C2E38965D0AF84920FEF36D3B727A9C719E95F377C3
9FF828D7857E146B9BFC53A1EB1677B1C662FB2E977D61ABB2CA71B46639C1FB
A720BAF19E171C9F648FFE0A37E01BE8D665D0FE29C8B30DE1FF00E114BC7DC0
F39DC0E0E7D4706A31D53D9D771C34B963E4DAD7AE9EA183A6E7493AEAF2F357
F4FC0F6C6844919560195860A9E73F5AE3F5BD6D7C29AA4D1C9E17F135B58C6D
98EFF4545BA81C103E66B6858CDBB39073038E3EF1EDDBF97851C53D22FDE0FA
F1EF5FA5D68F3E9B1F9EC64A3AB573C8354F8D1A0F8F746863F0EF89F46F115D
5BDFA2C962EC20BE8982BE448980F1E003C18739183EDF0EFF00C15E7E18F8D7
E256A9E0ABEF0C5C7886C7ED3BB43BAB44FF00906ABCCEBB6492646DD1B48DE5
C5992301B00020820FD15F0CBC9F8A3E35F88F7BACE9163E225BAF1CDE69F6B6
F736A9244905AA4CAA58BE55407918EEE58E7E519C01F3AFFC154FE1C7C60F01
DAF86751F872BA93F84A19925BAB4D2EEA4B8920D4C48ED0AC76B233B796B1AA
91E52E19B797500201F278AAD3AB425CEAFD34F27A6F7FCCFA7C251852AD1507
6EBAF9AF97E47CE7F0EBFE0A3BAAFC1FBF7F86DF1C3E1B7867E28587836E25D1
2E1B50B686E756D3BC891A29104CC1D25F2F695054A12147EF0F5AFA7BF6AFFD
943E17F807E08D97C4AF85BA443A6691E228AC99BECD7B2C96CD0CD89229238E
4DC577861BB2FF00294501465ABE69F0B7C44FD98BF6A6D51E6F8A5A7F8AFE10
FC50D4A690EB5AEE9533C9A56A77B231134D2412097C969198B3A048914B37CE
3191D478B35FF8A7FB27586BBFB3D6A979A4F897C03A79175A75FDCD81174B66
D309E19E1915F0A1A4600A3F98AA647556E057CB72EBA687D2F4D4EA3FE0B47F
B447C44F0BEA7F06FC31A4F8EBC61A5F8517E1278508D1EDB57B88AC11DF48B7
766112B6DCB6E3BB8E71EB5F0CFC31F87579F10F48F166A10EA16F02784ECEDE
FEE2291DBCD9D26BD82D3318008255EE109DC4003D4F07EC8FF82D2D89D4FC6F
F0DA3546F32CBE12F835B77738D12D09FC839AF8CFE095EDDDB78EE6B286668E
1D5ED5AD6EE30389A359239C29FA490C6DC7F76B7A4B4D4897747D2FFF0004FA
F85DAD5DFC506D4F4196E9B5286C5E7B61A3FD925D662500A3C9145732216E18
3108EAC54750B9AFD19F811F111BC23A3B586A5A829D46DE532DE9D42D1F4AB8
84CA58869D2E1C7EF642AEBB96E664629B50801547CCFF00F04A1F82BE19F1F4
BAADC6B5A3DBDF5C5958B18A60EF14D6C4DD32EE49232AF1B6171B948207422B
DF3C6DE1793C1FFB68782FC27A1EB97B34DE23D0EE2711F886793598912DD6EF
CA84F9C5A56899A493EFBB11962B835EDD3A3569E194E9BDDADBCD9E157A94AA
E25D3A8AF657FB91DBDBFC69F0BE9BF19B5ED3F509A18753D42DED2578E69021
DA88E026E936863F31608A58E2424020E4F7FF00DBBA6C76FBDAF7FB342AEF54
B86F248503248593195C77008F7AF86FE347C3CD474CFDB0FC3B0DFE93E1CD0E
3D43565D164BDF0EA3AC49703ECE4CA914AC7685037007A3BC9C9040AFBE3E0B
FC13B1F86FE28B7D3EDF49D275A56D3A59273711ADBB5C490C90289CC20341E7
1F35F2C89106DDC91815D997D6AD3BC1AD9EFEACE3C7D1A34ED35BB5B7A235BC
1FF09FC41E28B813DF5C1D374523EE344D06A379F43C8813DCA79879C08F873E
ADA16936BE16D322B1B3D3FEC5690E76AC0A194927249C65D989249661924924
927358E91586923EEEBDE172BDD7E7B545EFC7EF6D501E39215BD319AD5D324D
5AEED966B1B8D1FC416EDF2878D8DBB7FDF69E6239F60A83DEBDEA7151F5FBFF
00E18F06A49CBD3EE34E0BB8669762C8BE6373B0F0FF00F7C9E7F4A97663FBDF
8D71DE35F8F3E15F8729E5F8AB51B3F0F4CC3F7706A17300F3C8EC0872A3FE06
57AD78D685FF000547F85FAB5F341147E2C8FE42F1B5A68F73329C1DB8036796
7E6CAE7904E3A8C35635F32A1424A356695FFAF91B50CBB115A2E54E2DA5FD7C
FE47D217FA65BEAD6A60BAB786EA163CC73462443F83022B9897E0FD8E9ECF26
8977A97876666F308B29CF9123F669226CABE3818E303818E2BC2BE23FFC1452
FF00C30F6D71A3F817571A6F9C52697C4F3DB692B3AE323CB68E495C375214C2
49E7818AB1E1DFDA27E357C5B8A47D03C2FE1BD06DFECAF3A4B75A36AD781DC1
C79692C82D9198EE5232A01F9BB2935C32CEB0139349F335FCAAFF00735FE68E
E8E4B8D8479A568A7DDDBEFB9EDD12F8B3C3C8AB71158F88ADC02AB2C58B3BB6
3D77329FDD9F4C2E0FD6BE16FF008293FF00C14E7C33F03BC49F127C0F1E83A8
6A9AD78DBE1ECFE0DBF8A793EC874479AE56E619DC6D7DE7CA3B820C7DF52580
209F2FD1B56F8CFF0014BFE0A39A9785DBE206B5E1DD69B50962329924582DE5
FB190C9F6786711A2840C84C2E0E470E71CF1BFB747FC127FE25788BE23F8935
DBBD5B43B8D62DBC21AA78D6FAEA5D76EAF975A874C16CB7090B4D009A298453
215499E456F2FF00D6A920579B9963275A83508CB953D5BB69FADFE67A996E0A
146B2739479ADB2BFF00C358FCED8FE1C4FE2596E27D26EADB506B77DD2DACBF
B898A93D4024AB0EDD460F6E4565D9DB5EF83755F2EEACEE6DDA3625034679E7
839E9F9546DAE5D683A80B8B499EDE7889DAC9D467A8F7F706BA8F0D7C4F93C6
C16C356B784994ED4B841B406EDB97A0CFA8C0CF6AF015ADA9F40C5D4BC49A6F
8A3C3B3059A386F9537189FE562CA7391D8E4038039E6BD4FF00638FD933C35F
B41783BC75E29F18F8F1FC0BE19F87E96325FDC47A4BEA124AB752491A615581
186455E15892E3818AF1FF0010F87974DB49B30C7BA07DEB2EDF9B04818CFA77
1F8D7D0DFB10EED47F640FDA834F5E77F86F4ABE03FEB85EB3FF005ADE1AEE67
3D8D69EC3F634F870AC24D4BE327C429D3FE79A5BE9D6B263D98472A8FCCD513
FB637C09F04C4E9E10FD9E74D9D55B227F10F8867BC2C7B13115653F81AF94E4
B48834885BF7DB9B01871C7A1FF3D2BE80FD9AFF00635D23E387EC5FF19BE26D
C6BD796BA9FC337B14B7D26DA042B742E254532C9236485DBE600AAB92533BB1
C198A954938C16BABFBB50938C1734DF65F7BB1D643FF0543F1A2CCBA7F817C2
9F0E3C08F707C985F40F0E8FB4E4F002972CACC738E13AD64F867F65DF8CDFB5
5F8E5B54D62C75CB8BCBA6025D6BC4F2496F0C6A0F014480B955CF091A363200
5008A77ECDFF0000FC27E35F17F836DEFB528DBFB4EE754D3EFB48B75F2EEA05
86C0DCDBDD9903173BE577419181F67032C32A3E9DF10FECD375F01F5DB5BAB1
F8897FFF0008CDC6A3F6092DB5AD38DD4D6BBF705669D084DB9EBE698D79C672
4648D37CBCF2F87CADE44CAA24F963BF99A7F0DFF62FF0EFECD7F0BF58BAD3EF
E1D67C5924416E7569A200B8DCA4C100DC7CA46C637292E58F2595401A1E06F8
33258259DC78AB4BD1BC7BA95D1896E8EBD792DE240F80024237F97B02825559
1C6319EED5D45A6913476B247AF5BFDAAD5668A2F32C94A433F2197E62C50E40
27113B82B820915B6DF1A341D7FC596B169CCCD1E9F3416E418C288595423A8F
F75CB29C67054F7E2AA5528549FEEF651F4D7F5328C6B463EFEEDFE076DA145A
3F82916D747B33E129264DE90E981B4FC24647DF7B72AAE41652016206781D6B
2EEFC33A65F5D493491DECB24CE5D9DAEEE09724E493F3F7AD1D5BC41A6AE98B
7135F5A40AAA76379A30325793CF7207739C7E15CABE95E229D8BC7A1F8DA68D
CEE5923F0FDEB2480F465222C107A835D198E15CAB5E11BE8B6B1860710A34AD
37D59F6F5EDE43A6D94971733436F6F029796695C2471A8EA598F007B9ACAB6B
8D43C5B22ADAFDA349D34B0DD75247B6EEE07FD32461FBB53FDF906E3CE1002B
257CBBF073FE0A9FF0E7E377C71D07C3234DF15DE6A5AC5E8B7D32696DE14D3E
D672098F119937EF240512B82416C8F2D4915F40EAD7DE33F04E99757CBAD68B
AB5BD8C2F3B43AC6912D94C5514B1DD776CED0A9C0EA203CD7D83C642A2BC355
E5FD7E47C94B093A6ED5347E7FD7E67947C2FF000EC3F0DF48D0ADECDA49D752
9757D5A6799CB3492BDC427713D4FCB391C924F724D7CEDFF054CFDB9BC45FB3
55F782F4FD1FC33637B1C939D5DB52D4609A4B34913CC816DD4C6E83CCC33B1C
B640319039C8F6CF851F15AE3C7BE1FF00095E47E13D6A6D3E3D2AED449A75E5
BDEB32F9D0C6CE54B44FB730646D462C1B81C7373E317C66F8790F812FF4ED62
ED4F1FE9BA46ABA6CF1CF32323AA8304D182CA5CAFCC14A8CE73819AF07DB43E
A295ECDFEAEFD4F6FD9CFEB8E4E3CC974F456E87E6EDAFEC9BF0C3F6FEF186A7
E2DF04FC5ED2BC2FE3CF175EDC6A5A87837C61079622BCB891A4952DEEA3C19A
3DEE4A6C85D82EDDDF3022BBFD77F6A8D53C3BF02AE3E00FC4EF01CC7E22F836
28F4787C5515CC326FB6B799658436E412188C4A14323B07CC6C541626BE3EFD
B33C2B63E0EFDAFF00E2769BA7E96747D1ED7C57AA0D2AD1206B65B5B43752B5
AF968402B1F9262298E0A15238C57DBDF0F3E39F807FE0A09F077C35A0C76F71
27ED45AD5BE9FE17820FB25D37F6F325D4481C48AA6DC33C6A2466728570EB9D
A1457CCBD357A9F4DBEC47FF000536B05F117C7DF05D9150CB1FC2BF085B3F7E
1BC39627FF0066AF857E0EE9D259FC6486178DB7C026490019DA4020FEB5F657
FC153FE2C69117ED6BE25BEF0E32EB5E1DF0DC5A7784F4EB98E4DB1DE43A6585
BE9D1DC83CFCB235A09063FBE2BE40F84739D57E38A4E4C8A970679D93CC2777
05C027F8B07D6BA2927A194DE87E8CFF00C1273C3ED73A6EA9A85C6A16B60B0E
9F39124F12342BFE9CF82C4ED7181DD64439EE4715D77C56F8C7A2783FFE0A25
F0EF579B5DD2F54B5B0F0F3DB4B77A64ADA9ADBBF997800640E5831320CA6F63
8C73CE2BC1FF0062CF855E01F1B594D378E35BD6B43F2ED9EE21BF8ED5BECCB2
79E546E79619615014E0960A323EF135E957BE0EB5D03F6EFF0084F69E11F137
843C7D6D3E9137D8E60B15ADA921AE3F713BDA7980BEDC6196307951B08193EC
C6759D18C61156BAD6FADFA688F1654E8FB794A6DDECF4B74EBAEC6E7ED47F14
2DBC67F1BBC1F7D670DF18ECBC4CBAA3CED6C6D94A88635DB890E6327CB0403C
05C9AFA8349F8E1F14B51F1DC0DE1FF0678574F55B0B94177AB6A171730EDF36
00C4AC71C5F30654FE3C1DC483C0CFC9FF00B5D78BF678C1A7B9D2ACEC924F1C
DA4BF6AB2BE86EE1DB1DACE8D0A01B65619190C2309F2E090DB54FE857C09BDD
0FC4DE2DD2FC41A0C2B0D8EB5A4DD4F138B77B332A34B6FCB44C1486F9472573
83C1C1193034EBCE4D42A72F7B2F37DFB118E9D1A708CA54F9BB5DE9B2EDDCE5
ECFC13F1FF00C75A69B8BFF1DE8FA12CC418A2F0F69505BC40739CC971E7CBDC
60A9EDEF54DFFE09E9278BF576BCF1678EFC5BAE4D2A9497CCD66E5A3953FB8D
1E44641E0E3681903A62BE8C9340B3965693C948E66396961262909F76521BF5
A7AE9B736FC437D27A05B88C4CABF88DAE7F1627EB5EAFF64C64EF5A739FFDBC
D7E0AC7951CE2A455A8C630F48FEAEE7837857FE09BBE03F03B79DA3A7D8AF32
1BCCFB2A15F73C624DC78E4C84703E5AF8F7E25FEC4DAC78DFFE0A4DADF86F46
F176BDA0DDDD4075C6D4F4FD935CDBA4704188D54BC21801204CB7CDB703F7A4
923F4F96E6F201FBCB459BB036F28CB7B957DA07D371FA9AF21B8D1ADED3F6EB
B0D5A7D1F4FB28E4F045C08F549DE486EDA5FB7461E0DAD88DE321D583F24321
0A7048AE5C665B8383A708C2DCD249EF7B7AB3AF0799E2E7CF394EFCB16D7A9D
87866C34DF04C10DAE97AC7F6549811A45AB58AC7E7B77209586491C9EA448C3
9E9C8AE864BED5AD79BAD316E94FFCB4B2B8566FA94976607B2B39F6AD978D67
B665655923997E60795753FA115927C17616EBFE871CDA6B751F6295A04CFA98
D4F96C7FDE535EF429A82E58688F0A5539DF34F73F367E0EEA31DF7FC167BC45
33A9B78D7C577C999B74647FA24D80437DD3920638EDC64E4F71FF000582FDB5
B40FD97FE20695A59B78F5BD735CF00F88F41BBB04B83049656DAA8B6862B876
DAC18036F291181B9B67254106B84F8136335C7FC164FC5D12AC5A848BE2DD5D
08BB608B3E2C6E73BCAA103201E898CF6AA5FF00059FFD81A1F8D1F1AFC0DAAE
8090F85FC49E25D2F54B6B9123AC9A5DD1D36D7ED510411A892391D5A442C536
9DB19DB90C4FCFE2399E0EAF2FF37EA8FA2C3F2AC652727F67F43F25F4FF0086
69E38BF9E1D17548CDFC41A75B5BC4F2CCCA39628EB90C579241038E79C1C54F
13787354F0B78A64B9934D92DE191C4A04617CA462016505491B43640F503A0A
C57D526B49A3B88249619948923746DAE87A8C11D0D751E17F8BDA86A720B5D5
923BAB791B63CBB36BA8F52070DF9035F351B5B53E95F91666F1769FE22F0FB4
17529B5D45A22A564520391D0838C7381C7AD7BBFF00C13ADBEDBF0B7F692B06
E049F0BEFAEFA7786446FF00D9ABC2BC53E1A5D32DEE5552368F06646D837290
3B375C633C74AF74FF0082606ED4358F8DDA6FFD053E11F882003D4ED848ADE9
DCCE7B58F9875FB6F2F5090A9FE23823BF26BE9AFF00826BFC4A834CF85DFB47
F81EEDE4487C5DF0F25D42D9563670F736132C8A0ED0768F2E598EE38036F5E4
57CDB771FDA76B7F79335DA7EC8DE3E4F877F1CA192697C9B7D7348D5BC3D396
38522FF4EB9B45DDEC249A33FF0001AAC3C9C6A292F4FBF4FD49AD0E6A6D7CFE
ED4FA3BF67FF0084FA5F8C34EF0CCD27DBECAFEEBC6969A4CB7D617925BDD241
71A748C888FF003227EF222721093961C8E2BD97E206BDE22F00FC16F145C1F1
E787FC55E1B8E092CE74D72C9EDF53B492452B1FD9E68C1496E01C11B9436E52
32A412BE6BFB3569B6D359E8B7122B47756DE3FF000BA47711B98A78A3923BF4
708C385E550E4FF741F5AF59FDAB3E1343A67C18F126B13EB16775336A365A8C
F67A8C4BF688D8CF6E1BECD2311E629F9C32229230C4E3219AA29C29A9455BFA
B18B7CD51C5FF5D7F5352E7E2AF83756F05EA3A0DE4571A2EBD61A6456FA743A
822A24327961631BC31842B7C8CAFB89C2920A9C83E0BF133E19FF00C209F19F
44D2F4E93C45A2E9BAB7F6734D3DE88D27B8334AE1E48F61DB24188DD91A41B8
E067D4FAB7ECB5ADEBDF1274FF008D10DAB5D0D36F24BD6566B117492DB2B4C8
AA57036900150C18005B9E14579AFED4FE36D43C4DE2FF000FDE4B058D9FF61A
436369E4337EFA3B7895D1DC1EAC3ED0CA76F0304738CD79BCB6B58EC5D4FD2E
FD937E01F85F41F0658DFC9A6A6A9E20D1EF2EEC5F50BD76B9749209DA21244A
E4A4259151B11FDD2C46E6EA7DA9E172E7E57EBE95F977ADF81BF6EAD57C2B78
7C23A0F89974B8EE64FB5C5A2DAE9D78F0DDB849645545324AAA6396161B4630
E08279AF3A97E14FED98256F36C7E3B09327781A05F8E7BF021C7E55F4986E22
A54A0A10A6BCF5B6A7875B239559B9CA7F87FC1380F84DFB4743E24F1E7C19FB
2E9FA569BAEF837527177AAE9F6C96AD7B119216B68DFCA4C3BC2164FDE90D23
79D825B62D7D936DF1BBE3378A3C5DF127C1EDAC78CA55F07E8F7336B12AE9B6
BFD9B6D11B576DB24F2A99519D46546159CEFDBD067466FF00823FC7FB336A9E
18D77C1BE13F0AFC415F0A78965D6EED752D6E6B5BAD734F138960B3920B856B
35648C0899B3893258852401E8DFB2AFED35A3FED39E1DF8EDE24D3743B9D075
AF15BDB5A34372F086B98C99CC488EB8F30C51C9B4B103236D793530F5694D29
371DFCB6BBFF00807A5F58A5562E51B4BF1DD9C4783BF65EB6F2BC2EFE23D6FC
4BA5C7A6F852C9A3812DAEDAD2D656332C98DA7CA5CBA3163B572770EB93567E
287C00F01C1616F79A6FF67EB567A1697AC6A375334B14A63963B36580FCAB90
CAC5DBE6E7E41DD457D19AFC91693AC9B9BCB85B1B18F4CB5B759643B149F36E
656F98E00C09579FF6BD8D796FC53F8F3F063EC3343AF78B3C13A93EC6DF612D
DDADEBDD3904052A1DB1F79865F006EE4819AE8587C324A7369CB4DEEFD7BFE4
72CABE25B718A696BD95FF0023F28AF7E2AF827E3C78634DB3F8A30F88F4EF10
E8F17D96C3C51A25BC57935D5A86262B7BDB79248FCCF283154951C304DAACAC
1411DCFECC5FB4A7C39FD90BC4BAD5C7C3E9B5F4F126B9A44FA21F166BB64B1D
ED9437055268F4CB581A4F2659620F19B87769024AEA8232C5AABFFC145BC3BE
1283C79669F0BFC0EBE1B5D244897CD14A5DAF8CAA8C8EB1B31558B663853C97
CE0FDEAF2BFD9A7C23AB7817E29E9FE3CD7BCBD174FF0007DCC57BE4EDB6FB65
E33128A2286575DE412090C0A85C920806B92B24B4D19DD464E4AFAAF23A0F8C
9F107C31AE2DD5A2DF7D96DCC7E5279EAAA73FC276025B00E0E76D79BFC0145B
EF8C962D1C8A47933F43C8FDD9AF66D67F648F86C15E6F127C6CF87D14FB0B79
5A2699A8EB370C40E1772411401BB7FAEDA3D4D67FC33F83DE11F845E206D4AC
3C69E10F172DEC2F6F6A2D8DD5ADFD83928C5DA09D231CAABC7C348B87638DDB
4D453A8B99234A917C973EB2FF00827A7C32F8E07E1FFF00C265F0E754F0943A
74A27B0FB16B3B9BCCF2E61B87C91961BD943062E9F748CFADAF8B3A078DBE28
FEDE9F09F4FF008A5E05F0CE8F71783CB921D22E43DB6B302CCCCF2C98919811
9230CDBB038AF5CFD943C49FB3ADA7C1FF000869573E27D3FC29E26B1115E6A1
35F5A5DA19AE4FCD2C7E7BE53C92CCC76A4A801C101718A77C754F0C78D3FE0A
75F0374DF0378B1B5C812CCBDCDE43A91D5A1B233CD208634965697E622272D1
9276AEC385DC09FA0A74FF007295F4BAEA9ADD74DD1F3B2A9FBF93B747D1A7B7
7BEA791FED216DE0DF873E05F13F867428FEC771A1F8F2C6F22B6820676B1B73
0DD2281230C005D70159F2719AFD34F035D35DFC46D2DDBCC0CFA7DD6E1D5724
DB9E4FA8C57C3BFF000504F84D7DE14FD98FC51A85D43A3CACBE3B815B518ED7
ECF7975279F322C45773B4806377DE50A1B80D86C7D99F0666D72F35FD0EF751
F0DEB1A743169ACEF3C8D6D2C532C8916D286295CF38276B056C0E456D9738C2
6EFF00D6ACE7CC3DE847E7F923D91507E14E58C0C7BFE95135F436FA7C979319
ADACE152EF3CF0BC312281924B3800003927B53FC4D751F847E1F6A9E29BCF9F
43D1616B8BB9ED48BA68D557790238CB3B36DE42A82C72300E467D878BA2B792
FBD1E3470D55ED17F712797F5AF2AF859F0AACB40FDAA7E29F8AE2B7924BCD71
74EB59AE594058CA59C00DBA1DD93F2AC3231C007CD519254E3E62F19FFC1C5D
FB3BE9F21B4D0478FF00C5734CE2247D3F4716A9F31DBB83DC3A30EA48F933C7
4AD2FD873FE0A516DF10FE1AEB1A84D1EA1E23BA8F5D9E3BC9A7B9585E266556
4D8BE5FF00ABF2FCB5193CB24841208C79B89CCB0EEA422E5A277FC2CBA75BFE
07A987CAF12A9CDA8EAD592F9DDFE47DACDA0DA87668E25B776392D0130B31F7
2A467F1CD1FD9F7512FEEAED9813F76E230E07B02BB4FE2DBBFC737C15E376F8
87E0CD3F56B4B59AC22D533B3CEDB23201BB2700E0F2B8EA383DAA2F8C365E30
B2F829A3EB9E1FF13681E1DBA1E2BB1D0AF9D7434D59EEA0BDD56CEC51D0CEFB
2092159E4728639433003700093D188CC68D2A4AB24DA7D8E6C3E5F56AD574AF
66BBFF00C03F38FF00664B991BFE0B3FE2F668CC922F8C7C400AC7DF1677A38D
C47A77EDEFC57A7FFC165FF68ED27E03DCFC23D4DA1FED0D6AC352D52ED74C97
75B3CB692E9B35A3486428708259E2E80EFDAC07DD35F3858FC59F17FECAFF00
F0551F8CDABF862CEF3C69E24F09EA1E3190DE186DADE4474B1BF85F5168B625
BFEE41FB4989061846E8AA30A1ACFF00C14BB4EF097ED59FB447863C1B6BA97C
70F08F8CE6B9D3B48D374BF8AB697D26A16B04F06A32DF48CD2EF0D1FDAADECC
AED9C2E6EAE0C71B05213E76A666FD9CA8C17C4EFE9ADCFA5A796AF6B1AD37F0
AB7E07E6AF867E0669DF1175C5D1F4EF100D375699765947A8C3FE8F76E3A47E
6A728E7F8414218F190700E1F8EBE16789FC19AF3B6A161FBC8422C8D149E621
28A173D8F20679C54DE34B7B8D2F56B88B7347359DC3C0DB491B5E372A483F55
EB57F48F8E5E20D6EFFCAD6E6FED48E3C2892E17FD2197DDFABF1DDB24FAD795
193FB47AF249FC22683E3DB1BBD07EC3AD34D6D38DD123F965E39148E3247208
CE3A7402BDD3FE0920AD79FB4A78874DEADABF81B5CB2C7A936E1BFF0064AF1A
F137859224926B74536D76A1DBE507A659483D460FA57B2FFC11BDD9BF6F1F0D
AF3E5CDA66A91CBEC86CA5CE7F215D14CC6A6C7CDF631EF82127FE788AC785FE
CBADDABF649D1BE98615BD69E5C6D1AE7F758D9BBD1738CFBE0735CFEAFF00B8
B866FEEBE7E9CD268A5A9F58683A3789F507B59341BABCB3D3EC6EEC6E6F8C57
86350E6E8C36F318778F38A4B200BB412BE61E80B1AFADFF0069BF8970F8D3E0
E789BC13ABE9BA8C9E28D16D4D86A37F6BE6DCFD9E485C911CF2CE90C85C3460
36D8A44E58EF04E2BE38D37C4DAE693E176486F5AC92FA654BA8ACEE5E38EE62
4B859610E323715711B818215943019191F567863F686BEF17783EC3C3DE259B
ED1A97887C2379ACCD37D8C02F3FDAEE6DC4FB555362CF6F1412339043BAB4CC
73231A9955942328AD992E9464D49EE8E6FF00E09A53EB2AB7D63E1A9219355B
8D1EEDEF6D43C07ED96E55CC8AEEE0EC382AC3A67691900E4737FB57E937AB61
F0EBC4579A5AAC5E22D2E48A2BC5B5F216F96210461865882CAA55491B73C1C6
4F3C7FEC75AEE9FADFC41D763D4AD2D6F2DF50F0EDE69304324584B26F2418A7
0C394D8C1DB78E540CFA0153C5171E268BE15787D357B8D4AEB48D2EE6E6C74E
4B98CCB6F6CDBB122C4F80DD153208C0E0E6B9797DFB9B736963F487FE098DFB
7FD9BFC545F879A97C41B596FF00C456F06A3A25E6A9A535BDAEAD782D2086E6
CE66DDBE29235B7844723BFEF70C02E4857FD10FEDBF1A7FD0034493FDB4D664
DADEE3F71D0D7E1AFC3BBAF11F8FFF00690F09EA5E26F07F84AFA6BAF0F34D6A
FAF491CD6F0DA94B4315D212A5B72A4242AEEDCA1E400AE79FAB113E20D8A2C3
05F7C22B58211B23863D4F5444854701428BDC0007000E062B4860EACB64CCA5
88A6B767D75E28F0C5AF8BBC3B79A56A11CAD65A8C0D6F388E5689CA30C1C3A9
0CA7DC10457C77E14FF825B6977D6FE28B6F087C44F8BBF0DEC23D59EDA3B7B3
D5A19AD2E9A35556936ED12BA86CA82D203F21E3B9FA0BC4DE1FF09F803C177F
736FFF0009578621B181D834173776A9031E9B5E66FB38218F00B6DE8067815C
9FECDFF1364F1BFC28D1354F117C4AD3F49F126B0AD712E99149650ADBB3FEF3
CA30485A4DE036E6CEC7058864560D9FAEC6D3A356B45565B26F75E9AEDDCF94
C2D4AF4E94A545BD5A5B7CF4DFB1F287C57FF821B7C44D58CD269BF143C2FE32
661C2789F4DB8B39587A19636B8CFD768AF86BF697FD807E2A7ECBB7571278AB
C1BA8693A6AB958F52B36379A5CB93C6DB94CAA93D924DAF8ED5FBA9F0EBC59A
87C4AD26F2FB40F1526A76765772D8C86FFC3D25B06963628E11B29B9432B0DC
1586548CD748C9E3010C90CD1784F5186652922133DB8914F552A448181F7FCB
B571CF27C34D7351BAFC51D14F39C4425CB56CFF0007FD7C8FE6C7C37F10B56F
0A4E2D24692F2C738304ADF347FEE1EDF4E47B77A7789342B6BF125E59A308E4
2588230D193EB5FABDFF00054FFD81BC03A67C09D7FE2159FC33D27C27E25D32
5B5C5E681AAF97632F9B731C4DE65AF9688490E465114827249AFCF5D1FE1E5B
792AE5BCCFBD91B703E515E2E2B0B528CBD9CBF53DDC2E2A9D687B489E576BA3
47A7D9C724CA599865549E4FF9F5AAD3788AFB4997CCB5DB6E776D1B073F9D45
F13F55BCD0BE22DD5ADB95589821F2D9430CE39E7AFEB5D67C0AF05C1F15BC4B
6763AAC170D6F34E5196CEEA2B491F0858012CC1A34C903E660463B6715C328D
B5676AEC8C2D37C6DAE4A7F737D711EDEA518A85FAD773F0F7E366A3E07BA171
FDAFA8C9A90561138214C6A54A9DAC3E6E412A493D1B18E6BE8AF877F087E1A5
96A1A0EADA0F82F53D2EF7C25E3AD12D357B7F13EAC9AB5B6A1653CCE8D902DA
188A8911436637575901040460FF00A05F163FE0947F093C5FE0CF1559F85F51
D4BC2C6EA1903697697BE5D8DCEA7106F29E68E41925248C0548CA280D270C18
6DDA8D1A937FBA7E7BDBF130AF5E9D2FE2AFC2E7CAFF000C3FE09B5FB587ED35
F0EB439A2F08DF2F84B5058B5BD34EB1E2DB586CD84D0B7977490B4EEC19A295
B9F2F387AFB59345FDA43C17E33B1F07FC49BCF10CDA95E784B529FC0FA7FC24
BB7863D3EF607B38E0975295628435AC2D2A26FB8F347EF3E62F9E7BCFD91FF6
E6B3F867FF0004E3F0878866D25B525F087842DA17B2370B672CBF6689E38E18
9D8C9BDD8C6918DCA9F330EB9CD779E27FDB33C27F0E3E3059F89BE2169BAA78
7FC43A7E917BA3E976BA44777AEC77B6B3CD673CEC7CAB550ACB25B42A18B050
0B752462651C472F34AF6239A8F372C6D738DBFF0015DB0F892BE35D7B54D42D
BC693F8DF56F0B6A773752DD59DA1D253C357456C16190ADB84FB4C70CDE5A8F
304AE1CF2F93C6E81E288FF67DF84BE30F186B9E03F86FA1C7A0FC3BF096A167
67A55D0FECB9AC45D5E473DEDE4AB6DBA2BDDCC4C8AB0B0091A2F98E7257B99B
F69DF03EB7F1E25F137857E03FC45BCF1A6B1672C97979AA68B1E9EBABDA9896
D24112CD70C124646843CC2257686028588205719F1F3E38EAD6625D26E3E07F
C33D121D620B5D0AD175AF115ADABD84789951CC9040B22C6F1A36E567010403
192F8A98D3AD7E68C5E9F9EFE88A7529BF764D7F5A1F9897FF00B36F80FC3FFB
40DF5BDCFC42BEBAD43C59752EA7E1EB2D2FC29A6DD69915A4B26F8A3B7D5351
9E36BA3123842628583046DACFC9AEFECBC43F0D3F620F1C37873C3B1EB1AE69
7E2290C136A7178922BA0AD081B2630FF674263318725A06C160E02CA386AF31
FDA9BF66C7F84DE25D7BC3777E2EF01DFF00816F353FED8D074ED22CE3BFBAFB
4799819360D1005166914492B46655442501C2AFAA693E178BC51F0EFC27E249
2CF54F895A9F876D67BD92DEF6E2CB47859A18716FE6234AF717516CB6759117
CA92411B21941CBAD4BDD95E4691D62944FD00FD95BC4963E28F043D9DB3DE59
6B9A1EAB77A36A3736EAB70AD358B157B74C1DE17748241850C55C960075F6BF
1678AB4AD7FE09C7E1BBABCB78EFEE3C5D61A8ACBA3DBADC283657F0DF8132BC
91F97248B62F13658847209240207E7C7FC1327C67A77C16F85DAB697E236F19
6B7E30F895E21BBD6F53D62DA07B601E7220C22AC9E6AC81D24762A8A497C0DC
AAA6BAEF8EFF00B7D6A57DFDA3A0E89E0D856F2E2D62B886F6EEF62867825BDB
68A6672157CC611A4CC321577300C0950B9EDA98BA4F0FEC7EEB5FA773CF8E16
AAC47B5E9AEFFD7F5D8F2CFD9BF57D07E33FFC1567E28DE4B6571AAF873C73A8
78BE2B98E229311697B677F1B48AD1391222C736F2D1B1C804A93C676BF6F4F8
F1E0FF00863F09BC13AA49E34F1EF8CBC65A7FC51F0E5EF8A2FF00C44935C7D8
AD74FB7BCB36B64BCFB2C10C8A8279DC2A658B4B231248663F35FC18F8D7ABFE
CF7F1D2FBC631EB3A7E83A969379334D79788CD6D18789D2547552A59583B0C1
3DF90699FF000508FDAAEE3F69FF00D8F6F34FD3FE207FC24FA1784758B06934
A44B78E1B3693ED016541E4C72BA02EEB906455322A9604A83872FBEAFDBCB73
AD5ED6F33E50FDB9BE1F37C1EFDA53E206898CC30EB173756A7040782E2433C4
412391B640B91C12A715E1DF69965789FF008A340873DC03C7E5D2BECFF06DEF
867FE0A25F07BC3FE0BF126B163E1BF8CFE0BB45D37C3DAB5FBEDB5F15582FDC
B39A4EA268FA29E49CEE018B381E27E38FD853E2BFC39D764D3F52F87FE2A322
B6C1259E9EF79049FEEC908743F9D54A9EA5C65D0C0F067C5BB61A79B3D6232A
AB81149147BC11DC3639FC877AF7EFF827BE98BF03FE1AFC62F8D975F269FE19
D0AE3C35E1D95C6DFB66AB7BB523D99E498D36961D42CB9EC6B9FF00837FF04D
2F186AF07FC249F101A1F85FE05D3C892FF58D7C8B790275DB140C43B487A004
2827A64FCA6AFED87FB4DE8BF12B46D03E1DFC3AD3EE344F84FE052E74C8261B
6E759BA6C89350B91C7EF1B736D046543B13B4B145AA7A132D4F054411DB22FF
00754AFE9593E2118F339E39ADC9ED9A081376DF9D770C306E08EF8E9D3A1E45
62EBD0F9DBBE99A25B1513E8ED2BC63FD99E0AB51F66B3B8FED4B278CC9736C9
2ADB8DB6EE5E32DCACBC10197E600903EF57AD7817E20AF863C4BE33BEF155E4
6DE28D7A236D7536B16F23DD7D9C1B7F2208D540863468C105780AB144A981F2
9F03F0E06D4BE1868ED1C68CD6F6D196F9B9FF0052BCFD32BF5E6BA7F87FE3DF
105BEB9AB69FE1F592F26BCB5B8B0BAB44B72CD716F260BAB05C171F2860093C
AF4ED594F71C7627FD99A04B3F89D0C0D7B0E8F1C2C1A296E9E18A3891771C1F
3BF767238C36771C639C576FFB473EA5E1AD074CB15B8D4751D17CC62B23432C
76B05C3990EE12E3CA264019C22724649279AF30F8256706ABF16743B0D5352B
8B4D324D42149E45BC5B76B642E06FF3581085786CF6C57D49FB49793AF7EC97
756E9A84DAA4B6DE30751704C4D1CF12473246D94033210492DB4039F7CD44AE
9AB0CF11F1CE90DE048BC39A83EED58DE698B78D696D76EAD0A324ADB5F2A769
DB1EF21430DB8C915DD693FB4569F36956AF36816AD33C4ACE4DD124B1033FC1
5DE7C3EF0F785F52BDF8177DAF6A9A6D9C933496FAA3493C2C6158A29D6112AE
18A2BB02A378C30FBA33927E93B5B3F024B6D1B342DB99413E4445A2CE3F8488
B057D08EA2B1A951DF634A713E82FDB23E1BF87F59FD9ABC51A4DFC3E266B5D6
E04D3847A5CF34CF1C9348B1C72794C5A3DB1B3090E57A21C738AEDFC23F0863
F0878274DF0FD9EBBA96A5A5E976B1DADAA6A76D6772BE546A163DDB6042C768
03713938C924924F53723CD963FEEC32A1FAB123F903F991E95711016E47E95F
A04A9AE772F2B1F03ED64A0A070B1FC1982DAC66B786CB40B786793CE9174D86
7D27CC72412C7ECF28F9C900EEEBD33576C741D561DC60B8D76C63591908FED4
5BDF33048C817114C4038E9B81AEC235E5477A759C6AB180AA7E7666000EA589
3FD68E44B6279DBD0F967FE0A8EBAB4DFB1178AAD6E2E1E6825BAD3D5BCFB48D
243FE99163E68E418E7FE9973EDD6BF32C7863EC3A4190AB7CAB20C7F77E5E7F
515FAADFF053CDBA9FEC89A9E5D9ADE6D574E58801F7BFD21497F7CE300F65C9
FE222BF3C75BF0C5C6B3A1496F636FE64DE55CCDB4B05F9521323B7246005563
CFA57878EBCEA29BDADA1EF602D0A4E0B7BEBEA7C1BF1FAD9EDFE25DFC8BF7A1
0AFF008735EB9FB1969125E6B9A79DFAA5BC77174567934F8619AE4DBBC38991
166FDDE5E2675F9BB12464802B87F8D7E0AD5BC4DE35D5350B3B192E2DE588C6
A5194B6E03046DCE7A8F4AF5EFD8E34AB7B0BEB54D7350B6F0EC30932C975A81
9228A275B76DA1CA4333ED660172B1B1E7819E478B286E8F7148F50FDA5BC316
BA4FC2B8EDFC0EB1C3E176D4E3D4AFEEE5D7BFB4F55BF9608A458D2711C30456
C882566089E639704BC8764613E91F8ABE0D3E28F12378B3C2F69691E8FA8585
D4369A2F8C14EBB60BE4A194DDACB26F95988803471C8772EE2AC5A32517CA2E
7E36C9F18FC31E22F877A7EA9F10AF75AF0F698FA5E8BAC69B65791681E29B79
711CED25A38091B4B148C4CB2AC5958436D8F6A463DC3F663F86FAE7C43FD947
E1DDE4DE2FB186CF505103D958E9CF0DD5B4663B9B7129956E544D2125530F1E
06EEE179E395B975669ADFFCCF03F843FF00050F9BC2FF0009BC2BE133378574
4D274DD645EB5EDFD9C5325F189609638583B2ED8967904982082634078C83F5
B7C49BEF8F5E1CF006ABE30F166A43C2FE14D16D05C5C5CDAE976DA608977752
5B9F98B22AE382580EA6BE5BF0C7FC13A63F889F1B7E257C3FF107897C2BA545
E0FD434BD516F350BF4F31A0BB89CCC6168A366793CB440C8005570BB81DB5FA
76DF113C3FA57C38B7F01CDA8F877C49A3C3631E9434A934B94CED6C91AC681C
CF341BF0A8BCAA16CE0E735D11C5495A2DBB69DFF468E7A9878BF79257F45FA9
F949ACFED859FB55C269FF0015B58B3BB25659A6BE105A1DCC1C9578E468C862
99E3A9504F415F612FFC13A74FF187C39B7F881A7DC43AF7F6BE836FABD8E98D
66EB3DF192133450B19640A9231755666185C939E39ECB4BD17E1FFC2BF146BD
E2FF0010787CDA5E5F451C1787518E2D1C5DBA6F2B752B9B378DA46DC434C650
A0B64004927B6F167EDB5E15B58E592E6E34BF0959B010A346B71ACDAF2A3684
367322AEE5E4663620F50320D72D4A8AF7F3EDB9D5084ADA76EE7E6EEA9F0F7E
335BCB63A2E9BE0AF09D9B4978CBA9E9B69A72FEE2D4C8A5C348CE33F2B9766C
08A38CA317259847DC49F10BC55FB34DA40B1DD781FC496ECE74AFB2697E22D3
F55F14C72CED78C9776ED03DDFD9D6289204633C24096E079615CABAFB57C43F
DA53C0FF0013EE3C41A6DE78EB45D36D64944204DE08179672DA410BDDB5BCE6
F239BC962D6E92AEF88A130606F902D707F137F6BBF87FF06FE217FC2117D6FA
DBEA715C84B1BC8753FF00843B4081CC61E06636CD708B957E240910CB9FBABF
30D232DD2D7B6DA13CBB391E9DF097C15F1035FF001BF82F55BFD3BC752D9DBE
A96923EADE25D3E5875092C6E6C259FC9D49F647992D6E2DCC44C84362E90316
5118AFA7BF673D5345F08E9FAADAB789344BE9219AD2DE386DAFA1BFB88922D3
EDA160F0C26471B9A36254820F247079F89743F88BA9FF00656A1A7EA1A4F81F
C3B757FAE69B6CBAB59DEDD7882F07DAACAF4A4B6B7F792CBF37EE9536429971
7129014A864F54D07E25F89FE04FC3CBAD574FF1343A0C76DA6BDB2437B77656
D6A26505949DD0C804859DCAF98E8C1A4C061804E752EDEA5C6D63E6EF077ECC
F2FED35FB6278C3C23A45AAB5A6A3E27BD92782451144D631CECF2218DD7A88D
72A8547CC141031C6D7EDB5FF04C7D07E00FFC13B35CD11A6F06DBFC6CB18A0F
105FE9566F135D6A3A7DBCCEB2C9688D1A4E8BE59323A2008CD0B8009518E416
2F1458B789755864F105BEA9AB3CD3ADCDADC496B7370F2E1891328CAEF63F33
007827E56191599FB44FC38F1D7ED1DE36D37C5BA1D8F847C3AB6F636561A55A
EBFAC4D72BA5E9F6D6CF0881895CC924B248F2C8CCAADE63B67926B49F3AAA9C
7AA220A2E9B52EE7E6F5E5A27D8B77972BAED25BF72C700727231D873ED5DEF8
3BF6E1F8A9F0EB43FB0E8BF113C5D6F63020D907DB1A68E15E802F99BB68F618
15EF1FB447ECE7E34F005E58EBFE22B9F871AE6A175A447696F1697A85CC3379
085A34706E11BCD2376D2C1F3803278AF8EBC71E19BEF0C6AD25ADD43F659594
318FCC56CA9CE3A1231D7BD7546A49A21C5266D7C44FDA27C45F16AFD2E7C51A
EEBDE24BA8B2626D46F5E61167FB81890BFF000102A5F0AE953788FC3179AD49
6F247A6D94E2DF3190EEEFB771E3B000AF3DF70C7438F3C5B5FB5DC470C7B649
A46088A187CC49C01E95EF1F04FC252D97C2FD4345D466861BCB8BF3730D9C37
51CB3483CA55C9446240C8C73CF5A4E4F61D91E6F73E28D15AC658E383578EF3
04C6CC23F2F3E8CB8DDF883F9D63CFA87DA59B103B2ED009C7B0F6C57B047FB3
3F8B2EA48E6D3B4BBC8CC4C1926F3043E5B0E41058820F715D5F833E0878825F
1E7DB3C55AFDD2DD5F5BCB0DCDFDBDF7DBB54B7FDD0447C3BA172B8500798385
C640A7EF2576174637816D193E0CDAE15F74D6A30BDF203A1E7D7915E9BFB327
8217429B4EF11586A925F4724F358DDA0824B5BAD3DDACE6640EB8276B61C874
62AC14F23070787FC3F6BA5E8935DF8C2C752D6B4FB142F756DE62D94FAC46A1
9A40B260AA33EDC67E6C13CE7AD7A17ECCBF027C1BFF0009E6B9A65BE8B1C725
D69911CFF6F5CEB11582B48CD37D9F305BAC73A88B0D2B34EA239B09B99C38AA
89DF4338C95B53C23E10F875BC41F1934CB3589526B9B989510289464B2ED5DA
C181CF1F2907A8073DFE97F8E1E19B8F0E7ECBDE2AD1AF9BF7BA3EA314C3CD8C
79922398B6392077CB80BC6DC6DC118C78E7C40F0A59785BF6CE4F0EF87A48E5
86096C5567E6E5A277487703F30DD8661C139C6066BE8FFDAC3E1B78BADFE197
8E34FD4E3F0D5EC3A7E95A65CCB3E9FE7D8BDB037B300441286121380ADF3A85
5C101B9A950E68F3F6B04A694947B9E14FE19B8D27E1FF0082BC59A2E9F7D79A
C6A177E458C36914E646BA8CEE8063CB2B26589CAC4FBB181B41193C2EA5FB71
4E750B8FB769F711DEF98DF685F36F06D933F30C7DA4639CD7D45FB28E87378A
BE16FC3D81B4FD6E0B7F0AF8C975692F7ECB27D916DE24F34279DFEAC3193CA0
54FCC43E471CD7C07F1C2286D7E3578C238D19638F5BBD551C0C013B81DAB595
18593D2FFD7EA4C6ACAED33FA563E20D345BC68BA858B36F4EB709B9BE71938C
F73CD6A5A4E977FEA64498772AC187E95E0D04DABEB024B8BFF1ED8E817D771A
E45DF86BC892152DBC2317650CCBC8C851CE4F238AE9749BAF0BC3A15D69D2F8
DA059A38E276D663D580B867B89A440A91EFFB3E4B28500C0C49906724835F46
B1D564F4A6FE6EC7CCCB054E3BCF5F467A478B7C67A4FC3FB09AEB5ABC8F4FB7
B7B692EDDE50DC471825C800124F070A32CC4600278AF1ABEFF8293FC1D5F076
8FAC5AF8B7ED9A5EB969737904E9673DBB3416E1CC876CEB1B00DE54C01C7CC2
09B1F74B0DDD27F675F0D69BAE5B6A967A6EB5A85F5A09560BDBB5B680979230
8FC8856525C29DCC1318690F3920B47EC6DE119F5AD5AFBC41A4E87AB26B51A5
AC3A747A622C16A05BBC1B50B1242F92F2A7EEC46162665DACA140E3C557C5CD
38C52B75FF002EDA9D586A38483529B6DF4D2DF3F97E879BFEDD5F1534EF8CFF
00B1E47A96866C753D0EFB5DB0F22FECB54B6BDB7B80B2C81B6BC0EE8D878CA9
01B2086CE31839BFB25FECE7A0EB7FB2F6BFAC6B1A4DB5D5E6BD36A16905CCA9
B9E0B516E21210E78CB19B247D3A55CFDBDBE1BC7F08BF651D1F44D1DA1B5F0F
58EB16504165145E5AC2155F6851D028DA400A0718CE4E49F60F877E101E05FD
967C2561E5F9771FD8ED3CA3D1E64F39FF00F1E7C7E15C38E9D4E48BA97E6EBF
E5A6E7760E34F99FB2B72F4FF83E67E196BF7D69E14F156AFA2EA17D630EA5A6
5F4D6F7104970A8E8CAE41E09CF38AEBFE1AEB17DA15A5D6ADA05E3DBEA562AF
34535BBAEF50217DDB5BA64AE467DEBCAFFE0A55E188F47FDB43E264516369BA
4B9618FE29208E46FF00C79CD7A2FEC3DF0DF4DF14695A2E8BA8798D6FAAEB90
46638D824972ECB1EC8518FDD691F081806605B211C80A7939934EFB58EF71B3
4D1EFDF0034BD4BE247C4BF0D78D2E3E227883537D36E7C3F77E25F0EEA77173
E5D85AC97004F348E646824846C766C7CAAA58B05DC0554FD99FC69E34BBF873
A2E87E0DD305F6A1E1FD5AED750BCBCB7B1BCB30BB4B431DB0998162B8958EC6
00F98BD8823CAAFF00E3BC7E36175E1BF87D7DA6E83A14D0DB88E4834CB98F53
F2158C1E5493B090EF56320133166505C46C8ACCA7DAFF0066B8A4F85BE3BF12
5BE977DA7E9F63E13F10C3A9033DC08D238E4B49E38A188481434C0C9B0EE1F3
6D63CE0570EF16AC6F2D1EACF40F825F0BF54F1FFEDDD63FF0995ADE785FFB6B
C212DF5841A7CF6F1BDE436D3881164642E50B42EFB82346C47A29E6C7C54FD9
EFE28FC60F8EBF15BC25A3FC52F105CD9F86EE34BB8D2ADB53D5EF63922FB642
D7660B710BAC4AA8CA533229013196E589DEF881F1964F0AFEDB1F056EA6D235
45BDB0B6D4745B9B4816D2FE468AE2D992DD116C679DE461247B8A955241C0CE
491E81F013E387857C35FB53FC62B8D7BC40BA45CEBABA20B6FEDA80E97712F9
164CB28F2650AF128908015F92369CB7DE3ECD3C251E5507BDF7D9DADD8F1EA6
2AB2939ADADB6FADD1F2BEA9F04BC57E10FDA33E1F7C31D5216BF97C51AE9D1E
5B8B59E08D2D65478A594A4891A4B232C6CB316729F3700B95047D8BFB53FF00
C12DE6F81BA0FDB06AD6B7927FC25BA8697A7DE5F5EB08F59B1F2ADA6B3712B8
9024CA5EF12566609E65BAA054196AE5749D5FC37F12FF006FBF875AC43A8432
697378C1AE2D354B7B2B8BA9229A6821B688C6A8426D79090CCEAC0EC003264B
57D8FF00B60FECD31F86FE0F6B5A7EADE3CF1C34163AEDDF886D9EF67B2B3B4B
39B51BD325D46B10B6173E5667B82B1A4E71B8F2531BBC6853849C979B5F73D0
F61B924BA689FDEB53F1C7E36FC24B7F879F062E97C5DE2AD43C2F6BE3DD6ACA
F17C44D126AB63E1CBAB54D4A08ACEE45A949639EEA090C81BCA21163DACCC4B
F97CC7C42F817A2FC1EF85D6775E32F8A5A845AC58EA70E97A3369FA4B5E5BDF
4915BC170927DAA69E2F214473C663223917E51C8C135F417FC14F34FD3F46F8
71F0CF5ED2EEAC7414B6B18AC353F105F4116B5E1E8818D847637FA701297776
0ECB3FD99CC6514647253E5EFDAFBC391D97EC69630CF6579A4FD9FC4D2CF6B0
5CDDFDA207CE9F6DFF001E4E4E5ACB68060EE2168B3EA7B274D464A2B6B2FC91
85393945B7DDFE67BB7C15F0578AAD758F0668763AF785350D0FC077A2F92E23
D5EDEE66768768B49DDA08D23F2A28E5B948621BF699642EC4305AF61F879F18
3C4DF06F4ED763F10787AC2EA2D362FED1B486F750FECC478A3749A76C48CC1C
11122AE028CE4019233F3F7C17F157D8BC6DE04D3759D427F10E9BA9E948F636
B3465974A6DC4BC4DF383E5882D86DDA7E53B7E423E61EE07C6979E11FD9EBE2
F6B9E245908D05EEA422DAF6DECD6FEE1EE1EDFCA86411C9E5A8598795D5385D
A9950C3292946AEDA0F4953DCF8E3E2AFED65F1735CD35B5ED07C49A2C769329
BA1636BA3DA09A0899C8DCA2584B950782413820E0B0E6BC6356FDBA3E2F3339
FF0084E35CB7DDD45B48B6DFFA2C2D7710FC6ED3AEB43D51B56B85BABABAB630
DB43A8C03559A25F3176C725C490EE70AA58F500900F04F1B1FB4869DF01BE33
780BC2775E08D4B56F0D7C486B2B4B6D720BBD345B681712ADAAABB2B20CC4E6
65DBBC828C1B7391CBD1ECA4EED16AA2564D1E43E12FDABFC65ADDE6A6BAEEB1
26BD69F6379A78F57D40C92305C01E43484B79A376422F040248E323B58353D2
7C79E168F50B786CB528E152424B107F29C73B594F43FCC7B5780F893C197DE1
2F105C69BA959DC595EDBB18E48A54C143D7F11DC11C104115BBE0696FBC357A
B716323445C6D910FDC997D1877FE63DAA7A6869A6E75DA9FED15E24D160682C
F4FF000DD946A3681169AA0E07D49AE7EDBE30F89AE2EDA78EE63B395B86305B
C684FAF2067BD4DE21D3C6ACAD34719567E5E3C7DDCFA7B7BD57D37C35242BBA
E15608C6097738502B3BBEA5DA3BA417DE32F116B4BB6EB55BFB856FE1927665
FC89AA724CD691AC97175E5F395E7073EDEB57754D66DED2D9A2B1856593A19E
55F97FE02BFE39AE3A6692F6EDA4964692461C92739E6A772B5B1E93E16FDA07
53F09E9CB6D6BAA6AB3479E52E27F3A2FA04604015B3A77ED5B7966EBE769F14
C579530B98190FA8C0207E55E77E04F86FAF7C48D5BEC1E1FD1757D72F76190C
1A75949752851D5B646A4E07AE2B63C6BF0A358F864D1C3AAD8FD8EEA662803C
88F2C6C02E54C609D87E75FBDCF3D2AA3269E8C9924F73D5BE1FFC5AF0FF0089
35CFED6B8D3F51B1D45583B5CCB6F1CF0CE4306C39C867E473C1E2BD53C73FB4
8EB5F123C21A968CB7D610DBEAF0DBDB5CBC21EDD658E079258E2DAED8442F26
4840061471F7B773773FB21782E2D52DECF4BD73C53AC5C5C68971AAAB5D4B1A
431C296125C292D1A875225409B0060413CE700FB07ECADFB1CFC2DF125CDCD9
F883C1975AF6A5A7696D35D06D6EEDD279C4AA36C680478254E03162A0E72010
71A46B54B72F46652A70DDF424FD9A7F683B1F861F0BAF7C23AB5B4EF6F34CD7
96F77664336F68E38CA39F30298F0808C65837B74F867E3AD85C37C6FF00191F
B3DC2E75CBDE190EE1FE90FD7DEBF483E13FC2BF82BE0CF0E78B7557F87B269F
6BA0191A5D527D2E2B986C632F1A8625669652BBA2936B6CCFEF08C5705E29F0
CF80755F136A57574D3C97373752CB2B996CBE7767258FFAFEE49AA956D9CBB1
11A69EC8FD53FD97BC7DA97C4BFD9EFC1BE21D52456D4B56D1EDEE6E5A30555E
42BF33633C67AFD4D75F2F8774FD68FF00A669F6379890B8F3EDD24C10D907E6
079079CD1457D9D1D69C6FD91F175F4AB2B7765497E1F689AB3DD5BCDA65AAC3
1C8A1561530E094472D9420E7271907A281EB99B4EF045AFDA2E2382EB54B48E
DE408AB15EC841DD1A312771273CFE1818C73928AE4B5A31F57FA9D5CCFDFF00
F0AFD0F05FF8290688F1FC1AD1ACE4BFBEB8B5B8F1258C6D1CAC8DD44A33BB6E
EE87B9AF68F891214F0B246BF2C71DBC88AA070004C0FD28A2BCDCDB75F33D2C
A7E197A9F807FF000552B7583F6D7F8A3B06DF9ED7BFAD95B13FA9AF4CFD81EF
1B4BF1AFC3BDAA926DF1CE9080C83715FDFC073F51814515C54FE1F97E87A953
75EA790FC30B249758D77EF27D8746B578B61DB82D752B367D725D8FE5E95F48
786EE85B78CAC7C4135B69B797D71A0D8DCCC92D840B6F2B34B736EC0C488A80
18C63800E4EECEEC105158D959FF005D4A937747D71FF0506F835A07837F64DF
837AFE9316A5617F278B7478E409AB5DB467CD8A62E515A53E536777316CFBC7
DB1E3FF01FE0F687E284D4AE3548EFB516BAD3ECEFA412DFCEB9925D3D2E8825
1D4B2893202B12304E7279A28AEBC47C76E965F9238F08DBA4DF9BFCCCFF0085
BE02D27C0BE39F19FF0063D8C3A70D2FC33AC49008C6E2A91C0BBA3DCD965595
0BC6ECA43ED91F6B23618755FF00048AD7ACBE27783B52F104DE1CF0D697793F
8BF488825858EC4897ECAEA554B977C36DDC41620B33375268A2B8701FC59AF3
7F923BF19FEEF07E4BFF004A6715FF000559B0B5F0B7C3BF04C86CED350B3F12
5FDAE997B67730A88DA2FB3120AC91EC995964449011270CA78DACEADF217C7C
F164DAE7C10B0F0A8861B4D0FC1325C2E9B6F1348DFBC79912499DA466667641
1A750AA90C4AAAA1714515D4FE146503D334BD426F87D17C2EBED3E6B8F3BC47
A2C33DCACB3C92468C751685B626EC0052250548233938CF35CB7C48F1DDCEAD
FB3B9B336B636F1DF6AD25D398632A5424F38112F3811EE3BB6E3860318000A2
8ACEA7C6553F84F12B3B15D47548A172CAB21C12B8CF4CD5111F972EDC9C1E28
A282A47E93F80FF667F06FED8DFB2F7C4EF1278BB498E3F107803E1968BAC68F
A869C7ECF3453C3FDBD9DFD55D6516F0AB86072235C152011F9F1A3E8B0C76E3
1BBE5E073451584762A5F11721D1A16D46163BB3F7873D0D71DF192F24D13518
DA17639936ED73B940C761DA8A2B396E694CE6B4FF00114D7C63478E10188CED
07FC6B5347D1E0BAF1024722B347904AE719F6E39E7DB9A28A8347B1EC565A87
88BE0EF8125BBF08F8DBC71E154D540FB55B691AD4D6704FB49DBB96320B6373
6324E326B85BEF106ADAE5BADE6A9AC6A5AB4D6F2A4CAD7D209D999700167237
9E00182718028A2B334E87DF9FB347872D757F8A3AD79D18FF0044F00AA44100
4D9BD630C780393B9B9FF68D7AE7C1676F107C766D4266F2EE353B6B99AE3CB0
3123A35BCF939C9CB348C092738C6304668A2B78F4F4397B9E79E209E5BBF85D
F136CCCD2C70C7E13D58111B6DDE12E92450474C033C9C631D3B806BE42F8EDF
10FC4769F1BFC65143E22D7A1863D72F51238EFA4548D45C38000CF000E31451
56BE1899FDA67FFFD9}
Visible = False
end
object GroupBox1: TGroupBox
Left = 8
Top = 48
-1
View File
@@ -39,7 +39,6 @@ type
CheckChiffre: TCheckBox;
CheckChevron: TCheckBox;
CheckClignote: TCheckBox;
ImageSignaux: TImage;
procedure RadioVertClick(Sender: TObject);
procedure RadioVertCliClick(Sender: TObject);
procedure RadioJauneClick(Sender: TObject);
+10 -10
View File
@@ -1,11 +1,11 @@
object FormPrinc: TFormPrinc
Left = 257
Top = 205
Left = 148
Top = 246
Anchors = [akLeft, akTop, akRight]
BorderStyle = bsNone
Caption = 'Signaux complexes'
ClientHeight = 431
ClientWidth = 866
ClientHeight = 520
ClientWidth = 976
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
@@ -23,8 +23,8 @@ object FormPrinc: TFormPrinc
OnKeyDown = FormKeyDown
OnResize = FormResize
DesignSize = (
866
431)
976
520)
PixelsPerInch = 96
TextHeight = 13
object LabelTitre: TLabel
@@ -1432,7 +1432,7 @@ object FormPrinc: TFormPrinc
Visible = False
end
object LabelClock: TLabel
Left = 774
Left = 884
Top = 0
Width = 85
Height = 22
@@ -5443,8 +5443,8 @@ object FormPrinc: TFormPrinc
end
object StatusBar1: TStatusBar
Left = 0
Top = 409
Width = 866
Top = 498
Width = 976
Height = 22
Panels = <
item
@@ -6450,7 +6450,7 @@ object FormPrinc: TFormPrinc
Caption = '-'
end
object Mesurerlavitessedestrains: TMenuItem
Caption = 'Mesurer la vitesse des trains'
Caption = 'Mesurer la vitesse des trains ('#233'talonnage)'
OnClick = MesurerlavitessedestrainsClick
end
object Affichelamesuredesvitesses1: TMenuItem
+174 -75
View File
@@ -8,6 +8,9 @@ unit Unitprinc;
on utilise activeX Tmscomm pour les liaisons série/USB
Delphi 12 :
Dans Outils / Options / Interface utilisateurs / Concerpteur de fiches / Haute résolution
Sélextionner Automatique (PPI de l'écran) et cocher "taille de la grille..."
on utilise AsyncPro pour les liaisons série/USB - ce composant est compilable en 32 et en 64 bits.
https://github.com/TurboPack/AsyncPro
liste des fichiers nécessaires:
@@ -21,6 +24,8 @@ unit Unitprinc;
AwDefine.inc
AwUser.pas
AwWin32.pas
LnsWin32.pas
LnsQueue.pas
OoMisc.pas
un essai avec IdTCPClient (Indy) a été fait avec D7/D12. En D7 nécéssite le fichier Idtcpclient.dcu.
@@ -438,7 +443,6 @@ type
procedure Sauvegarderlaconfiguration1Click(Sender: TObject);
procedure MesurerlavitessedestrainsClick(Sender: TObject);
procedure Affichelamesuredesvitesses1Click(Sender: TObject);
procedure Button0Click(Sender: TObject);
procedure Etatdesactionneurs1Click(Sender: TObject);
procedure Compilerlabasededonnes1Click(Sender: TObject);
procedure PopupMenuTrainsPopup(Sender: TObject);
@@ -1037,7 +1041,7 @@ tTrain = record
x0,y0,x1,y1 : integer; // ancien contour du tampon, pour l'animation dans la fenêtre cdm
// routes -----------------------------------
roulage : integer; // =1 train en roulage mais arrêté pour réservation par tiers =2 en roulage effectif
dernierDet : integer; // dernier détecteur traité
dernierDet : integer; // dernier détecteur traité (le n-1)
cantonOrg,CantonDest : integer; // cantons origine et destination si route
route : TuneRoute; // tableau de la route en cours du train
NomRoute : array[1..30] of string; // nom de la route sauvegardée
@@ -1493,6 +1497,7 @@ function ClavierHookLLProc(Code : integer; WordParam : wparam; LongParam: lparam
procedure cree_GB_compteur(rang : integer);
procedure pilote_train(det1,det2,AdrTrain,it : integer);
procedure equation_droite(y1,y2,x1,x2 : single;var pente,b : single);
procedure change_clic_train(i : integer);
implementation
@@ -1550,7 +1555,7 @@ uses UnitDebug, UnitPilote, UnitSimule, UnitTCO, UnitConfig,
Fclient.IOHandler.ReadBytes(Fdata,0,false);
if (FData <> nil) and Assigned(FOnData) then
{$ELSE}
FData := FClient.CurrentReadBuffer;
FData:=FClient.CurrentReadBuffer;
if (FData <> '') and Assigned(FOnData) then
{$IFEND}
Synchronize(DataReceived);
@@ -2078,7 +2083,7 @@ begin
//---- calc _systemId de la mac-address[2-5] XOR mac-address[1]...
if (RetCode=chr(0)) or (RetCode=chr(6)) then
begin
_SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
_SystemId:=IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
IntToHex(Ord(Adapter.adapter_address[1]),2) + '-' +
IntToHex(Ord(Adapter.adapter_address[2]),2) + '-' +
IntToHex(Ord(Adapter.adapter_address[3]),2) + '-' +
@@ -2183,7 +2188,7 @@ begin
i:=pos('-',s);
if i>4 then
begin
i:=i-4;
i:=i-4;
s:=copy(s,i,9)+' '; // Id de formatage de c:\
end;
end
@@ -2288,7 +2293,7 @@ begin
end;
end;
// exécuté en fin d'init (voir menu Projet/voir le source)
procedure fin_preliminaire;
var i : integer;
s : string;
@@ -2594,7 +2599,7 @@ begin
end;
{$ELSE}
// envoi la chaîne trameIF à la centrale par USBLenz ou socket, n'attend pas l'ack
// envoi la chaîne trameIF à la centrale par USB ou socket, n'attend pas l'ack
// pour le protole XpressNet (1), on ajoute l'entete et le suffixe dans la trame.
// ici on envoie pas à CDM
// utilisation de TMSCOMM
@@ -2603,7 +2608,7 @@ var i,timeout,valto,l : integer;
begin
if simuInterface then exit;
if protocole=1 then s:=entete+s; // ajout de l'entete en Xpressnet, pas en Dccpp
if protocole=1 then s:=entete+s; // ajout de l'entete définie dans le panneau de config en Xpressnet, pas en Dccpp
l:=length(s);
Setlength(TrameIF,l);
for i:=0 to l-1 do TrameIF[i]:=byte(ord(s[i+1])); // transforme la chaine en tableau dynamique d'octets
@@ -3338,6 +3343,7 @@ begin
end;
// Ecrire sur un canvas un texte avec un angle, avec ou sans bordure, monochrome ou à face texturée
// procédure pour Delphi 7
// params : C = Canvas
// X,Y = Coordonnées angle supérieur gauche du début du texte.
// Fonte = Police de caractères à utiliser : uniquement des fontes scalables.
@@ -3410,6 +3416,7 @@ begin
SelectObject(dc,AncBrush);
DeleteObject(NouvBrush);
end;
// inverse une image (miroir horizontal) et la met dans dest
// Utilisé pour les signaux belges, et les trains
procedure inverse_image(imageDest,ImageSrc : Timage);
@@ -4902,7 +4909,7 @@ begin
with font do
begin
Color:=clWhite;
Size:=taillefonte;
Size:=round(taillefonte*RedFonte);
Style:=[fsbold];
Name:='Arial';
end;
@@ -5216,7 +5223,7 @@ begin
end;
}
// dessine l'aspect du signal en fonction de son adresse dans le canvas de destination
// dessine dans le canvas de destination l'aspect du signal en fonction de son adresse passé en paramètre, son orientation, facteurs de réduction (FrX et FrY) en x,y
procedure Dessine_signal_mx(CanvasDest : Tcanvas;x,y : integer;FrX,frY : single;adresse : integer;orientation : integer);
var i,aspect : integer;
begin
@@ -5284,7 +5291,7 @@ end;
function Select_dessin_Signal(TypeSignal : integer) : TBitmap;
var Bm : TBitMap;
begin
case TypeSignal of
case TypeSignal of
2 : Bm:=Formprinc.Image2feux.picture.Bitmap;
3 : Bm:=Formprinc.Image3feux.picture.Bitmap;
4 : Bm:=Formprinc.Image4feux.picture.Bitmap;
@@ -5299,9 +5306,9 @@ begin
14 : Bm:=Formprinc.Image4Dir.picture.Bitmap;
15 : Bm:=Formprinc.Image5Dir.picture.Bitmap;
16 : Bm:=Formprinc.Image6Dir.picture.Bitmap;
else Bm:=nil;
end;
Select_dessin_Signal:=bm;
else Bm:=nil;
end;
Select_dessin_Signal:=bm;
end;
// créée une image dynamiquement dans la partie droite pour un nouveau signal déclaré dans le fichier de config
@@ -5415,6 +5422,7 @@ begin
else Signaux[rang].checkFB:=nil;
end;
// change le train sélectionné ; i=nouvel index train
procedure change_clic_train(i : integer);
begin
if (i<1) or (i>nTrains) then exit;
@@ -5480,7 +5488,7 @@ end;
procedure cree_GB_compteur(rang : integer);
const HautTb=10; // hauteur trackbar
ofsGBH=15; // marge haut du groupbox
ofsGBB=8; // marge bas du groupbox
ofsGBB=8; // marge bas du groupbox
var Imh,Iml : integer;
begin
iml:=0;imh:=0;
@@ -5974,7 +5982,7 @@ begin
chaine_CDM_Acc:=so+s;
end;
// prépare une tache pour le timer
// met une tache en tableau taches[] pour le timer
// ttache=1 : pilote accessoire...
// temporisation pour le timer avant action
// destinataire (1=CDM 2=XpressNet 3=Dccpp)
@@ -5989,7 +5997,7 @@ begin
exit;
end;
NoTraite:=true; // interdire le traitement pour éviter interférence
NoTraite:=true; // interdire le traitement pour éviter interférence
with taches[pointeurTaches+1] do
begin
traite:=false;
@@ -6435,7 +6443,7 @@ begin
//else Affiche('action='+intToSTR(code),clLime);
end;
// en sortie si on renvoie <>0,la touche n'est pas transmise
// en sortie si on renvoie <>0,la touche n'est pas transmise à windows
callNextHookEx(kbHook,code,wordparam,longparam);
if r=99 then result:=0 else result:=r;
end;
@@ -6611,7 +6619,7 @@ begin
end;
if (fonction>=13) and (fonction<=20) then
begin
b:=222;
b:=222; // 1101 1110
if etat=1 then
case fonction of
13 : c:=1;
@@ -6811,13 +6819,13 @@ begin
Signaux[i].EtatSignal:=etats;
end;
// signalisation combinée
if (aspect and $1C0)<>0 then
if (aspect and $1c0)<>0 then
begin
etats:=Signaux[i].EtatSignal;
//si le bit 15 (bita1) est à 1, c'est l'indicateur de mise à 1
if testBit(aspect,bita1) then
begin
etats:=etats or (aspect and $1C0); // mise à 1 par masquage
etats:=etats or (aspect and $1c0); // mise à 1 par masquage
Signaux[i].EtatSignal:=Signaux[i].EtatSignal or etats;
end
else
@@ -8114,18 +8122,18 @@ begin
// 98=VJR + blanc + violet + ral30 + rappel30
if modele=98 then
begin
case aspect of
case aspect of
vert,vert_cli : begin pilote_acc(adresse+1,1,signal);pilote_acc(adresse+3,2,signal);end;
jaune,jaune_cli : begin pilote_acc(adresse,1,signal);pilote_acc(adresse+3,2,signal);end;
semaphore,semaphore_cli: begin pilote_acc(adresse,2,signal);pilote_acc(adresse+3,2,signal);end;
blanc,blanc_cli : pilote_acc(adresse+1,2,signal);
violet : pilote_acc(adresse+3,1,signal);
end;
end;
if combine=ral_30 then begin pilote_acc(adresse+2,1,signal);pilote_acc(adresse+3,2,signal);end;
if combine=rappel_30 then begin pilote_acc(adresse+2,2,signal);pilote_acc(adresse+3,2,signal);end;
if ((aspect=jaune) or (aspect=jaune_cli)) and (combine=rappel_30)
then begin pilote_acc(adresse,1,signal);pilote_acc(adresse+2,2,signal);pilote_acc(adresse+3,2,signal);end;
end;
end;
// 99=VJR + blanc + violet + ral30 + rappel60
if modele=99 then
@@ -13402,7 +13410,7 @@ end; }
function test_memoire_zones(adresse : integer) : boolean;
var
AdrSuiv,prec,ife,actuel,i,j,it,
dernierdet,AdrSignal,NSignaux,NSigMax,voie1,voie2,indexSig2,indexSig1,ia : integer;
dernierdetec,AdrSignal,NSignaux,NSigMax,voie1,voie2,indexSig2,indexSig1,ia : integer;
TypePrec,TypeActuel : TEquipement;
Pres_train : boolean;
s : string;
@@ -13463,7 +13471,7 @@ begin
Pres_train:=false;
TypePrec:=det;
dernierdet:=prec;
dernierdetec:=prec;
// purge les aiguillages après le signal
it:=0;
@@ -13503,19 +13511,19 @@ begin
repeat
inc(j);
if (typeactuel=det) and (dernierdet<>0) then
if (typeactuel=det) and (dernierdetec<>0) then
begin
Pres_train:=MemZone[dernierdet,actuel].etat or detecteur[actuel].etat or Pres_Train;
Pres_train:=MemZone[dernierdetec,actuel].etat or detecteur[actuel].etat or Pres_Train;
if (nivDebug=3) then
begin
if Pres_Train then AfficheDebug('Présence train de '+intToSTR(dernierdet)+' à '+intToSTR(actuel),clyellow)
else AfficheDebug('Absence train de '+intToSTR(dernierdet)+' à '+intToSTR(actuel),clyellow)
if Pres_Train then AfficheDebug('Présence train de '+intToSTR(dernierdetec)+' à '+intToSTR(actuel),clyellow)
else AfficheDebug('Absence train de '+intToSTR(dernierdetec)+' à '+intToSTR(actuel),clyellow)
end;
Pres_train:=MemZone[actuel,dernierdet].etat or Pres_Train;
Pres_train:=MemZone[actuel,dernierdetec].etat or Pres_Train;
if (nivDebug=3) then
begin
if Pres_Train then AfficheDebug('Présence train inverse de '+intToSTR(actuel)+' à '+intToSTR(dernierdet),clyellow)
else AfficheDebug('Absence train de '+intToSTR(actuel)+' à '+intToSTR(dernierdet),clyellow)
if Pres_Train then AfficheDebug('Présence train inverse de '+intToSTR(actuel)+' à '+intToSTR(dernierdetec),clyellow)
else AfficheDebug('Absence train de '+intToSTR(actuel)+' à '+intToSTR(dernierdetec),clyellow)
end;
// sortir de suite
if Pres_train then
@@ -13525,7 +13533,7 @@ begin
exit;
end;
dernierdet:=actuel;
dernierdetec:=actuel;
// isi:=index_signal_det(Actuel,voie,index2); // renvoie l'index du signal se trouvant au détecteur "AdrSuiv": il peut y avoir 4 détecteurs par signal
index_signal_det(actuel,voie1,indexSig1,voie2,indexSig2);
@@ -15768,6 +15776,65 @@ begin
detecteur[detect].Temps_cour:=0; // arret incrémente le compteur
end;
// Supprime le train i du tableau TrainZone
procedure supprime_train_zone(isup,det1,det2,AdrTrainLoc : integer);
var i : integer;
begin
// N_trains est ke nombre de trains détectés
for i:=isup to N_Trains-1 do
begin
TrainZone[i]:=TrainZone[i+1];
end;
dec(N_Trains);
Formprinc.LabelNbTrains.caption:=IntToSTR(N_trains);
MemZone[det1,det2].etat:=FALSE; // dévalide l'ancienne zone
MemZone[det1,det2].train:='';
MemZone[det1,det2].Adrtrain:=0;
MemZone[det1,det2].IndexTrainRoulant:=0;
MemZone[det2,det1].etat:=FALSE; // dévalide l'ancienne zone inverse
MemZone[det2,det1].train:='';
MemZone[det2,det1].Adrtrain:=0; // libère la réservation
MemZone[det2,det1].IndexTrainRoulant:=0;
with detecteur[det1] do
begin
Train:='';
AdrTrainRes:=0;
IndexTrainRoulant:=0;
AdrTrain:=0;
precedent:=0;
suivant:=0;
end;
with detecteur[det2] do
begin
Train:='';
AdrTrainRes:=0;
AdrTrain:=0;
IndexTrainRoulant:=0;
precedent:=0;
suivant:=0;
end;
libere_canton(det1,det2,AdrTrainLoc);
for i:=1 to nbreTCO do
begin
Zone_TCO(i,det1,det2,isup,AdrTrainLoc,0,true,true); // enleve la loco des cantons du tco
maj_tco(i,det2);
end;
isup:=index_train_adresse(AdrTrainLoc);
with trains[isup] do
begin
detecteurSuiv:=0;
detecteurPrec:=0;
dernierDet:=0;
end;
actualise_seltrains;
Affiche_evt('Suppression du train',clOrange);
end;
// calcul des zones depuis le tableau des fronts montants ou descendants des évènements détecteurs
// transmis dans le tableau Event_det
// rattache le nouveau détecteur à un train
@@ -15838,7 +15905,7 @@ begin
Affiche('Démarrage train non placé depuis détecteur '+intToSTR(det3),clred);
if TraceListe then AfficheDebug('Démarrage train non placé depuis détecteur '+intToSTR(det3),clred);
end;
// affecter le nouveau détecteur
// affecter le nouveau détecteur
detecteur[det3].train:=Train_ch;
detecteur[det3].AdrTrain:=AdrTrainLoc;
detecteur[det3].IndexTrainRoulant:=i;
@@ -15855,9 +15922,37 @@ begin
if adrSuiv>NbMaxDet then
begin
if adrsuiv=9996 then affiche_evt('Erreur aiguillage '+intToSTR(AigMal)+' mal positionné',clred)
else
if AdrSuiv=9996 then Affiche_evt('La position de l''aiguillage '+intToSTR(AigMal)+' est inconnue',clred);
Affiche_evt('Info 1-0 '+intToSTR(AdrSuiv)+' : pas de suivant detecteur_suivant_el '+intToSTR(det1)+' '+intToSTR(det3),clWhite);
MemZone[det1,det3].etat:=FALSE; // dévalide l'ancienne zone
MemZone[det1,det3].train:='';
MemZone[det1,det3].Adrtrain:=0;
MemZone[det1,det3].IndexTrainRoulant:=0;
MemZone[det3,det1].etat:=FALSE; // dévalide l'ancienne zone inverse
MemZone[det3,det1].train:='';
MemZone[det3,det1].Adrtrain:=0; // libère la réservation
MemZone[det3,det1].IndexTrainRoulant:=0;
with detecteur[det1] do
begin
Train:='';
AdrTrainRes:=0;
IndexTrainRoulant:=0;
end;
with detecteur[det3] do
begin
Train:='';
AdrTrainRes:=0;
IndexTrainRoulant:=0;
end;
libere_canton(det1,det3,AdrTrainLoc); // on quitte det3
for ntco:=1 to nbreTCO do
begin
Zone_TCO(ntco,det1,det3,i,AdrTrainLoc,0,false,true); // tco,det1,det2,train, mode
maj_tco(ntco,det3);
end;
// le train est perdu, le suppprimer
supprime_train_zone(i,det1,det3,AdrTrainLoc);
exit;
end
else
@@ -15960,7 +16055,6 @@ begin
MemZone[det3,det_suiv].AdrTrain:=AdrTrainLoc;
for ntco:=1 to nbreTCO do
begin
//raz_cantons_train(AdrTrainLoc); // efface tous les cantons contenant le train adrloc
if ModeCouleurCanton=0 then zone_TCO(ntco,det3,det_suiv,i,AdrTrainLoc,1,true,true)
else zone_TCO(ntco,det3,det_suiv,i,AdrTrainLoc,2,true,true); // affichage avec la couleur de index_couleur du train
end;
@@ -16163,8 +16257,13 @@ begin
if TraceListe then AfficheDebug('le sursuivant est '+intToSTR(adrsuiv),couleur);
if (Adrsuiv>=9990) and not(casaig) then
begin
//Affiche('Erreur 1500 : pas de suivant sur la route de '+intToSTR(det2)+' à '+intToSTR(det3),clRed);
if (NivDebug=3) or TraceListe then AfficheDebug('Msg 1500 : pas de suivant sur la route de '+intToSTR(det2)+' à '+intToSTR(det3),clorange);
if AdrSuiv=9996 then Affiche_evt('La position de l''aiguillage '+intToSTR(AigMal)+' est inconnue',clred);
Affiche_evt('Info 2-0 '+intToSTR(AdrSuiv)+' : pas de suivant detecteur_suivant_el '+intToSTR(det1)+' '+intToSTR(det3),clWhite);
// le train est perdu, le suppprimer
supprime_train_zone(i,det2,det3,AdrTrainLoc);
exit;
end
else
begin
@@ -16414,8 +16513,9 @@ begin
end
else
begin
if det_suiv=9996 then affiche_evt('Erreur 2-1 position inconnue aiguillage ',clred)
if det_suiv=9996 then affiche_evt('Erreur 2-1 position inconnue aiguillage '+intToSTR(AigMal),clred)
else Affiche_evt('Erreur 2-1 '+intToSTR(Det_Suiv)+' : pas de suivant det_suiv_cont '+intToSTR(det2)+' '+intToSTR(det3),clred);
end;
end
else
@@ -16552,7 +16652,7 @@ begin
// Nombre d'éléments à 0 : ici c'est un nouveau train donc créer un train, donc un tableau
if N_Trains>=Max_Trains then
begin
Affiche('Erreur nombre de train maximal atteint',clRed);
Affiche('Erreur nombre de trains en circulation maximal atteint',clRed);
N_trains:=0;
end;
Inc(N_trains);
@@ -21502,20 +21602,6 @@ begin
lire_fichier_tco(i);
end;
{
case compteur of
1 : begin
init_compteur1;
aiguille_compteur(1,0);
Compteurdevitesse1.checked:=true;
end;
2 : begin
Init_compteur2;
aiguille_compteur(2,0);
Compteurdevitesse2.checked:=true;
end;
end; }
verif_coherence;
procetape('La configuration a été lue');
@@ -21576,7 +21662,6 @@ begin
end;
renseigne_tous_cantons; // les form des TCO doivent être créés
// ouvre les périphériques commandes actionneurs, car on a lu les com dans la config
for i:=1 to NbPeriph do
begin
@@ -21698,8 +21783,14 @@ end;
procedure TFormPrinc.RecuInterface(Sender: TObject;Count : word);
var i,tev,l : integer;
s : string;
tablo : array[1..255] of byte;
tablo : array[1..1024] of byte;
begin
if count>1024 then
begin
Affiche('Débordement Com interface',clred);
count:=1024;
end;
MSCommUSBInterface.GetBlock(tablo,count);
l:=Long_Recue; // résidu précédent à chainer - longueur du tampon
@@ -22690,7 +22781,7 @@ begin
end;
// erreur sur socket Lenz (interface XpressNet)
// erreur sur socket interface XpressNet)
procedure TFormPrinc.ClientSocketInterfaceError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
@@ -23375,7 +23466,7 @@ begin
ss:=copy(commandeCDM,i+5,l-i-5);
nom:=ss;
Delete(commandeCDM,i,l-i+1);
end;
end;
i:=posEx('OBJ=',commandeCDM,1);l:=posEx(';',commandeCDM,i);
if (i<>0) and (l<>0) then
@@ -24047,8 +24138,8 @@ begin
if protocole=1 then
begin
//s:=#$ff+#$fe+#$23+#$1e+Char(adr)+Char(valeur); //CV de 512 à 767 V3.4
//s:=#$ff+#$fe+#$23+#$1d+Char(adr)+Char(valeur); //CV de 256 à 511 V3.4
//s:=#$23+#$1e+Char(adr)+Char(valeur); //CV de 512 à 767 V3.4
//s:=#$23+#$1d+Char(adr)+Char(valeur); //CV de 256 à 511 V3.4
s:=#$23+#$16+Char(adr)+Char(valeur); //CV de 1 à 256
s:=checksum(s);
envoi(s); // envoi de la trame et attente Ack
@@ -24323,8 +24414,6 @@ begin
end;
end;
// pour déplacer l'ascenseur de l'affichage automatiquement en bas
procedure TFormPrinc.FenRichChange(Sender: TObject);
begin
@@ -24376,7 +24465,7 @@ begin
end;
procedure TFormPrinc.Etatdeszonespartrain1Click(Sender: TObject);
var i,j,n,train : integer;
var i,j,n,train,nb : integer;
couleur : tcolor;
rien,aff : boolean;
s,ss : string;
@@ -24384,7 +24473,8 @@ begin
Affiche('',clyellow);
Affiche('Historique de l''état des zones par train',clWhite);
rien:=true;
for train:=1 to 20 do
for train:=1 to nTrains do
begin
n:=TrainZone[train].Nbre;
for i:=1 to n do
@@ -24399,8 +24489,9 @@ begin
Affiche(s,CouleurTrain[couleur]);
end;
end;
Affiche('Liste des zones actuellement occupées:',clWhite);
i:=0;
nb:=0;i:=0;
repeat
j:=0;
repeat
@@ -24411,14 +24502,14 @@ begin
s:=s+' Train n°'+intToSTR(MemZone[i,j].IndexTrainRoulant);
s:=s+' PrevSuiv='+intToSTR(MemZone[i,j].Prev);
Affiche(s,couleurTrain[MemZone[i,j].IndexTrainRoulant]);
inc(nb);
rien:=false;
end;
inc(j);
until (j>NbMaxDet);
inc(i);
until (i>NbMaxDet);
if nb=0 then Affiche('Aucune zone occupée',clYellow);
{Affiche('Derniers éléments scannés:',clWhite);
for i:=1 to idEl do
begin
@@ -26092,10 +26183,16 @@ end;
// réception COM/USB du périphérique 1 avec Asyncpro
procedure TFormPrinc.RecuPeriph1(Sender: TObject;Count : Word);
var s : string;
tablo : array[1..255] of byte; // tableau rx usb
tablo : array[1..1024] of byte; // tableau rx usb
c : char;
i : integer;
begin
if count>1024 then
begin
Affiche('Débordement com périph1',clred);
count:=1024;
end;
MScommCde1.GetBlock(Tablo,count);
for i:=1 to count do
@@ -26107,7 +26204,6 @@ begin
s:=tablo_periph[1].tamponrx;
affiche(s,clyellow);
tablo_periph[1].tamponrx:='';
telecommande(s);
end;
if (c>#31) and (c<#128) then tablo_periph[1].tamponrx:=tablo_periph[1].tamponrx+c;
@@ -26121,7 +26217,14 @@ var s : string;
c : char;
i : integer;
begin
if count>1024 then
begin
Affiche('Débordement com périph2',clred);
count:=1024;
end;
MSCommCde2.GetBlock(Tablo,count); // TMSComm autoadapte la longueur du tampon dynamique
for i:=1 to length(tablo) do
begin
c:=char(tablo[i]);
@@ -27974,11 +28077,7 @@ begin
Affiche_mesure_trains;
end;
procedure TFormPrinc.Button0Click(Sender: TObject);
begin
{ EditVitesse.Text:='0';
TrackBarVit.Position:=0; }
end;
procedure TFormPrinc.Compilerlabasededonnes1Click(Sender: TObject);
begin
+1 -1
View File
@@ -523,7 +523,7 @@ begin
ncanton:=0;
TrainExistant:=0;
ideb:=trains[idTrain].PointRout;
ideb:=Pointeur; // zizi
ideb:=Pointeur;
AdrSig:=0;
SigBonSens:=false;
//TraceListe:=true;
+4
View File
@@ -1598,6 +1598,10 @@ object FormTCO: TFormTCO
Caption = 'Supprimer le canton'
OnClick = Supprimercanton1Click
end
object Afficherlecompteurdevitessedutrain1: TMenuItem
Caption = 'Afficher le compteur de vitesse du train'
OnClick = Afficherlecompteurdevitessedutrain1Click
end
object N6: TMenuItem
Caption = '-'
end
+3047 -3019
View File
File diff suppressed because it is too large Load Diff
+14 -11
View File
@@ -251,7 +251,8 @@ procedure affecte_Train_canton(AdrTrain,idcanton,sens : integer);
var idTrain,t,el1,el2 : integer;
t1,t2 : tequipement;
begin
if ProcPrinc then AfficheDebug('Affecte_train_canton: @='+intToSTR(AdrTrain)+' Idcanton='+intToSTR(idcanton),clorange);
if ProcPrinc then
AfficheDebug('Affecte_train_canton: @='+intToSTR(AdrTrain)+' Idcanton='+intToSTR(idcanton),clorange);
//Affiche('Affecte_train_canton: @='+intToSTR(AdrTrain)+' Idcanton='+intToSTR(idcanton),clyellow);
if (IdCanton>0) and (idCanton<=nCantons) then
begin
@@ -284,13 +285,14 @@ begin
TCO[t,canton[idCanton].x,canton[idCanton].y].train:=idTrain;
end;
if AdrTrain=0 then
if AdrTrain=0 then // effacement train du canton
begin
idTrain:=0;
idTrain:=canton[Idcanton].indexTrain;
trains[idTrain].canton:=0;
canton[Idcanton].NomTrain:='';
canton[Idcanton].indexTrain:=0;
canton[IdCanton].adresseTrain:=0;
// a revoir IDTrain=0 !!!! Maj_icone_train(Image_Train[idTrain],idTrain,clWhite);
idTrain:=0;
end;
// si l'un des deux éléments adjacents au canton est un détecteur à 1, affecter la loco au détecteur
@@ -641,7 +643,7 @@ begin
//raz_trains_idcanton(IdCantonSelect); // au retour, route contient la route du train razé du canton
raz_cantons_train(trains[AutreTrain].adresse,true);
//Affiche('Et 1',clYellow);
maj_signaux(true);
maj_signaux(false);
end;
@@ -655,7 +657,7 @@ begin
affecte_Train_canton(trains[indexTrainClic].adresse,IdCantonSelect,sensLoco); // le train affecté contient la route du train razé
LabelInfo.caption:='Affectation du train '+intToSTR(IndexTrainClic)+' '+trains[indexTrainClic].nom_train+' au canton '+intToSTR(canton[idcantonSelect].numero);
maj_signaux(true);
maj_signaux(false);
end;
end;
end;
@@ -701,10 +703,10 @@ begin
exit;
end;
renseigne_canton(IdAutreCanton); //?? pourquoi faire le canton est normalement déje renseigné
renseigne_canton(IdAutreCanton); //?? pourquoi faire le canton est normalement déjà renseigné
affecte_Train_canton(AdrTrain,idAutreCanton,f);
//Affiche('Et 3',clYellow);
maj_signaux(true);
maj_signaux(false);
end;
end;
@@ -722,6 +724,7 @@ begin
begin
dessin_canton(i,0);
end;
maj_signaux(false);
end;
@@ -739,8 +742,8 @@ begin
end;
end;
Quel_canton(x,y,el);
FormSelTrain.caption:=s; // s est indéfini !!
Quel_canton(x,y,el); // renvoie le canton en fonction de la var globale IdCantonSelect
FormSelTrain.caption:=''; // s est indéfini !!
with formSelTrain.ComboBoxCanton do
begin
@@ -784,7 +787,7 @@ begin
until trouve or (i>=n);
if trouve then
begin
Positionne_SG(i-1);
Positionne_SG(i-1); // positionne la scrollbar
end;
end;
end;
+11 -40
View File
@@ -26,7 +26,7 @@ var
f : textFile;
Const
VersionSC = '10.6'; // sert à la comparaison de la version publiée
VersionSC = '10.7'; // sert à la comparaison de la version publiée
SousVersion=' '; // A B C ... en cas d'absence de sous version mettre un espace
// pour unzip
SHCONTCH_NOPROGRESSBOX=4;
@@ -574,58 +574,29 @@ begin
if V_utile=V_publie then Affiche('Votre version '+Version+SousVersion+' est à jour',clLime);
if V_utile>V_publie then Affiche('Votre version '+version+SousVersion+' est plus récente que la version publiée '+s,clLime);
end;
end;
{
procedure TFormVersion.TimerVerifTimer(Sender: TObject);
var V_utile,V_publie : real;
erreur: integer;
s : string;
begin
if lance_verif>0 then dec(lance_verif);
if lance_verif=0 then
begin
if not(verifVersion) then exit;
if debug=1 then Affiche('Vérification version en ligne',clLime);
V_publie:=verifie_version;
if notificationVersion and (v_publie>0) then
begin
val(version,V_utile,erreur);
str(v_publie:2:2,s);
if V_utile=V_publie then Affiche('Votre version '+Version+SousVersion+' est à jour',clLime);
if V_utile>V_publie then Affiche('Votre version '+version+SousVersion+' est plus récente que la version publiée '+s,clLime);
end;
end;
end;
}
// ne parche pas pour les répertoires non vides
// ne marche pas pour les répertoires non vides
procedure DeleteDirectory(const DirName: string);
var
FileFolderOperation: TSHFileOpStruct;
var fos: TSHFileOpStruct;
begin
FillChar(FileFolderOperation, SizeOf(FileFolderOperation), 0);
FileFolderOperation.wFunc := FO_DELETE;
FileFolderOperation.pFrom := PChar(ExcludeTrailingPathDelimiter(DirName) + #0);
FileFolderOperation.fFlags := FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION;
SHFileOperation(FileFolderOperation);
FillChar(Fos, SizeOf(Fos),0);
Fos.wFunc:=FO_DELETE;
Fos.pFrom:=PChar(ExcludeTrailingPathDelimiter(DirName) + #0);
Fos.fFlags:=FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION;
SHFileOperation(Fos);
end;
function DelDir(Dir: String): Boolean;
var fos: TSHFileOpStruct;
begin
ZeroMemory(@fos,SizeOf(fos));
with fos do
begin
wFunc:=FO_DELETE;
fFlags:=FOF_SILENT or FOF_NOCONFIRMATION;
pFrom:=PChar(Dir + #0);
end;
fos.wFunc:=FO_DELETE;
fos.pFrom:=PChar(Dir + #0);
fos.fFlags:=FOF_SILENT or FOF_NOCONFIRMATION;
Result:=(0=ShFileOperation(fos));
end;
begin
end.
+4 -10
View File
@@ -338,18 +338,12 @@ version 10.6 : Modification pour l'affichage de la barre de zoom du TCO pour les
versions les plus récentes de W11.
Ajout des touches + et - pour le zoom du TCO.
Correction des affichages lors des mises à l'échelle du texte dans win10/11.
version 10.7 : Affichage du compteur de train depuis le menu contextuel des cantons du tco.
En roulage ou RUN CDM, suppression d'un train non suivi de la liste des trains en roulage.
Correction désaffectation trains sur cantons.
-