Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use size_t rather than int #6

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
bdf4f14
Update Sony(1|2) group (minor Minolta changes)
postscript-dev Aug 10, 2022
6a99546
Improve coverage of `Sony(1|2)` group
postscript-dev Aug 11, 2022
6ee33f3
Fix clang compilation on macOS
postscript-dev Aug 11, 2022
212f6f4
Fix github-code-scanning warnings
postscript-dev Aug 12, 2022
edd7d84
Fix minor `Exif.Sony(1|2)` problems
postscript-dev Aug 12, 2022
962e8d5
Fix tests and update `Sony(1|2)` group coverage
postscript-dev Aug 12, 2022
28c49ae
Fix testing
postscript-dev Aug 12, 2022
7c2dceb
Minor fixes and regenerate Regression data
postscript-dev Aug 14, 2022
7bd4afb
Update Sony tags with `getModel()`
postscript-dev Aug 19, 2022
791ed8e
Fix `Exif.Sony(1|2).AFPointsUsed` type
postscript-dev Aug 19, 2022
75e40bc
Improve `Exif.Sony(1|2).*` coverage
postscript-dev Aug 19, 2022
b8eee1c
Fix types in Sony func `getFocusMode()`
postscript-dev Aug 20, 2022
cafe2e0
Update Regression tests for `Sony(1|2)`
postscript-dev Aug 20, 2022
23e32cf
Minor fixes to `Sony(1|2)` tags
postscript-dev Aug 21, 2022
48df828
Update `Sony(1|2)` tag coverage
postscript-dev Aug 21, 2022
e5996b5
Improve `Sony(1|2)` tag coverage
postscript-dev Aug 21, 2022
688529a
Update easyaccess with `Exif.Sony(1|2)` tags
postscript-dev Aug 23, 2022
2e6ffef
Update `SonyModelID` array comment
postscript-dev Aug 23, 2022
812a683
Add Sony `LensSpec` tag to easyaccess
postscript-dev Aug 27, 2022
dc6ae50
Update `Sony(1|2)` label/descriptions
postscript-dev Aug 29, 2022
537eb27
Use size_t rather than int.
kevinbackhouse Sep 19, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion samples/write2-test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ int main(int argc, char* const argv[]) {
Exiv2::ExifData edMn9;
edMn9["Exif.Image.Make"] = "SONY";
edMn9["Exif.Image.Model"] = "DSC-W7";
edMn9["Exif.Sony1.0x2000"] = "0 1 2 3 4 5";
edMn9["Exif.Sony1.Quality"] = static_cast<uint32_t>(2);
write(file, edMn9);
print(file);

Expand Down
87 changes: 48 additions & 39 deletions src/easyaccess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,11 @@ ExifData::const_iterator flashBias(const ExifData& ed) {

ExifData::const_iterator exposureMode(const ExifData& ed) {
static const char* keys[] = {
"Exif.Photo.ExposureProgram", "Exif.Image.ExposureProgram", "Exif.CanonCs.ExposureProgram",
"Exif.MinoltaCs7D.ExposureMode", "Exif.MinoltaCs5D.ExposureMode", "Exif.MinoltaCsNew.ExposureMode",
"Exif.MinoltaCsOld.ExposureMode", "Exif.Sony1MltCsA100.ExposureMode", "Exif.Sony1Cs.ExposureProgram",
"Exif.Sony2Cs.ExposureProgram", "Exif.Sigma.ExposureMode"};
"Exif.Photo.ExposureProgram", "Exif.Image.ExposureProgram", "Exif.CanonCs.ExposureProgram",
"Exif.MinoltaCs7D.ExposureMode", "Exif.MinoltaCs5D.ExposureMode", "Exif.MinoltaCsNew.ExposureMode",
"Exif.MinoltaCsOld.ExposureMode", "Exif.Sony1.ExposureMode", "Exif.Sony2.ExposureMode",
"Exif.Sony1Cs.ExposureProgram", "Exif.Sony2Cs.ExposureProgram", "Exif.Sony1MltCsA100.ExposureMode",
"Exif.Sigma.ExposureMode"};
return findMetadatum(ed, keys, std::size(keys));
}

Expand Down Expand Up @@ -196,27 +197,28 @@ ExifData::const_iterator macroMode(const ExifData& ed) {
}

ExifData::const_iterator imageQuality(const ExifData& ed) {
static const char* keys[] = {"Exif.CanonCs.Quality", "Exif.Fujifilm.Quality", "Exif.Sigma.Quality",
"Exif.Nikon1.Quality", "Exif.Nikon2.Quality", "Exif.Nikon3.Quality",
"Exif.Olympus.Quality", "Exif.OlympusCs.Quality", "Exif.Panasonic.Quality",
"Exif.Minolta.Quality", "Exif.MinoltaCsNew.Quality", "Exif.MinoltaCsOld.Quality",
"Exif.MinoltaCs5D.Quality", "Exif.MinoltaCs7D.Quality", "Exif.Sony1MltCsA100.Quality",
"Exif.Sony1.JPEGQuality", "Exif.Sony1.Quality", "Exif.Sony1Cs.Quality",
"Exif.Sony2.JPEGQuality", "Exif.Sony2.Quality", "Exif.Sony2Cs.Quality",
"Exif.Casio.Quality", "Exif.Casio2.QualityMode", "Exif.Casio2.Quality"};
static const char* keys[] = {"Exif.CanonCs.Quality", "Exif.Fujifilm.Quality", "Exif.Sigma.Quality",
"Exif.Nikon1.Quality", "Exif.Nikon2.Quality", "Exif.Nikon3.Quality",
"Exif.Olympus.Quality", "Exif.OlympusCs.Quality", "Exif.Panasonic.Quality",
"Exif.Sony1.JPEGQuality", "Exif.Sony1.Quality", "Exif.Sony1.Quality2",
"Exif.Sony1Cs.Quality", "Exif.Sony2.JPEGQuality", "Exif.Sony2.Quality",
"Exif.Sony2.Quality2", "Exif.Sony2Cs.Quality", "Exif.Minolta.Quality",
"Exif.MinoltaCsNew.Quality", "Exif.MinoltaCsOld.Quality", "Exif.MinoltaCs5D.Quality",
"Exif.MinoltaCs7D.Quality", "Exif.Sony1MltCsA100.Quality", "Exif.Casio.Quality",
"Exif.Casio2.QualityMode", "Exif.Casio2.Quality"};
return findMetadatum(ed, keys, std::size(keys));
}

ExifData::const_iterator whiteBalance(const ExifData& ed) {
static const char* keys[] = {
"Exif.CanonSi.WhiteBalance", "Exif.Fujifilm.WhiteBalance", "Exif.Sigma.WhiteBalance",
"Exif.Nikon1.WhiteBalance", "Exif.Nikon2.WhiteBalance", "Exif.Nikon3.WhiteBalance",
"Exif.Olympus.WhiteBalance", "Exif.OlympusCs.WhiteBalance", "Exif.Panasonic.WhiteBalance",
"Exif.MinoltaCs5D.WhiteBalance", "Exif.MinoltaCs7D.WhiteBalance", "Exif.MinoltaCsNew.WhiteBalance",
"Exif.MinoltaCsOld.WhiteBalance", "Exif.Minolta.WhiteBalance", "Exif.Sony1MltCsA100.WhiteBalance",
"Exif.SonyMinolta.WhiteBalance", "Exif.Sony1.WhiteBalance", "Exif.Sony2.WhiteBalance",
"Exif.Sony1.WhiteBalance2", "Exif.Sony2.WhiteBalance2", "Exif.Casio.WhiteBalance",
"Exif.Casio2.WhiteBalance", "Exif.Casio2.WhiteBalance2", "Exif.Photo.WhiteBalance"};
"Exif.CanonSi.WhiteBalance", "Exif.Fujifilm.WhiteBalance", "Exif.Sigma.WhiteBalance",
"Exif.Nikon1.WhiteBalance", "Exif.Nikon2.WhiteBalance", "Exif.Nikon3.WhiteBalance",
"Exif.Olympus.WhiteBalance", "Exif.OlympusCs.WhiteBalance", "Exif.Panasonic.WhiteBalance",
"Exif.MinoltaCs5D.WhiteBalance", "Exif.MinoltaCs7D.WhiteBalance", "Exif.MinoltaCsNew.WhiteBalance",
"Exif.MinoltaCsOld.WhiteBalance", "Exif.Minolta.WhiteBalance", "Exif.Sony1.WhiteBalance",
"Exif.Sony2.WhiteBalance", "Exif.Sony1.WhiteBalance2", "Exif.Sony2.WhiteBalance2",
"Exif.Sony1MltCsA100.WhiteBalance", "Exif.SonyMinolta.WhiteBalance", "Exif.Casio.WhiteBalance",
"Exif.Casio2.WhiteBalance", "Exif.Casio2.WhiteBalance2", "Exif.Photo.WhiteBalance"};
return findMetadatum(ed, keys, std::size(keys));
}

Expand All @@ -226,8 +228,9 @@ ExifData::const_iterator lensName(const ExifData& ed) {
"Exif.CanonCs.LensType", "Exif.Photo.LensModel", "Exif.NikonLd1.LensIDNumber",
"Exif.NikonLd2.LensIDNumber", "Exif.NikonLd3.LensIDNumber", "Exif.Pentax.LensType",
"Exif.PentaxDng.LensType", "Exif.Minolta.LensID", "Exif.SonyMinolta.LensID",
"Exif.Sony1.LensID", "Exif.Sony2.LensID", "Exif.OlympusEq.LensType",
"Exif.Panasonic.LensType", "Exif.Samsung2.LensType"};
"Exif.Sony1.LensID", "Exif.Sony2.LensID", "Exif.Sony1.LensSpec",
"Exif.Sony2.LensSpec", "Exif.OlympusEq.LensType", "Exif.Panasonic.LensType",
"Exif.Samsung2.LensType"};
return findMetadatum(ed, keys, std::size(keys));
}

Expand All @@ -237,7 +240,8 @@ ExifData::const_iterator saturation(const ExifData& ed) {
"Exif.MinoltaCsOld.Saturation", "Exif.MinoltaCs7D.Saturation", "Exif.MinoltaCs5D.Saturation",
"Exif.Fujifilm.Color", "Exif.Nikon3.Saturation", "Exif.Panasonic.Saturation",
"Exif.Pentax.Saturation", "Exif.PentaxDng.Saturation", "Exif.Sigma.Saturation",
"Exif.Casio.Saturation", "Exif.Casio2.Saturation", "Exif.Casio2.Saturation2"};
"Exif.Sony1.Saturation", "Exif.Sony2.Saturation", "Exif.Casio.Saturation",
"Exif.Casio2.Saturation", "Exif.Casio2.Saturation2"};
return findMetadatum(ed, keys, std::size(keys));
}

Expand All @@ -247,19 +251,18 @@ ExifData::const_iterator sharpness(const ExifData& ed) {
"Exif.MinoltaCsNew.Sharpness", "Exif.MinoltaCsOld.Sharpness", "Exif.MinoltaCs7D.Sharpness",
"Exif.MinoltaCs5D.Sharpness", "Exif.Olympus.SharpnessFactor", "Exif.Panasonic.Sharpness",
"Exif.Pentax.Sharpness", "Exif.PentaxDng.Sharpness", "Exif.Sigma.Sharpness",
"Exif.Casio.Sharpness", "Exif.Casio2.Sharpness", "Exif.Casio2.Sharpness2"};
"Exif.Sony1.Sharpness", "Exif.Sony2.Sharpness", "Exif.Casio.Sharpness",
"Exif.Casio2.Sharpness", "Exif.Casio2.Sharpness2"};
return findMetadatum(ed, keys, std::size(keys));
}

ExifData::const_iterator contrast(const ExifData& ed) {
static const char* keys[] = {"Exif.Photo.Contrast", "Exif.CanonCs.Contrast",
"Exif.Fujifilm.Tone", "Exif.MinoltaCsNew.Contrast",
"Exif.MinoltaCsOld.Contrast", "Exif.MinoltaCs7D.Contrast",
"Exif.MinoltaCs5D.Contrast", "Exif.Olympus.Contrast",
"Exif.Panasonic.Contrast", "Exif.Pentax.Contrast",
"Exif.PentaxDng.Contrast", "Exif.Sigma.Contrast",
"Exif.Casio.Contrast", "Exif.Casio2.Contrast",
"Exif.Casio2.Contrast2"
static const char* keys[] = {"Exif.Photo.Contrast", "Exif.CanonCs.Contrast", "Exif.Fujifilm.Tone",
"Exif.MinoltaCsNew.Contrast", "Exif.MinoltaCsOld.Contrast", "Exif.MinoltaCs7D.Contrast",
"Exif.MinoltaCs5D.Contrast", "Exif.Olympus.Contrast", "Exif.Panasonic.Contrast",
"Exif.Pentax.Contrast", "Exif.PentaxDng.Contrast", "Exif.Sigma.Contrast",
"Exif.Sony1.Contrast", "Exif.Sony2.Contrast", "Exif.Casio.Contrast",
"Exif.Casio2.Contrast", "Exif.Casio2.Contrast2"

};
return findMetadatum(ed, keys, std::size(keys));
Expand All @@ -271,8 +274,9 @@ ExifData::const_iterator sceneCaptureType(const ExifData& ed) {
}

ExifData::const_iterator meteringMode(const ExifData& ed) {
static const char* keys[] = {"Exif.Photo.MeteringMode", "Exif.Image.MeteringMode", "Exif.CanonCs.MeteringMode",
"Exif.Sony1MltCsA100.MeteringMode"};
static const char* keys[] = {"Exif.Photo.MeteringMode", "Exif.Image.MeteringMode",
"Exif.CanonCs.MeteringMode", "Exif.Sony1.MeteringMode2",
"Exif.Sony2.MeteringMode2", "Exif.Sony1MltCsA100.MeteringMode"};
return findMetadatum(ed, keys, std::size(keys));
}

Expand All @@ -282,7 +286,7 @@ ExifData::const_iterator make(const ExifData& ed) {
}

ExifData::const_iterator model(const ExifData& ed) {
static const char* keys[] = {"Exif.Image.Model"};
static const char* keys[] = {"Exif.Image.Model", "Exif.Sony1.SonyModelID", "Exif.Sony2.SonyModelID"};
return findMetadatum(ed, keys, std::size(keys));
}

Expand All @@ -307,7 +311,8 @@ ExifData::const_iterator apertureValue(const ExifData& ed) {
}

ExifData::const_iterator brightnessValue(const ExifData& ed) {
static const char* keys[] = {"Exif.Photo.BrightnessValue", "Exif.Image.BrightnessValue"};
static const char* keys[] = {"Exif.Photo.BrightnessValue", "Exif.Image.BrightnessValue", "Exif.Sony1.Brightness",
"Exif.Sony2.Brightness"};
return findMetadatum(ed, keys, std::size(keys));
}

Expand Down Expand Up @@ -337,14 +342,16 @@ ExifData::const_iterator lightSource(const ExifData& ed) {
}

ExifData::const_iterator flash(const ExifData& ed) {
static const char* keys[] = {"Exif.Photo.Flash", "Exif.Image.Flash"};
static const char* keys[] = {"Exif.Photo.Flash", "Exif.Image.Flash", "Exif.Sony1.FlashAction",
"Exif.Sony2.FlashAction"};
return findMetadatum(ed, keys, std::size(keys));
}

ExifData::const_iterator serialNumber(const ExifData& ed) {
static const char* keys[] = {
"Exif.Image.CameraSerialNumber", "Exif.Canon.SerialNumber", "Exif.Nikon3.SerialNumber", "Exif.Nikon3.SerialNO",
"Exif.Fujifilm.SerialNumber", "Exif.Olympus.SerialNumber2", "Exif.Sigma.SerialNumber"};
"Exif.Image.CameraSerialNumber", "Exif.Canon.SerialNumber", "Exif.Nikon3.SerialNumber",
"Exif.Nikon3.SerialNO", "Exif.Fujifilm.SerialNumber", "Exif.Olympus.SerialNumber2",
"Exif.Sigma.SerialNumber", "Exif.Sony1.SerialNumber", "Exif.Sony2.SerialNumber"};
return findMetadatum(ed, keys, std::size(keys));
}

Expand Down Expand Up @@ -392,6 +399,8 @@ ExifData::const_iterator afPoint(const ExifData& ed) {
"Exif.Pentax.AFPointInFocus",
"Exif.PentaxDng.AFPoint",
"Exif.PentaxDng.AFPointInFocus",
"Exif.Sony1.AFPointSelected",
"Exif.Sony2.AFPointSelected",
"Exif.Sony1Cs.LocalAFAreaPoint",
"Exif.Sony2Cs.LocalAFAreaPoint",
"Exif.Sony1Cs2.LocalAFAreaPoint",
Expand Down
70 changes: 38 additions & 32 deletions src/minoltamn_int.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@
namespace Exiv2::Internal {
// -- Standard Minolta Makernotes tags ---------------------------------------------------------------

//! Lookup table to translate Minolta Std (tag 0x0115) white balance values to readable labels
constexpr TagDetails minoltaWhiteBalanceStd0x0115[] = {
{0x00, N_("Auto")}, {0x01, N_("Color Temperature/Color Filter")},
{0x10, N_("Daylight")}, {0x20, N_("Cloudy")},
{0x30, N_("Shade")}, {0x40, N_("Tungsten")},
{0x50, N_("Flash")}, {0x60, N_("Fluorescent")},
{0x70, N_("Custom")}};

//! Lookup table to translate Minolta color mode values to readable labels
constexpr TagDetails minoltaColorMode[] = {
{0, N_("Natural Color")}, {1, N_("Black & White")}, {2, N_("Vivid Color")}, {3, N_("Solarization")},
Expand All @@ -26,9 +34,8 @@ constexpr TagDetails minoltaColorMode[] = {
{17, N_("Night Scene")}, {18, N_("Night Portrait")}};

//! Lookup table to translate Minolta image quality values to readable labels
[[maybe_unused]] constexpr TagDetails minoltaImageQuality[] = {{0, N_("Raw")}, {1, N_("Super Fine")},
{2, N_("Fine")}, {3, N_("Standard")},
{4, N_("Economy")}, {5, N_("Extra Fine")}};
constexpr TagDetails minoltaImageQuality[] = {{0, N_("Raw")}, {1, N_("Super Fine")}, {2, N_("Fine")},
{3, N_("Standard")}, {4, N_("Economy")}, {5, N_("Extra Fine")}};

//! Lookup table to translate Minolta image stabilization values
constexpr TagDetails minoltaImageStabilization[] = {{1, N_("Off")}, {5, N_("On")}};
Expand Down Expand Up @@ -68,7 +75,7 @@ constexpr TagInfo MinoltaMakerNote::tagInfo_[] = {
EXV_PRINT_TAG(minoltaColorMode)},

{0x0102, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaId, SectionId::makerTags, unsignedLong,
-1, printMinoltaSonyImageQuality},
-1, EXV_PRINT_TAG(minoltaImageQuality)},

// TODO: Tag 0x0103 : quality or image size (see ExifTool doc).
{0x0103, "0x0103", N_("0x0103"), N_("Unknown"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1,
Expand Down Expand Up @@ -101,7 +108,7 @@ constexpr TagInfo MinoltaMakerNote::tagInfo_[] = {
IfdId::minoltaId, SectionId::makerTags, undefined, -1, printValue},

{0x0115, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaId, SectionId::makerTags,
unsignedLong, -1, printMinoltaSonyWhiteBalanceStd},
unsignedLong, -1, EXV_PRINT_TAG(minoltaWhiteBalanceStd0x0115)},
{0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::minoltaId, SectionId::makerTags, undefined,
-1, printValue},
{0x0f00, "CameraSettingsZ1", N_("Camera Settings (Z1)"), N_("Camera Settings (for Z1, DImage X, and F100 models)"),
Expand Down Expand Up @@ -1769,28 +1776,39 @@ std::ostream& printMinoltaSonyRotation(std::ostream& os, const Value& value, con

//! Lookup table to translate Minolta/Sony scene mode values to readable labels
constexpr TagDetails minoltaSonySceneMode[] = {
{0, N_("Standard")}, {1, N_("Portrait")}, {2, N_("Text")}, {3, N_("Night Scene")},
{4, N_("Sunset")}, {5, N_("Sports")}, {6, N_("Landscape")}, {7, N_("Night Portrait")},
{8, N_("Macro")}, {9, N_("Super Macro")}, {16, N_("Auto")}, {17, N_("Night View/Portrait")}};
{0, N_("Standard")},
{1, N_("Portrait")},
{2, N_("Text")},
{3, N_("Night Scene")},
{4, N_("Sunset")},
{5, N_("Sports")},
{6, N_("Landscape")},
{7, N_("Night Portrait")},
{8, N_("Macro")},
{9, N_("Super Macro")},
{16, N_("Auto")},
{17, N_("Night View/Portrait")},
{18, N_("Sweep Panorama")},
{19, N_("Handheld Night Shot")},
{20, N_("Anti Motion Blur")},
{21, N_("Cont. Priority AE")},
{22, N_("Auto+")},
{23, N_("3D Sweep Panorama")},
{24, N_("Superior Auto")},
{25, N_("High Sensitivity")},
{26, N_("Fireworks")},
{27, N_("Food")},
{28, N_("Pet")},
{33, N_("HDR")},
{0xffff, N_("n/a")},
};

std::ostream& printMinoltaSonySceneMode(std::ostream& os, const Value& value, const ExifData* metadata) {
return EXV_PRINT_TAG(minoltaSonySceneMode)(os, value, metadata);
}

// ----------------------------------------------------------------------------------------------------

//! Lookup table to translate Sony/Minolta image quality values to readable labels
constexpr TagDetails minoltaSonyImageQuality[] = {
{0, N_("Raw")}, {1, N_("Super Fine")}, {2, N_("Fine")},
{3, N_("Standard")}, {4, N_("Economy")}, {5, N_("Extra Fine")},
{6, N_("Raw + JPEG")}, {7, N_("Compressed Raw")}, {8, N_("Compressed Raw + JPEG")}};

std::ostream& printMinoltaSonyImageQuality(std::ostream& os, const Value& value, const ExifData* metadata) {
return EXV_PRINT_TAG(minoltaSonyImageQuality)(os, value, metadata);
}

// ----------------------------------------------------------------------------------------------------

//! Lookup table to translate Sony/Minolta teleconverter model values to readable labels
constexpr TagDetails minoltaSonyTeleconverterModel[] = {{0x00, N_("None")},
{0x04, N_("Minolta/Sony AF 1.4x APO (D) (0x04)")},
Expand All @@ -1808,18 +1826,6 @@ std::ostream& printMinoltaSonyTeleconverterModel(std::ostream& os, const Value&

// ----------------------------------------------------------------------------------------------------

//! Lookup table to translate Sony/Minolta Std camera settings white balance values to readable labels
constexpr TagDetails minoltaSonyWhiteBalanceStd[] = {
{0x00, N_("Auto")}, {0x01, N_("Color Temperature/Color Filter")},
{0x10, N_("Daylight")}, {0x20, N_("Cloudy")},
{0x30, N_("Shade")}, {0x40, N_("Tungsten")},
{0x50, N_("Flash")}, {0x60, N_("Fluorescent")},
{0x70, N_("Custom")}};

std::ostream& printMinoltaSonyWhiteBalanceStd(std::ostream& os, const Value& value, const ExifData* metadata) {
return EXV_PRINT_TAG(minoltaSonyWhiteBalanceStd)(os, value, metadata);
}

//! Lookup table to translate Sony/Minolta zone matching values to readable labels
constexpr TagDetails minoltaSonyZoneMatching[] = {{0, N_("ISO Setting Used")}, {1, N_("High Key")}, {2, N_("Low Key")}};

Expand Down
Loading