2013-01-31 01:25:25 +04:00
|
|
|
#ifndef _EFI_CON_H
|
|
|
|
#define _EFI_CON_H
|
|
|
|
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Copyright (c) 1998 Intel Corporation
|
|
|
|
|
|
|
|
Module Name:
|
|
|
|
|
|
|
|
eficon.h
|
|
|
|
|
|
|
|
Abstract:
|
|
|
|
|
|
|
|
EFI console protocols
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Revision History
|
|
|
|
|
|
|
|
--*/
|
|
|
|
|
|
|
|
//
|
|
|
|
// Text output protocol
|
|
|
|
//
|
|
|
|
|
Update global protocol GUIDs definitions to match EDK2
This patch introduces the use of the EDK2 names for the global GUID
variables, to allow for easier code conversion between EDK2 and
gnu-efi. All the existing GUID global variables have also been
aliased for backwards compatibility.
The patch also completes some of the earlier work with regards to
protocol struct definitions to also match the EDK2, with the
following caveat:
Because some of gnu-efi GUID macro definitions were declared with
the name that the EDK2 uses for the protocol struct itself, we have
to immediately deprecate the following GUID data aliases:
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
EFI_SIMPLE_NETWORK_PROTOCOL
EFI_PCI_IO_PROTOCOL
EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
This means that existing code using one of the above will break
on compilation. To mitigate this, explicit warnings have been
placed at the location where a developer will look for breakage,
detailing how they should amend their code.
The KnownGuids short labels in guid.c were also updated/amended
in a manner that should be a bit more consistent (though I have
no idea what the EDK2 does here, since I haven't looked at the
actual EDK2 source).
Finally, besides clean up (typo, whitespaces, duplicate removal),
we introduce the _GNU_EFI macro, in efi.h, to allow for conditional
selection of specific gnu-efi API calls, in code that may be
compiled with either EDK2 or gnu-efi.
Signed-off-by: Pete Batard <pete@akeo.ie>
Signed-off-by: Nigel Croxon <nigel.croxon@hpe.com>
2016-08-18 15:42:11 +03:00
|
|
|
#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \
|
2013-01-31 01:25:25 +04:00
|
|
|
{ 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
Update global protocol GUIDs definitions to match EDK2
This patch introduces the use of the EDK2 names for the global GUID
variables, to allow for easier code conversion between EDK2 and
gnu-efi. All the existing GUID global variables have also been
aliased for backwards compatibility.
The patch also completes some of the earlier work with regards to
protocol struct definitions to also match the EDK2, with the
following caveat:
Because some of gnu-efi GUID macro definitions were declared with
the name that the EDK2 uses for the protocol struct itself, we have
to immediately deprecate the following GUID data aliases:
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
EFI_SIMPLE_NETWORK_PROTOCOL
EFI_PCI_IO_PROTOCOL
EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
This means that existing code using one of the above will break
on compilation. To mitigate this, explicit warnings have been
placed at the location where a developer will look for breakage,
detailing how they should amend their code.
The KnownGuids short labels in guid.c were also updated/amended
in a manner that should be a bit more consistent (though I have
no idea what the EDK2 does here, since I haven't looked at the
actual EDK2 source).
Finally, besides clean up (typo, whitespaces, duplicate removal),
we introduce the _GNU_EFI macro, in efi.h, to allow for conditional
selection of specific gnu-efi API calls, in code that may be
compiled with either EDK2 or gnu-efi.
Signed-off-by: Pete Batard <pete@akeo.ie>
Signed-off-by: Nigel Croxon <nigel.croxon@hpe.com>
2016-08-18 15:42:11 +03:00
|
|
|
#define SIMPLE_TEXT_OUTPUT_PROTOCOL EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID
|
2013-01-31 01:25:25 +04:00
|
|
|
|
|
|
|
INTERFACE_DECL(_SIMPLE_TEXT_OUTPUT_INTERFACE);
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_TEXT_RESET) (
|
|
|
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
|
|
|
IN BOOLEAN ExtendedVerification
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_TEXT_OUTPUT_STRING) (
|
|
|
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
|
|
|
IN CHAR16 *String
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_TEXT_TEST_STRING) (
|
|
|
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
|
|
|
IN CHAR16 *String
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_TEXT_QUERY_MODE) (
|
|
|
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
|
|
|
IN UINTN ModeNumber,
|
|
|
|
OUT UINTN *Columns,
|
|
|
|
OUT UINTN *Rows
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_TEXT_SET_MODE) (
|
|
|
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
|
|
|
IN UINTN ModeNumber
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_TEXT_SET_ATTRIBUTE) (
|
|
|
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
|
|
|
IN UINTN Attribute
|
|
|
|
);
|
|
|
|
|
|
|
|
#define EFI_BLACK 0x00
|
|
|
|
#define EFI_BLUE 0x01
|
|
|
|
#define EFI_GREEN 0x02
|
|
|
|
#define EFI_CYAN (EFI_BLUE | EFI_GREEN)
|
|
|
|
#define EFI_RED 0x04
|
|
|
|
#define EFI_MAGENTA (EFI_BLUE | EFI_RED)
|
|
|
|
#define EFI_BROWN (EFI_GREEN | EFI_RED)
|
|
|
|
#define EFI_LIGHTGRAY (EFI_BLUE | EFI_GREEN | EFI_RED)
|
|
|
|
#define EFI_BRIGHT 0x08
|
|
|
|
#define EFI_DARKGRAY (EFI_BRIGHT)
|
|
|
|
#define EFI_LIGHTBLUE (EFI_BLUE | EFI_BRIGHT)
|
|
|
|
#define EFI_LIGHTGREEN (EFI_GREEN | EFI_BRIGHT)
|
|
|
|
#define EFI_LIGHTCYAN (EFI_CYAN | EFI_BRIGHT)
|
|
|
|
#define EFI_LIGHTRED (EFI_RED | EFI_BRIGHT)
|
|
|
|
#define EFI_LIGHTMAGENTA (EFI_MAGENTA | EFI_BRIGHT)
|
|
|
|
#define EFI_YELLOW (EFI_BROWN | EFI_BRIGHT)
|
|
|
|
#define EFI_WHITE (EFI_BLUE | EFI_GREEN | EFI_RED | EFI_BRIGHT)
|
|
|
|
|
|
|
|
#define EFI_TEXT_ATTR(f,b) ((f) | ((b) << 4))
|
|
|
|
|
|
|
|
#define EFI_BACKGROUND_BLACK 0x00
|
|
|
|
#define EFI_BACKGROUND_BLUE 0x10
|
|
|
|
#define EFI_BACKGROUND_GREEN 0x20
|
|
|
|
#define EFI_BACKGROUND_CYAN (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN)
|
|
|
|
#define EFI_BACKGROUND_RED 0x40
|
|
|
|
#define EFI_BACKGROUND_MAGENTA (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_RED)
|
|
|
|
#define EFI_BACKGROUND_BROWN (EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED)
|
|
|
|
#define EFI_BACKGROUND_LIGHTGRAY (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED)
|
|
|
|
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_TEXT_CLEAR_SCREEN) (
|
|
|
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_TEXT_SET_CURSOR_POSITION) (
|
|
|
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
|
|
|
IN UINTN Column,
|
|
|
|
IN UINTN Row
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_TEXT_ENABLE_CURSOR) (
|
|
|
|
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This,
|
|
|
|
IN BOOLEAN Enable
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
INT32 MaxMode;
|
|
|
|
// current settings
|
|
|
|
INT32 Mode;
|
|
|
|
INT32 Attribute;
|
|
|
|
INT32 CursorColumn;
|
|
|
|
INT32 CursorRow;
|
|
|
|
BOOLEAN CursorVisible;
|
|
|
|
} SIMPLE_TEXT_OUTPUT_MODE;
|
|
|
|
|
|
|
|
typedef struct _SIMPLE_TEXT_OUTPUT_INTERFACE {
|
|
|
|
EFI_TEXT_RESET Reset;
|
|
|
|
|
|
|
|
EFI_TEXT_OUTPUT_STRING OutputString;
|
|
|
|
EFI_TEXT_TEST_STRING TestString;
|
|
|
|
|
|
|
|
EFI_TEXT_QUERY_MODE QueryMode;
|
|
|
|
EFI_TEXT_SET_MODE SetMode;
|
|
|
|
EFI_TEXT_SET_ATTRIBUTE SetAttribute;
|
|
|
|
|
|
|
|
EFI_TEXT_CLEAR_SCREEN ClearScreen;
|
|
|
|
EFI_TEXT_SET_CURSOR_POSITION SetCursorPosition;
|
|
|
|
EFI_TEXT_ENABLE_CURSOR EnableCursor;
|
|
|
|
|
|
|
|
// Current mode
|
|
|
|
SIMPLE_TEXT_OUTPUT_MODE *Mode;
|
2016-09-15 18:41:45 +03:00
|
|
|
} SIMPLE_TEXT_OUTPUT_INTERFACE, EFI_SIMPLE_TEXT_OUT_PROTOCOL;
|
2013-01-31 01:25:25 +04:00
|
|
|
|
|
|
|
//
|
|
|
|
// Define's for required EFI Unicode Box Draw character
|
|
|
|
//
|
|
|
|
|
|
|
|
#define BOXDRAW_HORIZONTAL 0x2500
|
|
|
|
#define BOXDRAW_VERTICAL 0x2502
|
|
|
|
#define BOXDRAW_DOWN_RIGHT 0x250c
|
|
|
|
#define BOXDRAW_DOWN_LEFT 0x2510
|
|
|
|
#define BOXDRAW_UP_RIGHT 0x2514
|
|
|
|
#define BOXDRAW_UP_LEFT 0x2518
|
|
|
|
#define BOXDRAW_VERTICAL_RIGHT 0x251c
|
|
|
|
#define BOXDRAW_VERTICAL_LEFT 0x2524
|
|
|
|
#define BOXDRAW_DOWN_HORIZONTAL 0x252c
|
|
|
|
#define BOXDRAW_UP_HORIZONTAL 0x2534
|
|
|
|
#define BOXDRAW_VERTICAL_HORIZONTAL 0x253c
|
|
|
|
|
|
|
|
#define BOXDRAW_DOUBLE_HORIZONTAL 0x2550
|
|
|
|
#define BOXDRAW_DOUBLE_VERTICAL 0x2551
|
|
|
|
#define BOXDRAW_DOWN_RIGHT_DOUBLE 0x2552
|
|
|
|
#define BOXDRAW_DOWN_DOUBLE_RIGHT 0x2553
|
|
|
|
#define BOXDRAW_DOUBLE_DOWN_RIGHT 0x2554
|
|
|
|
|
|
|
|
#define BOXDRAW_DOWN_LEFT_DOUBLE 0x2555
|
|
|
|
#define BOXDRAW_DOWN_DOUBLE_LEFT 0x2556
|
|
|
|
#define BOXDRAW_DOUBLE_DOWN_LEFT 0x2557
|
|
|
|
|
|
|
|
#define BOXDRAW_UP_RIGHT_DOUBLE 0x2558
|
|
|
|
#define BOXDRAW_UP_DOUBLE_RIGHT 0x2559
|
|
|
|
#define BOXDRAW_DOUBLE_UP_RIGHT 0x255a
|
|
|
|
|
|
|
|
#define BOXDRAW_UP_LEFT_DOUBLE 0x255b
|
|
|
|
#define BOXDRAW_UP_DOUBLE_LEFT 0x255c
|
|
|
|
#define BOXDRAW_DOUBLE_UP_LEFT 0x255d
|
|
|
|
|
|
|
|
#define BOXDRAW_VERTICAL_RIGHT_DOUBLE 0x255e
|
|
|
|
#define BOXDRAW_VERTICAL_DOUBLE_RIGHT 0x255f
|
|
|
|
#define BOXDRAW_DOUBLE_VERTICAL_RIGHT 0x2560
|
|
|
|
|
|
|
|
#define BOXDRAW_VERTICAL_LEFT_DOUBLE 0x2561
|
|
|
|
#define BOXDRAW_VERTICAL_DOUBLE_LEFT 0x2562
|
|
|
|
#define BOXDRAW_DOUBLE_VERTICAL_LEFT 0x2563
|
|
|
|
|
|
|
|
#define BOXDRAW_DOWN_HORIZONTAL_DOUBLE 0x2564
|
|
|
|
#define BOXDRAW_DOWN_DOUBLE_HORIZONTAL 0x2565
|
|
|
|
#define BOXDRAW_DOUBLE_DOWN_HORIZONTAL 0x2566
|
|
|
|
|
|
|
|
#define BOXDRAW_UP_HORIZONTAL_DOUBLE 0x2567
|
|
|
|
#define BOXDRAW_UP_DOUBLE_HORIZONTAL 0x2568
|
|
|
|
#define BOXDRAW_DOUBLE_UP_HORIZONTAL 0x2569
|
|
|
|
|
|
|
|
#define BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE 0x256a
|
|
|
|
#define BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL 0x256b
|
|
|
|
#define BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL 0x256c
|
|
|
|
|
|
|
|
//
|
|
|
|
// EFI Required Block Elements Code Chart
|
|
|
|
//
|
|
|
|
|
|
|
|
#define BLOCKELEMENT_FULL_BLOCK 0x2588
|
|
|
|
#define BLOCKELEMENT_LIGHT_SHADE 0x2591
|
|
|
|
//
|
|
|
|
// EFI Required Geometric Shapes Code Chart
|
|
|
|
//
|
|
|
|
|
|
|
|
#define GEOMETRICSHAPE_UP_TRIANGLE 0x25b2
|
|
|
|
#define GEOMETRICSHAPE_RIGHT_TRIANGLE 0x25ba
|
|
|
|
#define GEOMETRICSHAPE_DOWN_TRIANGLE 0x25bc
|
|
|
|
#define GEOMETRICSHAPE_LEFT_TRIANGLE 0x25c4
|
|
|
|
|
|
|
|
//
|
|
|
|
// EFI Required Arrow shapes
|
|
|
|
//
|
|
|
|
|
|
|
|
#define ARROW_UP 0x2191
|
|
|
|
#define ARROW_DOWN 0x2193
|
|
|
|
|
|
|
|
//
|
|
|
|
// Text input protocol
|
|
|
|
//
|
|
|
|
|
Update global protocol GUIDs definitions to match EDK2
This patch introduces the use of the EDK2 names for the global GUID
variables, to allow for easier code conversion between EDK2 and
gnu-efi. All the existing GUID global variables have also been
aliased for backwards compatibility.
The patch also completes some of the earlier work with regards to
protocol struct definitions to also match the EDK2, with the
following caveat:
Because some of gnu-efi GUID macro definitions were declared with
the name that the EDK2 uses for the protocol struct itself, we have
to immediately deprecate the following GUID data aliases:
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
EFI_SIMPLE_NETWORK_PROTOCOL
EFI_PCI_IO_PROTOCOL
EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
This means that existing code using one of the above will break
on compilation. To mitigate this, explicit warnings have been
placed at the location where a developer will look for breakage,
detailing how they should amend their code.
The KnownGuids short labels in guid.c were also updated/amended
in a manner that should be a bit more consistent (though I have
no idea what the EDK2 does here, since I haven't looked at the
actual EDK2 source).
Finally, besides clean up (typo, whitespaces, duplicate removal),
we introduce the _GNU_EFI macro, in efi.h, to allow for conditional
selection of specific gnu-efi API calls, in code that may be
compiled with either EDK2 or gnu-efi.
Signed-off-by: Pete Batard <pete@akeo.ie>
Signed-off-by: Nigel Croxon <nigel.croxon@hpe.com>
2016-08-18 15:42:11 +03:00
|
|
|
#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \
|
2013-01-31 01:25:25 +04:00
|
|
|
{ 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
Update global protocol GUIDs definitions to match EDK2
This patch introduces the use of the EDK2 names for the global GUID
variables, to allow for easier code conversion between EDK2 and
gnu-efi. All the existing GUID global variables have also been
aliased for backwards compatibility.
The patch also completes some of the earlier work with regards to
protocol struct definitions to also match the EDK2, with the
following caveat:
Because some of gnu-efi GUID macro definitions were declared with
the name that the EDK2 uses for the protocol struct itself, we have
to immediately deprecate the following GUID data aliases:
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
EFI_SIMPLE_NETWORK_PROTOCOL
EFI_PCI_IO_PROTOCOL
EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
This means that existing code using one of the above will break
on compilation. To mitigate this, explicit warnings have been
placed at the location where a developer will look for breakage,
detailing how they should amend their code.
The KnownGuids short labels in guid.c were also updated/amended
in a manner that should be a bit more consistent (though I have
no idea what the EDK2 does here, since I haven't looked at the
actual EDK2 source).
Finally, besides clean up (typo, whitespaces, duplicate removal),
we introduce the _GNU_EFI macro, in efi.h, to allow for conditional
selection of specific gnu-efi API calls, in code that may be
compiled with either EDK2 or gnu-efi.
Signed-off-by: Pete Batard <pete@akeo.ie>
Signed-off-by: Nigel Croxon <nigel.croxon@hpe.com>
2016-08-18 15:42:11 +03:00
|
|
|
#define SIMPLE_TEXT_INPUT_PROTOCOL EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID
|
2013-01-31 01:25:25 +04:00
|
|
|
|
|
|
|
INTERFACE_DECL(_SIMPLE_INPUT_INTERFACE);
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
UINT16 ScanCode;
|
|
|
|
CHAR16 UnicodeChar;
|
|
|
|
} EFI_INPUT_KEY;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Baseline unicode control chars
|
|
|
|
//
|
|
|
|
|
|
|
|
#define CHAR_NULL 0x0000
|
|
|
|
#define CHAR_BACKSPACE 0x0008
|
|
|
|
#define CHAR_TAB 0x0009
|
|
|
|
#define CHAR_LINEFEED 0x000A
|
|
|
|
#define CHAR_CARRIAGE_RETURN 0x000D
|
|
|
|
|
|
|
|
//
|
|
|
|
// Scan codes for base line keys
|
|
|
|
//
|
|
|
|
|
|
|
|
#define SCAN_NULL 0x0000
|
|
|
|
#define SCAN_UP 0x0001
|
|
|
|
#define SCAN_DOWN 0x0002
|
|
|
|
#define SCAN_RIGHT 0x0003
|
|
|
|
#define SCAN_LEFT 0x0004
|
|
|
|
#define SCAN_HOME 0x0005
|
|
|
|
#define SCAN_END 0x0006
|
|
|
|
#define SCAN_INSERT 0x0007
|
|
|
|
#define SCAN_DELETE 0x0008
|
|
|
|
#define SCAN_PAGE_UP 0x0009
|
|
|
|
#define SCAN_PAGE_DOWN 0x000A
|
|
|
|
#define SCAN_F1 0x000B
|
|
|
|
#define SCAN_F2 0x000C
|
|
|
|
#define SCAN_F3 0x000D
|
|
|
|
#define SCAN_F4 0x000E
|
|
|
|
#define SCAN_F5 0x000F
|
|
|
|
#define SCAN_F6 0x0010
|
|
|
|
#define SCAN_F7 0x0011
|
|
|
|
#define SCAN_F8 0x0012
|
|
|
|
#define SCAN_F9 0x0013
|
|
|
|
#define SCAN_F10 0x0014
|
2016-09-15 18:41:45 +03:00
|
|
|
#define SCAN_F11 0x0015
|
|
|
|
#define SCAN_F12 0x0016
|
2013-01-31 01:25:25 +04:00
|
|
|
#define SCAN_ESC 0x0017
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_INPUT_RESET) (
|
|
|
|
IN struct _SIMPLE_INPUT_INTERFACE *This,
|
|
|
|
IN BOOLEAN ExtendedVerification
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef
|
|
|
|
EFI_STATUS
|
|
|
|
(EFIAPI *EFI_INPUT_READ_KEY) (
|
|
|
|
IN struct _SIMPLE_INPUT_INTERFACE *This,
|
|
|
|
OUT EFI_INPUT_KEY *Key
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef struct _SIMPLE_INPUT_INTERFACE {
|
|
|
|
EFI_INPUT_RESET Reset;
|
|
|
|
EFI_INPUT_READ_KEY ReadKeyStroke;
|
|
|
|
EFI_EVENT WaitForKey;
|
2016-09-15 18:41:45 +03:00
|
|
|
} SIMPLE_INPUT_INTERFACE, EFI_SIMPLE_TEXT_IN_PROTOCOL;
|
2013-01-31 01:25:25 +04:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|