Sie sind auf Seite 1von 46

Content

1. Existing and Proposed System

2. Salient Features of the System

3. Software Requirement Analysis


3.1. Problem Definition
3.2. Feasibility Analysis
3.2.1. Economic Feasibility
3.2.2. Technical Feasibility
3.2.3. Behavioural Feasibility
3.3. Methodology

4. Life Cycle Model


4.1. Waterfall Model

5. Software Hardware Requirement


5.1. Android Studio
5.2. Java JDK
5.3. SQLite
5.4. Java Programming Language
5.5. XML Scripting Language

6. Software Specification

7. Hardware Specification

8. Define Modules and Functionalities


8.1. Subject Management Module
8.2. Time Table generation Module

9. Software Design

10. UML Diagram

11. Data Flow Diagram

12. Database Design

13. E-R Diagram

14. Testing
14.1. Test Types
14.1.1. Unit Testing
14.1.2. Integration Testing
14.1.3. System Testing
14.1.4. Acceptance Testing
14.2. Database Testing

15. Conclusion

16. Suggestion for future work

17. References/Bibliography
18. Appendices
18.1. Installation Manual
18.1.1. JDK Installation
18.1.2. Android Studio Installation
Introduction
Automatic Time Table Generator is an
Android based application used to generate
automatically.

Currently Time Table is managed manually. It


will help to manage all the periods automatically.
Maximum and minimum work load for a faculty for a
day, week and month will be specified for the efficient
generation of time table.

It is a comprehensive time table management


solution for colleges which will help to overcome the
challenges in manually setting the time table.
1. Existing and Proposed System
Normally Time table generation is done
manually. As we know all institutions /organisations
have their own Time tables, managing and maintaining
these will not be difficult. Considering work load with
this scheduling will make it more complex. As
mentioned, when Time table generation is being done, it
should consider the maximum and minimum workload
that is in a college. In those cases Time table generation
is more complex. Also it is a time consuming process.

Automatic Timetable Manager is an Android


based application used to generate Timetable
automatically. It will help user to manage all the periods
automatically. It will produce an excel sheet or a PDF
file of time table generated.
2. Salient Features of the System
 Automatic Time Table Manager is an Android
Based Application.
 It will help in generating time table automatically.
 Proposed System will help to generate time table
automatically and also helps saving time.
 There is no need for a faculty to worry about their
time table.
 It is a comprehensive time table management
solution for colleges which help to overcome the
challenges in the current system.
3. Software Requirement Analysis
The current problem is setting up of time table
manually. Any absent is there, then assigning that
period to another faculty is not an easy job because at
that time we should consider the maximum workload
for a faculty (assigning extra period should not exceed
the maximum workload).

3.1. Problem Definition

Avoid the complexity of setting and managing


time table manually it will help user to manage
all the periods automatically. Faculty can
receive their period information in their phone.
Initially we will be setting the maximum
workloads for a faculty in a day, week and
month. Main challenge is to manage time table
when any faculty is absent by using this app it
will be very easy to allocate subject for
different faculty.
3.2. Feasibility Analysis

A feasibility study was an evolution of a


proposal designed to determine the difficulty
in carrying out a designated task. Generally, a
feasibility study precedes technical
development and project implementation.

3.2.1. Economic Feasibilty

To develop the proposed system, it needs no


extra facilities and devices. All dependencies
are satisfied from the open source projects. All
tools used are free, open source and the
programming language is JAVA and XML and
hence, its development is economically
feasible.

3.2.2. Technical Feasibility

Proposed system is technically feasible


because the proposed system requires only
those hardware and software that are available
in the system. It requires the installation of
JVM, JAVA, Android Studio, Universal
Google USB Driver and SQLite which can be
done for free. Moreover, expandability will be
maintained in the new system. New modules
can be added later on the application, if
required in the future. Additionally, the app
will have user friendly forms and UI.

3.2.3. Behavioural Feasibility

Behavioural Feasibility determines how much


effort will go in the proposed information
system, and in educating and training the user
on the new system. Since the user interface is
very simple and easily understandable, no
training is required for using this app.
3.3. Methodology

The establishment makes use of Software


Engineering Principles in order to obtain
economically developed app that is reliable
and works efficiently on real machine is called
software engineering.

Software Engineering is the discipline whose


aim is:
o Production of quality software.
o Cost within the budget.
o Satisfies all requirement.

Software Process is the way in which we


produce the software. Apart from hiring smart
knowledgeable engineers and buying the latest
development tools, effective software
development process is also needed, so that
engineers can systematically use the best
technical and managerial practices to
successfully complete their projects.
A Software Life Cycle is a series of
identifiable stages that a software product
undergoes during its lifetime. A software life
cycle model is a descriptive and diagrammatic
representation of the software life cycle. A life
cycle model represents all the activities
required to make a software product transit
through its life cycle phases. It also captures
the order in which these activities are to be
taken.
4. Life Cycle Models
There are various life cycle models to improve
the software processes:

o Waterfall Model
o Prototype Model
o Iterative Enhancement Model
o Evolutionary Model
o Spiral Model

4.1. Waterfall Model


The waterfall model is a sequentialdesign
process, used in software development processes,
in which progress is seen as flowing steadily
downwards (like a waterfall) through the phases
of conception, initiation, analysis, design,
construction, testing, production/implementation
and maintenance.
The waterfall development model originates in
the manufacturing and construction industries:
highly structured physical environments in which
after-the-fact changes are prohibitively costly, if
not impossible. Since no formal software
development methodologies existed at the time,
this hardware-oriented model was simply
adapted for software development.
In Royce's original waterfall model, the following
phases are followed in order:
1. System and software requirements: captured in
a product requirements document
2. Analysis: resulting in models, schema, and
business rules
3. Design: resulting in the software architecture
4. Coding: the development, proving, and
integration of software
5. Testing: the systematic discovery and
debugging of defects
6. Operations: the installation, migration,
support, and maintenance of complete systems
Thus the waterfall model maintains that one should
move to a phase only when its preceding phase is
reviewed and verified.

Clients may not know exactly what their


requirements are before they see working software
and so change their requirements, leading to
redesign, redevelopment, and retesting, and
increased costs.
Designers may not be aware of future difficulties
when designing a new software product or feature;
in which case, it is better to revise the design than
persist in a design that does not account for any
newly discovered constraints, requirements, or
problems.
In response to the perceived problems with the
pure waterfall model, modified waterfall models
were introduced, such as "Sashimi (Waterfall with
Overlapping Phases), Waterfall with Subprojects,
and Waterfall with Risk Reduction".
5. Software and Hardware
Requirements
Platform forms the foundation on which the
architecture, designed and implementation of a
product is built. System specification define the
full functionality of the system. In many systems
we work on, some functionalities performed in
hardware and some in software. System
specification documents can thus be defined as a
requirements documentation that formally
specifies the system level requirements of an
application. This app developed on Android
Platform.

5.1. Android Studio

Android Studio is an integrated development


environment (IDE) for developing for the
Android platform. It was announced on May 16,
2013 at the Google I/O conference by Google's
Product Manager, Katherine Chou. Android
Studio is freely available under the Apache
License 2.0.
Android Studio was in early access preview stage
starting from version 0.1 in May 2013, then
entered beta stage starting from version 0.8
which was released in June 2014. The first stable
build was released in December 2014, starting
from version 1.0.
Based on Jet Brains' IntelliJ IDEA software,
Android Studio is designed specifically for
Android development. It is available for
download on Windows, Mac OS X and Linux,
and replaced Eclipse Android Development
Tools (ADT) as Google's primary IDE for native
Android application development.

5.2. Java JDK

The Java Development Kit (JDK) is an


implementation of either one of the Java SE,
Java EE or Java ME platforms released by Oracle
Corporation in the form of a binary product
aimed at Java developers on Solaris, Linux, Mac
OS X or Windows. The JDK includes a private
JVM and a few other resources to finish the
development of a Java Application. Since the
introduction of the Java platform, it has been by
far the most widely used Software Development
Kit (SDK). On 17 November 2006, Sun
announced that it would be released under the
GNU General Public License (GPL), thus making
it free software. This happened in large part on 8
May 2007, when Sun contributed the source
code to the OpenJDK.

5.3. SQLite

SQLite is a relational database management


system contained in a C programming library. In
contrast to many other database management
systems, SQLite is not a client–server database
engine. Rather, it is embedded into the end
program.
SQLite is ACID-compliant and implements most
of the SQL standard, using a dynamically and
weakly typed SQL syntax that does not guarantee
the domain integrity.
SQLite is a popular choice as embedded database
software for local/client storage in application
software such as web browsers. It is arguably the
most widely deployed database engine, as it is
used today by several widespread browsers,
operating systems, and embedded systems,
among others. SQLite has bindings to many
programming languages.
5.4. Java Programming Language

Java is a general-purpose computer programming


language that is concurrent, class-based, object-
oriented, and specifically designed to have as
few implementation dependencies as possible. It
is intended to let application developers "write
once, run anywhere" (WORA), meaning that
compiled Java code can run on all platforms that
support Java without the need for recompilation.
Java applications are typically compiled to
bytecode that can run on any Java virtual
machine (JVM) regardless of computer
architecture. As of 2015, Java is one of the most
popular programming languages in use,
particularly for client-server web applications,
with a reported 9 million developers. Java was
originally developed by James Gosling at Sun
Microsystems (which has since been acquired by
Oracle Corporation) and released in 1995 as a
core component of Sun Microsystems' Java
platform. The language derives much of its
syntax from C and C++, but it has fewer low-
level facilities than either of them.
The original and reference implementation Java
compilers, virtual machines, and class libraries
were originally released by Sun under
proprietary licences. As of May 2007, in
compliance with the specifications of the Java
Community Process, Sun relicensed most of its
Java technologies under the GNU General Public
License. Others have also developed alternative
implementations of these Sun technologies, such
as the GNU Compiler for Java (bytecode
compiler), GNU Classpath (standard libraries),
and IcedTea-Web (browser plugin for applets).
The latest version is Java 8, which is the only
version currently supported for free by Oracle,
although earlier versions are supported both by
Oracle and other companies on a commercial
basis.

5.5. XML Scripting Language

Extensible Markup Language (XML) is a


markup language that defines a set of rules for
encoding documents in a format which is both
human-readable and machine-readable. It is
defined by the W3C's XML 1.0 Specification and
by several other related specifications, all of
which are free open standards.
The design goals of XML emphasize simplicity,
generality and usability across the Internet. It is a
textual data format with strong support via
Unicode for different human languages.
Although the design of XML focuses on
documents, it is widely used for the
representation of arbitrary data structures such
as those used in web services.
Several schema systems exist to aid in the
definition of XML-based languages, while many
application programming interfaces (APIs) have
been developed to aid the processing of XML
data.
The material in this section is based on the XML
Specification. This is not an exhaustive list of all
the constructs that appear in XML; it provides an
introduction to the key constructs most often
encountered in day-to-day use.
6. Software Specification

 Operating System - Windows/Android


OS
 Technology
- Android
 Design Tool
- Android Studio
 Runtime Environment
- Dalvik/ART
 Compiler
- JACK
 Database
- SQLite

Where,

ART: Android Run Time Environment


JACK: Java Android Compiler Kit

7. Hardware Specification

 Processor - MTK/Snapdragon

 Clock speed - 0.5GHz

 RAM - 512MB

 Storage - 20MB

Processor belonging to any series of vendors


MTK (MediaTek) or Qualcomm Snapdragon will
work fine with the App.
8. Define the modules and their
functionalities
The proposed system consists of the following
modules:

8.1. Subject management Module

Subject management module in this project is


meant for the users. In
this module, subjects are allocated for users.

It does the following tasks:

✔ Give subject , faculty and Semester


✔ View timetable
✔ View leave request

8.2. Timetable Generation Module

It is the important part of project which generate


Timetable
automatically. IN this module it develop module.
Generation done by considering maximum and
minimum workload for a Faculty (without less
and without exceeding). This will be generated
by admin and viewed by Principal and Faculty
who's are the users of the system.

9. Software Design
The most creative and challenging phase of the
life cycle is system design. The term design
describes a final system and the process by
which it is developed. It refers to the technical
specifications that will be applied in
implementations of the system. The importance
of software design can be stated in a single word
“Quality”. Design provides us with
representations of software that can be assessed
for quality. Design is the only way where we can
accurately translate user requirements into a
complete software product or system. Without
design we risk building an unstable system that
might fail if small changes are made. It may as
well be difficult to test, or could be one who’s
quality can’t be tested. So it is an essential phase
in the development of a software product.
10. UML Diagrams
Admin
11. Data Flow Diagrams

The DFD is also known as the bubble chart. It is


a simple graphical formalism that can be used to
represent a system in terms of the input data to
the system, various processing carried out in
these data and the output data generated by the
system. Starting with a set of high-level
functions that a system performance of DFD
model in hierarchically it represents various sub
functions.

In a normal convention, logical DFD can be


completed using only four notations:

• Represents source or destination of data


• Represents Data Flow
• Represents a process that transforms incoming
data into outgoing data
• Represents Data Source

Function Symbol
A function is represented using a circle. This
symbol is called a process or a bubble. Bubbles
are annotated with the names of corresponding
functions.

External Entity Symbol


An external entity such as a librarian, library
member etc is represented by a rectangle. The
external entities are essentially those physical
entities external to the software system, which
interact with the system by inputting data to the
system or by consuming the data produced by the
system.

Data Flow Symbol


A directed arc or an arrow is used as a Data Flow
Symbol. This represents the data flow occurring
between two processes or between an external
entity and a process in direction of the Data
Flow Arrow. Data Flow symbols are annotated
with corresponding data names.

Data Store Symbol


A Data Store represents a logical file; it is
represented using two parallel lines. A logical
file can represent either Data Store Symbol,
which can represent either data structure or a
physical file on disk.

Output Symbol
The output symbol is used when a hardcopy is
produced and the user of the copies cannot be
clearly specified or there are several users of the
output. The DFD at the simplest level is referred
to as the Context Analysis Diagram. These are
expanded by level, each explaining in process in
detail. Processes are numbered for easy
identification and are normally labelled in block
letters. Each data flow is labelled for easy
understanding.
12. Database design
The system is implemented in such a way that all
the valid
Information’s are stored in the database.
Database design converts the data model
developed in logical designing to database
definition. This is supported by database
software. The management of data involves both
the definition of structure of the storage of
information and provision of mechanism for the
manipulation of information. In addition
database system must provide safety of
information handle, despite the system crashes
due to attempts of unauthorized access.
A database is a collection of interrelated data
stored with minimum redundancy to serve many
users quickly and efficiently. In database design,
several views of data must be considered along
with the person who users them. The logical
view is what the data look like, regardless of how
they are stored. The physical view is the way
data exist in physical storage. Tables are
carefully designed aiming to achieve its main
objectives i.e., to make information access easy,
quick, inexpensive and flexible for user.

NORMALIZATION
Normalization is the process of analyzing the
given relation schemas based on their Functional
Dependencies and primary keys to achieve the
desirable properties of Minimizing Redundancy,
Minimizing the insertion, deletion and updating
anomalies.
Normalization is carried out for the following
reasons:
• To structure the data so that perfect
relationship between entries can be
represented.
• To permit simple retrieval of data in response
query and report requests.
• To reduce the need to restructure or reorganize
data when new application requirement arises.

Normalization consists of various levels:

1. First Normal Form (1NF)


A table is in 1NF if there are no duplicate rows in
the table. Each cell is single valued. Entries in a
column are of the same kind.
2. Second Normal Form (2NF)
Second Normal form is based on the concept of
full functional dependency. A table (relation) is
in 2NF if .It is in First Normal Form and if all
non-key attributes are dependent on the key.
Dependent on only a part of the (composite) key,
the definition of 2NF is sometimes phrased as,
"A table is in 2nF if it is in 1NF and if it has no
partial dependencies.”

3. Third Normal Form (3NF)


Third Normal Form is based on the concept of
transitive dependency. A table (relation) is in
3NF if it is in Second Normal Form and if it has
no transitive dependencies.
13. E-R Diagram
14. Testing
Validation and checks
Software validation is achieved through a series
of tests that demonstrate conformity with
requirements. Validation succeeds when software
functions in a manner that can be reasonably
expected by the customer. Here line by line
checking is used to find errors. Comment line
facility is used for checking errors.
Testing is necessary for the success of the
system. During testing, program to be tested is
executed with a set of test data and the output of
the program for test data is evaluated to
determine if the programs are performing as
expected.
Validation means checking the quality of
software in both simulated and live
environments. System validation ensures that the
user can in fact match his/her claims, especially
system performance. True validation is verified
by having each system tested.
First the application goes through a phase often
referred as alpha testing in which the errors and
failures based on simulated user requirements are
verified and studied. The modified software is
then subjected to phase two called beta testing in
the actual user’s site or live environment. After a
scheduled time, failures and errors are
documented for final correction and
enhancements are made before the package is
released.
In a software development project, errors can be
injected at any stage during development. Even if
error detecting and eliminating techniques were
employed in the previous analysis and design
phases, errors are likely to remain undetected.
Unfortunately, these errors will be reflected in
the code. Since code is frequently the only
product that can be executed and whose actual
behaviour can be observed, testing is the phase
where the errors remaining from the earlier
phases must be detected in addition to detecting
the errors introduced during coding activity.
Having proper test cases is central to successful
testing. We would like to determine a set of test
cases such that successful execution of all of
them implies that there are no errors in the
program. Therefore, our project crew aimed at
selecting the test cases such that the maximum
possible numbers of errors are detected by the
minimum number of test cases.
For this we have adopted both manual testing
techniques and automated testing techniques.
First and foremost, testing was done by means of
Inspection, where participants manually examine
system deliverables for occurrences of well-
known errors. Inspection team consists of 5
members who are trained for their tasks. Items
for inspection include completeness of the
design, and functional requirements, internal
completeness and consistency in definition and
usage of terminology, and correctness of the
interfaces between modules. Syntax, grammar,
and some other routine errors were checked by
automated inspection software, so manual
inspection checks are used for more subtle errors.
And we have done the testing following design
phase prior to implementation.

Testing objectives are:


• Testing is a process of executing a program
with the intent of finding an error.
• A good test case is one that has a high
probability of finding an as-yet- undiscovered
error.
• A successful test is one that uncovers an as-
yet-undiscovered error. Automated testing is
performed at four different levels.

14.1. Test Types

1. Unit Testing
2. Integration Testing
3. System Testing
4. Acceptance Testing

14.1.1. Unit Testing

In unit testing different modules are tested


against the specifications produced during
design phase for the modules in the project and
the goal is to test the internal logic of the
modules.

In order to perform the unit testing, the best


approach we adopted in this project is
functional testing in which inputs are given to
the system for which the expected results are
known, boundary values and special values.
For this the module selected was advance
details where the balance amount falls to
negative indicating there is no more payment
required. Secondly performance testing was
done to determine the amount of execution
time spent in various aspects like the module,
program throughput, response time, and the
device utilization by the program unit.

14.1.2. Integration Testing

The primary goal of the integration testing is to


see if the modules can be integrated properly.
The integration testing is therefore considered
as testing the design. Thus in the integration
testing step, all the errors uncovered are
corrected for the next testing steps.

14.1.3. System Testing

System testing is similar to integration testing,


but instead of integrating modules into
programs for testing, programs are integrated
into systems for testing the interfaces between
programs in a system. System testing can be
defined in many ways, but a simple definition
is that validation succeeds when the software
functions in a manner that can be reasonably
expected by the customer.

14.1.4. Acceptance Testing

Once the system tests have been satisfactory


completed, the system is ready for acceptance
testing. Acceptance testing is the process
whereby actual users test a completed
information system in the environment where
it will eventually be used, the end result of
which is the user’s acceptance or rejection.
The admin and staff at Company accepted
proposed system after testing.

14.2. Database Testing

The accuracy and integrity of data stored by


the server is tested. Transactions posted by
client applications are examined to ensure that
data are properly stored, updated and retrieved.
Archiving is also tested.
15. Conclusion
Automatic Timetable Generator is aandroid
based application for generating timetable
automatically. It is a great difficult task that to
manage many Faculty's and allocating subjects
for them at a time manually. So proposed system
will help to overcome this disadvantage. Thus we
can generate timetable for any number of courses
and multiple semesters. This system will help to
create dynamic pages so that for implementing
such a system we can make use of the different
tools are widely applicable and free to use also.
16. SUGGESTION FOR FUTURE
WORK
Automatic Time Table Generator is an Android
based application which could further be made
into a Cloud based application. A client-server
type app can pass notifications to individual
faculties. A student portal could also be added so
that every student could stay updated of their
time table.
17. REFERENCES/BIBILIOGRAPHY
Books:

o Software Engineering Fifth edition by R.


Pressman, McGraw-Hill Publication, 1997

Websites:

o http://en.wikipedia.org/wiki/SQLite
o http://en.wikipedia.org/wiki/java
o http://en.wikipedia.org/wiki/xml
o http://en.wikipedia.org/wiki/android_studio
o http://en.wikipedia.org/wiki/jdk
o https://en.wikipedia.org/wiki/Software_testing
o https://en.wikipedia.org/wiki/Database_normal
ization
18. Appendices
The purpose of system implementation can be
summarized as follows: making the new system
available to a prepared set of users (deployment),
and positioning ongoing support and
maintenance of the system within the performing
organization. At a finer level, deploying the
system consists of executing all steps necessary
to educate the consumers on the use of the new
system, placing the newly developed system into
production, confirming that all data required at
the start of the operation are available and
accurate, and validating that, the functions that
interact with the system are functioning properly.

18.1. Installation Manual

Working of this software is required to set some


basic requirements concentrate on hardware and
software requirements.
18.1.1. JDK Installation

Install the latest JDK, but it can be messy if


you have multiple versions of JDK/JRE.If you
have previously installed older version of
JDK/JRE, un-install ALL of them.

Step 1: Download JDK


➔Go to Java SE download site @
http://oracle.com/technetwork/java/javase/dow
nload/index.html
➔Click the "Download" button under "JDK"
of "Java SE 7".
➔Check "Accept License Agreement".
➔Choose your operating platform, e.g.,
Windows x86 for 32-bit Windows OS or
Windows x64 for 64-bit Windows OS. You
can check whether your Windows OS is 32-bit
or 64-bit via "Control Panel" ⇒ System
⇒underthe “System Type".

Step 2: Install JDK and JRE


Run the downloaded installer which
installs both the JDK (Java Development Kit)
and JRE (Java Runtime). By default, the JDK
will be installed in directory "C:\Program
Files\Java\jdk1.7.0_xx", where xx denotes the
latest upgrade number; and JRE in
"C:\Program Files\Java\jre7".
For novices, accept the defaults. Simply click
"next"..."next"... to install JDK in "C:\Program
Files\Java\jdk1.7.0_xx" and JRE in
"C:\Program Files\Java\jre7".
Take note of your JDK installed directory
(which you will need to use in the next step).
Check the JDK installed directory by
inspecting these folders using Windows'
Explorer.

Step 3: Include JDK's "bin" Directory in the


PATH
➢ Variable name: PATH
➢ Variable value: c:\Program
Files\Java\jdk1.7.0_xx\bin;[exiting entries]
Place the JDK bin directory in front of
"c:\windows\system32" and "c:\windows".
This is because some Windows systems may
have an out-dated copy of JDK/JRE in these
directories. Do a search for "java.exe", and you
will be amazed by the findings.

Step 4: Verify the JDK Installation


Launch a CMD shell (Click "Start" button ⇒
run... ⇒ enter "cmd"; or "Start" button ⇒ All
Programs ⇒ Accessories ⇒ Command
Prompt).
✗ Issue a "path" command to list the
contents of the PATH environment variable.
Check the output and make sure that
<JAVA_HOME>\bin is listed in the PATH.
✗ prompt> path
PATH=c:\Program
Files\Java\jdk1.7.0_xx\bin;[other entries]
✗ Issue the following commands to verify
that JDK/JRE are properly installed and
display their version:
✗ prompt> java -version
✗ java version "1.7.0_xx"
✗ Java(TM) SE Runtime Environment (build
1.7.0_xx-b11)
✗ Java HotSpot(TM) Client VM (build 23.3-
b01, mixed mode, sharing)
✗ prompt>javac -version javac 1.7.0_xx

18.1.2. Android Studio Installation

Installing the Android SDK


If you haven't already, download the Android
SDK bundle for Android Studio or the stand-
alone SDK Tools.

Then, select which SDK bundle you want to


install.

1. Launch the .exe file you just downloaded.

2. Follow the setup wizard to install Android


Studio and any necessary SDK tools.

On some Windows systems, the launcher


script does not find where Java is installed. If
you encounter this problem, you need to set an
environment variable indicating the correct
location.

Select Start menu > Computer > System


Properties > Advanced System Properties.
Then open Advanced tab > Environment
Variables and add a new system variable
JAVA_HOME that points to your JDK folder,
for example C:\Program
Files\Java\jdk1.7.0_21.