Skip to content

Commit ae5360b

Browse files
committed
Merged revisions 66141,66145,66150,66180,66211,66217,66219,66226,66231,66244,66246,66249-66250,66264,66268,66272,66294,66306 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r66141 | gregory.p.smith | 2008-09-02 00:29:51 -0500 (Tue, 02 Sep 2008) | 3 lines Issue #3678: Correctly pass LDFLAGS and LDLAST to the linker on shared library targets in the Makefile. ........ r66145 | marc-andre.lemburg | 2008-09-02 05:32:34 -0500 (Tue, 02 Sep 2008) | 5 lines Add quotes around the file name to avoid issues with spaces. Closes #3719. ........ r66150 | marc-andre.lemburg | 2008-09-02 07:11:19 -0500 (Tue, 02 Sep 2008) | 3 lines Add news item for #3719. ........ r66180 | vinay.sajip | 2008-09-03 04:20:05 -0500 (Wed, 03 Sep 2008) | 1 line Issue #3726: Allowed spaces in separators in logging configuration files. ........ r66211 | vinay.sajip | 2008-09-04 02:31:21 -0500 (Thu, 04 Sep 2008) | 1 line Issue #3772: Fixed regression problem in StreamHandler.emit(). ........ r66217 | andrew.kuchling | 2008-09-04 08:26:24 -0500 (Thu, 04 Sep 2008) | 1 line #3671: various corrections and markup fixes noted by Kent Johnson ........ r66219 | hirokazu.yamamoto | 2008-09-04 09:25:30 -0500 (Thu, 04 Sep 2008) | 1 line Added NEWS ........ r66226 | benjamin.peterson | 2008-09-04 18:31:27 -0500 (Thu, 04 Sep 2008) | 1 line flesh out the documentation on using 2to3 ........ r66231 | andrew.kuchling | 2008-09-05 10:15:56 -0500 (Fri, 05 Sep 2008) | 1 line #3671: Typo fix ........ r66244 | jesse.noller | 2008-09-05 20:20:11 -0500 (Fri, 05 Sep 2008) | 2 lines Fix typo in multiprocessing doc, cancel_join_thread was missing _thread ........ r66246 | benjamin.peterson | 2008-09-05 22:00:00 -0500 (Fri, 05 Sep 2008) | 1 line actually tell the name of the flag to use ........ r66249 | andrew.kuchling | 2008-09-06 07:50:05 -0500 (Sat, 06 Sep 2008) | 1 line Various corrections ........ r66250 | andrew.kuchling | 2008-09-06 08:04:02 -0500 (Sat, 06 Sep 2008) | 1 line #3040: include 'dest' argument in example; trim some trailing whitespace ........ r66264 | benjamin.peterson | 2008-09-06 14:42:39 -0500 (Sat, 06 Sep 2008) | 1 line docs are pretty good about new-style classes these days ........ r66268 | andrew.kuchling | 2008-09-06 15:28:01 -0500 (Sat, 06 Sep 2008) | 1 line #3669 from Robert Lehmann: simplify use of iterator in example ........ r66272 | andrew.kuchling | 2008-09-06 16:26:02 -0500 (Sat, 06 Sep 2008) | 1 line #1317: describe the does_esmtp, ehlo_resp, esmtp_features, and helo_resp attributes ........ r66294 | georg.brandl | 2008-09-07 12:00:17 -0500 (Sun, 07 Sep 2008) | 2 lines Add a new howto about Python and the web, by Marek Kubica. ........ r66306 | mark.summerfield | 2008-09-08 09:45:37 -0500 (Mon, 08 Sep 2008) | 3 lines Added xrefs to each other. ........
1 parent e5b4ca6 commit ae5360b

13 files changed

+888
-76
lines changed

Doc/howto/index.rst

+1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ Currently, the HOWTOs are:
2121
sockets.rst
2222
unicode.rst
2323
urllib2.rst
24+
webservers.rst
2425

Doc/howto/webservers.rst

+697
Large diffs are not rendered by default.

Doc/library/2to3.rst

+35-14
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,21 @@
77

88
2to3 is a Python program that reads Python 2.x source code and applies a series
99
of *fixers* to transform it into valid Python 3.x code. The standard library
10-
contains a rich set of fixers that will handle almost all code. It is, however,
11-
possible to write your own fixers.
10+
contains a rich set of fixers that will handle almost all code. 2to3 supporting
11+
library :mod:`lib2to3` is, however, a flexible and generic library, so it is
12+
possible to write your own fixers for 2to3. :mod:`lib2to3` could also be
13+
adapted to custom applications in which Python code needs to be edited
14+
automatically.
1215

1316

1417
Using 2to3
1518
----------
1619

17-
2to3 can be run with a list of files to transform or a directory to recursively
18-
traverse looking for files with the ``.py`` extension.
20+
2to3 will usually be installed with the Python interpreter as a script. It is
21+
also located in the :file:`Tools/scripts` directory of the Python root.
22+
23+
2to3's basic arguments are a list of files or directories to transform. The
24+
directories are to recursively traversed for Python sources.
1925

2026
Here is a sample Python 2.x source file, :file:`example.py`::
2127

@@ -29,41 +35,56 @@ It can be converted to Python 3.x code via 2to3 on the command line::
2935

3036
$ 2to3 example.py
3137

32-
A diff against the original source file will be printed. 2to3 can also write
33-
the needed modifications right back to the source file. (A backup of the
34-
original file will also be made.) This is done with the :option:`-w` flag::
38+
A diff against the original source file is printed. 2to3 can also write the
39+
needed modifications right back to the source file. (Of course, a backup of the
40+
original is also be made.) Writing the changes back is enabled with the
41+
:option:`-w` flag::
3542

3643
$ 2to3 -w example.py
3744

38-
:file:`example.py` will now look like this::
45+
After transformation, :file:`example.py` looks like this::
3946

4047
def greet(name):
4148
print("Hello, {0}!".format(name))
4249
print("What's your name?")
4350
name = input()
4451
greet(name)
4552

46-
Comments and and exact indentation will be preserved throughout the translation
53+
Comments and and exact indentation are preserved throughout the translation
4754
process.
4855

49-
By default, 2to3 will run a set of predefined fixers. The :option:`-l` flag
56+
By default, 2to3 runs a set of predefined fixers. The :option:`-l` flag
5057
lists all avaible fixers. An explicit set of fixers to run can be given by use
5158
of the :option:`-f` flag. The following example runs only the ``imports`` and
5259
``has_key`` fixers::
5360

5461
$ 2to3 -f imports -f has_key example.py
5562

5663
Some fixers are *explicit*, meaning they aren't run be default and must be
57-
listed on the command line. Here, in addition to the default fixers, the
58-
``idioms`` fixer is run::
64+
listed on the command line to be run. Here, in addition to the default fixers,
65+
the ``idioms`` fixer is run::
5966

6067
$ 2to3 -f all -f idioms example.py
6168

62-
Notice how ``all`` enables all default fixers.
69+
Notice how passing ``all`` enables all default fixers.
6370

6471
Sometimes 2to3 will find will find a place in your source code that needs to be
6572
changed, but 2to3 cannot fix automatically. In this case, 2to3 will print a
66-
warning beneath the diff for a file.
73+
warning beneath the diff for a file. You should address the warning in order to
74+
have compliant 3.x code.
75+
76+
2to3 can also refactor doctests. To enable this mode, use the :option:`-d`
77+
flag. Note that *only* doctests will be refactored.
78+
79+
The :option:`-v` option enables the output of more information on the
80+
translation process.
81+
82+
When the :option:`-p` is passed to it, 2to3 treats ``print`` as a function
83+
instead of a statement. This is useful when ``from __future__ import
84+
print_function`` is being used. If this option is not given, the print fixer
85+
will surround print calls in an extra set of parentheses because it cannot
86+
differentiate between the and print statement with parentheses (such as ``print
87+
("a" + "b" + "c")``) and a true function call.
6788

6889

6990
:mod:`lib2to3` - 2to3's library

Doc/library/getopt.rst

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ This module helps scripts to parse the command line arguments in ``sys.argv``.
1111
It supports the same conventions as the Unix :cfunc:`getopt` function (including
1212
the special meanings of arguments of the form '``-``' and '``--``'). Long
1313
options similar to those supported by GNU software may be used as well via an
14-
optional third argument. This module provides two functions and an
14+
optional third argument.
15+
16+
A more convenient, flexible, and powerful alternative is the
17+
:mod:`optparse` module.
18+
19+
This module provides two functions and an
1520
exception:
1621

1722

Doc/library/multiprocessing.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -1859,7 +1859,7 @@ Joining processes that use queues
18591859
Bear in mind that a process that has put items in a queue will wait before
18601860
terminating until all the buffered items are fed by the "feeder" thread to
18611861
the underlying pipe. (The child process can call the
1862-
:meth:`Queue.cancel_join` method of the queue to avoid this behaviour.)
1862+
:meth:`Queue.cancel_join_thread` method of the queue to avoid this behaviour.)
18631863

18641864
This means that whenever you use a queue you need to make sure that all
18651865
items which have been put on the queue will eventually be removed before the

Doc/library/optparse.rst

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99

1010
``optparse`` is a more convenient, flexible, and powerful library for parsing
11-
command-line options than ``getopt``. ``optparse`` uses a more declarative
11+
command-line options than the old :mod:`getopt` module. ``optparse`` uses a more declarative
1212
style of command-line parsing: you create an instance of :class:`OptionParser`,
1313
populate it with options, and parse the command line. ``optparse`` allows users
1414
to specify options in the conventional GNU/POSIX syntax, and additionally
@@ -92,7 +92,7 @@ argument
9292
``sys.argv[1:]``, or of some other list provided as a substitute for
9393
``sys.argv[1:]``".
9494

95-
option
95+
option
9696
an argument used to supply extra information to guide or customize the execution
9797
of a program. There are many different syntaxes for options; the traditional
9898
Unix syntax is a hyphen ("-") followed by a single letter, e.g. ``"-x"`` or
@@ -464,7 +464,7 @@ user-friendly (documented) options::
464464
action="store_true", dest="verbose", default=True,
465465
help="make lots of noise [default]")
466466
parser.add_option("-q", "--quiet",
467-
action="store_false", dest="verbose",
467+
action="store_false", dest="verbose",
468468
help="be vewwy quiet (I'm hunting wabbits)")
469469
parser.add_option("-f", "--filename",
470470
metavar="FILE", help="write output to FILE"),
@@ -1632,7 +1632,7 @@ arguments::
16321632
setattr(parser.values, option.dest, value)
16331633

16341634
[...]
1635-
parser.add_option("-c", "--callback",
1635+
parser.add_option("-c", "--callback", dest="vararg_attr",
16361636
action="callback", callback=vararg_callback)
16371637

16381638
The main weakness with this particular implementation is that negative numbers

Doc/library/smtplib.rst

+9-1
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ An :class:`SMTP` instance has the following methods:
171171

172172
Identify yourself to the SMTP server using ``HELO``. The hostname argument
173173
defaults to the fully qualified domain name of the local host.
174+
The message returned by the server is stored as the :attr:`helo_resp` attribute
175+
of the object.
174176

175177
In normal operation it should not be necessary to call this method explicitly.
176178
It will be implicitly called by the :meth:`sendmail` when necessary.
@@ -180,7 +182,13 @@ An :class:`SMTP` instance has the following methods:
180182

181183
Identify yourself to an ESMTP server using ``EHLO``. The hostname argument
182184
defaults to the fully qualified domain name of the local host. Examine the
183-
response for ESMTP option and store them for use by :meth:`has_extn`.
185+
response for ESMTP option and store them for use by :meth:`has_extn`.
186+
Also sets several informational attributes: the message returned by
187+
the server is stored as the :attr:`ehlo_resp` attribute, :attr:`does_esmtp`
188+
is set to true or false depending on whether the server supports ESMTP, and
189+
:attr:`esmtp_features` will be a dictionary containing the names of the
190+
SMTP service extensions this server supports, and their
191+
parameters (if any).
184192

185193
Unless you wish to use :meth:`has_extn` before sending mail, it should not be
186194
necessary to call this method explicitly. It will be implicitly called by

Doc/library/sqlite3.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ A :class:`Connection` instance has the following attributes and methods:
419419
import sqlite3, os
420420

421421
con = sqlite3.connect('existing_db.db')
422-
full_dump = os.linesep.join([line for line in con.iterdump()])
422+
full_dump = os.linesep.join(con.iterdump())
423423
f = open('dump.sql', 'w')
424424
f.writelines(full_dump)
425425
f.close()

Doc/whatsnew/2.6.rst

+45-42
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ what it can, adding compatibility functions in a
6363
usages that will become unsupported in 3.0.
6464

6565
Some significant new packages have been added to the standard library,
66-
such as the :mod:`multiprocessing` and :mod:`jsonlib` modules, but
66+
such as the :mod:`multiprocessing` and :mod:`json` modules, but
6767
there aren't many new features that aren't related to Python 3.0 in
6868
some way.
6969

@@ -623,7 +623,7 @@ versa.)
623623
Two other classes, :class:`Pool` and :class:`Manager`, provide
624624
higher-level interfaces. :class:`Pool` will create a fixed number of
625625
worker processes, and requests can then be distributed to the workers
626-
by calling :meth:`apply` or `apply_async` to add a single request,
626+
by calling :meth:`apply` or :meth:`apply_async` to add a single request,
627627
and :meth:`map` or :meth:`map_async` to add a number of
628628
requests. The following code uses a :class:`Pool` to spread requests
629629
across 5 worker processes and retrieve a list of results::
@@ -977,10 +977,10 @@ sequence of bytes::
977977
bytearray(b'ABC')
978978
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
979979
>>> b
980-
bytearray(b'\xe2\x87\xaf \xe3\x89\x84')
980+
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
981981
>>> b[0] = '\xe3'
982982
>>> b
983-
bytearray(b'\xe3\x87\xaf \xe3\x89\x84')
983+
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
984984
>>> unicode(str(b), 'utf-8')
985985
u'\u31ef \u3244'
986986

@@ -1975,7 +1975,7 @@ changes, or look through the Subversion logs for all the details.
19751975

19761976
* A new function in the :mod:`heapq` module, ``merge(iter1, iter2, ...)``,
19771977
takes any number of iterables returning data in sorted
1978-
order, and returns a new iterator that returns the contents of all
1978+
order, and returns a new generator that returns the contents of all
19791979
the iterators, also in sorted order. For example::
19801980

19811981
heapq.merge([1, 3, 5, 9], [2, 8, 16]) ->
@@ -2014,56 +2014,56 @@ changes, or look through the Subversion logs for all the details.
20142014
others, the missing values are set to *fillvalue*. For example::
20152015

20162016
itertools.izip_longest([1,2,3], [1,2,3,4,5]) ->
2017-
[(1, 1), (2, 2), (3, 3), (None, 4), (None, 5)]
2017+
(1, 1), (2, 2), (3, 3), (None, 4), (None, 5)
20182018

20192019
``product(iter1, iter2, ..., [repeat=N])`` returns the Cartesian product
20202020
of the supplied iterables, a set of tuples containing
20212021
every possible combination of the elements returned from each iterable. ::
20222022

20232023
itertools.product([1,2,3], [4,5,6]) ->
2024-
[(1, 4), (1, 5), (1, 6),
2024+
(1, 4), (1, 5), (1, 6),
20252025
(2, 4), (2, 5), (2, 6),
2026-
(3, 4), (3, 5), (3, 6)]
2026+
(3, 4), (3, 5), (3, 6)
20272027

20282028
The optional *repeat* keyword argument is used for taking the
20292029
product of an iterable or a set of iterables with themselves,
20302030
repeated *N* times. With a single iterable argument, *N*-tuples
20312031
are returned::
20322032

2033-
itertools.product([1,2], repeat=3)) ->
2034-
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
2035-
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
2033+
itertools.product([1,2], repeat=3) ->
2034+
(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
2035+
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)
20362036

20372037
With two iterables, *2N*-tuples are returned. ::
20382038

2039-
itertools(product([1,2], [3,4], repeat=2) ->
2040-
[(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
2039+
itertools.product([1,2], [3,4], repeat=2) ->
2040+
(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
20412041
(1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
20422042
(2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
2043-
(2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
2043+
(2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)
20442044

20452045
``combinations(iterable, r)`` returns sub-sequences of length *r* from
20462046
the elements of *iterable*. ::
20472047

20482048
itertools.combinations('123', 2) ->
2049-
[('1', '2'), ('1', '3'), ('2', '3')]
2049+
('1', '2'), ('1', '3'), ('2', '3')
20502050

20512051
itertools.combinations('123', 3) ->
2052-
[('1', '2', '3')]
2052+
('1', '2', '3')
20532053

20542054
itertools.combinations('1234', 3) ->
2055-
[('1', '2', '3'), ('1', '2', '4'), ('1', '3', '4'),
2056-
('2', '3', '4')]
2055+
('1', '2', '3'), ('1', '2', '4'), ('1', '3', '4'),
2056+
('2', '3', '4')
20572057

20582058
``permutations(iter[, r])`` returns all the permutations of length *r* of
20592059
the iterable's elements. If *r* is not specified, it will default to the
20602060
number of elements produced by the iterable. ::
20612061

20622062
itertools.permutations([1,2,3,4], 2) ->
2063-
[(1, 2), (1, 3), (1, 4),
2063+
(1, 2), (1, 3), (1, 4),
20642064
(2, 1), (2, 3), (2, 4),
20652065
(3, 1), (3, 2), (3, 4),
2066-
(4, 1), (4, 2), (4, 3)]
2066+
(4, 1), (4, 2), (4, 3)
20672067

20682068
``itertools.chain(*iterables)`` is an existing function in
20692069
:mod:`itertools` that gained a new constructor in Python 2.6.
@@ -2073,7 +2073,7 @@ changes, or look through the Subversion logs for all the details.
20732073
all the elements of the second, and so on. ::
20742074

20752075
chain.from_iterable([[1,2,3], [4,5,6]]) ->
2076-
[1, 2, 3, 4, 5, 6]
2076+
1, 2, 3, 4, 5, 6
20772077

20782078
(All contributed by Raymond Hettinger.)
20792079

@@ -2178,7 +2178,7 @@ changes, or look through the Subversion logs for all the details.
21782178
:const:`UF_APPEND` to indicate that data can only be appended to the
21792179
file. (Contributed by M. Levinson.)
21802180

2181-
``os.closerange(*low*, *high*)`` efficiently closes all file descriptors
2181+
``os.closerange(low, high)`` efficiently closes all file descriptors
21822182
from *low* to *high*, ignoring any errors and not including *high* itself.
21832183
This function is now used by the :mod:`subprocess` module to make starting
21842184
processes faster. (Contributed by Georg Brandl; :issue:`1663329`.)
@@ -2311,12 +2311,12 @@ changes, or look through the Subversion logs for all the details.
23112311
will be ignored, not copied.
23122312

23132313
The :mod:`shutil` module also provides an :func:`ignore_patterns`
2314-
function for use with this new parameter.
2315-
:func:`ignore_patterns` takes an arbitrary number of glob-style patterns
2316-
and will ignore any files and directories that match any of these patterns.
2317-
The following example copies a directory tree, but skips both
2318-
:file:`.svn` directories and Emacs backup
2319-
files, which have names ending with '~'::
2314+
function for use with this new parameter. :func:`ignore_patterns`
2315+
takes an arbitrary number of glob-style patterns and returns a
2316+
callable that will ignore any files and directories that match any
2317+
of these patterns. The following example copies a directory tree,
2318+
but skips both :file:`.svn` directories and Emacs backup files,
2319+
which have names ending with '~'::
23202320

23212321
shutil.copytree('Doc/library', '/tmp/library',
23222322
ignore=shutil.ignore_patterns('*~', '.svn'))
@@ -2523,13 +2523,15 @@ changes, or look through the Subversion logs for all the details.
25232523

25242524
(Contributed by Dwayne Bailey; :issue:`1581073`.)
25252525

2526-
* The :mod:`threading` module API is being changed to use properties such as
2527-
:attr:`daemon` instead of :meth:`setDaemon` and :meth:`isDaemon` methods, and
2528-
some methods have been renamed to use underscores instead of camel-case; for
2529-
example, the :meth:`activeCount` method is renamed to :meth:`active_count`.
2530-
The 2.6 version of the module supports the same properties and renamed
2531-
methods, but doesn't remove the old methods. 3.0 also fully supports both
2532-
APIs, and a date for the deprecation of the old APIs has not been set yet.
2526+
* The :mod:`threading` module API is being changed to use properties
2527+
such as :attr:`daemon` instead of :meth:`setDaemon` and
2528+
:meth:`isDaemon` methods, and some methods have been renamed to use
2529+
underscores instead of camel-case; for example, the
2530+
:meth:`activeCount` method is renamed to :meth:`active_count`. Both
2531+
the 2.6 and 3.0 versions of the module support the same properties
2532+
and renamed methods, but don't remove the old methods. No date has been set
2533+
for the deprecation of the old APIs in Python 3.x; the old APIs won't
2534+
be removed in any 2.x version.
25332535
(Carried out by several people, most notably Benjamin Peterson.)
25342536

25352537
The :mod:`threading` module's :class:`Thread` objects
@@ -2735,15 +2737,15 @@ of these built-in functions that can be imported when writing
27352737

27362738
The functions in this module currently include:
27372739

2738-
* ``ascii(*obj*)``: equivalent to :func:`repr`. In Python 3.0,
2740+
* ``ascii(obj)``: equivalent to :func:`repr`. In Python 3.0,
27392741
:func:`repr` will return a Unicode string, while :func:`ascii` will
27402742
return a pure ASCII bytestring.
27412743

2742-
* ``filter(*predicate*, *iterable*)``,
2743-
``map(*func*, *iterable1*, ...)``: the 3.0 versions
2744+
* ``filter(predicate, iterable)``,
2745+
``map(func, iterable1, ...)``: the 3.0 versions
27442746
return iterators, unlike the 2.x built-ins which return lists.
27452747

2746-
* ``hex(*value*)``, ``oct(*value*)``: instead of calling the
2748+
* ``hex(value)``, ``oct(value)``: instead of calling the
27472749
:meth:`__hex__` or :meth:`__oct__` methods, these versions will
27482750
call the :meth:`__index__` method and convert the result to hexadecimal
27492751
or octal. :func:`oct` will use the new ``0o`` notation for its
@@ -3210,7 +3212,8 @@ that may require changes to your code:
32103212
Acknowledgements
32113213
================
32123214

3213-
The author would like to thank the following people for offering suggestions,
3214-
corrections and assistance with various drafts of this article:
3215-
Georg Brandl, Steve Brown, Nick Coghlan, Jim Jewett, Antoine Pitrou.
3215+
The author would like to thank the following people for offering
3216+
suggestions, corrections and assistance with various drafts of this
3217+
article: Georg Brandl, Steve Brown, Nick Coghlan, Jim Jewett, Kent
3218+
Johnson, Chris Lambacher, Antoine Pitrou.
32163219

0 commit comments

Comments
 (0)