2022-12-14 16:11:32 +00:00
if ( CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS MACOS_SUPPORT_MINIMUM )
message ( FATAL_ERROR "Targeting macOS versions before ${MACOS_SUPPORT_MINIMUM} is not supported for the macOS project, please adjust CMAKE_OSX_DEPLOYMENT_TARGET (${CMAKE_OSX_DEPLOYMENT_TARGET})" )
2022-11-13 12:02:07 +00:00
endif ( )
2023-01-01 19:49:48 +00:00
set ( MAC_BUNDLE_NAME Transmission )
2018-09-30 10:37:30 +00:00
2022-11-12 20:01:57 +00:00
add_compile_options (
- f c x x - m o d u l e s
- f m o d u l e s
2023-01-01 19:49:48 +00:00
- f o b j c - a r c
# #warnings are good practice in development
" - W n o - #warnings"
# GNU extensions are good practice in Objective-C
- W n o - g n u )
2022-06-29 00:15:52 +00:00
2022-11-12 20:01:57 +00:00
find_program ( ACTOOL_EXECUTABLE actool REQUIRED )
find_program ( CODESIGN_EXECUTABLE codesign REQUIRED )
2016-09-10 17:08:58 +00:00
2023-01-01 19:49:48 +00:00
add_subdirectory ( QuickLookPlugin )
add_subdirectory ( VDKQueue )
add_executable ( ${ TR_NAME } -mac MACOSX_BUNDLE )
target_sources ( ${ TR_NAME } -mac
P R I V A T E
A b o u t W i n d o w C o n t r o l l e r . h
A b o u t W i n d o w C o n t r o l l e r . m m
A d d M a g n e t W i n d o w C o n t r o l l e r . h
A d d M a g n e t W i n d o w C o n t r o l l e r . m m
A d d W i n d o w C o n t r o l l e r . h
A d d W i n d o w C o n t r o l l e r . m m
B a d g e r . h
B a d g e r . m m
B a d g e V i e w . h
B a d g e V i e w . m m
B l o c k l i s t D o w n l o a d e r . h
B l o c k l i s t D o w n l o a d e r . m m
B l o c k l i s t D o w n l o a d e r V i e w C o n t r o l l e r . h
B l o c k l i s t D o w n l o a d e r V i e w C o n t r o l l e r . m m
B l o c k l i s t S c h e d u l e r . h
B l o c k l i s t S c h e d u l e r . m m
B o n j o u r C o n t r o l l e r . h
B o n j o u r C o n t r o l l e r . m m
B u t t o n T o o l b a r I t e m . h
B u t t o n T o o l b a r I t e m . m m
C o c o a C o m p a t i b i l i t y . h
C o l o r T e x t F i e l d . h
C o l o r T e x t F i e l d . m m
C o n t r o l l e r . h
C o n t r o l l e r . m m
C r e a t o r W i n d o w C o n t r o l l e r . h
C r e a t o r W i n d o w C o n t r o l l e r . m m
D r a g O v e r l a y V i e w . h
D r a g O v e r l a y V i e w . m m
D r a g O v e r l a y W i n d o w . h
D r a g O v e r l a y W i n d o w . m m
E x p a n d e d P a t h T o I c o n T r a n s f o r m e r . h
E x p a n d e d P a t h T o I c o n T r a n s f o r m e r . m m
E x p a n d e d P a t h T o P a t h T r a n s f o r m e r . h
E x p a n d e d P a t h T o P a t h T r a n s f o r m e r . m m
F i l e L i s t N o d e . h
F i l e L i s t N o d e . m m
F i l e N a m e C e l l . h
F i l e N a m e C e l l . m m
F i l e O u t l i n e C o n t r o l l e r . h
F i l e O u t l i n e C o n t r o l l e r . m m
F i l e O u t l i n e V i e w . h
F i l e O u t l i n e V i e w . m m
F i l e P r i o r i t y C e l l . h
F i l e P r i o r i t y C e l l . m m
F i l e R e n a m e S h e e t C o n t r o l l e r . h
F i l e R e n a m e S h e e t C o n t r o l l e r . m m
F i l t e r B a r C o n t r o l l e r . h
F i l t e r B a r C o n t r o l l e r . m m
F i l t e r B a r V i e w . h
F i l t e r B a r V i e w . m m
F i l t e r B u t t o n . h
F i l t e r B u t t o n . m m
G l o b a l O p t i o n s P o p o v e r V i e w C o n t r o l l e r . h
G l o b a l O p t i o n s P o p o v e r V i e w C o n t r o l l e r . m m
G r o u p P o p U p B u t t o n C e l l . h
G r o u p P o p U p B u t t o n C e l l . m m
G r o u p s C o n t r o l l e r . h
G r o u p s C o n t r o l l e r . m m
G r o u p s P r e f s C o n t r o l l e r . h
G r o u p s P r e f s C o n t r o l l e r . m m
G r o u p T e x t C e l l . h
G r o u p T e x t C e l l . m m
G r o u p T o o l b a r I t e m . h
G r o u p T o o l b a r I t e m . m m
I n f o A c t i v i t y V i e w C o n t r o l l e r . h
I n f o A c t i v i t y V i e w C o n t r o l l e r . m m
I n f o F i l e V i e w C o n t r o l l e r . h
I n f o F i l e V i e w C o n t r o l l e r . m m
I n f o G e n e r a l V i e w C o n t r o l l e r . h
I n f o G e n e r a l V i e w C o n t r o l l e r . m m
I n f o O p t i o n s V i e w C o n t r o l l e r . h
I n f o O p t i o n s V i e w C o n t r o l l e r . m m
I n f o P e e r s V i e w C o n t r o l l e r . h
I n f o P e e r s V i e w C o n t r o l l e r . m m
I n f o T e x t F i e l d . h
I n f o T e x t F i e l d . m m
I n f o T r a c k e r s V i e w C o n t r o l l e r . h
I n f o T r a c k e r s V i e w C o n t r o l l e r . m m
I n f o V i e w C o n t r o l l e r . h
I n f o W i n d o w C o n t r o l l e r . h
I n f o W i n d o w C o n t r o l l e r . m m
m a i n . m m
M e s s a g e W i n d o w C o n t r o l l e r . h
M e s s a g e W i n d o w C o n t r o l l e r . m m
N S A p p l i c a t i o n A d d i t i o n s . h
N S A p p l i c a t i o n A d d i t i o n s . m m
N S D a t a A d d i t i o n s . h
N S D a t a A d d i t i o n s . m m
N S I m a g e A d d i t i o n s . h
N S I m a g e A d d i t i o n s . m m
N S K e y e d U n a r c h i v e r A d d i t i o n s . h
N S K e y e d U n a r c h i v e r A d d i t i o n s . m m
N S M u t a b l e A r r a y A d d i t i o n s . h
N S M u t a b l e A r r a y A d d i t i o n s . m m
N S S t r i n g A d d i t i o n s . h
N S S t r i n g A d d i t i o n s . m m
P e e r P r o g r e s s I n d i c a t o r C e l l . h
P e e r P r o g r e s s I n d i c a t o r C e l l . m m
P e e r T a b l e V i e w . h
P e e r T a b l e V i e w . m m
P i e c e s V i e w . h
P i e c e s V i e w . m m
P o r t C h e c k e r . h
P o r t C h e c k e r . m m
P r e d i c a t e E d i t o r R o w T e m p l a t e A n y . h
P r e d i c a t e E d i t o r R o w T e m p l a t e A n y . m m
P r e f s C o n t r o l l e r . h
P r e f s C o n t r o l l e r . m m
P r e f s W i n d o w . h
P r e f s W i n d o w . m m
P r i o r i t y P o p U p B u t t o n C e l l . h
P r i o r i t y P o p U p B u t t o n C e l l . m m
P r o g r e s s G r a d i e n t s . h
P r o g r e s s G r a d i e n t s . m m
S h a r e T o o l b a r I t e m . h
S h a r e T o o l b a r I t e m . m m
S h a r e T o r r e n t F i l e H e l p e r . h
S h a r e T o r r e n t F i l e H e l p e r . m m
S p a r k l e P r o x y . m m
S t a t s W i n d o w C o n t r o l l e r . h
S t a t s W i n d o w C o n t r o l l e r . m m
S t a t u s B a r C o n t r o l l e r . h
S t a t u s B a r C o n t r o l l e r . m m
S t a t u s B a r V i e w . h
S t a t u s B a r V i e w . m m
T o o l b a r . h
T o o l b a r . m m
T o r r e n t . h
T o r r e n t . m m
T o r r e n t C e l l . h
T o r r e n t C e l l . m m
T o r r e n t G r o u p . h
T o r r e n t G r o u p . m m
T o r r e n t T a b l e V i e w . h
T o r r e n t T a b l e V i e w . m m
T r a c k e r C e l l . h
T r a c k e r C e l l . m m
T r a c k e r N o d e . h
T r a c k e r N o d e . m m
T r a c k e r T a b l e V i e w . h
T r a c k e r T a b l e V i e w . m m
U R L S h e e t W i n d o w C o n t r o l l e r . h
U R L S h e e t W i n d o w C o n t r o l l e r . m m
W e b S e e d T a b l e V i e w . h
W e b S e e d T a b l e V i e w . m m )
set ( XIB_FILES
2016-09-10 17:08:58 +00:00
A b o u t W i n d o w . x i b
B l o c k l i s t S t a t u s W i n d o w . x i b
F i l e R e n a m e S h e e t C o n t r o l l e r . x i b
F i l t e r B a r . x i b
I n f o F i l e V i e w . x i b
I n f o P e e r s V i e w . x i b
I n f o T r a c k e r s V i e w . x i b
I n f o W i n d o w . x i b
M e s s a g e W i n d o w . x i b
S t a t s W i n d o w . x i b
S t a t u s B a r . x i b
2023-01-01 19:49:48 +00:00
U R L S h e e t W i n d o w . x i b )
2021-04-24 21:55:11 +00:00
2023-01-01 19:49:48 +00:00
set ( RESOURCES
2016-09-10 17:08:58 +00:00
D e f a u l t s . p l i s t
C r e d i t s . r t f
s p a r k l e _ d s a _ p u b . p e m
. . / C O P Y I N G
2023-01-01 19:49:48 +00:00
I m a g e s / T r a n s m i s s i o n D o c u m e n t . i c n s )
source_group ( Resources
F I L E S $ { R E S O U R C E S } )
2016-09-10 17:08:58 +00:00
2023-01-01 19:49:48 +00:00
set_source_files_properties (
$ { R E S O U R C E S }
P R O P E R T I E S
M A C O S X _ P A C K A G E _ L O C A T I O N R e s o u r c e s )
2016-09-10 17:08:58 +00:00
2023-01-01 19:49:48 +00:00
set ( IMAGESETS
2016-09-10 17:08:58 +00:00
A c t i o n H o v e r
B a n d w i d t h
C l e a n u p T e m p l a t e
C o m p l e t e C h e c k
C r e a t e L a r g e
D o w n A r r o w G r o u p T e m p l a t e
D o w n A r r o w T e m p l a t e
2022-11-12 20:01:57 +00:00
D o w n l o a d B a d g e
2022-06-12 04:24:31 +00:00
E l l i p s i s T e m p l a t e
2016-09-10 17:08:58 +00:00
F a v I c o n
2022-11-12 20:01:57 +00:00
G e a r s h a p e T e m p l a t e
2016-09-10 17:08:58 +00:00
G l o b e
G r o u p s
I n f o A c t i v i t y
I n f o F i l e s
I n f o G e n e r a l
I n f o O p t i o n s
I n f o P e e r s
I n f o T r a c k e r
L o c k
M a g n e t
P a u s e H o v e r
P a u s e O f f
P a u s e O n
P i n T e m p l a t e
P r i o r i t y C o n t r o l H i g h
P r i o r i t y C o n t r o l L o w
P r i o r i t y C o n t r o l N o r m a l
P r i o r i t y H i g h T e m p l a t e
P r i o r i t y L o w T e m p l a t e
P r i o r i t y N o r m a l T e m p l a t e
R e m o t e
R e s u m e H o v e r
R e s u m e N o W a i t H o v e r
R e s u m e N o W a i t O f f
R e s u m e N o W a i t O n
R e s u m e O f f
R e s u m e O n
R e v e a l H o v e r
R e v e a l O f f
R e v e a l O n
T o o l b a r C r e a t e T e m p l a t e
T o o l b a r F i l t e r T e m p l a t e
T o o l b a r I n f o T e m p l a t e
T o o l b a r O p e n T e m p l a t e
T o o l b a r O p e n W e b T e m p l a t e
T o o l b a r P a u s e A l l T e m p l a t e
T o o l b a r P a u s e S e l e c t e d T e m p l a t e
T o o l b a r R e m o v e T e m p l a t e
T o o l b a r R e s u m e A l l T e m p l a t e
T o o l b a r R e s u m e S e l e c t e d T e m p l a t e
2022-05-27 11:59:37 +00:00
T o r t o i s e T e m p l a t e
2022-06-05 14:54:45 +00:00
T r a n s f e r s
2016-09-10 17:08:58 +00:00
U p A r r o w G r o u p T e m p l a t e
U p A r r o w T e m p l a t e
2022-11-12 20:01:57 +00:00
U p l o a d B a d g e
2016-09-10 17:08:58 +00:00
Y i n g Y a n g G r o u p T e m p l a t e
2023-01-01 19:49:48 +00:00
Y i n g Y a n g T e m p l a t e )
2016-09-10 17:08:58 +00:00
2022-11-12 20:01:57 +00:00
set ( APPICON_NAME AppIcon )
set ( IMAGE_ASSETS_DIR Images/Images.xcassets )
set ( APPICONSET_DIR "${IMAGE_ASSETS_DIR}/${APPICON_NAME}.appiconset" )
set ( IMAGE_ASSETS
$ { I M A G E _ A S S E T S _ D I R } / C o n t e n t s . j s o n
$ { A P P I C O N S E T _ D I R } / C o n t e n t s . j s o n )
2023-01-01 19:49:48 +00:00
foreach ( IMG IN LISTS IMAGESETS )
2022-11-12 20:01:57 +00:00
set ( IMG_DIR "${IMAGE_ASSETS_DIR}/${IMG}.imageset" )
list ( APPEND IMAGE_ASSETS
$ { I M G _ D I R } / $ { I M G } . p n g
$ { I M G _ D I R } / $ { I M G } @ 2 x . p n g
$ { I M G _ D I R } / C o n t e n t s . j s o n )
2016-09-10 17:08:58 +00:00
endforeach ( )
2022-11-12 20:01:57 +00:00
foreach ( SIZE IN ITEMS 16 32 128 256 512 )
list ( APPEND IMAGE_ASSETS
$ { A P P I C O N S E T _ D I R } / i c o n _ $ { S I Z E } x $ { S I Z E } . p n g
$ { A P P I C O N S E T _ D I R } / i c o n _ $ { S I Z E } x $ { S I Z E } @ 2 x . p n g )
endforeach ( )
set ( COMPILED_IMAGE_ASSETS
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { A P P I C O N _ N A M E } . i c n s "
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / A s s e t s . c a r " )
add_custom_command (
O U T P U T
$ { C O M P I L E D _ I M A G E _ A S S E T S }
$ { A P P I C O N _ N A M E } . I n f o . p l i s t
2023-01-01 19:49:48 +00:00
C O M M A N D
$ { A C T O O L _ E X E C U T A B L E }
2022-11-12 20:01:57 +00:00
- - c o m p i l e " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } "
- - p l a t f o r m m a c o s x
- - m i n i m u m - d e p l o y m e n t - t a r g e t $ { C M A K E _ O S X _ D E P L O Y M E N T _ T A R G E T }
- - a p p - i c o n $ { A P P I C O N _ N A M E }
- - o u t p u t - p a r t i a l - i n f o - p l i s t " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { A P P I C O N _ N A M E } . I n f o . p l i s t "
$ { I M A G E _ A S S E T S _ D I R }
D E P E N D S $ { I M A G E _ A S S E T S }
2023-01-01 19:49:48 +00:00
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } )
source_group ( "Generated Files"
F I L E S
$ { C O M P I L E D _ I M A G E _ A S S E T S }
$ { A P P I C O N _ N A M E } . I n f o . p l i s t )
2016-09-10 17:08:58 +00:00
2023-01-01 19:49:48 +00:00
list ( APPEND RESOURCES
$ { C O M P I L E D _ I M A G E _ A S S E T S } )
2022-11-12 20:01:57 +00:00
2023-01-01 19:49:48 +00:00
set_source_files_properties (
$ { C O M P I L E D _ I M A G E _ A S S E T S }
P R O P E R T I E S
M A C O S X _ P A C K A G E _ L O C A T I O N R e s o u r c e s )
2016-09-10 17:08:58 +00:00
2023-01-01 19:49:48 +00:00
set ( LINGUAS
2016-09-10 17:08:58 +00:00
d a
d e
2022-07-25 01:44:56 +00:00
e n
2016-09-10 17:08:58 +00:00
e s
f r
i t
n l
p t _ P T
r u
2023-01-01 19:49:48 +00:00
t r )
2016-09-10 17:08:58 +00:00
if ( ENABLE_NLS )
2023-01-01 19:49:48 +00:00
set ( ENABLED_LINGUAS ${ LINGUAS } )
2016-09-10 17:08:58 +00:00
else ( )
2023-01-01 19:49:48 +00:00
set ( ENABLED_LINGUAS en )
2016-09-10 17:08:58 +00:00
endif ( )
2023-01-01 19:49:48 +00:00
set ( BASE_XIB_FILES
2016-09-10 17:08:58 +00:00
A d d M a g n e t W i n d o w . x i b
A d d W i n d o w . x i b
C r e a t o r . x i b
G l o b a l O p t i o n s P o p o v e r . x i b
G r o u p R u l e s . x i b
I n f o A c t i v i t y V i e w . x i b
I n f o G e n e r a l V i e w . x i b
I n f o O p t i o n s V i e w . x i b
M a i n M e n u . x i b
2023-01-01 19:49:48 +00:00
P r e f s W i n d o w . x i b )
list ( TRANSFORM BASE_XIB_FILES
P R E P E N D B a s e . l p r o j / )
2016-09-10 17:08:58 +00:00
2023-01-01 19:49:48 +00:00
set ( LANG_STRINGS_FILES
2016-09-10 17:08:58 +00:00
I n f o P l i s t . s t r i n g s
2023-01-01 19:49:48 +00:00
L o c a l i z a b l e . s t r i n g s )
2016-09-10 17:08:58 +00:00
2023-01-01 19:49:48 +00:00
foreach ( LANG ${ ENABLED_LINGUAS } )
set ( ${ LANG } _STRINGS_FILES )
2022-07-25 01:44:56 +00:00
if ( NOT LANG STREQUAL "en" )
2023-01-01 19:49:48 +00:00
foreach ( F ${ BASE_XIB_FILES } )
2022-07-25 01:44:56 +00:00
get_filename_component ( F_BASE "${F}" NAME_WE )
2023-01-01 19:49:48 +00:00
list ( APPEND ${ LANG } _STRINGS_FILES ${ LANG } .lproj/ ${ F_BASE } .strings )
2022-07-25 01:44:56 +00:00
endforeach ( )
endif ( )
2023-01-01 19:49:48 +00:00
foreach ( F ${ LANG_STRINGS_FILES } )
list ( APPEND ${ LANG } _STRINGS_FILES ${ LANG } .lproj/ ${ F } )
2016-09-10 17:08:58 +00:00
endforeach ( )
2023-01-01 19:49:48 +00:00
source_group ( Resources/ ${ LANG } .lproj
F I L E S $ { $ { L A N G } _ S T R I N G S _ F I L E S } )
2016-09-10 17:08:58 +00:00
endforeach ( )
2023-01-01 19:49:48 +00:00
foreach ( LANG ${ ENABLED_LINGUAS } )
list ( APPEND RESOURCES ${ ${LANG } _STRINGS_FILES} )
2022-11-12 20:01:57 +00:00
set ( STRINGS_FILES_RESOURCES_DIR Resources )
if ( NOT CMAKE_GENERATOR STREQUAL Xcode )
string ( APPEND STRINGS_FILES_RESOURCES_DIR / ${ LANG } .lproj )
endif ( )
2023-01-01 19:49:48 +00:00
set_source_files_properties (
$ { $ { L A N G } _ S T R I N G S _ F I L E S }
P R O P E R T I E S
M A C O S X _ P A C K A G E _ L O C A T I O N $ { S T R I N G S _ F I L E S _ R E S O U R C E S _ D I R } )
2016-09-10 17:08:58 +00:00
endforeach ( )
2023-01-01 19:49:48 +00:00
target_sources ( ${ TR_NAME } -mac
P R I V A T E
$ { R E S O U R C E S } )
tr_target_xib_files ( ${ TR_NAME } -mac
$ { X I B _ F I L E S }
$ { B A S E _ X I B _ F I L E S } )
find_library ( SPARKLE_FRAMEWORK Sparkle
P A T H S $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R }
N O _ D E F A U L T _ P A T H S )
2016-09-10 17:08:58 +00:00
target_link_libraries ( ${ TR_NAME } -mac
2023-01-01 19:49:48 +00:00
P R I V A T E
$ { T R _ N A M E }
2023-01-02 16:23:51 +00:00
f m t : : f m t - h e a d e r - o n l y
2023-01-01 19:49:48 +00:00
v d k q u e u e
$ { S P A R K L E _ F R A M E W O R K }
" - f r a m e w o r k A p p K i t "
" - f r a m e w o r k C a r b o n "
" - f r a m e w o r k F o u n d a t i o n "
" - f r a m e w o r k I O K i t "
" - f r a m e w o r k Q u a r t z "
" - f r a m e w o r k S e c u r i t y "
" - w e a k _ f r a m e w o r k U s e r N o t i f i c a t i o n s " )
2016-09-10 17:08:58 +00:00
2022-11-12 20:01:57 +00:00
if ( NOT CMAKE_GENERATOR STREQUAL Xcode )
2023-01-01 19:49:48 +00:00
add_custom_command (
T A R G E T $ { T R _ N A M E } - m a c
P O S T _ B U I L D
2022-11-24 17:20:48 +00:00
C O M M A N D $ { C O D E S I G N _ E X E C U T A B L E } - s - $ < T A R G E T _ B U N D L E _ D I R : $ { T R _ N A M E } - m a c > )
2022-11-12 20:01:57 +00:00
endif ( )
2023-01-01 19:49:48 +00:00
set_target_properties (
$ { T R _ N A M E } - m a c
P R O P E R T I E S
O U T P U T _ N A M E $ { M A C _ B U N D L E _ N A M E }
M A C O S X _ B U N D L E _ G U I _ I D E N T I F I E R " o r g . m 0 k . t r a n s m i s s i o n "
M A C O S X _ B U N D L E _ I N F O _ P L I S T $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / I n f o . p l i s t . i n
I N S T A L L _ R P A T H " @ e x e c u t a b l e _ p a t h ; @ e x e c u t a b l e _ p a t h / . . / F r a m e w o r k s " )
install (
T A R G E T S $ { T R _ N A M E } - m a c
D E S T I N A T I O N A p p l i c a t i o n s )
install (
D I R E C T O R Y T r a n s m i s s i o n H e l p
D E S T I N A T I O N A p p l i c a t i o n s / $ { M A C _ B U N D L E _ N A M E } . a p p / C o n t e n t s / R e s o u r c e s )
2016-09-10 17:08:58 +00:00
tr_install_web ( Applications/ ${ MAC_BUNDLE_NAME } .app/Contents/Resources )
2023-01-01 19:49:48 +00:00
install ( CODE
" list ( APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")
2016-09-10 17:08:58 +00:00
include ( TrMacros )
include ( GetPrerequisites )
2023-01-01 19:49:48 +00:00
tr_fixup_bundle_item (
\ " \ $ E N V { D E S T D I R } $ { C M A K E _ I N S T A L L _ P R E F I X } / A p p l i c a t i o n s / $ { M A C _ B U N D L E _ N A M E } . a p p \ "
\ " C o n t e n t s / M a c O S / $ { M A C _ B U N D L E _ N A M E } \ " \ " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } \ " ) " )