re-adding a "unix-dev.mk". Debugging libtool output
is just too much of a pain for me, I prefer a good old static lib without optimizations :-) "make devel" is back on Unix then..
This commit is contained in:
parent
c703b1bf6d
commit
c5cdf8bcf1
15
CHANGES
15
CHANGES
|
@ -1,5 +1,20 @@
|
||||||
LATEST CHANGES
|
LATEST CHANGES
|
||||||
|
|
||||||
|
- fixed two memory leaks:
|
||||||
|
- the memory manager (16 bytes) isn't released in FT_Done_FreeType !!
|
||||||
|
|
||||||
|
- using custom input streams, the copy of the original stream
|
||||||
|
was never released
|
||||||
|
|
||||||
|
- fixed the auto-hinter by performing automatic computation of the
|
||||||
|
"filling direction" of each glyph. This is done through a simple and
|
||||||
|
fast approximation, and seems to work (problems spotted by Werner
|
||||||
|
though). The Arphic fonts are a lot nicer though there are still a
|
||||||
|
lot of things to do to handle Asian fonts correctly..
|
||||||
|
|
||||||
|
===========================================================================
|
||||||
|
BETA-8 (RELEASE CANDIDATE) CHANGES
|
||||||
|
|
||||||
- deactivated the trueType bytecode interpreter by default
|
- deactivated the trueType bytecode interpreter by default
|
||||||
|
|
||||||
- deactivated the "src/type1" font driver. Now "src/type1z" is
|
- deactivated the "src/type1" font driver. Now "src/type1z" is
|
||||||
|
|
|
@ -22,30 +22,29 @@ ifeq ($(PLATFORM),ansi)
|
||||||
COPY := cp
|
COPY := cp
|
||||||
DELETE := rm -f
|
DELETE := rm -f
|
||||||
|
|
||||||
# If a Unix platform is detected, the configure script is called and
|
|
||||||
# `unix.mk' is created.
|
|
||||||
#
|
|
||||||
# Arguments to `configure' should be in the CFG variable. Example:
|
|
||||||
#
|
|
||||||
# make CFG="--prefix=/usr --disable-static"
|
|
||||||
#
|
|
||||||
# If you need to set CFLAGS or LDFLAGS, do it here also.
|
|
||||||
#
|
|
||||||
# Feel free to add support for other platform specific compilers in this
|
|
||||||
# directory (e.g. solaris.mk + changes here to detect the platform).
|
|
||||||
#
|
|
||||||
CONFIG_FILE := unix.mk
|
|
||||||
setup: unix.mk
|
|
||||||
unix: setup
|
|
||||||
|
|
||||||
# If `devel' is the requested target, use `-g -O0' as the default value
|
# If `devel' is the requested target, we use a special configuration
|
||||||
# for CFLAGS if CFLAGS isn't set.
|
# file named "unix-dev.mk". It disables optimization and libtool..
|
||||||
#
|
#
|
||||||
ifneq ($(findstring devel,$(MAKECMDGOALS)),)
|
ifneq ($(findstring devel,$(MAKECMDGOALS)),)
|
||||||
ifndef CFLAGS
|
CONFIG_FILE := unix-dev.mk
|
||||||
USE_CFLAGS := CFLAGS="-g -O0"
|
|
||||||
endif
|
|
||||||
devel: setup
|
devel: setup
|
||||||
|
else
|
||||||
|
# If a Unix platform is detected, the configure script is called and
|
||||||
|
# `unix.mk' is created.
|
||||||
|
#
|
||||||
|
# Arguments to `configure' should be in the CFG variable. Example:
|
||||||
|
#
|
||||||
|
# make CFG="--prefix=/usr --disable-static"
|
||||||
|
#
|
||||||
|
# If you need to set CFLAGS or LDFLAGS, do it here also.
|
||||||
|
#
|
||||||
|
# Feel free to add support for other platform specific compilers in this
|
||||||
|
# directory (e.g. solaris.mk + changes here to detect the platform).
|
||||||
|
#
|
||||||
|
CONFIG_FILE := unix.mk
|
||||||
|
setup: unix.mk
|
||||||
|
unix: setup
|
||||||
endif
|
endif
|
||||||
|
|
||||||
setup: std_setup
|
setup: std_setup
|
||||||
|
|
|
@ -302,5 +302,21 @@
|
||||||
return memory;
|
return memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* <Function> */
|
||||||
|
/* FT_Done_Memory */
|
||||||
|
/* */
|
||||||
|
/* <Description> */
|
||||||
|
/* Discards memory manager. */
|
||||||
|
/* */
|
||||||
|
/* <Input> */
|
||||||
|
/* memory :: handle to memory manager */
|
||||||
|
/* */
|
||||||
|
FT_EXPORT_FUNC( void ) FT_Done_Memory( FT_Memory memory )
|
||||||
|
{
|
||||||
|
free( memory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
#
|
||||||
|
# FreeType 2 Configuration rules for Unix + GCC
|
||||||
|
#
|
||||||
|
# Development version without optimizations & libtool
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
# Copyright 1996-2000 by
|
||||||
|
# David Turner, Robert Wilhelm, and Werner Lemberg.
|
||||||
|
#
|
||||||
|
# This file is part of the FreeType project, and may only be used, modified,
|
||||||
|
# and distributed under the terms of the FreeType project license,
|
||||||
|
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
|
||||||
|
# indicate that you have read the license and understand and accept it
|
||||||
|
# fully.
|
||||||
|
#
|
||||||
|
# NOTE: This version requires that GNU Make is invoked from the Windows
|
||||||
|
# Shell (_not_ Cygwin BASH)!
|
||||||
|
#
|
||||||
|
|
||||||
|
ifndef TOP
|
||||||
|
TOP := .
|
||||||
|
endif
|
||||||
|
|
||||||
|
DELETE := rm -f
|
||||||
|
SEP := /
|
||||||
|
HOSTSEP := $(SEP)
|
||||||
|
BUILD := $(TOP)/builds/unix
|
||||||
|
PLATFORM := unixdev # do not set it to "unix", or libtool will trick you..
|
||||||
|
CC := gcc
|
||||||
|
|
||||||
|
# The directory where all object files are placed.
|
||||||
|
#
|
||||||
|
# Note that this is not $(TOP)/obj!
|
||||||
|
# This lets you build the library in your own directory with something like
|
||||||
|
#
|
||||||
|
# set TOP=.../path/to/freetype2/top/dir...
|
||||||
|
# mkdir obj
|
||||||
|
# make -f %TOP%/Makefile setup [options]
|
||||||
|
# make -f %TOP%/Makefile
|
||||||
|
#
|
||||||
|
OBJ_DIR := obj
|
||||||
|
|
||||||
|
|
||||||
|
# The directory where all library files are placed.
|
||||||
|
#
|
||||||
|
# By default, this is the same as $(OBJ_DIR), however, this can be changed
|
||||||
|
# to suit particular needs.
|
||||||
|
#
|
||||||
|
LIB_DIR := $(OBJ_DIR)
|
||||||
|
|
||||||
|
|
||||||
|
# The object file extension (for standard and static libraries). This can be
|
||||||
|
# .o, .tco, .obj, etc., depending on the platform.
|
||||||
|
#
|
||||||
|
O := o
|
||||||
|
SO := o
|
||||||
|
|
||||||
|
# The library file extension (for standard and static libraries). This can
|
||||||
|
# be .a, .lib, etc., depending on the platform.
|
||||||
|
#
|
||||||
|
A := a
|
||||||
|
SA := a
|
||||||
|
|
||||||
|
|
||||||
|
# The name of the final library file. Note that the DOS-specific Makefile
|
||||||
|
# uses a shorter (8.3) name.
|
||||||
|
#
|
||||||
|
LIBRARY := libfreetype
|
||||||
|
|
||||||
|
|
||||||
|
# Path inclusion flag. Some compilers use a different flag than `-I' to
|
||||||
|
# specify an additional include path. Examples are `/i=' or `-J'.
|
||||||
|
#
|
||||||
|
I := -I
|
||||||
|
|
||||||
|
|
||||||
|
# C flag used to define a macro before the compilation of a given source
|
||||||
|
# object. Usually is `-D' like in `-DDEBUG'.
|
||||||
|
#
|
||||||
|
D := -D
|
||||||
|
|
||||||
|
|
||||||
|
# The link flag used to specify a given library file on link. Note that
|
||||||
|
# this is only used to compile the demo programs, not the library itself.
|
||||||
|
#
|
||||||
|
L := -l
|
||||||
|
|
||||||
|
|
||||||
|
# Target flag.
|
||||||
|
#
|
||||||
|
T := -o # Don't remove this comment line! We need the space after `-o'.
|
||||||
|
|
||||||
|
|
||||||
|
# C flags
|
||||||
|
#
|
||||||
|
# These should concern: debug output, optimization & warnings.
|
||||||
|
#
|
||||||
|
# Use the ANSIFLAGS variable to define the compiler flags used to enfore
|
||||||
|
# ANSI compliance.
|
||||||
|
#
|
||||||
|
ifndef CFLAGS
|
||||||
|
CFLAGS := -c -g -O0 -Wall -W
|
||||||
|
endif
|
||||||
|
|
||||||
|
# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
|
||||||
|
#
|
||||||
|
ANSIFLAGS := -ansi -pedantic
|
||||||
|
|
||||||
|
|
||||||
|
ifdef BUILD_FREETYPE
|
||||||
|
|
||||||
|
# Now include the main sub-makefile. It contains all the rules used to
|
||||||
|
# build the library with the previous variables defined.
|
||||||
|
#
|
||||||
|
include $(TOP)/builds/freetype.mk
|
||||||
|
|
||||||
|
# The cleanup targets.
|
||||||
|
#
|
||||||
|
clean_freetype: clean_freetype_std
|
||||||
|
distclean_freetype: distclean_freetype_std
|
||||||
|
|
||||||
|
# Librarian to use to build the static library
|
||||||
|
#
|
||||||
|
FT_LIBRARIAN := $(AR) -r
|
||||||
|
|
||||||
|
|
||||||
|
# This final rule is used to link all object files into a single library.
|
||||||
|
# It is part of the system-specific sub-Makefile because not all
|
||||||
|
# librarians accept a simple syntax like
|
||||||
|
#
|
||||||
|
# librarian library_file {list of object files}
|
||||||
|
#
|
||||||
|
$(FT_LIBRARY): $(OBJECTS_LIST)
|
||||||
|
-$(DELETE) $(subst $(SEP),$(HOSTSEP),$(FT_LIBRARY)) 2> nul
|
||||||
|
$(FT_LIBRARIAN) $@ $(OBJECTS_LIST)
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
# EOF
|
|
@ -506,6 +506,7 @@
|
||||||
|
|
||||||
FT_EXPORT_DEF( FT_Memory ) FT_New_Memory( void );
|
FT_EXPORT_DEF( FT_Memory ) FT_New_Memory( void );
|
||||||
|
|
||||||
|
FT_EXPORT_DEF( void ) FT_Done_Memory( FT_Memory memory );
|
||||||
|
|
||||||
#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
|
#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
|
||||||
|
|
||||||
|
|
|
@ -322,10 +322,13 @@
|
||||||
outline->max_contours = new_contours;
|
outline->max_contours = new_contours;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* then, realloc the points, segments & edges arrays if needed */
|
/* then, realloc the points, segments & edges arrays if needed */
|
||||||
if ( num_points > outline->max_points )
|
/* note that we reserved two additional point positions, used to */
|
||||||
|
/* hint metrics appropriately.. */
|
||||||
|
/* */
|
||||||
|
if ( num_points+2 > outline->max_points )
|
||||||
{
|
{
|
||||||
FT_Int news = ( num_points + 7 ) & -8;
|
FT_Int news = ( num_points+2 + 7 ) & -8;
|
||||||
FT_Int max = outline->max_points;
|
FT_Int max = outline->max_points;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -152,4 +152,38 @@ const FT_Module_Class* ft_default_modules[] =
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* <Function> */
|
||||||
|
/* FT_Done_FreeType */
|
||||||
|
/* */
|
||||||
|
/* <Description> */
|
||||||
|
/* Destroys a given FreeType library object and all of its childs, */
|
||||||
|
/* including resources, drivers, faces, sizes, etc. */
|
||||||
|
/* */
|
||||||
|
/* <Input> */
|
||||||
|
/* library :: A handle to the target library object. */
|
||||||
|
/* */
|
||||||
|
/* <Return> */
|
||||||
|
/* FreeType error code. 0 means success. */
|
||||||
|
/* */
|
||||||
|
FT_EXPORT_FUNC( FT_Error ) FT_Done_FreeType( FT_Library library )
|
||||||
|
{
|
||||||
|
if (library)
|
||||||
|
{
|
||||||
|
FT_Memory memory = library->memory;
|
||||||
|
|
||||||
|
|
||||||
|
/* Discard the library object */
|
||||||
|
FT_Done_Library( library );
|
||||||
|
|
||||||
|
/* discard memory manager */
|
||||||
|
FT_Done_Memory( memory );
|
||||||
|
}
|
||||||
|
|
||||||
|
return FT_Err_Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|
|
@ -265,8 +265,10 @@
|
||||||
}
|
}
|
||||||
else if ( args->flags & ft_open_stream && args->stream )
|
else if ( args->flags & ft_open_stream && args->stream )
|
||||||
{
|
{
|
||||||
*stream = *(args->stream);
|
/* in this case, we do not need to allocate a new stream */
|
||||||
stream->memory = memory;
|
/* object. The caller is responsible for closing it himself!! */
|
||||||
|
FREE(stream);
|
||||||
|
stream = args->stream;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
error = FT_Err_Invalid_Argument;
|
error = FT_Err_Invalid_Argument;
|
||||||
|
@ -300,16 +302,19 @@
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
void ft_done_stream( FT_Stream* astream )
|
void ft_done_stream( FT_Stream* astream, FT_Int external )
|
||||||
{
|
{
|
||||||
FT_Stream stream = *astream;
|
FT_Stream stream = *astream;
|
||||||
FT_Memory memory = stream->memory;
|
|
||||||
|
|
||||||
|
|
||||||
if ( stream->close )
|
if ( stream->close )
|
||||||
stream->close( stream );
|
stream->close( stream );
|
||||||
|
|
||||||
FREE( stream );
|
if (!external)
|
||||||
|
{
|
||||||
|
FT_Memory memory = stream->memory;
|
||||||
|
FREE( stream );
|
||||||
|
}
|
||||||
*astream = 0;
|
*astream = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1146,8 +1151,8 @@
|
||||||
clazz->done_face( face );
|
clazz->done_face( face );
|
||||||
|
|
||||||
/* close the stream for this face if needed */
|
/* close the stream for this face if needed */
|
||||||
if ( ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) == 0 )
|
ft_done_stream( &face->stream,
|
||||||
ft_done_stream( &face->stream );
|
(face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM) != 0 );
|
||||||
|
|
||||||
/* get rid of it */
|
/* get rid of it */
|
||||||
FREE( face );
|
FREE( face );
|
||||||
|
@ -1392,7 +1397,7 @@
|
||||||
FT_Stream stream;
|
FT_Stream stream;
|
||||||
FT_Face face = 0;
|
FT_Face face = 0;
|
||||||
FT_ListNode node = 0;
|
FT_ListNode node = 0;
|
||||||
|
FT_Bool external_stream;
|
||||||
|
|
||||||
/* test for valid `library' and `args' delayed to */
|
/* test for valid `library' and `args' delayed to */
|
||||||
/* ft_new_input_stream() */
|
/* ft_new_input_stream() */
|
||||||
|
@ -1402,6 +1407,8 @@
|
||||||
|
|
||||||
*aface = 0;
|
*aface = 0;
|
||||||
|
|
||||||
|
external_stream = ( args->flags & ft_open_stream && args->stream );
|
||||||
|
|
||||||
/* create input stream */
|
/* create input stream */
|
||||||
error = ft_new_input_stream( library, args, &stream );
|
error = ft_new_input_stream( library, args, &stream );
|
||||||
if ( error )
|
if ( error )
|
||||||
|
@ -1436,7 +1443,7 @@
|
||||||
else
|
else
|
||||||
error = FT_Err_Invalid_Handle;
|
error = FT_Err_Invalid_Handle;
|
||||||
|
|
||||||
ft_done_stream( &stream );
|
ft_done_stream( &stream, external_stream );
|
||||||
goto Fail;
|
goto Fail;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1473,7 +1480,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ft_done_stream( &stream );
|
ft_done_stream( &stream, external_stream );
|
||||||
|
|
||||||
/* no driver is able to handle this format */
|
/* no driver is able to handle this format */
|
||||||
error = FT_Err_Unknown_File_Format;
|
error = FT_Err_Unknown_File_Format;
|
||||||
|
@ -1484,7 +1491,7 @@
|
||||||
FT_TRACE4(( "FT_New_Face: New face object, adding to list\n" ));
|
FT_TRACE4(( "FT_New_Face: New face object, adding to list\n" ));
|
||||||
|
|
||||||
/* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */
|
/* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */
|
||||||
if ( args->flags & ft_open_stream && args->stream )
|
if ( external_stream )
|
||||||
face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;
|
face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;
|
||||||
|
|
||||||
/* add the face object to its driver's list */
|
/* add the face object to its driver's list */
|
||||||
|
@ -1654,8 +1661,9 @@
|
||||||
error = clazz->attach_file( face, stream );
|
error = clazz->attach_file( face, stream );
|
||||||
|
|
||||||
/* close the attached stream */
|
/* close the attached stream */
|
||||||
if ( !parameters->stream || ( parameters->flags & ft_open_stream ) )
|
ft_done_stream( &stream,
|
||||||
ft_done_stream( &stream );
|
(FT_Bool)(parameters->stream &&
|
||||||
|
(parameters->flags & ft_open_stream)) );
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
return error;
|
||||||
|
@ -3217,30 +3225,4 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
|
||||||
/* */
|
|
||||||
/* <Function> */
|
|
||||||
/* FT_Done_FreeType */
|
|
||||||
/* */
|
|
||||||
/* <Description> */
|
|
||||||
/* Destroys a given FreeType library object and all of its childs, */
|
|
||||||
/* including resources, drivers, faces, sizes, etc. */
|
|
||||||
/* */
|
|
||||||
/* <Input> */
|
|
||||||
/* library :: A handle to the target library object. */
|
|
||||||
/* */
|
|
||||||
/* <Return> */
|
|
||||||
/* FreeType error code. 0 means success. */
|
|
||||||
/* */
|
|
||||||
FT_EXPORT_FUNC( FT_Error ) FT_Done_FreeType( FT_Library library )
|
|
||||||
{
|
|
||||||
/* test for valid `library' delayed to FT_Done_Library() */
|
|
||||||
|
|
||||||
/* Discard the library object */
|
|
||||||
FT_Done_Library( library );
|
|
||||||
|
|
||||||
return FT_Err_Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|
|
@ -296,4 +296,20 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* <Function> */
|
||||||
|
/* FT_Done_Memory */
|
||||||
|
/* */
|
||||||
|
/* <Description> */
|
||||||
|
/* Discards memory manager. */
|
||||||
|
/* */
|
||||||
|
/* <Input> */
|
||||||
|
/* memory :: handle to memory manager */
|
||||||
|
/* */
|
||||||
|
FT_EXPORT_FUNC( void ) FT_Done_Memory( FT_Memory memory )
|
||||||
|
{
|
||||||
|
free( memory );
|
||||||
|
}
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
#define FT_MAKE_OPTION_SINGLE_OBJECT
|
#define FT_MAKE_OPTION_SINGLE_OBJECT
|
||||||
|
|
||||||
#include <psmodule.c>
|
#include <psnames/psmodule.c>
|
||||||
|
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|
|
@ -539,6 +539,8 @@
|
||||||
FT_Error error = FT_Err_Ok;
|
FT_Error error = FT_Err_Ok;
|
||||||
|
|
||||||
|
|
||||||
|
FT_UNUSED(debug); /* used by truetype interpreter only */
|
||||||
|
|
||||||
n_ins = load->glyph->control_len;
|
n_ins = load->glyph->control_len;
|
||||||
|
|
||||||
/* add shadow points */
|
/* add shadow points */
|
||||||
|
@ -674,6 +676,7 @@
|
||||||
FT_GlyphLoader* gloader = loader->gloader;
|
FT_GlyphLoader* gloader = loader->gloader;
|
||||||
FT_Bool opened_frame = 0;
|
FT_Bool opened_frame = 0;
|
||||||
|
|
||||||
|
FT_UNUSED(stream); /* used with bytecode interpreter only */
|
||||||
|
|
||||||
/* check glyph index */
|
/* check glyph index */
|
||||||
index = glyph_index;
|
index = glyph_index;
|
||||||
|
|
|
@ -143,7 +143,6 @@
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
|
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
|
||||||
|
|
||||||
|
|
||||||
|
@ -730,7 +729,8 @@
|
||||||
TT_Destroy_Context( driver->context, driver->root.root.memory );
|
TT_Destroy_Context( driver->context, driver->root.root.memory );
|
||||||
driver->context = NULL;
|
driver->context = NULL;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
FT_UNUSED(driver);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,6 +119,7 @@
|
||||||
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
|
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* EXECUTION SUBTABLES */
|
/* EXECUTION SUBTABLES */
|
||||||
|
|
Loading…
Reference in New Issue