123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 |
- using System;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- namespace UpdateDataTool
- {
- class VidUpgrader
- {
- public static void Convert(string source, string dest)
- {
- if (File.Exists(source))
- {
- using (var sourceStream = new MemoryStream(File.ReadAllBytes(source)))
- {
- using (var vid1 = new Vinno.vCloud.Common.Vid.VinnoImageData(sourceStream))
- {
- using (var vid2 = new Vinno.vCloud.Common.Vid2.VinnoImageData(dest, Vinno.vCloud.Common.Vid2.OperationMode.Create))
- {
- var probe1 = vid1.Probe;
- var probeType = GetNewProbeType(probe1.Type);
- var application = GetNewApplication(probe1.Application);
- var probe2 = new Vinno.vCloud.Common.Vid2.VinnoProbe(probe1.Name, probeType, application, probe1.FrameRate);
- vid2.AddProbe(probe2);
- for (var i = 0; i < vid1.ImageCount; i++)
- {
- var vinnoImage1 = Vinno.vCloud.Common.Vid.VinnoImage.FromBytes(vid1.GetImage(i));
- var image = GetImageFromBytes(vinnoImage1.ImageData);
- var vinnoImage2 = new Vinno.vCloud.Common.Vid2.VinnoImage(i, image.Width, image.Height, vinnoImage1.ImageData);
- if (vinnoImage1 is Vinno.vCloud.Common.Vid.Vinno2DImage vinno2DImage1)
- {
- if (vinno2DImage1.AllowMeasure)
- {
- var vinno2DVisual = new Vinno.vCloud.Common.Vid2.Visuals.Vinno2DVisual();
- foreach (var lc in vinno2DImage1.LogicalCoordinates)
- {
- var newAreaType = GetNewVinnoVisualAreaType(lc.Key);
- vinno2DVisual.LogicalCoordinates.Add(newAreaType,
- new Vinno.vCloud.Common.Vid2.Visuals.VinnoLogicalCoordinate(lc.Value.IsFlipHorizontal,
- lc.Value.IsFlipVertical,
- GetNewRect(lc.Value.Region),
- GetNewUnit(lc.Value.XUnit),
- GetNewUnit(lc.Value.YUnit)
- ));
- }
- foreach (var pc in vinno2DImage1.PhysicalCoordinates)
- {
- var newAreaType = GetNewVinnoVisualAreaType(pc.Key);
- vinno2DVisual.PhysicalCoordinates.Add(
- newAreaType,
- GetNewPhysicalCoordinate(pc.Value));
- }
- var oldVisual = probe1.Visuals.FirstOrDefault();
- if (oldVisual != null)
- {
- foreach (var oldVisualMode in oldVisual.Modes)
- {
- vinno2DVisual.Modes.Add(
- new Vinno.vCloud.Common.Vid2.Visuals.VinnoMode(oldVisualMode.Name, oldVisualMode.DisplayName,
- GetNewModeType(oldVisualMode.Type)));
- }
- vinno2DVisual.ActiveModeType = GetNewModeType(oldVisual.ActiveModeType);
- }
- vinnoImage2.Visuals.Add(vinno2DVisual);
- }
- }
- if (vinnoImage1 is Vinno.vCloud.Common.Vid.Vinno3DPlaneImage vinno3DImage1)
- {
- if (vinno3DImage1.AllowMeasure)
- {
- var vinno3DVisual = new Vinno.vCloud.Common.Vid2.Visuals.Vinno3DVisual();
- foreach (var t3a in vinno3DImage1.Tissue3DAreas)
- {
- var new3DArea = new Vinno.vCloud.Common.Vid2.Visuals.VinnoTissue3DArea(
- GetNewRect(t3a.Bounds),
- t3a.CmPerPixel,
- GetNewPoint(t3a.GlobalOffset),
- GetNewIndicator(t3a.Indicator)
- );
- vinno3DVisual.Tissue3DAreas.Add(new3DArea);
- }
- var oldVisual = probe1.Visuals.FirstOrDefault();
- if (oldVisual != null)
- {
- foreach (var oldVisualMode in oldVisual.Modes)
- {
- vinno3DVisual.Modes.Add(
- new Vinno.vCloud.Common.Vid2.Visuals.VinnoMode(oldVisualMode.Name, oldVisualMode.DisplayName,
- GetNewModeType(oldVisualMode.Type)));
- }
- vinno3DVisual.ActiveModeType = GetNewModeType(oldVisual.ActiveModeType);
- }
- vinnoImage2.Visuals.Add(vinno3DVisual);
- }
- }
- vid2.AddImage(vinnoImage2);
- }
- }
- }
- }
- }
- }
- private static Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType GetNewVinnoVisualAreaType(
- Vinno.vCloud.Common.Vid.VinnoVisualAreaType vinnoVisualAreaType)
- {
- switch (vinnoVisualAreaType)
- {
- case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Colorbar:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Colorbar;
- case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Doppler:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Doppler;
- case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Flow:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Flow;
- case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.TimeMotion:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.TimeMotion;
- case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Tissue:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Tissue;
- case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Tissue3D:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Tissue3D;
- case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.TissueTimeMotion:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.TissueTimeMotion;
- case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Trace:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Trace;
- default:
- throw new ArgumentOutOfRangeException(nameof(vinnoVisualAreaType), vinnoVisualAreaType, "Convert VinnoVisualAreaType failed.");
- }
- }
- private static Vinno.vCloud.Common.Vid2.VinnoProbeType GetNewProbeType(
- Vinno.vCloud.Common.Vid.VinnoProbeType oldProbeType)
- {
- switch (oldProbeType)
- {
- case Vinno.vCloud.Common.Vid.VinnoProbeType.Undefined:
- return Vinno.vCloud.Common.Vid2.VinnoProbeType.Undefined;
- case Vinno.vCloud.Common.Vid.VinnoProbeType.Linear:
- return Vinno.vCloud.Common.Vid2.VinnoProbeType.Linear;
- case Vinno.vCloud.Common.Vid.VinnoProbeType.Convex:
- return Vinno.vCloud.Common.Vid2.VinnoProbeType.Convex;
- case Vinno.vCloud.Common.Vid.VinnoProbeType.Sector:
- return Vinno.vCloud.Common.Vid2.VinnoProbeType.Sector;
- default:
- throw new ArgumentOutOfRangeException(nameof(oldProbeType), oldProbeType, null);
- }
- }
- private static Vinno.vCloud.Common.Vid2.VinnoApplication GetNewApplication(
- Vinno.vCloud.Common.Vid.VinnoApplication oldApplication)
- {
- var newApplication = new Vinno.vCloud.Common.Vid2.VinnoApplication(oldApplication.ApplicationId,
- oldApplication.ApplicationOriginalId, oldApplication.ApplicationName,
- oldApplication.ApplicationCategoryName, oldApplication.IsUserDefined);
- return newApplication;
- }
- private static Image GetImageFromBytes(byte[] bytes)
- {
- using (var ms = new MemoryStream(bytes))
- {
- return Image.FromStream(ms);
- }
- }
- private static Vinno.vCloud.Common.Vid2.Visuals.VinnoRect GetNewRect(Vinno.vCloud.Common.Vid.VinnoRect oldRect)
- {
- return new Vinno.vCloud.Common.Vid2.Visuals.VinnoRect(oldRect.Left, oldRect.Top, oldRect.Width, oldRect.Height);
- }
- private static Vinno.vCloud.Common.Vid2.Visuals.VinnoPoint GetNewPoint(Vinno.vCloud.Common.Vid.VinnoPoint oldPoint)
- {
- return new Vinno.vCloud.Common.Vid2.Visuals.VinnoPoint(oldPoint.X, oldPoint.Y);
- }
- private static Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType GetNewModeType(Vinno.vCloud.Common.Vid.VinnoModeType oldModeType)
- {
- switch (oldModeType)
- {
- case Vinno.vCloud.Common.Vid.VinnoModeType.Undefined:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Undefined;
- case Vinno.vCloud.Common.Vid.VinnoModeType.Tissue:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Tissue;
- case Vinno.vCloud.Common.Vid.VinnoModeType.Flow:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Flow;
- case Vinno.vCloud.Common.Vid.VinnoModeType.Doppler:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Doppler;
- case Vinno.vCloud.Common.Vid.VinnoModeType.TissueTM:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.TissueTM;
- case Vinno.vCloud.Common.Vid.VinnoModeType.Tissue3D:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Tissue3D;
- case Vinno.vCloud.Common.Vid.VinnoModeType.FlowM:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.FlowM;
- default:
- throw new ArgumentOutOfRangeException(nameof(oldModeType), oldModeType, null);
- }
- }
- private static Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator GetNewIndicator(
- Vinno.vCloud.Common.Vid.AreaIndicator oldArea)
- {
- switch (oldArea)
- {
- case Vinno.vCloud.Common.Vid.AreaIndicator.Global:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.Global;
- case Vinno.vCloud.Common.Vid.AreaIndicator.A:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.A;
- case Vinno.vCloud.Common.Vid.AreaIndicator.B:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.B;
- case Vinno.vCloud.Common.Vid.AreaIndicator.C:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.C;
- case Vinno.vCloud.Common.Vid.AreaIndicator.ThreeD:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.ThreeD;
- default:
- throw new ArgumentOutOfRangeException(nameof(oldArea), oldArea, null);
- }
- }
- private static Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit GetNewUnit(Vinno.vCloud.Common.Vid.VinnoUnit oldUnit)
- {
- switch (oldUnit)
- {
- case Vinno.vCloud.Common.Vid.VinnoUnit.None:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.None;
- case Vinno.vCloud.Common.Vid.VinnoUnit.percent:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.percent;
- case Vinno.vCloud.Common.Vid.VinnoUnit.cm:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mm:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mm;
- case Vinno.vCloud.Common.Vid.VinnoUnit.inch:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.inch;
- case Vinno.vCloud.Common.Vid.VinnoUnit.ft:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ft;
- case Vinno.vCloud.Common.Vid.VinnoUnit.s:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.s;
- case Vinno.vCloud.Common.Vid.VinnoUnit.minute:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.minute;
- case Vinno.vCloud.Common.Vid.VinnoUnit.hour:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.hour;
- case Vinno.vCloud.Common.Vid.VinnoUnit.day:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.day;
- case Vinno.vCloud.Common.Vid.VinnoUnit.week:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.week;
- case Vinno.vCloud.Common.Vid.VinnoUnit.week_day:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.week_day;
- case Vinno.vCloud.Common.Vid.VinnoUnit.Tick:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.Tick;
- case Vinno.vCloud.Common.Vid.VinnoUnit.msec:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.msec;
- case Vinno.vCloud.Common.Vid.VinnoUnit.degree:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.degree;
- case Vinno.vCloud.Common.Vid.VinnoUnit.radian:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.radian;
- case Vinno.vCloud.Common.Vid.VinnoUnit.g:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.g;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mg:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mg;
- case Vinno.vCloud.Common.Vid.VinnoUnit.ng:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ng;
- case Vinno.vCloud.Common.Vid.VinnoUnit.kg:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.kg;
- case Vinno.vCloud.Common.Vid.VinnoUnit.oz:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.oz;
- case Vinno.vCloud.Common.Vid.VinnoUnit.lb:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.lb;
- case Vinno.vCloud.Common.Vid.VinnoUnit.cm2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mm2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mm2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.m2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.m2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.cm3:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mm3:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mm3;
- case Vinno.vCloud.Common.Vid.VinnoUnit.ml:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ml;
- case Vinno.vCloud.Common.Vid.VinnoUnit.L:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.L;
- case Vinno.vCloud.Common.Vid.VinnoUnit.cms:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cms;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mms:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mms;
- case Vinno.vCloud.Common.Vid.VinnoUnit.ms:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ms;
- case Vinno.vCloud.Common.Vid.VinnoUnit.cms2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cms2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mms2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mms2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.cm3s:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3s;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mls:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mls;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mlmin:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlmin;
- case Vinno.vCloud.Common.Vid.VinnoUnit.Lmin:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.Lmin;
- case Vinno.vCloud.Common.Vid.VinnoUnit.gcm3:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.gcm3;
- case Vinno.vCloud.Common.Vid.VinnoUnit.gml:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.gml;
- case Vinno.vCloud.Common.Vid.VinnoUnit.ngml:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ngml;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mmHg:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mmHg;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mV:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mV;
- case Vinno.vCloud.Common.Vid.VinnoUnit.Hz:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.Hz;
- case Vinno.vCloud.Common.Vid.VinnoUnit.KHz:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.KHz;
- case Vinno.vCloud.Common.Vid.VinnoUnit.HR:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.HR;
- case Vinno.vCloud.Common.Vid.VinnoUnit.cm3m2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3m2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mlm2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlm2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.cm3sm2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3sm2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mlsm2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlsm2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.cm3minm2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3minm2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mlminm2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlminm2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.Lminm2:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.Lminm2;
- case Vinno.vCloud.Common.Vid.VinnoUnit.circs:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.circs;
- case Vinno.vCloud.Common.Vid.VinnoUnit.mlbeat:
- return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlbeat;
- default:
- throw new ArgumentOutOfRangeException(nameof(oldUnit), oldUnit, null);
- }
- }
- private static Vinno.vCloud.Common.Vid2.Visuals.VinnoPhysicalCoordinate GetNewPhysicalCoordinate(
- Vinno.vCloud.Common.Vid.VinnoPhysicalCoordinate oldPhysicalCoordinate)
- {
- if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoConvexTVTissuePhysicalCoordinate cttpc)
- {
- return new Vinno.vCloud.Common.Vid2.Visuals.VinnoConvexTVTissuePhysicalCoordinate(cttpc.DepthEnd, cttpc.DepthStart, cttpc.Width, cttpc.BeamPosition, cttpc.ZeroRadius, cttpc.OriginalZeroRadius, cttpc.OriginalRocx);
- }
- if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoLinearTVTissuePhysicalCoordinate lttpc)
- {
- return new Vinno.vCloud.Common.Vid2.Visuals.VinnoLinearTVTissuePhysicalCoordinate(lttpc.DepthEnd, lttpc.DepthStart, lttpc.Width, lttpc.BeamPosition, lttpc.ZeroRadius);
- }
- if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoLinearTissuePhysicalCoordinate ltpc)
- {
- return new Vinno.vCloud.Common.Vid2.Visuals.VinnoLinearTissuePhysicalCoordinate(ltpc.DepthEnd, ltpc.DepthStart, ltpc.Width, ltpc.BeamPosition, ltpc.Steer);
- }
- if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoConvexTissuePhysicalCoordinate ctpc)
- {
- return new Vinno.vCloud.Common.Vid2.Visuals.VinnoConvexTissuePhysicalCoordinate(ctpc.DepthEnd, ctpc.DepthStart, ctpc.Width, ctpc.BeamPosition, ctpc.ZeroRadius);
- }
- if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoDopplerPhysicalCoordinate dpc)
- {
- return new Vinno.vCloud.Common.Vid2.Visuals.VinnoDopplerPhysicalCoordinate(dpc.SweepSpeed, dpc.Max, dpc.Min, dpc.BaseLine);
- }
- if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoTissueTimeMotionPhysicalCoordinate ttpc)
- {
- return new Vinno.vCloud.Common.Vid2.Visuals.VinnoTissueTimeMotionPhysicalCoordinate(ttpc.SweepSpeed, ttpc.Max, ttpc.Min, ttpc.DepthStart, ttpc.DepthEnd);
- }
- return null;
- }
- }
- }
|