Bladeren bron

附件。

Chenshilong 8 jaren geleden
bovenliggende
commit
e0bd8d35b7

+ 10 - 0
DataModules/PHPWebDm.pas

@@ -107,6 +107,7 @@ type
     function PageError(AMid: string): string;
     function ExistInServer(AWebID: Integer): Boolean;
     function GetNameFromURLProtocol(AURLProtocol: string): string;
+    function DeleteAttachment(AFileID: Integer): Integer;
 
     property Account: string read FAccount write SetAccount;
     property UserID: Integer read FUserID write SetUserID;
@@ -686,6 +687,15 @@ begin
     Result := Copy(AURLProtocol, 9, Length(AURLProtocol) - 8);
 end;
 
+function TPHPWeb.DeleteAttachment(AFileID: Integer): Integer;
+var sURL: string;
+  vArr: array of string;
+begin
+  vArr := VarArrayOf(['msg']);
+  sURL := Format('%stender/attachment/%d/list', [FMeasureURL, AFileID]);
+  Result := Search(sURL, [], [], vArr);
+end;
+
 initialization
 
 finalization

+ 4 - 4
Dprs/CSL/Measure_Cloud.dof

@@ -100,8 +100,8 @@ Conditionals=_mCloud;_mEncrypt1;_Test;_mLoginNoPW1
 DebugSourceDirs=
 UsePackages=0
 [Parameters]
-RunParams=
-HostApplication=
+RunParams=Measure:ww9zl
+HostApplication=C:\Program Files (x86)\纵横软件\计量支付 (单机版+云版) 1\Measure_Cloud.exe
 Launcher=
 UseLauncher=0
 DebugCWD=
@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=3
 MinorVer=1
 Release=3
-Build=1099
+Build=1107
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=纵横结算决算计量一体化云版
-FileVersion=3.1.3.1099
+FileVersion=3.1.3.1107
 InternalName=
 LegalCopyright=
 LegalTrademarks=

BIN
Dprs/CSL/Measure_Cloud.res


+ 2 - 2
Forms/LoginFrm.pas

@@ -164,8 +164,8 @@ begin
 
   if G_IsTest then
   begin
-    cbUser.Text := '1971614655@qq.com';
-    edtPW.Text := '357134933..';
+    cbUser.Text := 'ww9zl';
+    edtPW.Text := 'ww9zl';
   end;
 end;
 

+ 22 - 22
Forms/UpFileFrame.pas

@@ -123,7 +123,7 @@ end;
 
 procedure TUpFileView.btnCancelClick(Sender: TObject);
 begin
-  TUpFileManageView(Owner).DeleteViewAndData(Self);
+  TUpFileManageView(Owner).DeleteViewAndData(Self, False);
 end;
 
 procedure TUpFileView.btnUpClick(Sender: TObject);
@@ -156,27 +156,27 @@ begin
         Application.MessageBox('当前附件上传失败,请重试!', '系统提示', MB_OK);
         Data.Status := ufsNeedUp;
       end;
-    end
-    else
-    begin
-      if FileExists(Data.LocalFile) then
-        if Application.MessageBox('已存在同名的本地附件,该附件将会被覆盖,是否继续?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
-        begin
-          Data.Status := ufsNeedUp;
-          Exit;
-        end;
-
-      if Data.Owner.LocalSaveToDB(Data) > -1 then
-      begin
-        CopyFile(PChar(Data.OrgFile), PChar(Data.LocalFile), False);
-        Data.Status := ufsNormal;
-      end
-      else
-      begin
-        Application.MessageBox('当前附件保存失败,请重试!', '系统提示', MB_OK);
-        Data.Status := ufsNeedUp;
-      end;
     end;
+//    else
+//    begin
+//      if FileExists(Data.LocalFile) then
+//        if Application.MessageBox('已存在同名的本地附件,该附件将会被覆盖,是否继续?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
+//        begin
+//          Data.Status := ufsNeedUp;
+//          Exit;
+//        end;
+//
+//      if Data.Owner.LocalSaveToDB(Data) > -1 then
+//      begin
+//        CopyFile(PChar(Data.OrgFile), PChar(Data.LocalFile), False);
+//        Data.Status := ufsNormal;
+//      end
+//      else
+//      begin
+//        Application.MessageBox('当前附件保存失败,请重试!', '系统提示', MB_OK);
+//        Data.Status := ufsNeedUp;
+//      end;
+//    end;
   finally
     Screen.Cursor := crDefault;
   end;
@@ -262,7 +262,7 @@ end;
 
 procedure TUpFileView.btnDeleteClick(Sender: TObject);
 begin
-  FrameClick(Sender);
+  TUpFileManageView(Owner).DeleteViewAndData(Self, True);
   //ShellExecute(Handle, nil, PChar('explorer.exe'), PChar('/e,/select,' + Data.LocalFile), nil, SW_Show);
 end;
 

+ 1 - 1
Forms/UpFileManageFrame.dfm

@@ -358,7 +358,7 @@ object UpFileManageView: TUpFileManageView
       OnClick = btnEditClick
     end
     object btnEditNo: TPNGButton
-      Left = 324
+      Left = 220
       Top = 216
       Width = 51
       Height = 24

+ 12 - 7
Forms/UpFileManageFrame.pas

@@ -61,6 +61,7 @@ type
     FSelected: TUpFileView;
     FDatas: TUpFiles;
     FWaitForDelete: TUpFileView;
+    FDeleteAttachmentOnLine: Boolean;
     FOwner: TObject;
     FProjectData: TObject;
     FRec: TsdDataRecord;
@@ -84,7 +85,7 @@ type
 
   public
     constructor Create(AOwner: TComponent); override;
-    procedure DeleteViewAndData(AView: TUpFileView);
+    procedure DeleteViewAndData(AView: TUpFileView; ANeedDeleteOnLine: Boolean);
     procedure DoOnBillChange(ARec: TsdDataRecord);
 
     property ProjectData: TObject read FProjectData write SetProjectData;
@@ -162,7 +163,7 @@ begin
   if (FRec <> nil) {and (FRec.ValueByName('HasAttachment').AsBoolean = True)} then
     for i := 0 to Datas.Count - 1 do
     begin
-      if Datas[i].BillID = FRec.ValueByName('ID').AsInteger then
+      if (Datas[i].BillID = FRec.ValueByName('ID').AsInteger) and (Datas[i].Phase = TProjectData(FProjectData).PhaseIndex) then
         AddUpFileView(Datas[i]);
     end;
 end;
@@ -186,7 +187,7 @@ begin
     mmMemo.Text := vFile.Memo;
   end;
 
-  btnEdit.Enabled := edtFileName.Text <> '';
+  btnEdit.Enabled := (edtFileName.Text <> '') and TProjectData(FProjectData).CurUserIsAuthor;
 end;
 
 procedure TUpFileManageView.RefreshOtherFileFrames;
@@ -297,9 +298,10 @@ begin
   vVew.Data := AUpFile;
 end;
 
-procedure TUpFileManageView.DeleteViewAndData(AView: TUpFileView);
+procedure TUpFileManageView.DeleteViewAndData(AView: TUpFileView; ANeedDeleteOnLine: Boolean);
 begin
   WaitForDelete := AView;
+  FDeleteAttachmentOnLine := ANeedDeleteOnLine;
   tDelView.Enabled := True;
 end;
 
@@ -308,6 +310,9 @@ var vUpFile: TUpFile;
 begin
   tDelView.Enabled := False;
   vUpFile := WaitForDelete.Data;
+  if FDeleteAttachmentOnLine then
+    if PHPWeb.DeleteAttachment(vUpFile.ID) <> 1 then    
+      Exit;
   WaitForDelete.Free;
   Datas.Delete(vUpFile);
 end;
@@ -418,7 +423,7 @@ end;
 
 procedure TUpFileManageView.SelectUpFile;
 var vODlg: TOpenDialog;
-  i, iBillID, iPhase: Integer;
+  i, iBillID: Integer;
   vFile: TUpFile;
   sFile, sName: string;
   iV: Int64;
@@ -446,10 +451,10 @@ begin
           iBillID := TProjectData(FProjectData).BillsMeasureData.BillsMeasureTree.Selected.ID;
       end;
 
-      iPhase := TProjectData(FProjectData).PhaseIndex;
       sName := ExtractFileName(sFile);
 
-      vFile := Datas.Add(iBillID, iPhase);
+      vFile := Datas.Add(iBillID);
+      vFile.Phase := TProjectData(FProjectData).PhaseIndex;
       vFile.OrgFile := sFile;
       vFile.Category := '̨Õʸ½¼þ';
       vFile.Memo := 'Îҵı¸×¢';

+ 1 - 1
Frames/ProjectFme.dfm

@@ -219,9 +219,9 @@ object ProjectFrame: TProjectFrame
           Left = 366
           Top = 0
           Caption = #38468'  '#20214
-          Enabled = False
           ImageIndex = 6
           Style = tbsCheck
+          Visible = False
           OnClick = tobtnUpFileClick
         end
         object tobtnBookmark: TToolButton

+ 2 - 2
Frames/ProjectFme.pas

@@ -522,8 +522,8 @@ procedure TProjectFrame.dxsbViewControlItemClick(Sender: TObject;
       if (Item.Tag = xbiBillsCompile.Tag) or (Item.Tag = xbiBillsMeasure.Tag) then
         CheckUpFile;
 
-    tobtnUpFile.Enabled := Item.Tag = xbiBillsMeasure.Tag;
-    if (tobtnUpFile.Enabled = False) and (jpsAssistant.ActivePage = jpsAssistantUpFile) then
+    tobtnUpFile.Visible := Item.Tag = xbiBillsMeasure.Tag;
+    if (tobtnUpFile.Visible = False) and (jpsAssistant.ActivePage = jpsAssistantUpFile) then
       jpsAssistant.ActivePage := jpsAssistantStandardBills;
   end;
 

+ 2 - 2
Frames/ProjectManagerFme.pas

@@ -1485,7 +1485,7 @@ begin
     (CurRec.ValueByName('WebID').AsInteger = AWebID) and
     (CurRec.ValueByName('Type').AsInteger = 1) then
   begin
-    GetLocalValues(vRec);
+    GetLocalValues(CurRec);
     Exit;
   end;
 
@@ -1526,7 +1526,7 @@ begin
     (CurRec.ValueByName('WebID').AsInteger = AWebID) and
     (CurRec.ValueByName('Type').AsInteger = 1) then
   begin
-    Result := vRec.ValueByName('WebMD5').AsString;
+    Result := CurRec.ValueByName('WebMD5').AsString;
     Exit;
   end;
 

+ 7 - 7
Units/ProjectCommands.pas

@@ -743,9 +743,9 @@ begin
   sFileName := ExtractSimpleFileName(FResultFile);
   CopyFileOrFolder(FFileName, FTempFolder + '\' + sFileName);
 
-  if not G_IsCloud then   // 云版不导出附件,云版的运作机制是从网上下载
-    if AExportAttachment then
-      CopyFolder(FAttachmentPath, FTempFolder + '\' + sFileName + '[附件包]');
+//  if not G_IsCloud then   // 云版不导出附件,云版的运作机制是从网上下载
+//    if AExportAttachment then
+//      CopyFolder(FAttachmentPath, FTempFolder + '\' + sFileName + '[附件包]');
 
   ZipFolder(FTempFolder, FResultFile);
 end;
@@ -1012,11 +1012,11 @@ begin
   GetNewNode;
   LoadXmlInfo;
   sFile := FTempFolder + '\' + FTenderFileName;
-  sFJ := sFile + '[附件包]';
+//  sFJ := sFile + '[附件包]';
   CopyFileOrFolder(sFile, GetMyProjectsFilePath + FNewNode.Rec.ValueByName('FileName').AsString);
-  if not G_IsCloud then          // 云版附件从服务器获取,不导入。
-    if DirectoryExists(sFJ) then
-      CopyFolder(sFJ, GetMyProjectsFilePath + 'Attachment\' + FNewNode.Rec.ValueByName('FileName').AsString);
+//  if not G_IsCloud then          // 云版附件从服务器获取,不导入。
+//    if DirectoryExists(sFJ) then
+//      CopyFolder(sFJ, GetMyProjectsFilePath + 'Attachment\' + FNewNode.Rec.ValueByName('FileName').AsString);
 end;
 
 procedure TTenderImport.GetNewNode;

+ 112 - 94
Units/UpFileManageUnit.pas

@@ -96,9 +96,9 @@ type
     FPath: string;
 
     // -------------业务扩展,单机版本地也要存储管理附件,以下这部分适用于单机版。
-    FLocalCon: TADOConnection;
-    FLocalQue: TADOQuery;
-    FLocalQue2: TADOQuery;
+//    FLocalCon: TADOConnection;
+//    FLocalQue: TADOQuery;
+//    FLocalQue2: TADOQuery;
 
     function GetItem(Index: Integer): TUpFile;
     procedure Clear;
@@ -108,13 +108,13 @@ type
     constructor Create;
     destructor Destroy; override;
     function Add(AUpFile: TUpFile): Integer; overload;                          // 返回索引号
-    function Add(ABillID, APhase: Integer): TUpFile; overload;
-
+    function Add(ABillID: Integer): TUpFile; overload;
+    function Find(AID: Integer): TUpFile;
     procedure Delete(AIndex: Integer); overload;
     procedure Delete(AUpFile: TUpFile); overload;
     procedure Exchange(AUpFile1, AUpFile2: TUpFile);
     procedure LoadDatas;
-    function LocalSaveToDB(AUpFile: TUpFile): Integer;                          // 返回ID
+//    function LocalSaveToDB(AUpFile: TUpFile): Integer;                          // 返回ID
 
     property Item[Index: Integer]: TUpFile read GetItem; default;
     property Count: Integer read GetCount;
@@ -125,7 +125,8 @@ type
 
 implementation
 
-uses ProjectData, Forms, PHPWebDm, CslJson, ConstUnit, UtilMethods;
+uses ProjectData, Forms, PHPWebDm, CslJson, ConstUnit, UtilMethods,
+  StdConvs;
 
 { TUpFile }
 
@@ -194,21 +195,22 @@ constructor TUpFiles.Create;
 begin
   FList := TList.Create;
 
-  if not G_IsCloud then
-  begin
-    FLocalCon := TADOConnection.Create(nil);
-    FLocalCon.LoginPrompt := False;
-
-    FLocalQue := TADOQuery.Create(nil);
-    FLocalQue.Connection := FLocalCon;
-
-    FLocalQue2 := TADOQuery.Create(nil);
-    FLocalQue2.Connection := FLocalCon;
-  end;
+//  if not G_IsCloud then
+//  begin
+//    FLocalCon := TADOConnection.Create(nil);
+//    FLocalCon.LoginPrompt := False;
+//
+//    FLocalQue := TADOQuery.Create(nil);
+//    FLocalQue.Connection := FLocalCon;
+//
+//    FLocalQue2 := TADOQuery.Create(nil);
+//    FLocalQue2.Connection := FLocalCon;
+//  end;
 end;
 
 procedure TUpFiles.Delete(AUpFile: TUpFile);
 begin
+  if AUpFile = nil then Exit;
   FList.Remove(AUpFile);
 end;
 
@@ -223,15 +225,15 @@ begin
   Clear;
   FList.Free;
 
-  if not G_IsCloud then
-  begin
-    FLocalQue.Close;
-    FLocalQue.Free;
-    FLocalQue2.Close;
-    FLocalQue2.Free;
-    FLocalCon.Close;
-    FLocalCon.Free;
-  end;
+//  if not G_IsCloud then
+//  begin
+//    FLocalQue.Close;
+//    FLocalQue.Free;
+//    FLocalQue2.Close;
+//    FLocalQue2.Free;
+//    FLocalCon.Close;
+//    FLocalCon.Free;
+//  end;
 
   inherited;
 end;
@@ -260,7 +262,7 @@ end;
 
 procedure TUpFiles.LoadDatas;
 var vArrFile: TOVArr;
-  i, iBillID, iPhase: Integer;
+  i, iBillID: Integer;
   vFile: TUpFile;
 begin
   if G_IsCloud then
@@ -270,43 +272,43 @@ begin
       for i := Low(vArrFile) to High(vArrFile) do
       begin
         iBillID := StrToInt(vArrFile[i, 4]);
-        iPhase := 0;  // AAAAA
-        vFile := Add(iBillID, iPhase);
-        vFile.ID := StrToInt(vArrFile[i, 9]);
-        vFile.WebID := TProjectData(FProjectData).WebID;
+        vFile := Add(iBillID);    // AAAAA
+        vFile.DownURL := vArrFile[i, 0];
+        vFile.DisplayName := vArrFile[i, 1];
+        vFile.LocalFile := FPath + vArrFile[i, 1];
+        vFile.Phase := StrToInt(vArrFile[i, 2]);
+        vFile.UperName := vArrFile[i, 3];
         vFile.Category := vArrFile[i, 5];
         vFile.Memo := vArrFile[i, 6];
         vFile.UperID := StrToInt(vArrFile[i, 7]);
-        vFile.UperName := vArrFile[i, 3];
         vFile.UpTime := vArrFile[i, 8];
-        vFile.LocalFile := FPath + vArrFile[i, 1];
-        vFile.DisplayName := vArrFile[i, 1];
-        vFile.DownURL := vArrFile[i, 0];
+        vFile.ID := StrToInt(vArrFile[i, 9]);
+        vFile.WebID := TProjectData(FProjectData).WebID;
         vFile.Status := ufsNormal;
       end;
     end;
-  end
-  else
-  begin
-    FLocalQue.Close;
-    FLocalQue.SQL.Text := 'Select * from AttachmentFile order by ID';
-    FLocalQue.Open;
-    FLocalQue.First;
-
-    while not FLocalQue.Eof do
-    begin
-      iBillID := FLocalQue.FieldByName('BillID').AsInteger;
-      iPhase := FLocalQue.FieldByName('Phase').AsInteger;
-      vFile := Add(iBillID, iPhase);
-      vFile.ID := FLocalQue.FieldByName('ID').AsInteger;
-      vFile.LocalFile := FPath + FLocalQue.FieldByName('FileName').AsString;
-      vFile.DisplayName := FLocalQue.FieldByName('FileName').AsString;
-
-      FLocalQue.Next;
-    end;
-
-    FLocalCon.Close;
   end;
+//  else
+//  begin
+//    FLocalQue.Close;
+//    FLocalQue.SQL.Text := 'Select * from AttachmentFile order by ID';
+//    FLocalQue.Open;
+//    FLocalQue.First;
+//
+//    while not FLocalQue.Eof do
+//    begin
+//      iBillID := FLocalQue.FieldByName('BillID').AsInteger;
+//      iPhase := FLocalQue.FieldByName('Phase').AsInteger;
+//      vFile := Add(iBillID, iPhase);
+//      vFile.ID := FLocalQue.FieldByName('ID').AsInteger;
+//      vFile.LocalFile := FPath + FLocalQue.FieldByName('FileName').AsString;
+//      vFile.DisplayName := FLocalQue.FieldByName('FileName').AsString;
+//
+//      FLocalQue.Next;
+//    end;
+//
+//    FLocalCon.Close;
+//  end;
 end;
 
 procedure TUpFile.SetID(const Value: Integer);
@@ -345,24 +347,24 @@ begin
     FPath := PHPWeb.WebPath + 'Projects\' + IntToStr(TProjectData(FProjectData).WebID) + '\Attachment\';
     if not DirectoryExists(FPath) then
       ForceDirectories(FPath);
-  end
-  else
-  begin
-    FPath := ExtractFilePath(Application.ExeName) + '我的项目\Attachment\' + ExtractFileName(TProjectData(FProjectData).FileName) + '\';
-    if not DirectoryExists(FPath) then
-      ForceDirectories(FPath);
-
-    sLAFM := FPath + 'LocalAttachmentFileManager.dat';
-    sModelFile := ExtractFilePath(Application.ExeName) + 'Data\LocalAttachmentFileManager.dat';
-    if not FileExists(sLAFM) then
-      if not CopyFile(PChar(sModelFile), PChar(sLAFM), True) then
-      begin
-        Application.MessageBox(PChar('本地附件管理库模板文件“' + sModelFile + '”丢失或被占用无法复制。'), '警告', MB_OK + MB_ICONWARNING);
-        Exit;
-      end;
-
-    FLocalCon.ConnectionString := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False;', [sLAFM]);
   end;
+//  else
+//  begin
+//    FPath := ExtractFilePath(Application.ExeName) + '我的项目\Attachment\' + ExtractFileName(TProjectData(FProjectData).FileName) + '\';
+//    if not DirectoryExists(FPath) then
+//      ForceDirectories(FPath);
+//
+//    sLAFM := FPath + 'LocalAttachmentFileManager.dat';
+//    sModelFile := ExtractFilePath(Application.ExeName) + 'Data\LocalAttachmentFileManager.dat';
+//    if not FileExists(sLAFM) then
+//      if not CopyFile(PChar(sModelFile), PChar(sLAFM), True) then
+//      begin
+//        Application.MessageBox(PChar('本地附件管理库模板文件“' + sModelFile + '”丢失或被占用无法复制。'), '警告', MB_OK + MB_ICONWARNING);
+//        Exit;
+//      end;
+//
+//    FLocalCon.ConnectionString := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False;', [sLAFM]);
+//  end;
 end;
 
 procedure TUpFile.SetOwner(const Value: TUpFiles);
@@ -392,14 +394,13 @@ begin
     FIcon.Handle := sInfo.hIcon;
 end;
 
-function TUpFiles.Add(ABillID, APhase: Integer): TUpFile;
+function TUpFiles.Add(ABillID: Integer): TUpFile;
 var vFile: TUpFile;
 begin
   vFile := TUpFile.Create;
   vFile.No := Add(vFile);
   vFile.Owner := Self;
   vFile.BillID := ABillID;
-  vFile.Phase := APhase;
   Result := vFile;
 end;
 
@@ -408,24 +409,24 @@ begin
   FOrgFile := Value;
 end;
 
-function TUpFiles.LocalSaveToDB(AUpFile: TUpFile): Integer;
-begin
-  try
-    FLocalQue2.Close;
-    FLocalQue2.SQL.Text := 'Select * from AttachmentFile where 1 < 0';
-    FLocalQue2.Open;
-    FLocalQue2.Append;
-    FLocalQue2.FieldByName('BillID').AsInteger := AUpFile.BillID;
-    FLocalQue2.FieldByName('Phase').AsInteger := AUpFile.Phase;
-    FLocalQue2.FieldByName('FileName').AsString := AUpFile.DisplayName;
-    FLocalQue2.Post;
-    Result := FLocalQue2.FieldByName('ID').AsInteger;
-    FLocalQue2.Close;
-  except
-    Result := -1;
-    Application.MessageBox('本地保存失败,请重试!', '警告', MB_OK + MB_ICONWARNING);
-  end;
-end;
+//function TUpFiles.LocalSaveToDB(AUpFile: TUpFile): Integer;
+//begin
+//  try
+//    FLocalQue2.Close;
+//    FLocalQue2.SQL.Text := 'Select * from AttachmentFile where 1 < 0';
+//    FLocalQue2.Open;
+//    FLocalQue2.Append;
+//    FLocalQue2.FieldByName('BillID').AsInteger := AUpFile.BillID;
+//    FLocalQue2.FieldByName('Phase').AsInteger := AUpFile.Phase;
+//    FLocalQue2.FieldByName('FileName').AsString := AUpFile.DisplayName;
+//    FLocalQue2.Post;
+//    Result := FLocalQue2.FieldByName('ID').AsInteger;
+//    FLocalQue2.Close;
+//  except
+//    Result := -1;
+//    Application.MessageBox('本地保存失败,请重试!', '警告', MB_OK + MB_ICONWARNING);
+//  end;
+//end;
 
 procedure TUpFile.SetPhase(const Value: Integer);
 begin
@@ -442,4 +443,21 @@ begin
   Result := ExtractFileExt(DisplayName);
 end;
 
+function TUpFiles.Find(AID: Integer): TUpFile;
+var i: Integer;
+  vUpFile: TUpFile;
+begin
+  vUpFile := nil;
+  for i := 0 to FList.Count - 1 do
+  begin
+   vUpFile := TUpFile(FList[i]);
+   if vUpFile.ID = AID then
+   begin
+     Result := vUpFile;
+     Break;
+   end;
+  end;
+end;
+
+
 end.