| Modifier and Type | Method and Description |
|---|---|
String |
Cache.getName() |
| Constructor and Description |
|---|
Cache(IFunction<KEYTYPE,VALUETYPE> aCacheValueProvider,
int nMaxSize,
String sCacheName) |
| Modifier and Type | Method and Description |
|---|---|
protected String |
LoggingExceptionCallback.getLogMessage(Throwable t)
Get the text to be logged for a certain exception
|
| Modifier and Type | Method and Description |
|---|---|
byte[] |
EUnicodeBOM.getAllBytes() |
| Modifier and Type | Method and Description |
|---|---|
static Charset |
CharsetHelper.getCharsetFromName(String sCharsetName)
Resolve the charset by the specified name.
|
| Modifier and Type | Method and Description |
|---|---|
protected abstract String |
AbstractRFC1522Codec.getRFC1522Encoding()
Returns the codec name (referred to as encoding in the RFC 1522).
|
| Modifier and Type | Method and Description |
|---|---|
String |
CSVWriter.getLineEnd() |
| Modifier and Type | Method and Description |
|---|---|
CSVWriter |
CSVWriter.setLineEnd(String sLineEnd)
Set the line delimiting string.
|
| Modifier and Type | Method and Description |
|---|---|
String |
PDTMask.getPattern() |
String |
DateTimeFormatterPattern.getPattern() |
String |
PDTZoneID.getZoneIDString() |
| Modifier and Type | Method and Description |
|---|---|
static DateTimeFormatter |
DateTimeFormatterCache.getDateTimeFormatter(String sPattern,
ResolverStyle eResolverStyle)
Get the cached DateTimeFormatter using the provided resolver style.
|
static DateTimeFormatter |
DateTimeFormatterCache.getDateTimeFormatterLenient(String sPattern)
Get the cached DateTimeFormatter using LENIENT resolving.
|
static DateTimeFormatter |
DateTimeFormatterCache.getDateTimeFormatterSmart(String sPattern)
Get the cached DateTimeFormatter using SMART resolving.
|
static DateTimeFormatter |
DateTimeFormatterCache.getDateTimeFormatterStrict(String sPattern)
Get the cached DateTimeFormatter using STRICT resolving.
|
static PDTMask<LocalDate> |
PDTMask.localDate(String sPattern) |
static PDTMask<LocalDateTime> |
PDTMask.localDateTime(String sPattern) |
static PDTMask<OffsetDateTime> |
PDTMask.offsetDateTime(String sPattern) |
static OffsetDateTime |
PDTWebDateHelper.parseOffsetDateTimeUsingMask(PDTMask<?>[] aMasks,
String sDate)
Parses a Date out of a string using an array of masks.
|
static ZonedDateTime |
PDTWebDateHelper.parseZonedDateTimeUsingMask(PDTMask<?>[] aMasks,
String sDate,
ZoneId aDTZ)
Parses a Date out of a string using an array of masks.
|
static ESuccess |
PDTConfig.setDefaultDateTimeZoneID(String sDateTimeZoneID)
Set the default date time zone to use.
|
static PDTMask<Year> |
PDTMask.year(String sPattern) |
static PDTMask<YearMonth> |
PDTMask.yearMonth(String sPattern) |
static PDTMask<ZonedDateTime> |
PDTMask.zonedDateTime(String sPattern) |
| Constructor and Description |
|---|
DateTimeFormatterPattern(String sPattern,
ResolverStyle eResolverStyle) |
PDTMask(String sPattern,
PDTMask.ITemporalQuery<T> aQuery) |
PDTZoneID(String sZoneID,
ZoneId aZoneId) |
| Modifier and Type | Method and Description |
|---|---|
void |
IThreadDeadlockCallback.onDeadlockDetected(ThreadDeadlockInfo[] aDeadlockedThreads)
Callback to be invoked on a deadlock
|
| Modifier and Type | Method and Description |
|---|---|
default String |
IError.getAsString(Locale aContentLocale)
Get the error as a string representation, including error ID, error
location, error text and the linked exception.
|
String |
ErrorTextProvider.EField.getID() |
String |
ErrorTextProvider.FormattableItem.getUnformattedText() |
| Modifier and Type | Method and Description |
|---|---|
ErrorTextProvider |
ErrorTextProvider.addItem(ErrorTextProvider.EField eField,
String sText)
Add an error item to be disabled.
|
| Constructor and Description |
|---|
FormattableItem(ErrorTextProvider.EField eField,
String sText) |
| Modifier and Type | Method and Description |
|---|---|
String |
ErrorLevel.getID() |
String |
EErrorLevel.getID() |
| Constructor and Description |
|---|
ErrorLevel(String sID,
int nNumericLevel) |
| Modifier and Type | Method and Description |
|---|---|
default IErrorList |
IErrorList.getListOfFieldsRegExp(String sRegExp)
Get a sub-list with all entries that have field names matching the passed
regular expression.
|
| Modifier and Type | Method and Description |
|---|---|
Object[] |
DynamicHasErrorTextWithArgs.getAllArgs()
Get all arguments from the constructor.
|
| Constructor and Description |
|---|
DynamicHasErrorTextWithArgs(IHasDisplayText aParentText,
Object... aArgs) |
DynamicHasErrorTextWithArgs(IHasText aParentText,
Object... aArgs) |
| Modifier and Type | Method and Description |
|---|---|
static String |
CHttp.getHttpResponseMessage(int nResponseCode) |
String |
EHttpMethod.getName() |
| Modifier and Type | Method and Description |
|---|---|
void |
HttpHeaderMap.addDateHeader(String sName,
LocalDate aLD)
Add the passed header as a date header.
|
void |
HttpHeaderMap.addDateHeader(String sName,
LocalDateTime aLDT)
Add the passed header as a date header.
|
void |
HttpHeaderMap.addDateHeader(String sName,
long nMillis)
Add the passed header as a date header.
|
void |
HttpHeaderMap.addDateHeader(String sName,
ZonedDateTime aDT)
Add the passed header as a date header.
|
void |
HttpHeaderMap.addHeader(String sName,
String sValue)
Add the passed header as is.
|
void |
HttpHeaderMap.addIntHeader(String sName,
int nValue)
Add the passed header as a number.
|
void |
HttpHeaderMap.addLongHeader(String sName,
long nValue)
Add the passed header as a number.
|
void |
HttpHeaderMap.setDateHeader(String sName,
LocalDate aLD)
Set the passed header as a date header.
|
void |
HttpHeaderMap.setDateHeader(String sName,
LocalDateTime aLDT)
Set the passed header as a date header.
|
void |
HttpHeaderMap.setDateHeader(String sName,
long nMillis)
Set the passed header as a date header.
|
void |
HttpHeaderMap.setDateHeader(String sName,
ZonedDateTime aDT)
Set the passed header as a date header.
|
void |
HttpHeaderMap.setHeader(String sName,
String sValue)
Set the passed header as is.
|
void |
HttpHeaderMap.setIntHeader(String sName,
int nValue)
Set the passed header as a number.
|
void |
HttpHeaderMap.setLongHeader(String sName,
long nValue)
Set the passed header as a number.
|
| Modifier and Type | Method and Description |
|---|---|
static String |
FilenameHelper.getAsSecureValidASCIIFilename(String sFilename)
Replace all non-ASCII characters from the filename (e.g.
|
static String |
FilenameHelper.getAsSecureValidASCIIFilename(String sFilename,
char cReplacementChar)
Replace all non-ASCII characters from the filename (e.g.
|
static String |
FilenameHelper.getAsSecureValidFilename(String sFilename)
Convert the passed filename into a valid filename by performing the
following actions:
Remove everything after a potential \0 character
Remove all characters that are invalid at the end of a file name
Replace all characters that are invalid inside a filename with a
underscore
If the filename is invalid on Windows platforms it is prefixed with an
underscore.
|
String |
ERandomAccessFileMode.getMode() |
| Modifier and Type | Method and Description |
|---|---|
static IFileFilter |
IFileFilter.filenameEndsWith(String sSuffix) |
static IFileFilter |
IFileFilter.filenameEquals(String sFilename) |
static IFileFilter |
IFileFilter.filenameEqualsIgnoreCase(String sFilename) |
static IFileFilter |
IFileFilter.filenameMatchAny(String... aFilenames)
Create a file filter that matches, if it matches one of the provided
filenames.
|
static IFileFilter |
IFileFilter.filenameMatchAnyRegEx(String... aRegExs)
Create a file filter that matches, if it matches one of the provided
regular expressions
|
static IFileFilter |
IFileFilter.filenameMatchNone(String... aFilenames)
Create a file filter that matches, if it matches none of the provided
filenames.
|
static IFileFilter |
IFileFilter.filenameMatchNoRegEx(String... aRegExs)
Create a file filter that matches, if it matches none of the provided
regular expressions
|
static IFileFilter |
IFileFilter.filenameNotEquals(String sFilename) |
static IFileFilter |
IFileFilter.filenameNotEqualsIgnoreCase(String sFilename) |
static IFileFilter |
IFileFilter.filenameStartsWith(String sPrefix) |
| Modifier and Type | Method and Description |
|---|---|
String |
PathRelativeIO.getBasePath() |
String |
IPathRelativeIO.getBasePath() |
default String |
IFileRelativeIO.getBasePath() |
String |
PathRelativeIO.getBaseURL() |
| Modifier and Type | Method and Description |
|---|---|
IReadableResource |
PathRelativeIO.getResource(String sRelativePath) |
| Constructor and Description |
|---|
PathRelativeIO(String sBasePath) |
| Modifier and Type | Method and Description |
|---|---|
String |
ClassPathResource.getPath() |
| Modifier and Type | Method and Description |
|---|---|
static File |
ClassPathResource.getAsFile(String sPath)
Get the file for the specified path using automatic class loader handling.
|
static File |
ClassPathResource.getAsFile(String sPath,
ClassLoader aClassLoader) |
static InputStream |
ClassPathResource.getInputStream(String sPath)
Get the input stream for the specified path using automatic class loader
handling.
|
static InputStream |
ClassPathResource.getInputStream(String sPath,
ClassLoader aClassLoader)
Get the input stream of the passed resource using the specified class
loader only.
|
| Constructor and Description |
|---|
ClassPathResource(String sPath)
Create a new class path resource, using the specified path.
|
ClassPathResource(String sPath,
ClassLoader aClassLoader)
Create a new class path resource using the specified path and class loader
(optional).
|
| Modifier and Type | Method and Description |
|---|---|
String |
AbstractMemoryReadableResource.getResourceID() |
| Constructor and Description |
|---|
AbstractMemoryReadableResource(String sResourceID) |
| Modifier and Type | Method and Description |
|---|---|
ICommonsList<IReadableResourceProvider> |
ReadableResourceProviderChain.getAllContainedReadingResourceProviders() |
ICommonsList<IWritableResourceProvider> |
WritableResourceProviderChain.getAllContainedWritingResourceProviders() |
| Modifier and Type | Method and Description |
|---|---|
static ESuccess |
StreamHelper.copyInputStreamToOutputStream(InputStream aIS,
OutputStream aOS,
byte[] aBuffer,
MutableLong aCopyByteCount)
Pass the content of the given input stream to the given output stream.
|
static ESuccess |
StreamHelper.copyInputStreamToOutputStream(InputStream aIS,
OutputStream aOS,
byte[] aBuffer,
MutableLong aCopyByteCount,
Long aLimit)
Pass the content of the given input stream to the given output stream.
|
static ESuccess |
StreamHelper.copyReaderToWriter(Reader aReader,
Writer aWriter,
char[] aBuffer,
MutableLong aCopyCharCount)
Pass the content of the given reader to the given writer.
|
static ESuccess |
StreamHelper.copyReaderToWriter(Reader aReader,
Writer aWriter,
char[] aBuffer,
MutableLong aCopyCharCount,
Long aLimit)
Pass the content of the given reader to the given writer.
|
static String |
StreamHelper.getAllBytesAsString(IHasInputStream aISP,
Charset aCharset)
Read all bytes from the passed input stream into a string.
|
static String |
StreamHelper.getAllBytesAsString(InputStream aIS,
Charset aCharset)
Read all bytes from the passed input stream into a string.
|
static ICommonsList<String> |
StreamHelper.readStreamLines(InputStream aIS,
Charset aCharset)
Get the content of the passed stream as a list of lines in the passed
character set.
|
static void |
StreamHelper.readStreamLines(InputStream aIS,
Charset aCharset,
Consumer<? super String> aLineCallback)
Read the complete content of the passed stream and pass each line separately
to the passed callback.
|
static void |
StreamHelper.readStreamLines(InputStream aIS,
Charset aCharset,
int nLinesToSkip,
int nLinesToRead,
Consumer<? super String> aLineCallback)
Read the content of the passed stream line by line and invoking a callback on
all matching lines.
|
| Constructor and Description |
|---|
ByteBuffersInputStream(ByteBuffer... aBuffers)
Constructor
|
| Modifier and Type | Method and Description |
|---|---|
String |
EWatchDirAction.getID() |
| Modifier and Type | Method and Description |
|---|---|
static String |
ClassHelper.getObjectAddress(Object aObject)
Get the hex representation of the passed object's address.
|
static String |
ClassHelper.getSafeClassName(Object aObject)
Get the class name of the passed object.
|
| Modifier and Type | Method and Description |
|---|---|
static URL |
ClassHelper.getResource(Class<?> aClass,
String sPath)
Get the URL of the passed resource using the class loader of the specified
class only.
|
static URL |
ClassLoaderHelper.getResource(ClassLoader aClassLoader,
String sPath)
Get the URL of the passed resource using the specified class loader only.
|
static InputStream |
ClassHelper.getResourceAsStream(Class<?> aClass,
String sPath)
Get the input stream of the passed resource using the class loader of the
specified class only.
|
static InputStream |
ClassLoaderHelper.getResourceAsStream(ClassLoader aClassLoader,
String sPath)
Get the input stream of the passed resource using the specified class
loader only.
|
static Enumeration<URL> |
ClassLoaderHelper.getResources(ClassLoader aClassLoader,
String sPath)
Get all URLs of the passed resource using the specified class loader only.
|
| Modifier and Type | Method and Description |
|---|---|
static <DATATYPE> void |
CombinationGenerator.addAllPermutations(ICommonsList<DATATYPE> aInput,
int nSlotCount,
Collection<ICommonsList<DATATYPE>> aResultList)
Fill a list with all permutations of the input elements.
|
static <DATATYPE> ICommonsList<ICommonsList<DATATYPE>> |
CombinationGenerator.getAllPermutations(ICommonsList<DATATYPE> aInput,
int nSlotCount)
Get a list of all permutations of the input elements.
|
| Constructor and Description |
|---|
CombinationGenerator(ICommonsList<DATATYPE> aElements,
int nSlotCount)
Ctor
|
| Modifier and Type | Method and Description |
|---|---|
byte[] |
MimeTypeContent.getAllContentBytes() |
String |
MimeType.getAsString(EMimeQuoting eQuotingAlgorithm) |
String |
IMimeType.getAsString(EMimeQuoting eQuotingAlgorithm)
Get the MIME type including all parameters as a single string.
|
String |
IMimeType.getAsStringWithoutParameters() |
String |
MimeTypeParameter.getAttribute() |
String |
MimeType.getContentSubType() |
String |
EMimeContentType.getID() |
abstract String |
EMimeQuoting.getQuotedString(String sUnquotedString) |
String |
EMimeContentType.getText() |
abstract String |
EMimeQuoting.getUnquotedString(String sQuotedString) |
String |
MimeTypeParameter.getValue() |
String |
MimeTypeParameter.getValueQuotedIfNecessary(EMimeQuoting eQuotingAlgorithm) |
| Modifier and Type | Method and Description |
|---|---|
MimeType |
MimeType.addParameter(String sAttribute,
String sValue)
Add a parameter.
|
MimeType |
MimeType.addParameter(String sAttribute,
String sValue)
Add a parameter.
|
MimeType |
EMimeContentType.buildMimeType(String sContentSubType)
Build a new
MimeType based on this MIME content type and the
provided sub type. |
abstract String |
EMimeQuoting.getQuotedString(String sUnquotedString) |
abstract String |
EMimeQuoting.getUnquotedString(String sQuotedString) |
| Constructor and Description |
|---|
MimeType(EMimeContentType eContentType,
String sContentSubType)
Constructor without parameters.
|
MimeType(EMimeContentType eContentType,
String sContentSubType,
Collection<? extends MimeTypeParameter> aParameters)
Constructor without parameters.
|
MimeTypeContent(byte[] aContentBytes,
boolean bCopyBytes,
IMimeType aMimeType)
Constructor
|
MimeTypeContent(byte[] aContentBytes,
IMimeType aMimeType)
Constructor
|
MimeTypeParameter(String sAttribute,
String sValue)
Constructor.
|
MimeTypeParameter(String sAttribute,
String sValue)
Constructor.
|
| Modifier and Type | Method and Description |
|---|---|
String |
CommonsMock.Param.getParamName() |
| Modifier and Type | Method and Description |
|---|---|
static CommonsMock.Param |
CommonsMock.Param.createConstant(String sParamName,
boolean bDefault) |
static <T> CommonsMock.Param |
CommonsMock.Param.createConstant(String sParamName,
Class<T> aParamClass,
T aDefault)
Create a
CommonsMock.Param with a constant default value. |
| Constructor and Description |
|---|
Param(String sParamName,
Class<T> aParamClass,
Supplier<T> aDefaultValueSupplier)
Constructor for a mock parameter
|
| Modifier and Type | Method and Description |
|---|---|
String |
RegExPattern.getRegEx() |
| Modifier and Type | Method and Description |
|---|---|
static Pattern |
RegExCache.getPattern(String sRegEx)
Get the cached regular expression pattern.
|
static Pattern |
RegExCache.getPattern(String sRegEx,
int nOptions)
Get the cached regular expression pattern.
|
| Constructor and Description |
|---|
RegExPattern(String sRegEx) |
RegExPattern(String sRegEx,
int nOptions) |
| Modifier and Type | Method and Description |
|---|---|
String |
ETriState.getID() |
| Modifier and Type | Method and Description |
|---|---|
static IMutableStatisticsHandlerCache |
StatisticsManager.getCacheHandler(String sName) |
static IMutableStatisticsHandlerCounter |
StatisticsManager.getCounterHandler(String sName) |
static IMutableStatisticsHandlerKeyedCounter |
StatisticsManager.getKeyedCounterHandler(String sName) |
static IMutableStatisticsHandlerKeyedSize |
StatisticsManager.getKeyedSizeHandler(String sName) |
static IMutableStatisticsHandlerKeyedTimer |
StatisticsManager.getKeyedTimerHandler(String sName) |
static IMutableStatisticsHandlerSize |
StatisticsManager.getSizeHandler(String sName) |
static IMutableStatisticsHandlerTimer |
StatisticsManager.getTimerHandler(String sName) |
| Modifier and Type | Method and Description |
|---|---|
static int |
StringHelper.getReplaceMultipleResultLength(char[] aInputString,
char[] aSearchChars,
char[][] aReplacementStrings)
Get the result length (in characters) when replacing all patterns with the
replacements on the passed input array.
|
static int |
StringHelper.getReplaceMultipleResultLength(char[] aInputString,
char[] aSearchChars,
char[][] aReplacementStrings)
Get the result length (in characters) when replacing all patterns with the
replacements on the passed input array.
|
| Modifier and Type | Method and Description |
|---|---|
String |
EOperatingSystem.getDisplayName() |
String |
ENewLineMode.getText() |
| Modifier and Type | Method and Description |
|---|---|
Object[] |
HasTextWithArgs.getAllArgs()
Get all arguments from the constructor.
|
| Constructor and Description |
|---|
HasTextWithArgs(IHasText aParentText,
Object... aArgs) |
| Modifier and Type | Method and Description |
|---|---|
String |
Codepoint.getAsString() |
static String |
CodepointHelper.getAsString(int nCodepoint) |
| Modifier and Type | Method and Description |
|---|---|
Object[] |
HasDisplayTextWithArgs.getAllArgs()
Get all arguments from the constructor.
|
| Constructor and Description |
|---|
HasDisplayTextWithArgs(IHasDisplayText aParentText,
Object... aArgs) |
| Modifier and Type | Method and Description |
|---|---|
String |
ResourceBundleKey.getBundleName() |
String |
ResourceBundleKey.getKey() |
| Constructor and Description |
|---|
ResourceBundleKey(String sBundleName,
String sKey) |
ResourceBundleKey(String sBundleName,
String sKey) |
| Modifier and Type | Method and Description |
|---|---|
String |
ThirdPartyModule.getCopyrightOwner() |
String |
ThirdPartyModule.getDisplayName() |
String |
ELicense.getDisplayName() |
String |
CustomLicense.getDisplayName() |
String |
ELicense.getID() |
String |
CustomLicense.getID() |
| Constructor and Description |
|---|
CustomLicense(String sID,
String sName,
Version aVersion,
String sURL)
Create a custom license.
|
CustomLicense(String sID,
String sName,
Version aVersion,
String sURL)
Create a custom license.
|
ThirdPartyModule(String sDisplayName,
String sCopyrightOwner,
ILicense aLicense) |
ThirdPartyModule(String sDisplayName,
String sCopyrightOwner,
ILicense aLicense) |
ThirdPartyModule(String sDisplayName,
String sCopyrightOwner,
ILicense aLicense,
boolean bOptional) |
ThirdPartyModule(String sDisplayName,
String sCopyrightOwner,
ILicense aLicense,
boolean bOptional) |
ThirdPartyModule(String sDisplayName,
String sCopyrightOwner,
ILicense aLicense,
Version aVersion,
String sWebsiteURL) |
ThirdPartyModule(String sDisplayName,
String sCopyrightOwner,
ILicense aLicense,
Version aVersion,
String sWebsiteURL) |
ThirdPartyModule(String sDisplayName,
String sCopyrightOwner,
ILicense aLicense,
Version aVersion,
String sWebsiteURL,
boolean bOptional) |
ThirdPartyModule(String sDisplayName,
String sCopyrightOwner,
ILicense aLicense,
Version aVersion,
String sWebsiteURL,
boolean bOptional) |
| Modifier and Type | Method and Description |
|---|---|
String |
ObjectType.getName() |
default String |
IHasObjectType.getObjectTypeName() |
| Constructor and Description |
|---|
ObjectType(String sName) |
| Modifier and Type | Method and Description |
|---|---|
String |
TypeConverterException.EReason.getMessage(Class<?> aDstClass) |
String |
TypeConverterException.EReason.getMessage(Class<?> aSrcClass,
Class<?> aDstClass) |
| Modifier and Type | Method and Description |
|---|---|
String |
URLParameter.getName() |
String |
URLProtocol.getProtocol() |
String |
IURLProtocol.getProtocol() |
String |
EURLProtocol.getProtocol() |
| Modifier and Type | Method and Description |
|---|---|
default IMPLTYPE |
IURLParameterList.add(String sName)
Add a parameter without a value
|
default IMPLTYPE |
IURLParameterList.add(String sName,
BigInteger aValue) |
default IMPLTYPE |
IURLParameterList.add(String sName,
boolean bValue) |
default IMPLTYPE |
IURLParameterList.add(String sName,
int nValue) |
default IMPLTYPE |
IURLParameterList.add(String sName,
long nValue) |
default IMPLTYPE |
IURLParameterList.add(String sName,
String sValue) |
default IMPLTYPE |
IURLParameterList.addAll(String sName,
String... aValues) |
default IMPLTYPE |
IURLParameterList.addIf(String sName,
String sValue,
Predicate<? super String> aFilter)
Add the parameter of the passed value predicate evaluates to true.
|
default IMPLTYPE |
IURLParameterList.addIfNotNull(String sName,
String sValue)
Add the parameter of the passed value if it is not null.
|
default IMPLTYPE |
IURLParameterList.addRandom(String sName)
Add a parameter with a random long value
|
static URL |
URLHelper.getClassPathURL(String sPath)
Get the URL for the specified path using automatic class loader handling.
|
static boolean |
URLHelper.isClassPathURLExisting(String sPath) |
static boolean |
URLHelper.isClassPathURLExisting(String sPath,
ClassLoader aClassLoader) |
| Constructor and Description |
|---|
URLParameter(String sName) |
URLParameter(String sName,
String sValue) |
URLProtocol(String sProtocol,
boolean bAllowsForQueryParameters) |
| Modifier and Type | Method and Description |
|---|---|
static void |
VendorInfo.setVendorEmail(String sVendorEmail) |
static void |
VendorInfo.setVendorLocation(String sVendorLocation) |
static void |
VendorInfo.setVendorName(String sVendorName) |
static void |
VendorInfo.setVendorURL(String sVendorURL) |
| Modifier and Type | Method and Description |
|---|---|
String |
Version.getAsStringMajorMinor()
Get the string representation of the version number but only major and
minor version number.
|
String |
Version.getAsStringMajorMinorMicro()
Get the string representation of the version number but only major and
minor and micro version number.
|
Copyright © 2014–2019 Philip Helger. All rights reserved.