master 99be7451bc64 cached
336 files
3.5 MB
927.8k tokens
1757 symbols
1 requests
Download .txt
Showing preview only (3,715K chars total). Download the full file or copy to clipboard to get everything.
Repository: khandelwal-arpit/springboot-starterkit-mysql
Branch: master
Commit: 99be7451bc64
Files: 336
Total size: 3.5 MB

Directory structure:
gitextract_v8vgjgt0/

├── .dockerignore
├── .gitignore
├── Dockerfile
├── LICENSE
├── docker-compose.yml
├── pom.xml
├── readme.md
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── starterkit/
    │   │           └── springboot/
    │   │               └── brs/
    │   │                   ├── BusReservationSystemApplication.java
    │   │                   ├── config/
    │   │                   │   ├── BrsConfiguration.java
    │   │                   │   ├── FakeController.java
    │   │                   │   ├── PageConfig.java
    │   │                   │   └── PropertiesConfig.java
    │   │                   ├── controller/
    │   │                   │   └── v1/
    │   │                   │       ├── api/
    │   │                   │       │   ├── BusReservationController.java
    │   │                   │       │   └── UserController.java
    │   │                   │       ├── command/
    │   │                   │       │   ├── AdminSignupFormCommand.java
    │   │                   │       │   ├── AgencyFormCommand.java
    │   │                   │       │   ├── BusFormCommand.java
    │   │                   │       │   ├── PasswordFormCommand.java
    │   │                   │       │   ├── ProfileFormCommand.java
    │   │                   │       │   └── TripFormCommand.java
    │   │                   │       ├── request/
    │   │                   │       │   ├── BookTicketRequest.java
    │   │                   │       │   ├── GetTripSchedulesRequest.java
    │   │                   │       │   └── UserSignupRequest.java
    │   │                   │       └── ui/
    │   │                   │           ├── AdminController.java
    │   │                   │           └── DashboardController.java
    │   │                   ├── dto/
    │   │                   │   ├── mapper/
    │   │                   │   │   ├── TicketMapper.java
    │   │                   │   │   ├── TripMapper.java
    │   │                   │   │   ├── TripScheduleMapper.java
    │   │                   │   │   └── UserMapper.java
    │   │                   │   ├── model/
    │   │                   │   │   ├── bus/
    │   │                   │   │   │   ├── AgencyDto.java
    │   │                   │   │   │   ├── BusDto.java
    │   │                   │   │   │   ├── StopDto.java
    │   │                   │   │   │   ├── TicketDto.java
    │   │                   │   │   │   ├── TripDto.java
    │   │                   │   │   │   └── TripScheduleDto.java
    │   │                   │   │   └── user/
    │   │                   │   │       ├── RoleDto.java
    │   │                   │   │       └── UserDto.java
    │   │                   │   └── response/
    │   │                   │       ├── Response.java
    │   │                   │       └── ResponseError.java
    │   │                   ├── exception/
    │   │                   │   ├── BRSException.java
    │   │                   │   ├── CustomizedResponseEntityExceptionHandler.java
    │   │                   │   ├── EntityType.java
    │   │                   │   └── ExceptionType.java
    │   │                   ├── model/
    │   │                   │   ├── bus/
    │   │                   │   │   ├── Agency.java
    │   │                   │   │   ├── Bus.java
    │   │                   │   │   ├── Stop.java
    │   │                   │   │   ├── Ticket.java
    │   │                   │   │   ├── Trip.java
    │   │                   │   │   └── TripSchedule.java
    │   │                   │   └── user/
    │   │                   │       ├── Role.java
    │   │                   │       ├── User.java
    │   │                   │       └── UserRoles.java
    │   │                   ├── repository/
    │   │                   │   ├── bus/
    │   │                   │   │   ├── AgencyRepository.java
    │   │                   │   │   ├── BusRepository.java
    │   │                   │   │   ├── StopRepository.java
    │   │                   │   │   ├── TicketRepository.java
    │   │                   │   │   ├── TripRepository.java
    │   │                   │   │   └── TripScheduleRepository.java
    │   │                   │   └── user/
    │   │                   │       ├── RoleRepository.java
    │   │                   │       └── UserRepository.java
    │   │                   ├── security/
    │   │                   │   ├── CustomUserDetailsService.java
    │   │                   │   ├── MultiHttpSecurityConfig.java
    │   │                   │   ├── SecurityConstants.java
    │   │                   │   ├── api/
    │   │                   │   │   ├── ApiJWTAuthenticationFilter.java
    │   │                   │   │   └── ApiJWTAuthorizationFilter.java
    │   │                   │   └── form/
    │   │                   │       ├── CustomAuthenticationSuccessHandler.java
    │   │                   │       ├── CustomLogoutSuccessHandler.java
    │   │                   │       └── FormBasedJWTAuthenticationFilter.java
    │   │                   ├── service/
    │   │                   │   ├── BusReservationService.java
    │   │                   │   ├── BusReservationServiceImpl.java
    │   │                   │   ├── UserService.java
    │   │                   │   └── UserServiceImpl.java
    │   │                   └── util/
    │   │                       ├── DateUtils.java
    │   │                       └── RandomStringUtil.java
    │   └── resources/
    │       ├── application-prod.properties
    │       ├── application-uat.properties
    │       ├── application.properties
    │       ├── banner.txt
    │       ├── custom.properties
    │       ├── static/
    │       │   ├── auth/
    │       │   │   ├── css/
    │       │   │   │   └── style.css
    │       │   │   ├── fonts/
    │       │   │   │   └── material-icon/
    │       │   │   │       └── css/
    │       │   │   │           └── material-design-iconic-font.css
    │       │   │   └── scss/
    │       │   │       ├── common/
    │       │   │       │   ├── extend.scss
    │       │   │       │   ├── fonts.scss
    │       │   │       │   ├── global.scss
    │       │   │       │   ├── minxi.scss
    │       │   │       │   └── variables.scss
    │       │   │       ├── layouts/
    │       │   │       │   ├── main.scss
    │       │   │       │   └── responsive.scss
    │       │   │       └── style.scss
    │       │   └── dashboard/
    │       │       ├── assets/
    │       │       │   └── plugins/
    │       │       │       ├── bootstrap/
    │       │       │       │   ├── css/
    │       │       │       │   │   ├── bootstrap-grid.css
    │       │       │       │   │   ├── bootstrap-reboot.css
    │       │       │       │   │   └── bootstrap.css
    │       │       │       │   └── js/
    │       │       │       │       └── bootstrap.js
    │       │       │       ├── chartist-js/
    │       │       │       │   └── dist/
    │       │       │       │       ├── chartist-init.css
    │       │       │       │       ├── chartist-init.js
    │       │       │       │       ├── chartist.css
    │       │       │       │       ├── chartist.js
    │       │       │       │       └── scss/
    │       │       │       │           ├── chartist.scss
    │       │       │       │           └── settings/
    │       │       │       │               └── _chartist-settings.scss
    │       │       │       ├── chartist-plugin-tooltip-master/
    │       │       │       │   ├── .gitignore
    │       │       │       │   ├── CHANGELOG.md
    │       │       │       │   ├── Gruntfile.js
    │       │       │       │   ├── LICENSE
    │       │       │       │   ├── README.md
    │       │       │       │   ├── bower.json
    │       │       │       │   ├── dist/
    │       │       │       │   │   ├── LICENSE
    │       │       │       │   │   ├── chartist-plugin-tooltip.css
    │       │       │       │   │   └── chartist-plugin-tooltip.js
    │       │       │       │   ├── package.json
    │       │       │       │   ├── src/
    │       │       │       │   │   ├── css/
    │       │       │       │   │   │   └── chartist-plugin-tooltip.css
    │       │       │       │   │   ├── scripts/
    │       │       │       │   │   │   └── chartist-plugin-tooltip.js
    │       │       │       │   │   └── scss/
    │       │       │       │   │       └── chartist-plugin-tooltip.scss
    │       │       │       │   ├── tasks/
    │       │       │       │   │   ├── aliases.yml
    │       │       │       │   │   ├── clean.js
    │       │       │       │   │   ├── copy.js
    │       │       │       │   │   ├── jasmine.js
    │       │       │       │   │   ├── jshint.js
    │       │       │       │   │   ├── sass.js
    │       │       │       │   │   ├── uglify.js
    │       │       │       │   │   └── umd.js
    │       │       │       │   └── test/
    │       │       │       │       ├── .jshintrc
    │       │       │       │       ├── runner.html
    │       │       │       │       └── spec/
    │       │       │       │           └── spec-tooltip.js
    │       │       │       ├── d3/
    │       │       │       │   ├── API.md
    │       │       │       │   ├── CHANGES.md
    │       │       │       │   ├── LICENSE
    │       │       │       │   ├── README.md
    │       │       │       │   ├── d3.js
    │       │       │       │   └── d3.min-v4.js
    │       │       │       ├── gmaps/
    │       │       │       │   ├── gmaps.js
    │       │       │       │   ├── jquery.gmaps.js
    │       │       │       │   └── lib/
    │       │       │       │       ├── gmaps.controls.js
    │       │       │       │       ├── gmaps.core.js
    │       │       │       │       ├── gmaps.events.js
    │       │       │       │       ├── gmaps.geofences.js
    │       │       │       │       ├── gmaps.geometry.js
    │       │       │       │       ├── gmaps.layers.js
    │       │       │       │       ├── gmaps.map_types.js
    │       │       │       │       ├── gmaps.markers.js
    │       │       │       │       ├── gmaps.native_extensions.js
    │       │       │       │       ├── gmaps.overlays.js
    │       │       │       │       ├── gmaps.routes.js
    │       │       │       │       ├── gmaps.static.js
    │       │       │       │       ├── gmaps.streetview.js
    │       │       │       │       ├── gmaps.styles.js
    │       │       │       │       └── gmaps.utils.js
    │       │       │       └── sticky-kit-master/
    │       │       │           └── dist/
    │       │       │               └── sticky-kit.js
    │       │       └── html/
    │       │           ├── css/
    │       │           │   ├── animate.css
    │       │           │   ├── colors/
    │       │           │   │   └── blue.css
    │       │           │   ├── spinners.css
    │       │           │   └── style.css
    │       │           ├── js/
    │       │           │   ├── custom.js
    │       │           │   ├── dashboard1.js
    │       │           │   ├── jquery.slimscroll.js
    │       │           │   ├── sidebarmenu.js
    │       │           │   └── waves.js
    │       │           └── scss/
    │       │               ├── app.scss
    │       │               ├── colors/
    │       │               │   └── blue.scss
    │       │               ├── grid.scss
    │       │               ├── icons/
    │       │               │   ├── font-awesome/
    │       │               │   │   ├── css/
    │       │               │   │   │   └── font-awesome.css
    │       │               │   │   ├── fonts/
    │       │               │   │   │   └── FontAwesome.otf
    │       │               │   │   ├── less/
    │       │               │   │   │   ├── animated.less
    │       │               │   │   │   ├── bordered-pulled.less
    │       │               │   │   │   ├── core.less
    │       │               │   │   │   ├── fixed-width.less
    │       │               │   │   │   ├── font-awesome.less
    │       │               │   │   │   ├── icons.less
    │       │               │   │   │   ├── larger.less
    │       │               │   │   │   ├── list.less
    │       │               │   │   │   ├── mixins.less
    │       │               │   │   │   ├── path.less
    │       │               │   │   │   ├── rotated-flipped.less
    │       │               │   │   │   ├── screen-reader.less
    │       │               │   │   │   ├── stacked.less
    │       │               │   │   │   └── variables.less
    │       │               │   │   ├── old/
    │       │               │   │   │   ├── .bower.json
    │       │               │   │   │   ├── .gitignore
    │       │               │   │   │   ├── .npmignore
    │       │               │   │   │   ├── HELP-US-OUT.txt
    │       │               │   │   │   ├── bower.json
    │       │               │   │   │   ├── css/
    │       │               │   │   │   │   └── font-awesome.css
    │       │               │   │   │   ├── fonts/
    │       │               │   │   │   │   └── FontAwesome.otf
    │       │               │   │   │   ├── less/
    │       │               │   │   │   │   ├── animated.less
    │       │               │   │   │   │   ├── bordered-pulled.less
    │       │               │   │   │   │   ├── core.less
    │       │               │   │   │   │   ├── extras.less
    │       │               │   │   │   │   ├── fixed-width.less
    │       │               │   │   │   │   ├── font-awesome.less
    │       │               │   │   │   │   ├── icons.less
    │       │               │   │   │   │   ├── larger.less
    │       │               │   │   │   │   ├── list.less
    │       │               │   │   │   │   ├── mixins.less
    │       │               │   │   │   │   ├── path.less
    │       │               │   │   │   │   ├── rotated-flipped.less
    │       │               │   │   │   │   ├── spinning.less
    │       │               │   │   │   │   ├── stacked.less
    │       │               │   │   │   │   └── variables.less
    │       │               │   │   │   └── scss/
    │       │               │   │   │       ├── _animated.scss
    │       │               │   │   │       ├── _bordered-pulled.scss
    │       │               │   │   │       ├── _core.scss
    │       │               │   │   │       ├── _extras.scss
    │       │               │   │   │       ├── _fixed-width.scss
    │       │               │   │   │       ├── _icons.scss
    │       │               │   │   │       ├── _larger.scss
    │       │               │   │   │       ├── _list.scss
    │       │               │   │   │       ├── _mixins.scss
    │       │               │   │   │       ├── _path.scss
    │       │               │   │   │       ├── _rotated-flipped.scss
    │       │               │   │   │       ├── _spinning.scss
    │       │               │   │   │       ├── _stacked.scss
    │       │               │   │   │       ├── _variables.scss
    │       │               │   │   │       └── font-awesome.scss
    │       │               │   │   └── scss/
    │       │               │   │       ├── _animated.scss
    │       │               │   │       ├── _bordered-pulled.scss
    │       │               │   │       ├── _core.scss
    │       │               │   │       ├── _fixed-width.scss
    │       │               │   │       ├── _icons.scss
    │       │               │   │       ├── _larger.scss
    │       │               │   │       ├── _list.scss
    │       │               │   │       ├── _mixins.scss
    │       │               │   │       ├── _path.scss
    │       │               │   │       ├── _rotated-flipped.scss
    │       │               │   │       ├── _screen-reader.scss
    │       │               │   │       ├── _stacked.scss
    │       │               │   │       ├── _variables.scss
    │       │               │   │       └── font-awesome.scss
    │       │               │   ├── linea-icons/
    │       │               │   │   ├── linea.css
    │       │               │   │   ├── linea.less
    │       │               │   │   └── linea.scss
    │       │               │   ├── material-design-iconic-font/
    │       │               │   │   └── css/
    │       │               │   │       └── material-design-iconic-font.css
    │       │               │   ├── simple-line-icons/
    │       │               │   │   ├── css/
    │       │               │   │   │   └── simple-line-icons.css
    │       │               │   │   ├── less/
    │       │               │   │   │   └── simple-line-icons.less
    │       │               │   │   └── scss/
    │       │               │   │       └── simple-line-icons.scss
    │       │               │   ├── themify-icons/
    │       │               │   │   ├── ie7/
    │       │               │   │   │   ├── ie7.css
    │       │               │   │   │   └── ie7.js
    │       │               │   │   ├── themify-icons.css
    │       │               │   │   └── themify-icons.less
    │       │               │   └── weather-icons/
    │       │               │       ├── css/
    │       │               │       │   ├── weather-icons-core.css
    │       │               │       │   ├── weather-icons-variables.css
    │       │               │       │   ├── weather-icons-wind.css
    │       │               │       │   └── weather-icons.css
    │       │               │       ├── less/
    │       │               │       │   ├── css/
    │       │               │       │   │   ├── variables-beaufort.css
    │       │               │       │   │   ├── variables-day.css
    │       │               │       │   │   ├── variables-direction.css
    │       │               │       │   │   ├── variables-misc.css
    │       │               │       │   │   ├── variables-moon.css
    │       │               │       │   │   ├── variables-neutral.css
    │       │               │       │   │   ├── variables-night.css
    │       │               │       │   │   ├── variables-time.css
    │       │               │       │   │   └── variables-wind-names.css
    │       │               │       │   ├── icon-classes/
    │       │               │       │   │   ├── classes-beaufort.less
    │       │               │       │   │   ├── classes-day.less
    │       │               │       │   │   ├── classes-direction.less
    │       │               │       │   │   ├── classes-misc.less
    │       │               │       │   │   ├── classes-moon-aliases.less
    │       │               │       │   │   ├── classes-moon.less
    │       │               │       │   │   ├── classes-neutral.less
    │       │               │       │   │   ├── classes-night.less
    │       │               │       │   │   ├── classes-time.less
    │       │               │       │   │   ├── classes-wind-aliases.less
    │       │               │       │   │   ├── classes-wind-degrees.less
    │       │               │       │   │   └── classes-wind.less
    │       │               │       │   ├── icon-variables/
    │       │               │       │   │   ├── variables-beaufort.less
    │       │               │       │   │   ├── variables-day.less
    │       │               │       │   │   ├── variables-direction.less
    │       │               │       │   │   ├── variables-misc.less
    │       │               │       │   │   ├── variables-moon.less
    │       │               │       │   │   ├── variables-neutral.less
    │       │               │       │   │   ├── variables-night.less
    │       │               │       │   │   ├── variables-time.less
    │       │               │       │   │   └── variables-wind-names.less
    │       │               │       │   ├── mappings/
    │       │               │       │   │   ├── wi-forecast-io.less
    │       │               │       │   │   ├── wi-owm.less
    │       │               │       │   │   ├── wi-wmo4680.less
    │       │               │       │   │   └── wi-yahoo.less
    │       │               │       │   ├── weather-icons-classes.less
    │       │               │       │   ├── weather-icons-core.less
    │       │               │       │   ├── weather-icons-variables.less
    │       │               │       │   ├── weather-icons-wind.less
    │       │               │       │   ├── weather-icons-wind.min.less
    │       │               │       │   ├── weather-icons.less
    │       │               │       │   └── weather-icons.min.less
    │       │               │       └── sass/
    │       │               │           ├── icon-classes/
    │       │               │           │   ├── classes-beaufort.scss
    │       │               │           │   ├── classes-day.scss
    │       │               │           │   ├── classes-direction.scss
    │       │               │           │   ├── classes-misc.scss
    │       │               │           │   ├── classes-moon-aliases.scss
    │       │               │           │   ├── classes-moon.scss
    │       │               │           │   ├── classes-neutral.scss
    │       │               │           │   ├── classes-night.scss
    │       │               │           │   ├── classes-time.scss
    │       │               │           │   ├── classes-wind-aliases.scss
    │       │               │           │   ├── classes-wind-degrees.scss
    │       │               │           │   └── classes-wind.scss
    │       │               │           ├── icon-variables/
    │       │               │           │   ├── variables-beaufort.scss
    │       │               │           │   ├── variables-day.scss
    │       │               │           │   ├── variables-direction.scss
    │       │               │           │   ├── variables-misc.scss
    │       │               │           │   ├── variables-moon.scss
    │       │               │           │   ├── variables-neutral.scss
    │       │               │           │   ├── variables-night.scss
    │       │               │           │   ├── variables-time.scss
    │       │               │           │   └── variables-wind-names.scss
    │       │               │           ├── mappings/
    │       │               │           │   ├── wi-forecast-io.scss
    │       │               │           │   ├── wi-owm.scss
    │       │               │           │   ├── wi-wmo4680.scss
    │       │               │           │   └── wi-yahoo.scss
    │       │               │           ├── weather-icons-classes.scss
    │       │               │           ├── weather-icons-core.scss
    │       │               │           ├── weather-icons-variables.scss
    │       │               │           ├── weather-icons-wind.min.scss
    │       │               │           ├── weather-icons-wind.scss
    │       │               │           ├── weather-icons.min.scss
    │       │               │           └── weather-icons.scss
    │       │               ├── material.scss
    │       │               ├── pages.scss
    │       │               ├── prepros-6.config
    │       │               ├── responsive.scss
    │       │               ├── sidebar.scss
    │       │               ├── style.scss
    │       │               ├── variable.scss
    │       │               └── widgets.scss
    │       └── templates/
    │           ├── agency.html
    │           ├── bus.html
    │           ├── dashboard.html
    │           ├── error.html
    │           ├── fragments/
    │           │   ├── footer.html
    │           │   ├── header.html
    │           │   ├── navigation.html
    │           │   └── sidebar.html
    │           ├── layout/
    │           │   └── layout.html
    │           ├── login.html
    │           ├── profile.html
    │           ├── signup.html
    │           └── trip.html
    └── test/
        └── java/
            └── com/
                └── starterkit/
                    └── springboot/
                        └── brs/
                            └── BusReservationSystemApplicationTests.java

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
db/data
target/classes
target/generated-sources
target/generated-test-sources
target/maven-archiver
target/maven-status
target/surefire
target/test-classes

================================================
FILE: .gitignore
================================================
HELP.md
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
/build/

### Database ###
db/*

#mac-os
*.DS_Store


================================================
FILE: Dockerfile
================================================
# our base build image
FROM maven:3.6.0-jdk-8 as maven

# copy the project files
COPY ./pom.xml ./pom.xml

# build all dependencies
RUN mvn dependency:go-offline -B

# copy your other files
COPY ./src ./src

# build for release
RUN mvn package -DskipTests

# our final base image
FROM openjdk:8-jre-alpine

# set deployment directory
WORKDIR /my-project

# copy over the built artifact from the maven image
COPY --from=maven target/springboot-starterkit-mysql-1.0.jar ./

# set the startup command to run your binary
CMD ["java", "-jar", "./springboot-starterkit-mysql-1.0.jar"]


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2020 Arpit Khandelwal

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: docker-compose.yml
================================================
version: '3.5'
services:
  mysql:
    image: mysql:latest
    restart: always
    container_name: "mysql"
    volumes:
      - "./db:/var/lib/mysql"
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=brs
      - MYSQL_USER=brs-user
      - MYSQL_PASSWORD=changeit
  web:
    build: .
    links:
      - mysql
    container_name: BRS-Service
    restart: on-failure
    ports:
      - "8080:8080"
    environment:
      - DB_PORT=3306
      - DB_NAME=brs
      - DB_HOST=mysql
      - MYSQL_USER=brs-user
      - MYSQL_USER_PASSWORD=changeit
      - SPRING_PROFILES_ACTIVE=prod
    depends_on:
      - mysql

================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.3.RELEASE</version>
		<relativePath/>
	</parent>
	<groupId>com.starterkit.springboot</groupId>
	<artifactId>springboot-starterkit-mysql</artifactId>
	<version>1.0</version>
	<name>springboot-starterkit-mysql</name>
	<packaging>jar</packaging>
	<description>Demo project for Spring Boot with MySQL DB</description>

	<properties>
		<java.version>1.8</java.version>
		<downloadSources>true</downloadSources>
		<downloadJavadocs>true</downloadJavadocs>
	</properties>

	<repositories>
		<repository>
			<id>jcenter-snapshots</id>
			<name>jcenter</name>
			<url>https://jcenter.bintray.com/</url>
		</repository>
	</repositories>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>nz.net.ultraq.thymeleaf</groupId>
			<artifactId>thymeleaf-layout-dialect</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-rest-hal-browser</artifactId>
		</dependency>
		<dependency>
			<groupId>io.jsonwebtoken</groupId>
			<artifactId>jjwt</artifactId>
			<version>0.9.1</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.modelmapper</groupId>
			<artifactId>modelmapper</artifactId>
			<version>2.3.2</version>
		</dependency>
		<dependency>
			<groupId>javax.persistence</groupId>
			<artifactId>persistence-api</artifactId>
			<version>1.0.2</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-boot-starter</artifactId>
			<version>3.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
		</dependency>
	</dependencies>

	<profiles>
		<profile>
			<id>UAT</id>
			<properties>
				<activatedProperties>UAT</activatedProperties>
			</properties>
		</profile>
		<profile>
			<id>PROD</id>
			<properties>
				<activatedProperties>PROD</activatedProperties>
			</properties>
		</profile>
	</profiles>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>


================================================
FILE: readme.md
================================================
<h1 align="center">
  <br>
  <a><img src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/spring-framework.png" alt="spring boot"></a>
  <br>
  Spring Boot Starter-kit
  <br>
</h1>

<h4 align="center">Production ready starter-kit for Spring Boot applications with MySQL database.</h4>

<p align="center">
    <a alt="Java">
        <img src="https://img.shields.io/badge/Java-v1.8-orange.svg" />
    </a>
    <a alt="Spring Boot">
        <img src="https://img.shields.io/badge/Spring%20Boot-v2.3.3-brightgreen.svg" />
    </a>
    <a alt="Bootstrap">
        <img src="https://img.shields.io/badge/Bootstrap-v4.0.0-yellowgreen.svg">
    </a>
    <a alt="Material">
        <img src="https://img.shields.io/badge/Material%20Design-UI-orange.svg">  
    </a>      
    <a alt="Docker">
        <img src="https://img.shields.io/badge/Docker-v19-yellowgreen.svg" />
    </a>
    <a alt="Dependencies">
        <img src="https://img.shields.io/badge/dependencies-up%20to%20date-brightgreen.svg" />
    </a>
    <a alt="Contributions">
        <img src="https://img.shields.io/badge/contributions-welcome-orange.svg" />
    </a>
    <a alt="License">
        <img src="https://img.shields.io/badge/license-MIT-blue.svg" />
    </a>
</p>

## Table of Contents ##
1. [Philosophy](#Philosophy)
2. [Medium Articles](#Medium-Articles)
3. [Spring Boot](#Spring-Boot)
4. [Application](#Application)
5. [Database Schema](#Database-Schema)
6. [Technology](#Technology)
7. [Application Structure](#Application-Structure)
8. [Run Locally](#Running-the-server-locally)
9. [Run Insider Docker](#Running-the-server-in-Docker-Container)
10. [API Documentation](#API-Documentation)
11. [User Interface](#User-Interface)
12. [Contributor](#Contributor)
13. [License](#License)

## Philosophy ##
A lot of work has gone into Spring Boot to reduce complexity and dependencies, which largely alleviates our previous reservations. If you live in a Spring ecosystem and are moving to microservices, Spring Boot is now the obvious choice. Spring Boot allows easy set up of standalone Spring-based applications. It's ideal for pulling up new microservices and easy to deploy. It also makes data access less of a pain due to the hibernate mappings with much less boilerplate code. You can get started with minimum fuss due to it taking an opinionated view of the Spring platform and third-party libraries. Most Spring Boot applications need very little Spring configuration. 

The greatest thing about Spring Boot is the ability to be up and running in very little time. You don’t have to install a web server like JBoss, Websphere, or even Tomcat for that matter. All you need to do is pull in the proper libraries, annotate, and fire away. If you are going to do a lot of Spring Boot projects, I would highly suggest using the IntelliJ IDEA IDE. It has some great features for making Boot projects really easy to manage. You can of course choose between Maven or Gradle to manage dependencies and builds. This starter kit is based on Maven as it is what I am familiar and slightly more comfortable with. 

## Medium Articles ##
Readers can find more information about this starter-kit on my medium publication [The Resonant Web](https://medium.com/the-resonant-web). I have written a series of two articles on Spring Boot v2, here are the links:

[Part-1](https://medium.com/the-resonant-web/spring-boot-2-0-starter-kit-part-1-23ddff0c7da2)  
[Part-2](https://medium.com/the-resonant-web/spring-boot-2-0-project-structure-and-best-practices-part-2-7137bdcba7d3)

There is also a NoSQL version of this starter kit which is built with MongoDB as the database. The location of GitHub repository for the same is [here](https://github.com/khandelwal-arpit/springboot-starterkit).

## Spring Boot ##
_Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can just run. We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration._

**Spring Boot is opinionated** : This simply means that Spring Boot has its own configurations, application structures, dependencies, Servers and other environment configuration available inside its realm. Thus, to say Spring Boot has its own opinions about an application development environment. For example, most of the Java-based web applications use tomcat server. While working on Spring Boot you need not use any server, because Spring Boot already has an embedded tomcat container.

**Spring Boot is stand-alone** : What it means is that you don’t need to use any other third-party library or server to run or develop a spring boot application, it already has all of it.

**It is production-grade** : This implies that application developed using Spring Boot defaults is able to handle all complexities and requirements of a production environment.

**Still very customizable** : It is not worth using a framework which has its own rigid opinions, which you can’t customize or change according to your own business requirements. Although Spring Boot is opinionated you can easily change or customize its defaults to suit your own needs. 

## Application ##
This starter kit focuses on how to use Spring Boot following all the best practices that are recommended by Spring Framework 5.0, ensure the code is loosely coupled and that all the layers in the application are completely independent of each other and talk using neutral objects. While writing this kit, I have done sufficient research around the code structure and usage of appropriate design patterns to make this as an excellent starting point to begin coding your own web application.

The kit would have been incomplete if it did not have a concrete use case to implement, here I have taken a case study of a _Bus Reservation System_ and tried to implement an Admin portal which can be operated over browsers and a series of REST APIs to interact with the system using mobile applications or frontend applications written for the browsers. The complete systems has two important actors :

1. Admin user
2. End user

The _Admin user_ can access this application on browser (laptop or mobile/tablet, doesn't really matter as this is built using bootstrap, material design and is completely responsive) and can perform the following actions :

1. Signup
2. Login
3. Update their profile
4. Create an agency
5. Add buses to the agency
6. Add trips consisting of predefined stops and buses
 
The _End user_ can use their mobile application (yet to be built, however the REST APIs are ready and could be used via Postman or Swagger) to perform the following actions :

1. Signup
2. Login (and get a JWT token) 
3. List all available stops
4. Search a trip between any two stops
5. Filter search results with a date option
6. Book a ticket for a given trip schedule

Admin interface and REST APIs both have their independent authentication mechanisms, the web application uses the cookie based authentication (provided by default by Spring security) and the REST API uses the JWT authentication for access. This application assumes the availability of 'MySQL' installation on the localhost where the server will run or the use of docker-compose to boot up a mysql container and link the application with it within the realm of docker.

Any changes that the admin users will do on the web portal will impact the search results of the end users, there will be certain use cases which you may find missing here, I hope you will appreciate that the overall idea was to present a way to create such an application completely inside the realm of Spring Boot and not to actually building a fully functional reservation system.

The admin user interface is completely written in material design using Bootstrap v4 and is responsive to suite a variety of devices. The template engine used to render the admin views is Thymeleaf since the library is extremely extensible and its natural templating capability ensures templates can be prototyped without a back-end – which makes development very fast when compared with other popular template engines such as JSP.

## Database Schema ##
The current schema looks as follows:

<img src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/db-schema.png" alt="spring boot"></a>

- The authentication and authorization is governed by _User_ and _Role_ entities.
- The _Agency_ entity keeps the details of agency along with who owns it.
- The _Stop_ entity keeps the data about all the stops in the system.
- The _Bus_ entity has the data of all the buses for various agencies along with their capacity and make years.
- The _Trip_ and _TripSchedule_ entities keep the information about all the trips that agency owners create within the system. Information like source and destination stops, journey time, data of travel, tickets sold so far and the available seats is collected in them.
- Last, the _Ticket_ entity keeps information about all the tickets issued in the application for various trips.
  
## Technology ##
Following libraries were used during the development of this starter kit :

- **Spring Boot** - Server side framework
- **Docker** - Containerizing framework
- **MySQL** - Database 
- **Swagger** - API documentation
- **Thymeleaf** - Templating engine
- **Material** - UI theming/design
- **Bootstrap** - CSS framework
- **JWT** - Authentication mechanism for REST APIs


## Application Structure ##
Spring Boot is an opinionated framework that makes our life very easy since we don't have to choose the versions of different dependencies based on the version of Spring framework, its all taken care of by Spring Boot. I have tried to follow the same ideology while creating the project structure, at first it might seem like overwhelming, but do believe me once you start writing your pieces the structure will help you immensely by saving your time and thinking about questions which are already answered. The structure look as follows :

<img src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/project-structure.png" alt="project structure"></a>

**_Models & DTOs_**

The various models of the application are organized under the **_model_** package, their DTOs(data transfer objects) are present under the **_dto_** package. There are different opinions about whether we should use DTOs or not, I belong to the set of minds who think we definitely should and not using DTOs makes your model layer very tightly coupled with the UI layer and that is something that no enterprise project should ever get into. DTOs let us transfer only the data that we need to share with the user interface and not the entire model object that we may have aggregated using several sub-objects and persisted in the database. The mapping of models to the DTOs can be handled using ModelMapper utility, however its only useful when your DTO is almost similar (literally) to the concerned models which is not always the case and hence I prefer using custom mapper classes. You can find some examples under the dto/mapper package.

**_DAOs_**

The data access objects (DAOs) are present in the **_repository_** package. They are all extensions of the CrudRepository Interface helping the service layer to persist and retrieve the data from MySQL. The service layer is defined under the **_service_** package, considering the current case study it made sense to create two basic services - UserService and BusReservationService to satisfy the different business operations that the users are executing using the UI.

**_Security_**

The security setting are present under the **_config_** package and the actual configurations are done under the class present in the **_security_** package. The application has different security concepts for the admin portal and the REST APIs, for the portal I have applied the default spring session mechanism that is based on the concept of sessionID and cookies. For the REST APIs I have used JWT token based authentication mechanism.

**_Controllers_**

Last, but the most important part is the controller layer. It binds everything together right from the moment a request is intercepted till the response is prepared and sent back. The controller layer is present in the **_controller_** package, the best practices suggest that we keep this layer versioned to support multiple versions of the application and the same practice is applied here. For now code is only present under v1 but over the time I expect to have different versions having different features. The Admin portal related controllers are present in the **_ui_** package and it's concerning form command objects are located under the **_command_** package. The REST API controllers are located under the **_api_** package and the corresponding request classes are located under the **_request_** package. 

**_Request and Form Commands_**

Again, there are different opinions amongst the fraternity regarding the usage of separate classes for mapping the incoming request vs using the DTOs, I am personally a fan of segregating the two as far as possible to promote loose coupling amongst the UI and controller layer. The request objects and the form commands do give us a way to apply an additional level of validations on the incoming requests before they get converted to the DTOs which transfer valid information to the service layer for persistence and data retrieval. We could use DTOs here and some developers prefer that approach as it reduces some additional classes, however I usually prefer to keep the validation logic separate from the transfer objects and hence am inclined to use the request/command objects ahead of them.

The static resources are grouped under the **_resources_** directory. All the UI objects and their styling aspects can be located here.

## Response and Exception Handling ##
I have tried to experiment a bit with the RuntimeExceptions and come up with a mini framework for handling the entire application's exceptions using a few classes and the properties file. If you carefully observe the **_exception_** package, it consists of two enums - EntityType and ExceptionType. The EntityType enum contains all the entity names that we are using in the system for persistence and those which can result in a run time exception. The ExceptionType enum consists of the different entity level exceptions such as the EntityNotFound and DuplicateEntity exceptions. 

The BRSException class has two static classes _EntityNotFoundException_ and _DuplicateEntityException_ which are the two most widely thrown exceptions from the service layer. It also contains a set of overloaded methods _throwException_ which take the EntityType, ExceptionType and arguments to come up with a formatted message whose template is present under the **_custom.properties_** file. Using this class I was able to empower the entire services layer to throw entity exceptions in a uniform manner without cluttering the code base with all sorts of NOT_FOUND and DUPLICATE entity exceptions.

For example, while login if you try to use a email address which is not registered, an exception is raised and thrown using the following single line of code -

``` java
throw exception(USER, ENTITY_NOT_FOUND, userDto.getEmail());
```

This results in clubbing the names of these two enums USER(user) and ENTITY_NOT_FOUND(not.found) and coming up with a key _user.not.found_ which is present in the custom.properties files as follows :

``` 
user.not.found=Requested user with email - {0} does not exist.
```
By simply replacing the {0} param with the email address included in the thrown exception you can get a well formatted message to be shown to the user or to be sent back as the response of the REST API call.

Another important part of this mini framework is the **_CustomizedResponseEntityExceptionHandler_** class. This class takes care of these RuntimeExceptions before sending a response to the API requests. Its a controller advice that checks if a service layer invocation resulted in a EntityNotFoundException or a DuplicateEntityException and sends an appropriate response to the caller.

Last, the API response are all being sent in a uniform manner using the **_Response_** class present in the dto/response package. This class allows us to create uniform objects which result in a response as shown below (this one is a response for the "api/v1/reservation/stops" api) :

```
{
    "status": "OK",
    "payload": [
        {
            "code": "STPA",
            "name": "Stop A",
            "detail": "Near hills"
        },
        {
            "code": "STPB",
            "name": "Stop B",
            "detail": "Near river"
        }
    ]
}
```

And when there is an exception (for example searching for a trip between two stops which are not linked by any bus) the following responses are sent back (result of "api/v1/reservation/tripsbystops" GET request) :

```
{
    "status": "NOT_FOUND",
    "errors": "No trips between source stop - 'STPD' and destination stop - 'STPC' are available at this time."
}
```

```
{
    "status": "NOT_FOUND",
    "errors": {
        "timestamp": "2019-03-13T07:47:10.990+0000",
        "message": "Requested stop with code - STPF does not exist.",
        "details": "Requested stop with code - STPF does not exist."
    }
}
```

As you can observe, both type of responses, one with a HTTP-200 and another with HTTP-404 the response payload doesn't change its structure and the calling framework can blindly accept the response knowing that there is a status and a error or payload field in the JSON object.

## UI Architecture ##
The user interface for the admin portal is designed using material design with the help of Bootstrap and responsive web app concept. The UI is server side rendered using Thymeleaf templates (preferred templating engine in Spring). The standard way of working with Thymeleaf is to use includes. This quite often leads to repetitive code, especially, when a website has many pages and each page has several reusable components (e.g. header, navigation, sidebar, and footer). It is repetitive as each content page has to include the same fragments at the same locations. This also has a negative effect when the page layout changes, e.g. when putting the sidebar from the left to the right side.

The decorator pattern used by the Thymeleaf Layout dialect solves these issues. In the context of template engines, the decorator pattern doesn't work with includes on content pages anymore, but it refers to a common template file. Each page basically only provides the main content and by describing which basic template to use the template engine can build the final page. The content is being decorated with the template file.This approach has advantages compared to the standard way of including fragments:

- The page itself only has to provide the content
- As a template file is being used to build the final page global changes can be applied easily
- The code becomes shorter and cleaner
- As each content page references which template file to use, it is easy to use different templates for different areas of the application (e.g. public area and admin area)

The layout for admin portal is arranged as follows :

<p align="center">
<img width="600" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/ui-layout.png">
</p>

The individual areas in this layout serve the following purpose :

- **Header**: this fragment is used for the static imports (CSS and JavaScript), the title and meta tags
- **Navigation**: the navigation bar
- **Content**: the content placeholder that will be replaced by the requested page
- **Sidebar**: a sidebar for additional information
- **Footer**: the footer area that provides the copyright info

These components can be located in the resources/templates directory at the root as well as under the sub-directories fragments and layout. The content area in this layout will host the following pages :

- Dashboard
- Agency
- Bus
- Trip
- Profile

Also, an error page for any unhandled exception is designed with the name "error.html". The login and signup pages are designed separately from the portal accessible to a logged-in user.

## Running the server locally ##
To be able to run this Spring Boot app you will need to first build it. To build and package a Spring Boot app into a single executable Jar file with a Maven, use the below command. You will need to run it from the project folder which contains the pom.xml file.

```
maven package
```
or you can also use

```
mvn install
```

To run the Spring Boot app from a command line in a Terminal window you can you the java -jar command. This is provided your Spring Boot app was packaged as an executable jar file.

```
java -jar target/springboot-starterkit-mysql-1.0.jar
```

You can also use Maven plugin to run the app. Use the below example to run your Spring Boot app with Maven plugin :

```
mvn spring-boot:run
```

If you do not have a mysql instance running and still just want to create the JAR, then please use the following command:

```
mvn install -DskipTests
```

This will skip the test cases and won't check the availability of a mysql instance and allow you to create the JAR.

You can follow any/all the above commands, or simply use the run configuration provided by your favorite IDE and run/debug the app from there for development purposes. Once the server is setup you should be able to access the admin interface at the following URL :

http://localhost:8080

And the REST APIs can be accessed over the following base-path :

http://localhost:8080/api/

Some of the important api endpoints are as follows :

- http://localhost:8080/api/v1/user/signup (HTTP:POST)
- http://localhost:8080/api/auth (HTTP:POST)
- http://localhost:8080/api/v1/reservation/stops (HTTP:GET)
- http://localhost:8080/api/v1/reservation/tripsbystops (HTTP:GET)
- http://localhost:8080/api/v1/reservation/tripschedules (HTTP:GET)
- http://localhost:8080/api/v1/reservation/bookticket (HTTP:POST)

## Running the server in Docker Container ##
##### Docker #####
Command to build the container :

```
docker build -t spring/starterkit .
```

Command to run the container :

```
docker run -p 8080:8080 spring/starterkit
```

Please **note** when you build the container image and if mysql is running locally on your system, you will need to provide your system's IP address (or cloud hosted database's IP) in the application.properties file to be able to connect to the database from within the container.

##### Docker Compose #####
Another alternative to run the application is to use the docker-compose.yml file and utility. To build the application using docker-compose simply execute the following command :
```
docker-compose build
```

And to run the application, please execute the following command :
```
docker-compose up
```

## API Documentation ##
Its as important to document(as is the development) and make your APIs available in a readable manner for frontend teams or external consumers. The tool for API documentation used in this starter kit is Swagger3, you can open the same inside a browser at the following url -

http://localhost:8080/swagger-ui/index.html

It will present you with a well structured UI which has two specs :

1. User
2. BRS

You can use the User spec to execute the login api for generating the Bearer token. The token then should be applied in the "Authorize" popup which will by default apply it to all secured apis (get and post both).

<p align="center">
    <b>User Spec</b><br>
    <br>
    <img width="600" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/swagger-screens/swagger-1.png">
</p>

<p align="center">
    <b>User Login</b><br>
    <br>
    <img width="600" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/swagger-screens/swagger-2.png">
</p>

<p align="center">
    <b>Authorization</b><br>
    <br>
    <img width="600" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/swagger-screens/swagger-3.png">
</p>

<p align="center">
    <b>BRS Spec</b><br>
    <br>
    <img width="600" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/swagger-screens/swagger-4.png">
</p>

<p align="center">
    <b>BRS APIs</b><br>
    <br>
    <img width="600" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/swagger-screens/swagger-5.png">
</p>

The configuration of Swagger is being taken care of by class BrsConfiguration. I have defined two specs there with the help of "swaggerBRSApi" and "swaggerUserApi" methods. Since the login part is by default taken care of by Spring Security we don't get to expose its apis implicitly as the rest of the apis defined in the system and for the same reason I have defined a controller in the config package with the name "FakeController". Its purpose is to facilitate the generation of swagger documentation for login and logout apis, it will never come into existence during the application life cycle as the "/api/auth" api is being handled by the security filters defined in the code base. 

## User Interface ##
Here are the various screens of the Admin portal that you should be able to use once the application is setup properly :


<p align="center">
    <b>Login</b><br>
    <br>
    <img width="800" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/app-screens/login.png">
</p>

<p align="center">
    <b>Signup</b><br>
    <br>
    <img width="800" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/app-screens/signup.png">
</p>

<p align="center">
    <b>Dashboard</b><br>
    <br>
    <img width="800" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/app-screens/dashboard.png">
</p>

<p align="center">
    <b>Agency</b><br>
    <br>
    <img width="800" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/app-screens/agency.png">
</p>

<p align="center">
    <b>Buses</b><br>
    <br>
    <img width="800" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/app-screens/buses.png">
</p>

<p align="center">
    <b>Trips</b><br>
    <br>
    <img width="800" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/app-screens/trips.png">
</p>

<p align="center">
    <b>Profile</b><br>
    <br>
    <img width="800" src="https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/docs/images/app-screens/profile.png">
</p>

## Contributors ##
[Arpit Khandelwal](https://www.linkedin.com/in/arpitkhandelwal1984/)

## License ##
This project is licensed under the terms of the MIT license.

================================================
FILE: src/main/java/com/starterkit/springboot/brs/BusReservationSystemApplication.java
================================================
package com.starterkit.springboot.brs;

import com.starterkit.springboot.brs.model.bus.*;
import com.starterkit.springboot.brs.model.user.Role;
import com.starterkit.springboot.brs.model.user.User;
import com.starterkit.springboot.brs.model.user.UserRoles;
import com.starterkit.springboot.brs.repository.bus.*;
import com.starterkit.springboot.brs.repository.user.RoleRepository;
import com.starterkit.springboot.brs.repository.user.UserRepository;
import com.starterkit.springboot.brs.util.DateUtils;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

@SpringBootApplication
public class BusReservationSystemApplication {

    public static void main(String[] args) {
        SpringApplication.run(BusReservationSystemApplication.class, args);
    }

    @Bean
    CommandLineRunner init(RoleRepository roleRepository, UserRepository userRepository,
                           StopRepository stopRepository, AgencyRepository agencyRepository,
                           BusRepository busRepository, TripRepository tripRepository,
                           TripScheduleRepository tripScheduleRepository) {
        return args -> {
            //Create Admin and Passenger Roles
            Role adminRole = roleRepository.findByRole(UserRoles.ADMIN);
            if (adminRole == null) {
                adminRole = new Role();
                adminRole.setRole(UserRoles.ADMIN);
                roleRepository.save(adminRole);
            }

            Role userRole = roleRepository.findByRole(UserRoles.PASSENGER);
            if (userRole == null) {
                userRole = new Role();
                userRole.setRole(UserRoles.PASSENGER);
                roleRepository.save(userRole);
            }

            //Create an Admin user
            User admin = userRepository.findByEmail("admin@gmail.com");
            if (admin == null) {
                admin = new User()
                        .setEmail("admin@gmail.com")
                        .setPassword("$2a$10$7PtcjEnWb/ZkgyXyxY1/Iei2dGgGQUbqIIll/dt.qJ8l8nQBWMbYO") // "123456"
                        .setFirstName("John")
                        .setLastName("Doe")
                        .setMobileNumber("9425094250")
                        .setRoles(Arrays.asList(adminRole));
                userRepository.save(admin);
            }

            //Create a passenger user
            User passenger = userRepository.findByEmail("passenger@gmail.com");
            if (passenger == null) {
                passenger = new User()
                        .setEmail("passenger@gmail.com")
                        .setPassword("$2a$10$7PtcjEnWb/ZkgyXyxY1/Iei2dGgGQUbqIIll/dt.qJ8l8nQBWMbYO") // "123456"
                        .setFirstName("Mira")
                        .setLastName("Jane")
                        .setMobileNumber("8000110008")
                        .setRoles(Arrays.asList(userRole));
                userRepository.save(passenger);
            }

            //Create four stops
            Stop stopA = stopRepository.findByCode("STPA");
            if (stopA == null) {
                stopA = new Stop()
                        .setName("Stop A")
                        .setDetail("Near hills")
                        .setCode("STPA");
                stopRepository.save(stopA);
            }

            Stop stopB = stopRepository.findByCode("STPB");
            if (stopB == null) {
                stopB = new Stop()
                        .setName("Stop B")
                        .setDetail("Near river")
                        .setCode("STPB");
                stopRepository.save(stopB);
            }

            Stop stopC = stopRepository.findByCode("STPC");
            if (stopC == null) {
                stopC = new Stop()
                        .setName("Stop C")
                        .setDetail("Near desert")
                        .setCode("STPC");
                stopRepository.save(stopC);
            }

            Stop stopD = stopRepository.findByCode("STPD");
            if (stopD == null) {
                stopD = new Stop()
                        .setName("Stop D")
                        .setDetail("Near lake")
                        .setCode("STPD");
                stopRepository.save(stopD);
            }

            //Create an Agency
            Agency agencyA = agencyRepository.findByCode("AGENCY-A");
            if (agencyA == null) {
                agencyA = new Agency()
                        .setName("Green Mile Agency")
                        .setCode("AGENCY-A")
                        .setDetails("Reaching desitnations with ease")
                        .setOwner(admin);
                agencyRepository.save(agencyA);
            }

            //Create a bus
            Bus busA = busRepository.findByCode("AGENCY-A-1");
            if (busA == null) {
                busA = new Bus()
                        .setCode("AGENCY-A-1")
                        .setAgency(agencyA)
                        .setCapacity(60);
                busRepository.save(busA);
            }

            //Add busA to set of buses owned by Agency 'AGENCYA'
            if (agencyA.getBuses() == null) {
                Set<Bus> buses = new HashSet<>();
                agencyA.setBuses(buses);
                agencyA.getBuses().add(busA);
                agencyRepository.save(agencyA);
            }

            //Create a Trip
            Trip trip = tripRepository.findBySourceStopAndDestStopAndBus(stopA, stopB, busA);
            if (trip == null) {
                trip = new Trip()
                        .setSourceStop(stopA)
                        .setDestStop(stopB)
                        .setBus(busA)
                        .setAgency(agencyA)
                        .setFare(100)
                        .setJourneyTime(60);
                tripRepository.save(trip);
            }

            //Create a trip schedule
            TripSchedule tripSchedule = tripScheduleRepository.findByTripDetailAndTripDate(trip, DateUtils.todayStr());
            if (tripSchedule == null) {
                tripSchedule = new TripSchedule()
                        .setTripDetail(trip)
                        .setTripDate(DateUtils.todayStr())
                        .setAvailableSeats(trip.getBus().getCapacity());
                tripScheduleRepository.save(tripSchedule);
            }
        };
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/config/BrsConfiguration.java
================================================
package com.starterkit.springboot.brs.config;

import org.modelmapper.ModelMapper;
import org.modelmapper.convention.NamingConventions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.Arrays;

/**
 * Created by Arpit Khandelwal.
 */
@Configuration
public class BrsConfiguration {

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public ModelMapper modelMapper() {
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration()
                .setFieldMatchingEnabled(true)
                .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE)
                .setSourceNamingConvention(NamingConventions.JAVABEANS_MUTATOR);
        return modelMapper;
        //https://github.com/modelmapper/modelmapper/issues/212
    }

    /**
     * Group BRS contains operations related to reservations and agency management
     */
    @Bean
    public Docket swaggerBRSApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("BRS")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.starterkit.springboot.brs.controller.v1.api"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo())
                .securitySchemes(Arrays.asList(apiKey()));
    }

    /**
     * Group User contains operations related to user management such as login/logout
     */
    @Bean
    public Docket swaggerUserApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("User")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.starterkit.springboot.brs.config"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo())
                .securitySchemes(Arrays.asList(apiKey()));
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("Bus Reservation System - REST APIs")
                .description("Spring Boot starter kit application.").termsOfServiceUrl("")
                .contact(new Contact("Arpit Khandelwal", "https://medium.com/the-resonant-web", "khandelwal.arpit@outlook.com"))
                .license("Apache License Version 2.0")
                .licenseUrl("https://www.apache.org/licenses/LICENSE-2.0")
                .version("0.0.1")
                .build();
    }

    private ApiKey apiKey() {
        return new ApiKey("apiKey", "Authorization", "header");
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/config/FakeController.java
================================================
package com.starterkit.springboot.brs.config;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

/**
 * This is a global controller written merely for showing the login and logout apis in the
 * swagger documentation allowing users to get the authorisation token from the same interface
 * and use it for executing the secured API operations.
 * <p>
 * Created by Arpit Khandelwal.
 */
@RestController
@RequestMapping("/api")
@Api(value = "brs-application", description = "Operations pertaining to user login and logout in the BRS application")
public class FakeController {
    @ApiOperation("Login")
    @PostMapping("/auth")
    public void fakeLogin(@RequestBody @Valid LoginRequest loginRequest) {
        throw new IllegalStateException("This method shouldn't be called. It's implemented by Spring Security filters.");
    }

    @ApiOperation("Logout")
    @PostMapping("/logout")
    public void fakeLogout() {
        throw new IllegalStateException("This method shouldn't be called. It's implemented by Spring Security filters.");
    }

    @Getter
    @Setter
    @Accessors(chain = true)
    @NoArgsConstructor
    @JsonIgnoreProperties(ignoreUnknown = true)
    private static class LoginRequest {
        @NotNull(message = "{constraints.NotEmpty.message}")
        private String email;
        @NotNull(message = "{constraints.NotEmpty.message}")
        private String password;
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/config/PageConfig.java
================================================
package com.starterkit.springboot.brs.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Created by Arpit Khandelwal.
 */
@Configuration
public class PageConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/dashboard").setViewName("dashboard");
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/signup").setViewName("signup");
        registry.addViewController("/profile").setViewName("profile");
        registry.addViewController("/agency").setViewName("agency");
        registry.addViewController("/bus").setViewName("bus");
        registry.addViewController("/trip").setViewName("trip");
        registry.addViewController("/logout").setViewName("logout");
    }

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/config/PropertiesConfig.java
================================================
package com.starterkit.springboot.brs.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

/**
 * Created by Arpit Khandelwal.
 */
@Component
@PropertySource("classpath:custom.properties")
public class PropertiesConfig {
    @Autowired
    private Environment env;

    public String getConfigValue(String configKey) {
        return env.getProperty(configKey);
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/api/BusReservationController.java
================================================
package com.starterkit.springboot.brs.controller.v1.api;

import com.starterkit.springboot.brs.controller.v1.request.BookTicketRequest;
import com.starterkit.springboot.brs.controller.v1.request.GetTripSchedulesRequest;
import com.starterkit.springboot.brs.dto.model.bus.TicketDto;
import com.starterkit.springboot.brs.dto.model.bus.TripDto;
import com.starterkit.springboot.brs.dto.model.bus.TripScheduleDto;
import com.starterkit.springboot.brs.dto.model.user.UserDto;
import com.starterkit.springboot.brs.dto.response.Response;
import com.starterkit.springboot.brs.service.BusReservationService;
import com.starterkit.springboot.brs.service.UserService;
import com.starterkit.springboot.brs.util.DateUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.Authorization;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.Optional;

/**
 * Created by Arpit Khandelwal.
 */
@RestController
@RequestMapping("/api/v1/reservation")
@Api(value = "brs-application", description = "Operations pertaining to agency management and ticket issue in the BRS application")
public class BusReservationController {
    @Autowired
    private BusReservationService busReservationService;

    @Autowired
    private UserService userService;

    @GetMapping("/stops")
    @ApiOperation(value = "", authorizations = {@Authorization(value = "apiKey")})
    public Response getAllStops() {
        return Response
                .ok()
                .setPayload(busReservationService.getAllStops());
    }

    @GetMapping("/tripsbystops")
    @ApiOperation(value = "", authorizations = {@Authorization(value = "apiKey")})
    public Response getTripsByStops(@RequestBody @Valid GetTripSchedulesRequest getTripSchedulesRequest) {
        List<TripDto> tripDtos = busReservationService.getAvailableTripsBetweenStops(
                getTripSchedulesRequest.getSourceStop(),
                getTripSchedulesRequest.getDestinationStop());
        if (!tripDtos.isEmpty()) {
            return Response.ok().setPayload(tripDtos);
        }
        return Response.notFound()
                .setErrors(String.format("No trips between source stop - '%s' and destination stop - '%s' are available at this time.", getTripSchedulesRequest.getSourceStop(), getTripSchedulesRequest.getDestinationStop()));
    }

    @GetMapping("/tripschedules")
    @ApiOperation(value = "", authorizations = {@Authorization(value = "apiKey")})
    public Response getTripSchedules(@RequestBody @Valid GetTripSchedulesRequest getTripSchedulesRequest) {
        List<TripScheduleDto> tripScheduleDtos = busReservationService.getAvailableTripSchedules(
                getTripSchedulesRequest.getSourceStop(),
                getTripSchedulesRequest.getDestinationStop(),
                DateUtils.formattedDate(getTripSchedulesRequest.getTripDate()));
        if (!tripScheduleDtos.isEmpty()) {
            return Response.ok().setPayload(tripScheduleDtos);
        }
        return Response.notFound()
                .setErrors(String.format("No trips between source stop - '%s' and destination stop - '%s' on date - '%s' are available at this time.", getTripSchedulesRequest.getSourceStop(), getTripSchedulesRequest.getDestinationStop(), DateUtils.formattedDate(getTripSchedulesRequest.getTripDate())));
    }

    @PostMapping("/bookticket")
    @ApiOperation(value = "", authorizations = {@Authorization(value = "apiKey")})
    public Response bookTicket(@RequestBody @Valid BookTicketRequest bookTicketRequest) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        String email = (String) auth.getPrincipal();
        Optional<UserDto> userDto = Optional.ofNullable(userService.findUserByEmail(email));
        if (userDto.isPresent()) {
            Optional<TripDto> tripDto = Optional
                    .ofNullable(busReservationService.getTripById(bookTicketRequest.getTripID()));
            if (tripDto.isPresent()) {
                Optional<TripScheduleDto> tripScheduleDto = Optional
                        .ofNullable(busReservationService.getTripSchedule(tripDto.get(), DateUtils.formattedDate(bookTicketRequest.getTripDate()), true));
                if (tripScheduleDto.isPresent()) {
                    Optional<TicketDto> ticketDto = Optional
                            .ofNullable(busReservationService.bookTicket(tripScheduleDto.get(), userDto.get()));
                    if (ticketDto.isPresent()) {
                        return Response.ok().setPayload(ticketDto.get());
                    }
                }
            }
        }
        return Response.badRequest().setErrors("Unable to process ticket booking.");
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/api/UserController.java
================================================
package com.starterkit.springboot.brs.controller.v1.api;

import com.starterkit.springboot.brs.controller.v1.request.UserSignupRequest;
import com.starterkit.springboot.brs.dto.model.user.UserDto;
import com.starterkit.springboot.brs.dto.response.Response;
import com.starterkit.springboot.brs.service.UserService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * Created by Arpit Khandelwal.
 */
@RestController
@RequestMapping("/api/v1/user")
@Api(value = "brs-application", description = "Operations pertaining to user management in the BRS application")
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * Handles the incoming POST API "/v1/user/signup"
     *
     * @param userSignupRequest
     * @return
     */
    @PostMapping("/signup")
    public Response signup(@RequestBody @Valid UserSignupRequest userSignupRequest) {
        return Response.ok().setPayload(registerUser(userSignupRequest, false));
    }

    /**
     * Register a new user in the database
     *
     * @param userSignupRequest
     * @return
     */
    private UserDto registerUser(UserSignupRequest userSignupRequest, boolean isAdmin) {
        UserDto userDto = new UserDto()
                .setEmail(userSignupRequest.getEmail())
                .setPassword(userSignupRequest.getPassword())
                .setFirstName(userSignupRequest.getFirstName())
                .setLastName(userSignupRequest.getLastName())
                .setMobileNumber(userSignupRequest.getMobileNumber())
                .setAdmin(isAdmin);

        return userService.signup(userDto);
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/AdminSignupFormCommand.java
================================================
package com.starterkit.springboot.brs.controller.v1.command;

import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

/**
 * Created by Arpit Khandelwal.
 */
@Data
@Accessors(chain = true)
public class AdminSignupFormCommand {
    @NotBlank
    @Email
    private String email;

    @NotBlank
    @Size(min = 5)
    private String password;

    @NotBlank
    private String firstName;

    @NotBlank
    private String lastName;

    @NotBlank
    @Size(min = 5, max = 100)
    private String agencyName;

    @NotBlank
    @Size(max = 100)
    private String agencyDetails;

    @NotBlank
    @Size(min = 5, max = 13)
    private String mobileNumber;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/AgencyFormCommand.java
================================================
package com.starterkit.springboot.brs.controller.v1.command;

import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

/**
 * Created by Arpit Khandelwal.
 */
@Data
@Accessors(chain = true)
public class AgencyFormCommand {
    @NotBlank
    @Size(min = 5, max = 100)
    private String agencyName;

    @NotBlank
    @Size(max = 100)
    private String agencyDetails;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/BusFormCommand.java
================================================
package com.starterkit.springboot.brs.controller.v1.command;

import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

/**
 * Created by Arpit Khandelwal.
 */
@Data
@Accessors(chain = true)
public class BusFormCommand {
    @NotBlank
    @Size(min = 4, max = 8)
    private String code;

    @Min(value = 10, message = "Cannot enroll a bus with capacity smaller than 10")
    private int capacity;

    @NotBlank
    private String make;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/PasswordFormCommand.java
================================================
package com.starterkit.springboot.brs.controller.v1.command;

import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

/**
 * Created by Arpit Khandelwal.
 */
@Data
@Accessors(chain = true)
public class PasswordFormCommand {
    @NotBlank
    @Size(min = 5, max = 12)
    private String password;

    private String email;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/ProfileFormCommand.java
================================================
package com.starterkit.springboot.brs.controller.v1.command;

import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

/**
 * Created by Arpit Khandelwal.
 */
@Data
@Accessors(chain = true)
public class ProfileFormCommand {
    @NotBlank
    @Size(min = 1, max = 40)
    private String firstName;

    @NotBlank
    private String lastName;

    @NotBlank
    @Size(min = 5, max = 13)
    private String mobileNumber;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/TripFormCommand.java
================================================
package com.starterkit.springboot.brs.controller.v1.command;

import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Positive;

/**
 * Created by Arpit Khandelwal.
 */
@Data
@Accessors(chain = true)
public class TripFormCommand {
    @NotBlank
    private String sourceStop;

    @NotBlank
    private String destinationStop;

    @NotBlank
    private String busCode;

    @Positive
    private int tripDuration;

    @Positive
    private int tripFare;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/request/BookTicketRequest.java
================================================
package com.starterkit.springboot.brs.controller.v1.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BookTicketRequest {
    @NotEmpty(message = "{constraints.NotEmpty.message}")
    private Long tripID;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    @NotNull(message = "{constraints.NotEmpty.message}")
    @Temporal(TemporalType.DATE)
    private Date tripDate;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/request/GetTripSchedulesRequest.java
================================================
package com.starterkit.springboot.brs.controller.v1.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotEmpty;
import java.util.Date;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class GetTripSchedulesRequest {

    @NotEmpty(message = "{constraints.NotEmpty.message}")
    private String sourceStop;

    @NotEmpty(message = "{constraints.NotEmpty.message}")
    private String destinationStop;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    @Temporal(TemporalType.DATE)
    private Date tripDate;

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/request/UserSignupRequest.java
================================================
package com.starterkit.springboot.brs.controller.v1.request;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotEmpty;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserSignupRequest {
    @NotEmpty(message = "{constraints.NotEmpty.message}")
    private String email;

    @NotEmpty(message = "{constraints.NotEmpty.message}")
    private String password;

    @NotEmpty(message = "{constraints.NotEmpty.message}")
    private String firstName;

    @NotEmpty(message = "{constraints.NotEmpty.message}")
    private String lastName;

    private String mobileNumber;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/ui/AdminController.java
================================================
package com.starterkit.springboot.brs.controller.v1.ui;


import com.starterkit.springboot.brs.controller.v1.command.AdminSignupFormCommand;
import com.starterkit.springboot.brs.dto.model.bus.AgencyDto;
import com.starterkit.springboot.brs.dto.model.user.UserDto;
import com.starterkit.springboot.brs.service.BusReservationService;
import com.starterkit.springboot.brs.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.validation.Valid;

/**
 * Created by Arpit Khandelwal.
 */

@Controller
public class AdminController {

    @Autowired
    BusReservationService busReservationService;
    @Autowired
    private UserService userService;

    @GetMapping(value = {"/", "/login"})
    public ModelAndView login() {
        return new ModelAndView("login");
    }

    @GetMapping(value = {"/logout"})
    public String logout() {
        SecurityContextHolder.getContext().setAuthentication(null);
        return "redirect:login";
    }

    @GetMapping(value = "/home")
    public String home() {
        return "redirect:dashboard";
    }

    @GetMapping(value = "/signup")
    public ModelAndView signup() {
        ModelAndView modelAndView = new ModelAndView("signup");
        modelAndView.addObject("adminSignupFormData", new AdminSignupFormCommand());
        return modelAndView;
    }

    @PostMapping(value = "/signup")
    public ModelAndView createNewAdmin(@Valid @ModelAttribute("adminSignupFormData") AdminSignupFormCommand adminSignupFormCommand, BindingResult bindingResult) {
        ModelAndView modelAndView = new ModelAndView("signup");
        if (bindingResult.hasErrors()) {
            return modelAndView;
        } else {
            try {
                UserDto newUser = registerAdmin(adminSignupFormCommand);
            } catch (Exception exception) {
                bindingResult.rejectValue("email", "error.adminSignupFormCommand", exception.getMessage());
                return modelAndView;
            }
        }
        return new ModelAndView("login");
    }

    /**
     * Register a new user in the database
     *
     * @param adminSignupRequest
     * @return
     */
    private UserDto registerAdmin(@Valid AdminSignupFormCommand adminSignupRequest) {
        UserDto userDto = new UserDto()
                .setEmail(adminSignupRequest.getEmail())
                .setPassword(adminSignupRequest.getPassword())
                .setFirstName(adminSignupRequest.getFirstName())
                .setLastName(adminSignupRequest.getLastName())
                .setMobileNumber(adminSignupRequest.getMobileNumber())
                .setAdmin(true);
        UserDto admin = userService.signup(userDto); //register the admin
        AgencyDto agencyDto = new AgencyDto()
                .setName(adminSignupRequest.getAgencyName())
                .setDetails(adminSignupRequest.getAgencyDetails())
                .setOwner(admin);
        busReservationService.addAgency(agencyDto); //add the agency for this admin
        return admin;
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/ui/DashboardController.java
================================================
package com.starterkit.springboot.brs.controller.v1.ui;

import com.starterkit.springboot.brs.controller.v1.command.*;
import com.starterkit.springboot.brs.dto.model.bus.AgencyDto;
import com.starterkit.springboot.brs.dto.model.bus.BusDto;
import com.starterkit.springboot.brs.dto.model.bus.StopDto;
import com.starterkit.springboot.brs.dto.model.bus.TripDto;
import com.starterkit.springboot.brs.dto.model.user.UserDto;
import com.starterkit.springboot.brs.service.BusReservationService;
import com.starterkit.springboot.brs.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.validation.Valid;
import java.util.List;
import java.util.Set;

/**
 * Created by Arpit Khandelwal.
 */
@Controller
public class DashboardController {

    @Autowired
    private UserService userService;

    @Autowired
    private BusReservationService busReservationService;

    @GetMapping(value = "/dashboard")
    public ModelAndView dashboard() {
        ModelAndView modelAndView = new ModelAndView("dashboard");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        modelAndView.addObject("currentUser", userDto);
        modelAndView.addObject("userName", userDto.getFullName());
        return modelAndView;
    }

    @GetMapping(value = "/agency")
    public ModelAndView agencyDetails() {
        ModelAndView modelAndView = new ModelAndView("agency");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        AgencyDto agencyDto = busReservationService.getAgency(userDto);
        AgencyFormCommand agencyFormCommand = new AgencyFormCommand()
                .setAgencyName(agencyDto.getName())
                .setAgencyDetails(agencyDto.getDetails());
        modelAndView.addObject("agencyFormData", agencyFormCommand);
        modelAndView.addObject("agency", agencyDto);
        modelAndView.addObject("userName", userDto.getFullName());
        return modelAndView;
    }

    @PostMapping(value = "/agency")
    public ModelAndView updateAgency(@Valid @ModelAttribute("agencyFormData") AgencyFormCommand agencyFormCommand, BindingResult bindingResult) {
        ModelAndView modelAndView = new ModelAndView("agency");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        AgencyDto agencyDto = busReservationService.getAgency(userDto);
        modelAndView.addObject("agency", agencyDto);
        modelAndView.addObject("userName", userDto.getFullName());
        if (!bindingResult.hasErrors()) {
            if (agencyDto != null) {
                agencyDto.setName(agencyFormCommand.getAgencyName())
                        .setDetails(agencyFormCommand.getAgencyDetails());
                busReservationService.updateAgency(agencyDto, null);
            }
        }
        return modelAndView;
    }

    @GetMapping(value = "/bus")
    public ModelAndView busDetails() {
        ModelAndView modelAndView = new ModelAndView("bus");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        AgencyDto agencyDto = busReservationService.getAgency(userDto);
        modelAndView.addObject("agency", agencyDto);
        modelAndView.addObject("busFormData", new BusFormCommand());
        modelAndView.addObject("userName", userDto.getFullName());
        return modelAndView;
    }

    @PostMapping(value = "/bus")
    public ModelAndView addNewBus(@Valid @ModelAttribute("busFormData") BusFormCommand busFormCommand, BindingResult bindingResult) {
        ModelAndView modelAndView = new ModelAndView("bus");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        AgencyDto agencyDto = busReservationService.getAgency(userDto);
        modelAndView.addObject("userName", userDto.getFullName());
        modelAndView.addObject("agency", agencyDto);
        if (!bindingResult.hasErrors()) {
            try {
                BusDto busDto = new BusDto()
                        .setCode(busFormCommand.getCode())
                        .setCapacity(busFormCommand.getCapacity())
                        .setMake(busFormCommand.getMake());
                AgencyDto updatedAgencyDto = busReservationService.updateAgency(agencyDto, busDto);
                modelAndView.addObject("agency", updatedAgencyDto);
                modelAndView.addObject("busFormData", new BusFormCommand());
            } catch (Exception ex) {
                bindingResult.rejectValue("code", "error.busFormCommand", ex.getMessage());
            }
        }
        return modelAndView;
    }

    @GetMapping(value = "/trip")
    public ModelAndView tripDetails() {
        ModelAndView modelAndView = new ModelAndView("trip");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        AgencyDto agencyDto = busReservationService.getAgency(userDto);
        Set<StopDto> stops = busReservationService.getAllStops();
        List<TripDto> trips = busReservationService.getAgencyTrips(agencyDto.getCode());
        modelAndView.addObject("agency", agencyDto);
        modelAndView.addObject("stops", stops);
        modelAndView.addObject("trips", trips);
        modelAndView.addObject("tripFormData", new TripFormCommand());
        modelAndView.addObject("userName", userDto.getFullName());
        return modelAndView;
    }

    @PostMapping(value = "/trip")
    public ModelAndView addNewTrip(@Valid @ModelAttribute("tripFormData") TripFormCommand tripFormCommand, BindingResult bindingResult) {
        ModelAndView modelAndView = new ModelAndView("trip");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        AgencyDto agencyDto = busReservationService.getAgency(userDto);
        Set<StopDto> stops = busReservationService.getAllStops();
        List<TripDto> trips = busReservationService.getAgencyTrips(agencyDto.getCode());

        modelAndView.addObject("stops", stops);
        modelAndView.addObject("agency", agencyDto);
        modelAndView.addObject("userName", userDto.getFullName());
        modelAndView.addObject("trips", trips);

        if (!bindingResult.hasErrors()) {
            try {
                TripDto tripDto = new TripDto()
                        .setSourceStopCode(tripFormCommand.getSourceStop())
                        .setDestinationStopCode(tripFormCommand.getDestinationStop())
                        .setBusCode(tripFormCommand.getBusCode())
                        .setJourneyTime(tripFormCommand.getTripDuration())
                        .setFare(tripFormCommand.getTripFare())
                        .setAgencyCode(agencyDto.getCode());
                busReservationService.addTrip(tripDto);

                trips = busReservationService.getAgencyTrips(agencyDto.getCode());
                modelAndView.addObject("trips", trips);
                modelAndView.addObject("tripFormData", new TripFormCommand());
            } catch (Exception ex) {
                bindingResult.rejectValue("sourceStop", "error.tripFormData", ex.getMessage());
            }
        }
        return modelAndView;
    }

    @GetMapping(value = "/profile")
    public ModelAndView getUserProfile() {
        ModelAndView modelAndView = new ModelAndView("profile");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        ProfileFormCommand profileFormCommand = new ProfileFormCommand()
                .setFirstName(userDto.getFirstName())
                .setLastName(userDto.getLastName())
                .setMobileNumber(userDto.getMobileNumber());
        PasswordFormCommand passwordFormCommand = new PasswordFormCommand()
                .setEmail(userDto.getEmail())
                .setPassword(userDto.getPassword());
        modelAndView.addObject("profileForm", profileFormCommand);
        modelAndView.addObject("passwordForm", passwordFormCommand);
        modelAndView.addObject("userName", userDto.getFullName());
        return modelAndView;
    }

    @PostMapping(value = "/profile")
    public ModelAndView updateProfile(@Valid @ModelAttribute("profileForm") ProfileFormCommand profileFormCommand, BindingResult bindingResult) {
        ModelAndView modelAndView = new ModelAndView("profile");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        PasswordFormCommand passwordFormCommand = new PasswordFormCommand()
                .setEmail(userDto.getEmail())
                .setPassword(userDto.getPassword());
        modelAndView.addObject("passwordForm", passwordFormCommand);
        modelAndView.addObject("userName", userDto.getFullName());
        if (!bindingResult.hasErrors()) {
            userDto.setFirstName(profileFormCommand.getFirstName())
                    .setLastName(profileFormCommand.getLastName())
                    .setMobileNumber(profileFormCommand.getMobileNumber());
            userService.updateProfile(userDto);
            modelAndView.addObject("userName", userDto.getFullName());
        }
        return modelAndView;
    }

    @PostMapping(value = "/password")
    public ModelAndView changePassword(@Valid @ModelAttribute("passwordForm") PasswordFormCommand passwordFormCommand, BindingResult bindingResult) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        UserDto userDto = userService.findUserByEmail(auth.getName());
        if (bindingResult.hasErrors()) {
            ModelAndView modelAndView = new ModelAndView("profile");
            ProfileFormCommand profileFormCommand = new ProfileFormCommand()
                    .setFirstName(userDto.getFirstName())
                    .setLastName(userDto.getLastName())
                    .setMobileNumber(userDto.getMobileNumber());
            modelAndView.addObject("profileForm", profileFormCommand);
            modelAndView.addObject("userName", userDto.getFullName());
            return modelAndView;
        } else {
            userService.changePassword(userDto, passwordFormCommand.getPassword());
            return new ModelAndView("login");
        }
    }

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/mapper/TicketMapper.java
================================================
package com.starterkit.springboot.brs.dto.mapper;

import com.starterkit.springboot.brs.dto.model.bus.TicketDto;
import com.starterkit.springboot.brs.model.bus.Ticket;

/**
 * Created by Arpit Khandelwal.
 */
public class TicketMapper {
    public static TicketDto toTicketDto(Ticket ticket) {
        return new TicketDto()
                .setId(ticket.getId())
                .setBusCode(ticket.getTripSchedule().getTripDetail().getBus().getCode())
                .setSeatNumber(ticket.getSeatNumber())
                .setSourceStop(ticket.getTripSchedule().getTripDetail().getSourceStop().getName())
                .setDestinationStop(ticket.getTripSchedule().getTripDetail().getDestStop().getName())
                .setCancellable(false)
                .setJourneyDate(ticket.getJourneyDate())
                .setPassengerName(ticket.getPassenger().getFullName())
                .setPassengerMobileNumber(ticket.getPassenger().getMobileNumber());
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/mapper/TripMapper.java
================================================
package com.starterkit.springboot.brs.dto.mapper;

import com.starterkit.springboot.brs.dto.model.bus.TripDto;
import com.starterkit.springboot.brs.model.bus.Trip;

/**
 * Created by Arpit Khandelwal.
 */
public class TripMapper {
    public static TripDto toTripDto(Trip trip) {
        return new TripDto()
                .setId(trip.getId())
                .setAgencyCode(trip.getAgency().getCode())
                .setSourceStopCode(trip.getSourceStop().getCode())
                .setSourceStopName(trip.getSourceStop().getName())
                .setDestinationStopCode(trip.getDestStop().getCode())
                .setDestinationStopName(trip.getDestStop().getName())
                .setBusCode(trip.getBus().getCode())
                .setJourneyTime(trip.getJourneyTime())
                .setFare(trip.getFare());
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/mapper/TripScheduleMapper.java
================================================
package com.starterkit.springboot.brs.dto.mapper;

import com.starterkit.springboot.brs.dto.model.bus.TripScheduleDto;
import com.starterkit.springboot.brs.model.bus.Trip;
import com.starterkit.springboot.brs.model.bus.TripSchedule;

/**
 * Created by Arpit Khandelwal.
 */
public class TripScheduleMapper {
    public static TripScheduleDto toTripScheduleDto(TripSchedule tripSchedule) {
        Trip tripDetails = tripSchedule.getTripDetail();
        return new TripScheduleDto()
                .setId(tripSchedule.getId())
                .setTripId(tripDetails.getId())
                .setBusCode(tripDetails.getBus().getCode())
                .setAvailableSeats(tripSchedule.getAvailableSeats())
                .setFare(tripDetails.getFare())
                .setJourneyTime(tripDetails.getJourneyTime())
                .setSourceStop(tripDetails.getSourceStop().getName())
                .setDestinationStop(tripDetails.getDestStop().getName());
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/mapper/UserMapper.java
================================================
package com.starterkit.springboot.brs.dto.mapper;

import com.starterkit.springboot.brs.dto.model.user.RoleDto;
import com.starterkit.springboot.brs.dto.model.user.UserDto;
import com.starterkit.springboot.brs.model.user.User;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.stream.Collectors;

/**
 * Created by Arpit Khandelwal.
 */
@Component
public class UserMapper {

    public static UserDto toUserDto(User user) {
        return new UserDto()
                .setEmail(user.getEmail())
                .setFirstName(user.getFirstName())
                .setLastName(user.getLastName())
                .setMobileNumber(user.getMobileNumber())
                .setRoles(new HashSet<RoleDto>(user
                        .getRoles()
                        .stream()
                        .map(role -> new ModelMapper().map(role, RoleDto.class))
                        .collect(Collectors.toSet())));
    }

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/AgencyDto.java
================================================
package com.starterkit.springboot.brs.dto.model.bus;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.starterkit.springboot.brs.dto.model.user.UserDto;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.util.Set;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@ToString
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class AgencyDto {
    private String code;

    private UserDto owner;

    private Set<BusDto> buses;

    private String name;

    private String details;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/BusDto.java
================================================
package com.starterkit.springboot.brs.dto.model.bus;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@ToString
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class BusDto {

    private String code;

    private int capacity;

    private String make;

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/StopDto.java
================================================
package com.starterkit.springboot.brs.dto.model.bus;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@ToString
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class StopDto implements Comparable {

    private String code;
    private String name;
    private String detail;

    @Override
    public int compareTo(Object o) {
        return this.getName().compareTo(((StopDto) o).getName());
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/TicketDto.java
================================================
package com.starterkit.springboot.brs.dto.model.bus;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;


/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@ToString
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class TicketDto {
    private Long id;

    private String busCode;

    private int seatNumber;

    private boolean cancellable;

    private String journeyDate;

    private String sourceStop;

    private String destinationStop;

    private String passengerName;

    private String passengerMobileNumber;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/TripDto.java
================================================
package com.starterkit.springboot.brs.dto.model.bus;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@ToString
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class TripDto {

    private Long id;

    private int fare;

    private int journeyTime;

    private String sourceStopCode;

    private String sourceStopName;

    private String destinationStopCode;

    private String destinationStopName;

    private String busCode;

    private String agencyCode;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/TripScheduleDto.java
================================================
package com.starterkit.springboot.brs.dto.model.bus;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;


/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@ToString
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class TripScheduleDto {

    private Long id;

    private Long tripId;

    private String tripDate;

    private int availableSeats;

    private int fare;

    private int journeyTime;

    private String busCode;

    private String sourceStop;

    private String destinationStop;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/model/user/RoleDto.java
================================================
package com.starterkit.springboot.brs.dto.model.user;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@ToString
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class RoleDto {
    private String role;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/model/user/UserDto.java
================================================
package com.starterkit.springboot.brs.dto.model.user;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.util.Collection;
import java.util.Set;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@ToString
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDto {
    private String email;
    private String password;
    private String firstName;
    private String lastName;
    private String mobileNumber;
    private boolean isAdmin;
    private Collection<RoleDto> roles;

    public String getFullName() {
        return firstName != null ? firstName.concat(" ").concat(lastName) : "";
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/response/Response.java
================================================
package com.starterkit.springboot.brs.dto.response;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.starterkit.springboot.brs.util.DateUtils;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * @author Arpit Khandelwal
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response<T> {

    private Status status;
    private T payload;
    private Object errors;
    private Object metadata;

    public static <T> Response<T> badRequest() {
        Response<T> response = new Response<>();
        response.setStatus(Status.BAD_REQUEST);
        return response;
    }

    public static <T> Response<T> ok() {
        Response<T> response = new Response<>();
        response.setStatus(Status.OK);
        return response;
    }

    public static <T> Response<T> unauthorized() {
        Response<T> response = new Response<>();
        response.setStatus(Status.UNAUTHORIZED);
        return response;
    }

    public static <T> Response<T> validationException() {
        Response<T> response = new Response<>();
        response.setStatus(Status.VALIDATION_EXCEPTION);
        return response;
    }

    public static <T> Response<T> wrongCredentials() {
        Response<T> response = new Response<>();
        response.setStatus(Status.WRONG_CREDENTIALS);
        return response;
    }

    public static <T> Response<T> accessDenied() {
        Response<T> response = new Response<>();
        response.setStatus(Status.ACCESS_DENIED);
        return response;
    }

    public static <T> Response<T> exception() {
        Response<T> response = new Response<>();
        response.setStatus(Status.EXCEPTION);
        return response;
    }

    public static <T> Response<T> notFound() {
        Response<T> response = new Response<>();
        response.setStatus(Status.NOT_FOUND);
        return response;
    }

    public static <T> Response<T> duplicateEntity() {
        Response<T> response = new Response<>();
        response.setStatus(Status.DUPLICATE_ENTITY);
        return response;
    }

    public void addErrorMsgToResponse(String errorMsg, Exception ex) {
        ResponseError error = new ResponseError()
                .setDetails(errorMsg)
                .setMessage(ex.getMessage())
                .setTimestamp(DateUtils.today());
        setErrors(error);
    }

    public enum Status {
        OK, BAD_REQUEST, UNAUTHORIZED, VALIDATION_EXCEPTION, EXCEPTION, WRONG_CREDENTIALS, ACCESS_DENIED, NOT_FOUND, DUPLICATE_ENTITY
    }

    @Getter
    @Accessors(chain = true)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class PageMetadata {
        private final int size;
        private final long totalElements;
        private final int totalPages;
        private final int number;

        public PageMetadata(int size, long totalElements, int totalPages, int number) {
            this.size = size;
            this.totalElements = totalElements;
            this.totalPages = totalPages;
            this.number = number;
        }
    }

}



================================================
FILE: src/main/java/com/starterkit/springboot/brs/dto/response/ResponseError.java
================================================
package com.starterkit.springboot.brs.dto.response;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.util.Date;

/**
 * Created by Arpit Khandelwal
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResponseError {
    private Date timestamp;
    private String message;
    private String details;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/exception/BRSException.java
================================================
package com.starterkit.springboot.brs.exception;

import com.starterkit.springboot.brs.config.PropertiesConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.MessageFormat;
import java.util.Optional;

/**
 * A helper class to generate RuntimeExceptions with a little AI inbuilt.
 * <p>
 * Created by Arpit Khandelwal.
 */
@Component
public class BRSException {

    private static PropertiesConfig propertiesConfig;

    @Autowired
    public BRSException(PropertiesConfig propertiesConfig) {
        BRSException.propertiesConfig = propertiesConfig;
    }

    /**
     * Returns new RuntimeException based on template and args
     *
     * @param messageTemplate
     * @param args
     * @return
     */
    public static RuntimeException throwException(String messageTemplate, String... args) {
        return new RuntimeException(format(messageTemplate, args));
    }

    /**
     * Returns new RuntimeException based on EntityType, ExceptionType and args
     *
     * @param entityType
     * @param exceptionType
     * @param args
     * @return
     */
    public static RuntimeException throwException(EntityType entityType, ExceptionType exceptionType, String... args) {
        String messageTemplate = getMessageTemplate(entityType, exceptionType);
        return throwException(exceptionType, messageTemplate, args);
    }

    /**
     * Returns new RuntimeException based on EntityType, ExceptionType and args
     *
     * @param entityType
     * @param exceptionType
     * @param args
     * @return
     */
    public static RuntimeException throwExceptionWithId(EntityType entityType, ExceptionType exceptionType, Integer id, String... args) {
        String messageTemplate = getMessageTemplate(entityType, exceptionType).concat(".").concat(id.toString());
        return throwException(exceptionType, messageTemplate, args);
    }

    /**
     * Returns new RuntimeException based on EntityType, ExceptionType, messageTemplate and args
     *
     * @param entityType
     * @param exceptionType
     * @param messageTemplate
     * @param args
     * @return
     */
    public static RuntimeException throwExceptionWithTemplate(EntityType entityType, ExceptionType exceptionType, String messageTemplate, String... args) {
        return throwException(exceptionType, messageTemplate, args);
    }

    /**
     * Returns new RuntimeException based on template and args
     *
     * @param messageTemplate
     * @param args
     * @return
     */
    private static RuntimeException throwException(ExceptionType exceptionType, String messageTemplate, String... args) {
        if (ExceptionType.ENTITY_NOT_FOUND.equals(exceptionType)) {
            return new EntityNotFoundException(format(messageTemplate, args));
        } else if (ExceptionType.DUPLICATE_ENTITY.equals(exceptionType)) {
            return new DuplicateEntityException(format(messageTemplate, args));
        }
        return new RuntimeException(format(messageTemplate, args));
    }

    private static String getMessageTemplate(EntityType entityType, ExceptionType exceptionType) {
        return entityType.name().concat(".").concat(exceptionType.getValue()).toLowerCase();
    }

    private static String format(String template, String ... args) {
        Optional<String> templateContent = Optional.ofNullable(propertiesConfig.getConfigValue(template));
        if (templateContent.isPresent()) {
            return MessageFormat.format(templateContent.get(), (Object[]) args);
        }
        return String.format(template, (Object[]) args);
    }

    public static class EntityNotFoundException extends RuntimeException {
        public EntityNotFoundException(String message) {
            super(message);
        }
    }

    public static class DuplicateEntityException extends RuntimeException {
        public DuplicateEntityException(String message) {
            super(message);
        }
    }

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/exception/CustomizedResponseEntityExceptionHandler.java
================================================
package com.starterkit.springboot.brs.exception;

import com.starterkit.springboot.brs.dto.response.Response;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

/**
 * Created by Arpit Khandelwal.
 */
@ControllerAdvice
@RestController
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(BRSException.EntityNotFoundException.class)
    public final ResponseEntity handleNotFountExceptions(Exception ex, WebRequest request) {
        Response response = Response.notFound();
        response.addErrorMsgToResponse(ex.getMessage(), ex);
        return new ResponseEntity(response, HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(BRSException.DuplicateEntityException.class)
    public final ResponseEntity handleNotFountExceptions1(Exception ex, WebRequest request) {
        Response response = Response.duplicateEntity();
        response.addErrorMsgToResponse(ex.getMessage(), ex);
        return new ResponseEntity(response, HttpStatus.CONFLICT);
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/exception/EntityType.java
================================================
package com.starterkit.springboot.brs.exception;

/**
 * Created by Arpit Khandelwal.
 */
public enum EntityType {
    USER,
    ROLE,
    AGENCY,
    BUS,
    STOP,
    TICKET,
    TRIP,
    TRIPSCHEDULE
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/exception/ExceptionType.java
================================================
package com.starterkit.springboot.brs.exception;

/**
 * Created by Arpit Khandelwal.
 */
public enum ExceptionType {
    ENTITY_NOT_FOUND("not.found"),
    DUPLICATE_ENTITY("duplicate"),
    ENTITY_EXCEPTION("exception");

    String value;

    ExceptionType(String value) {
        this.value = value;
    }

    String getValue() {
        return this.value;
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Agency.java
================================================
package com.starterkit.springboot.brs.model.bus;

import com.starterkit.springboot.brs.model.user.User;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.util.Set;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@Entity
@Table(name = "agency",
        indexes = @Index(
                name = "idx_agency_code",
                columnList = "code",
                unique = true
        ))
public class Agency {
    @Id
    @Column(name = "agency_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String code;

    private String name;

    private String details;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "owner_user_id")
    private User owner;

    @OneToMany(mappedBy = "agency", cascade = CascadeType.ALL)
    private Set<Bus> buses;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Bus.java
================================================
package com.starterkit.springboot.brs.model.bus;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.*;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@Entity
@Table(
        name = "bus",
        indexes = @Index(
                name = "idx_bus_code",
                columnList = "code",
                unique = true
        )
)
public class Bus {
    @Id
    @Column(name = "bus_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String code;

    private int capacity;

    private String make;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "agency_id")
    private Agency agency;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Stop.java
================================================
package com.starterkit.springboot.brs.model.bus;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.*;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@Entity
@Table(
        name = "stop",
        indexes = @Index(
                name = "idx_stop_code",
                columnList = "code",
                unique = true
        )
)
public class Stop {
    @Id
    @Column(name = "stop_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String code;

    private String name;

    private String detail;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Ticket.java
================================================
package com.starterkit.springboot.brs.model.bus;

import com.starterkit.springboot.brs.model.user.User;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.*;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@Entity
@Table(name = "ticket")
public class Ticket {
    @Id
    @Column(name = "ticket_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "seat_number")
    private int seatNumber;

    private Boolean cancellable;

    @Column(name = "journey_date")
    private String journeyDate;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "trip_schedule_id")
    private TripSchedule tripSchedule;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User passenger;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Trip.java
================================================
package com.starterkit.springboot.brs.model.bus;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.*;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@Entity
@Table(name = "trip")
public class Trip {
    @Id
    @Column(name = "trip_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private int fare;

    @Column(name = "journey_time")
    private int journeyTime;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "source_stop_id")
    private Stop sourceStop;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "dest_stop_id")
    private Stop destStop;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "bus_id")
    private Bus bus;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "agency_id")
    private Agency agency;

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/model/bus/TripSchedule.java
================================================
package com.starterkit.springboot.brs.model.bus;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.util.Set;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@Entity
@Table(name = "trip_schedule")
public class TripSchedule {
    @Id
    @Column(name = "trip_schedule_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "trip_id")
    private Trip tripDetail;

    @OneToMany(mappedBy = "tripSchedule", cascade = CascadeType.ALL)
    private Set<Ticket> ticketsSold;

    @Column(name = "trip_date")
    private String tripDate;

    @Column(name = "available_seats")
    private int availableSeats;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/model/user/Role.java
================================================
package com.starterkit.springboot.brs.model.user;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.util.Collection;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@Entity
@Table(name = "role")
public class Role {
    @Id
    @Column(name = "role_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "roles")
    private Collection<User> users;

    @Enumerated(EnumType.STRING)
    private UserRoles role;
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/model/user/User.java
================================================
package com.starterkit.springboot.brs.model.user;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.util.Collection;
import java.util.Set;

/**
 * Created by Arpit Khandelwal.
 */
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@Entity
@Table(name = "user",
        indexes = @Index(
                name = "idx_user_email",
                columnList = "email",
                unique = true
        ))
public class User {
    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String email;

    private String password;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "mobile_number")
    private String mobileNumber;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "user_role",
            joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")})
    private Collection<Role> roles;

    public String getFullName() {
        return firstName != null ? firstName.concat(" ").concat(lastName) : "";
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/model/user/UserRoles.java
================================================
package com.starterkit.springboot.brs.model.user;

/**
 * Created by Arpit Khandelwal.
 */
public enum UserRoles {
    ADMIN, PASSENGER
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/AgencyRepository.java
================================================
package com.starterkit.springboot.brs.repository.bus;

import com.starterkit.springboot.brs.model.bus.Agency;
import com.starterkit.springboot.brs.model.user.User;
import org.springframework.data.repository.CrudRepository;

/**
 * Created by Arpit Khandelwal.
 */
public interface AgencyRepository extends CrudRepository<Agency, Long> {
    Agency findByCode(String agencyCode);

    Agency findByOwner(User owner);

    Agency findByName(String name);
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/BusRepository.java
================================================
package com.starterkit.springboot.brs.repository.bus;

import com.starterkit.springboot.brs.model.bus.Agency;
import com.starterkit.springboot.brs.model.bus.Bus;
import org.springframework.data.repository.CrudRepository;

/**
 * Created by Arpit Khandelwal.
 */
public interface BusRepository extends CrudRepository<Bus, Long> {
    Bus findByCode(String busCode);

    Bus findByCodeAndAgency(String busCode, Agency agency);
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/StopRepository.java
================================================
package com.starterkit.springboot.brs.repository.bus;

import com.starterkit.springboot.brs.model.bus.Stop;
import org.springframework.data.repository.CrudRepository;

/**
 * Created by Arpit Khandelwal.
 */
public interface StopRepository extends CrudRepository<Stop, Long> {
    Stop findByCode(String code);
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/TicketRepository.java
================================================
package com.starterkit.springboot.brs.repository.bus;

import com.starterkit.springboot.brs.model.bus.Ticket;
import org.springframework.data.repository.CrudRepository;

/**
 * Created by Arpit Khandelwal.
 */
public interface TicketRepository extends CrudRepository<Ticket, Long> {
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/TripRepository.java
================================================
package com.starterkit.springboot.brs.repository.bus;

import com.starterkit.springboot.brs.model.bus.Agency;
import com.starterkit.springboot.brs.model.bus.Bus;
import com.starterkit.springboot.brs.model.bus.Stop;
import com.starterkit.springboot.brs.model.bus.Trip;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

/**
 * Created by Arpit Khandelwal.
 */
public interface TripRepository extends CrudRepository<Trip, Long> {
    Trip findBySourceStopAndDestStopAndBus(Stop source, Stop destination, Bus bus);

    List<Trip> findAllBySourceStopAndDestStop(Stop source, Stop destination);

    List<Trip> findByAgency(Agency agency);
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/TripScheduleRepository.java
================================================
package com.starterkit.springboot.brs.repository.bus;

import com.starterkit.springboot.brs.model.bus.Trip;
import com.starterkit.springboot.brs.model.bus.TripSchedule;
import org.springframework.data.repository.CrudRepository;

/**
 * Created by Arpit Khandelwal.
 */
public interface TripScheduleRepository extends CrudRepository<TripSchedule, Long> {
    TripSchedule findByTripDetailAndTripDate(Trip tripDetail, String tripDate);
}

================================================
FILE: src/main/java/com/starterkit/springboot/brs/repository/user/RoleRepository.java
================================================
package com.starterkit.springboot.brs.repository.user;

import com.starterkit.springboot.brs.model.user.Role;
import com.starterkit.springboot.brs.model.user.UserRoles;
import org.springframework.data.repository.CrudRepository;

/**
 * Created by Arpit Khandelwal.
 */
public interface RoleRepository extends CrudRepository<Role, Long> {

    Role findByRole(UserRoles role);

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/repository/user/UserRepository.java
================================================
package com.starterkit.springboot.brs.repository.user;

import com.starterkit.springboot.brs.model.user.User;
import org.springframework.data.repository.CrudRepository;

/**
 * Created by Arpit Khandelwal.
 */
public interface UserRepository extends CrudRepository<User, Long> {

    User findByEmail(String email);

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/security/CustomUserDetailsService.java
================================================
package com.starterkit.springboot.brs.security;

import com.starterkit.springboot.brs.dto.model.user.RoleDto;
import com.starterkit.springboot.brs.dto.model.user.UserDto;
import com.starterkit.springboot.brs.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * Created by Arpit Khandelwal.
 */
@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        UserDto userDto = userService.findUserByEmail(email);
        if (userDto != null) {
            List<GrantedAuthority> authorities = getUserAuthority(userDto.getRoles());
            return buildUserForAuthentication(userDto, authorities);
        } else {
            throw new UsernameNotFoundException("user with email " + email + " does not exist.");
        }
    }

    private List<GrantedAuthority> getUserAuthority(Collection<RoleDto> userRoles) {
        Set<GrantedAuthority> roles = new HashSet<>();
        userRoles.forEach((role) -> {
            roles.add(new SimpleGrantedAuthority(role.getRole()));
        });
        return new ArrayList<GrantedAuthority>(roles);
    }

    private UserDetails buildUserForAuthentication(UserDto user, List<GrantedAuthority> authorities) {
        return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), authorities);
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/security/MultiHttpSecurityConfig.java
================================================
package com.starterkit.springboot.brs.security;

import com.starterkit.springboot.brs.security.api.ApiJWTAuthenticationFilter;
import com.starterkit.springboot.brs.security.api.ApiJWTAuthorizationFilter;
import com.starterkit.springboot.brs.security.form.CustomAuthenticationSuccessHandler;
import com.starterkit.springboot.brs.security.form.CustomLogoutSuccessHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import javax.servlet.http.HttpServletResponse;

/**
 * Created by Arpit Khandelwal.
 */
@EnableWebSecurity
public class MultiHttpSecurityConfig {

    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        @Autowired
        private BCryptPasswordEncoder bCryptPasswordEncoder;

        @Autowired
        private CustomUserDetailsService userDetailsService;

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth
                    .userDetailsService(userDetailsService)
                    .passwordEncoder(bCryptPasswordEncoder);
        }

        // @formatter:off
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .csrf()
                    .disable()
                    .antMatcher("/api/**")
                    .authorizeRequests()
                    .antMatchers("/api/v1/user/signup").permitAll()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .exceptionHandling()
                    .authenticationEntryPoint((req, rsp, e) -> rsp.sendError(HttpServletResponse.SC_UNAUTHORIZED))
                    .and()
                    .addFilter(new ApiJWTAuthenticationFilter(authenticationManager()))
                    .addFilter(new ApiJWTAuthorizationFilter(authenticationManager()))
                    .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        }
        // @formatter:on

    }

    @Order(2)
    @Configuration
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
        @Autowired
        private BCryptPasswordEncoder bCryptPasswordEncoder;

        @Autowired
        private CustomAuthenticationSuccessHandler customAuthenticationSuccessHandler;

        @Autowired
        private CustomUserDetailsService userDetailsService;

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth
                    .userDetailsService(userDetailsService)
                    .passwordEncoder(bCryptPasswordEncoder);
        }

        // @formatter:off
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .cors()
                    .and()
                    .csrf()
                    .disable()
                    .authorizeRequests()
                    .antMatchers("/").permitAll()
                    .antMatchers("/login").permitAll()
                    .antMatchers("/signup").permitAll()
                    .antMatchers("/dashboard/**").hasAuthority("ADMIN")
                    .anyRequest()
                    .authenticated()
                    .and()
                    .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .failureUrl("/login?error=true")
                    .usernameParameter("email")
                    .passwordParameter("password")
                    .successHandler(customAuthenticationSuccessHandler)
                    .and()
                    .logout()
                    .permitAll()
                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                    .logoutSuccessHandler(new CustomLogoutSuccessHandler())
                    .deleteCookies("JSESSIONID")
                    .logoutSuccessUrl("/")
                    .and()
                    .exceptionHandling();
        }

        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers(
                    "/resources/**", "/static/**", "/css/**", "/js/**", "/images/**",
                    "/resources/static/**", "/css/**", "/js/**", "/img/**", "/fonts/**",
                    "/images/**", "/scss/**", "/vendor/**", "/favicon.ico", "/auth/**", "/favicon.png",
                    "/v2/api-docs", "/configuration/ui", "/configuration/security",
                    "/webjars/**", "/swagger-resources/**", "/actuator", "/swagger-ui/**",
                    "/actuator/**", "/swagger-ui/index.html", "/swagger-ui/");
        }
        // @formatter:on
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/security/SecurityConstants.java
================================================
package com.starterkit.springboot.brs.security;

/**
 * Created by Arpit Khandelwal.
 */
public interface SecurityConstants {
    String SECRET = "SecretKeyToGenJWTs";
    String TOKEN_PREFIX = "Bearer ";
    String HEADER_STRING = "Authorization";
    String SIGN_UP_URL = "/users/sign-up";
    long EXPIRATION_TIME = 864_000_000; // 10 days
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/security/api/ApiJWTAuthenticationFilter.java
================================================
package com.starterkit.springboot.brs.security.api;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.starterkit.springboot.brs.model.user.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static com.starterkit.springboot.brs.security.SecurityConstants.*;

/**
 * Created by Arpit Khandelwal.
 */
public class ApiJWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
    private final AuthenticationManager authenticationManager;

    public ApiJWTAuthenticationFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
        this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/api/auth", "POST"));
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest req,
                                                HttpServletResponse res) throws AuthenticationException {
        try {
            User user = new ObjectMapper().readValue(req.getInputStream(), User.class);
            return authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(
                            user.getEmail(),
                            user.getPassword(),
                            new ArrayList<>())
            );
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest req,
                                            HttpServletResponse res,
                                            FilterChain chain,
                                            Authentication auth) throws IOException, ServletException {
        if (auth.getPrincipal() != null) {
            org.springframework.security.core.userdetails.User user = (org.springframework.security.core.userdetails.User) auth.getPrincipal();
            String login = user.getUsername();
            if (login != null && login.length() > 0) {
                Claims claims = Jwts.claims().setSubject(login);
                List<String> roles = new ArrayList<>();
                user.getAuthorities().stream().forEach(authority -> roles.add(authority.getAuthority()));
                claims.put("roles", roles);
                String token = Jwts.builder()
                        .setClaims(claims)
                        .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                        .signWith(SignatureAlgorithm.HS512, SECRET)
                        .compact();
                res.addHeader(HEADER_STRING, TOKEN_PREFIX + token);
            }
        }
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/security/api/ApiJWTAuthorizationFilter.java
================================================
package com.starterkit.springboot.brs.security.api;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;

import static com.starterkit.springboot.brs.security.SecurityConstants.*;

/**
 * Created by Arpit Khandelwal.
 */
public class ApiJWTAuthorizationFilter extends BasicAuthenticationFilter {
    public ApiJWTAuthorizationFilter(AuthenticationManager authManager) {
        super(authManager);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest req,
                                    HttpServletResponse res,
                                    FilterChain chain) throws IOException, ServletException {
        String header = req.getHeader(HEADER_STRING);
        if (header == null || !header.startsWith(TOKEN_PREFIX)) {
            chain.doFilter(req, res);
            return;
        }
        UsernamePasswordAuthenticationToken authentication = getAuthentication(req);
        SecurityContextHolder.getContext().setAuthentication(authentication);
        chain.doFilter(req, res);
    }

    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
        String token = request.getHeader(HEADER_STRING);
        if (token != null) {
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
                    .getBody();
            // Extract the UserName
            String user = claims.getSubject();
            // Extract the Roles
            ArrayList<String> roles = (ArrayList<String>) claims.get("roles");
            // Then convert Roles to GrantedAuthority Object for injecting
            ArrayList<GrantedAuthority> list = new ArrayList<>();
            if (roles != null) {
                for (String a : roles) {
                    GrantedAuthority g = new SimpleGrantedAuthority(a);
                    list.add(g);
                }
            }
            if (user != null) {
                return new UsernamePasswordAuthenticationToken(user, null, list);
            }
            return null;
        }
        return null;
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/security/form/CustomAuthenticationSuccessHandler.java
================================================
package com.starterkit.springboot.brs.security.form;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by Arpit Khandelwal.
 */
@Component
public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
                                        HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {
        response.setStatus(HttpServletResponse.SC_OK);
        for (GrantedAuthority auth : authentication.getAuthorities()) {
            if ("ADMIN".equals(auth.getAuthority())) {
                response.sendRedirect("/dashboard");
            }
        }
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/security/form/CustomLogoutSuccessHandler.java
================================================
package com.starterkit.springboot.brs.security.form;

import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by Arpit Khandelwal.
 */
public class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler
        implements LogoutSuccessHandler {
    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        super.onLogoutSuccess(request, response, authentication);
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/security/form/FormBasedJWTAuthenticationFilter.java
================================================
package com.starterkit.springboot.brs.security.form;

import com.starterkit.springboot.brs.model.user.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static com.starterkit.springboot.brs.security.SecurityConstants.*;

/**
 * Created by Arpit Khandelwal.
 */
public class FormBasedJWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
    private final AuthenticationManager authenticationManager;

    public FormBasedJWTAuthenticationFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest req,
                                                HttpServletResponse res) throws AuthenticationException {
        String email = req.getParameter("email");
        String password = req.getParameter("password");
        if (email != null && password != null) {
            User user = new User().setEmail(email).setPassword(password);
            return authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(
                            user.getEmail(),
                            user.getPassword(),
                            new ArrayList<>())
            );
        }

        return null;
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest req,
                                            HttpServletResponse res,
                                            FilterChain chain,
                                            Authentication auth) throws IOException, ServletException {
        if (auth.getPrincipal() != null) {
            // The Auth Mechanism stores the Username the Principal.
            // The username is stored in the Subject field of the Token
            org.springframework.security.core.userdetails.User user = (org.springframework.security.core.userdetails.User) auth.getPrincipal();
            String login = user.getUsername();
            if (login != null && login.length() > 0) {
                Claims claims = Jwts.claims().setSubject(login);
                List<String> roles = new ArrayList<>();
                user
                        .getAuthorities()
                        .stream()
                        .forEach(authority -> roles.add(authority.getAuthority()));

                claims.put("roles", roles);
                String token = Jwts.builder()
                        .setClaims(claims)
                        .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                        .signWith(SignatureAlgorithm.HS512, SECRET.getBytes())
                        .compact();
                res.addHeader(HEADER_STRING, TOKEN_PREFIX + token);
            }
        }
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/service/BusReservationService.java
================================================
package com.starterkit.springboot.brs.service;

import com.starterkit.springboot.brs.dto.model.bus.*;
import com.starterkit.springboot.brs.dto.model.user.UserDto;

import java.util.List;
import java.util.Set;

/**
 * Created by Arpit Khandelwal.
 */
public interface BusReservationService {

    //Stop related methods
    Set<StopDto> getAllStops();

    StopDto getStopByCode(String stopCode);

    //Agency related methods
    AgencyDto getAgency(UserDto userDto);

    AgencyDto addAgency(AgencyDto agencyDto);

    AgencyDto updateAgency(AgencyDto agencyDto, BusDto busDto);

    //Trip related methods
    TripDto getTripById(Long tripID);

    List<TripDto> addTrip(TripDto tripDto);

    List<TripDto> getAgencyTrips(String agencyCode);

    List<TripDto> getAvailableTripsBetweenStops(String sourceStopCode, String destinationStopCode);

    //Trips Schedule related methods
    List<TripScheduleDto> getAvailableTripSchedules(String sourceStopCode, String destinationStopCode, String tripDate);

    TripScheduleDto getTripSchedule(TripDto tripDto, String tripDate, boolean createSchedForTrip);

    //Ticket related method
    TicketDto bookTicket(TripScheduleDto tripScheduleDto, UserDto passenger);

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/service/BusReservationServiceImpl.java
================================================
package com.starterkit.springboot.brs.service;

import com.starterkit.springboot.brs.dto.mapper.TicketMapper;
import com.starterkit.springboot.brs.dto.mapper.TripMapper;
import com.starterkit.springboot.brs.dto.mapper.TripScheduleMapper;
import com.starterkit.springboot.brs.dto.model.bus.*;
import com.starterkit.springboot.brs.dto.model.user.UserDto;
import com.starterkit.springboot.brs.exception.BRSException;
import com.starterkit.springboot.brs.exception.EntityType;
import com.starterkit.springboot.brs.exception.ExceptionType;
import com.starterkit.springboot.brs.model.bus.*;
import com.starterkit.springboot.brs.model.user.User;
import com.starterkit.springboot.brs.repository.bus.*;
import com.starterkit.springboot.brs.repository.user.UserRepository;
import com.starterkit.springboot.brs.util.RandomStringUtil;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import static com.starterkit.springboot.brs.exception.EntityType.*;
import static com.starterkit.springboot.brs.exception.ExceptionType.*;

/**
 * Created by Arpit Khandelwal.
 */
@Component
public class BusReservationServiceImpl implements BusReservationService {
    @Autowired
    private AgencyRepository agencyRepository;

    @Autowired
    private BusRepository busRepository;

    @Autowired
    private StopRepository stopRepository;

    @Autowired
    private TicketRepository ticketRepository;

    @Autowired
    private TripRepository tripRepository;

    @Autowired
    private TripScheduleRepository tripScheduleRepository;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private ModelMapper modelMapper;

    /**
     * Retruns all the available stops in the database.
     *
     * @return
     */
    @Override
    public Set<StopDto> getAllStops() {
        return StreamSupport
                .stream(stopRepository.findAll().spliterator(), false)
                .map(stop -> modelMapper.map(stop, StopDto.class))
                .collect(Collectors.toCollection(TreeSet::new));
    }

    /**
     * Returns the Stop details based on stop code.
     *
     * @param stopCode
     * @return
     */
    @Override
    public StopDto getStopByCode(String stopCode) {
        Optional<Stop> stop = Optional.ofNullable(stopRepository.findByCode(stopCode));
        if (stop.isPresent()) {
            return modelMapper.map(stop.get(), StopDto.class);
        }
        throw exception(STOP, ENTITY_NOT_FOUND, stopCode);
    }

    /**
     * Fetch AgencyDto from userDto
     *
     * @param userDto
     * @return
     */
    @Override
    public AgencyDto getAgency(UserDto userDto) {
        User user = getUser(userDto.getEmail());
        if (user != null) {
            Optional<Agency> agency = Optional.ofNullable(agencyRepository.findByOwner(user));
            if (agency.isPresent()) {
                return modelMapper.map(agency.get(), AgencyDto.class);
            }
            throw exceptionWithId(AGENCY, ENTITY_NOT_FOUND, 2, user.getEmail());
        }
        throw exception(USER, ENTITY_NOT_FOUND, userDto.getEmail());
    }

    /**
     * Register a new agency from the Admin signup flow
     *
     * @param agencyDto
     * @return
     */
    @Override
    public AgencyDto addAgency(AgencyDto agencyDto) {
        User admin = getUser(agencyDto.getOwner().getEmail());
        if (admin != null) {
            Optional<Agency> agency = Optional.ofNullable(agencyRepository.findByName(agencyDto.getName()));
            if (!agency.isPresent()) {
                Agency agencyModel = new Agency()
                        .setName(agencyDto.getName())
                        .setDetails(agencyDto.getDetails())
                        .setCode(RandomStringUtil.getAlphaNumericString(8, agencyDto.getName()))
                        .setOwner(admin);
                agencyRepository.save(agencyModel);
                return modelMapper.map(agencyModel, AgencyDto.class);
            }
            throw exception(AGENCY, DUPLICATE_ENTITY, agencyDto.getName());
        }
        throw exception(USER, ENTITY_NOT_FOUND, agencyDto.getOwner().getEmail());
    }

    /**
     * Updates the agency with given Bus information
     *
     * @param agencyDto
     * @param busDto
     * @return
     */
    @Transactional
    public AgencyDto updateAgency(AgencyDto agencyDto, BusDto busDto) {
        Agency agency = getAgency(agencyDto.getCode());
        if (agency != null) {
            if (busDto != null) {
                Optional<Bus> bus = Optional.ofNullable(busRepository.findByCodeAndAgency(busDto.getCode(), agency));
                if (!bus.isPresent()) {
                    Bus busModel = new Bus()
                            .setAgency(agency)
                            .setCode(busDto.getCode())
                            .setCapacity(busDto.getCapacity())
                            .setMake(busDto.getMake());
                    busRepository.save(busModel);
                    if (agency.getBuses() == null) {
                        agency.setBuses(new HashSet<>());
                    }
                    agency.getBuses().add(busModel);
                    return modelMapper.map(agencyRepository.save(agency), AgencyDto.class);
                }
                throw exceptionWithId(BUS, DUPLICATE_ENTITY, 2, busDto.getCode(), agencyDto.getCode());
            } else {
                //update agency details case
                agency.setName(agencyDto.getName())
                        .setDetails(agencyDto.getDetails());
                return modelMapper.map(agencyRepository.save(agency), AgencyDto.class);
            }
        }
        throw exceptionWithId(AGENCY, ENTITY_NOT_FOUND, 2, agencyDto.getOwner().getEmail());
    }

    /**
     * Returns trip details basd on trip_id
     *
     * @param tripID
     * @return
     */
    @Override
    public TripDto getTripById(Long tripID) {
        Optional<Trip> trip = tripRepository.findById(tripID);
        if (trip.isPresent()) {
            return TripMapper.toTripDto(trip.get());
        }
        throw exception(TRIP, ENTITY_NOT_FOUND, tripID.toString());
    }

    /**
     * Creates two new Trips with the given information in tripDto object
     *
     * @param tripDto
     * @return
     */
    @Override
    @Transactional
    public List<TripDto> addTrip(TripDto tripDto) {
        Stop sourceStop = getStop(tripDto.getSourceStopCode());
        if (sourceStop != null) {
            Stop destinationStop = getStop(tripDto.getDestinationStopCode());
            if (destinationStop != null) {
                if (!sourceStop.getCode().equalsIgnoreCase(destinationStop.getCode())) {
                    Agency agency = getAgency(tripDto.getAgencyCode());
                    if (agency != null) {
                        Bus bus = getBus(tripDto.getBusCode());
                        if (bus != null) {
                            //Each new trip creation results in a to and a fro trip
                            List<TripDto> trips = new ArrayList<>(2);
                            Trip toTrip = new Trip()
                                    .setSourceStop(sourceStop)
                                    .setDestStop(destinationStop)
                                    .setAgency(agency)
                                    .setBus(bus)
                                    .setJourneyTime(tripDto.getJourneyTime())
                                    .setFare(tripDto.getFare());
                            trips.add(TripMapper.toTripDto(tripRepository.save(toTrip)));

                            Trip froTrip = new Trip()
                                    .setSourceStop(destinationStop)
                                    .setDestStop(sourceStop)
                                    .setAgency(agency)
                                    .setBus(bus)
                                    .setJourneyTime(tripDto.getJourneyTime())
                                    .setFare(tripDto.getFare());
                            trips.add(TripMapper.toTripDto(tripRepository.save(froTrip)));
                            return trips;
                        }
                        throw exception(BUS, ENTITY_NOT_FOUND, tripDto.getBusCode());
                    }
                    throw exception(AGENCY, ENTITY_NOT_FOUND, tripDto.getAgencyCode());
                }
                throw exception(TRIP, ENTITY_EXCEPTION, "");
            }
            throw exception(STOP, ENTITY_NOT_FOUND, tripDto.getDestinationStopCode());
        }
        throw exception(STOP, ENTITY_NOT_FOUND, tripDto.getSourceStopCode());
    }

    /**
     * Fetch all the trips for a given agency
     *
     * @param agencyCode
     * @return
     */
    @Override
    public List<TripDto> getAgencyTrips(String agencyCode) {
        Agency agency = getAgency(agencyCode);
        if (agency != null) {
            List<Trip> agencyTrips = tripRepository.findByAgency(agency);
            if (!agencyTrips.isEmpty()) {
                return agencyTrips
                        .stream()
                        .map(trip -> TripMapper.toTripDto(trip))
                        .collect(Collectors.toList());
            }
            return Collections.emptyList();
        }
        throw exception(AGENCY, ENTITY_NOT_FOUND, agencyCode);
    }

    /**
     * Returns a list of trips between given source and destination stops.
     *
     * @param sourceStopCode
     * @param destinationStopCode
     * @return
     */
    @Override
    public List<TripDto> getAvailableTripsBetweenStops(String sourceStopCode, String destinationStopCode) {
        List<Trip> availableTrips = findTripsBetweenStops(sourceStopCode, destinationStopCode);
        if (!availableTrips.isEmpty()) {
            return availableTrips
                    .stream()
                    .map(trip -> TripMapper.toTripDto(trip))
                    .collect(Collectors.toList());
        }
        return Collections.emptyList();
    }

    /**
     * Function to locate all the trips between src and dest stops and then
     * filter the results as per the given date based on data present in
     * trip schedule collection.
     *
     * @param sourceStopCode
     * @param destinationStopCode
     * @param tripDate
     * @return list of tripschedules on given date
     */
    @Override
    public List<TripScheduleDto> getAvailableTripSchedules(String sourceStopCode, String destinationStopCode, String tripDate) {
        List<Trip> availableTrips = findTripsBetweenStops(sourceStopCode, destinationStopCode);
        if (!availableTrips.isEmpty()) {
            return availableTrips
                    .stream()
                    .map(trip -> getTripSchedule(TripMapper.toTripDto(trip), tripDate, true))
                    .filter(tripScheduleDto -> tripScheduleDto != null)
                    .collect(Collectors.toList());
        }
        return Collections.emptyList();
    }

    /**
     * Returns TripScheduleDto based on trip details and trip date,
     * optionally creates a schedule if its not found and if the createSchedForTrip
     * parameter is set to true.
     *
     * @param tripDto
     * @param tripDate
     * @param createSchedForTrip
     * @return
     */
    @Override
    public TripScheduleDto getTripSchedule(TripDto tripDto, String tripDate, boolean createSchedForTrip) {
        Optional<Trip> trip = tripRepository.findById(tripDto.getId());
        if (trip.isPresent()) {
            Optional<TripSchedule> tripSchedule = Optional.ofNullable(tripScheduleRepository.findByTripDetailAndTripDate(trip.get(), tripDate));
            if (tripSchedule.isPresent()) {
                return TripScheduleMapper.toTripScheduleDto(tripSchedule.get());
            } else {
                if (createSchedForTrip) { //create the schedule
                    TripSchedule tripSchedule1 = new TripSchedule()
                            .setTripDetail(trip.get())
                            .setTripDate(tripDate)
                            .setAvailableSeats(trip.get().getBus().getCapacity());
                    return TripScheduleMapper.toTripScheduleDto(tripScheduleRepository.save(tripSchedule1));
                } else {
                    throw exceptionWithId(TRIP, ENTITY_NOT_FOUND, 2, tripDto.getId().toString(), tripDate);
                }
            }
        }
        throw exception(TRIP, ENTITY_NOT_FOUND, tripDto.getId().toString());
    }

    /**
     * Method to book ticket for a given trip schedule
     *
     * @param tripScheduleDto
     * @param userDto
     * @return
     */
    @Override
    @Transactional
    public TicketDto bookTicket(TripScheduleDto tripScheduleDto, UserDto userDto) {
        User user = getUser(userDto.getEmail());
        if (user != null) {
            Optional<TripSchedule> tripSchedule = tripScheduleRepository.findById(tripScheduleDto.getId());
            if (tripSchedule.isPresent()) {
                Ticket ticket = new Ticket()
                        .setCancellable(false)
                        .setJourneyDate(tripSchedule.get().getTripDate())
                        .setPassenger(user)
                        .setTripSchedule(tripSchedule.get())
                        .setSeatNumber(tripSchedule.get().getTripDetail().getBus().getCapacity() - tripSchedule.get().getAvailableSeats());
                ticketRepository.save(ticket);
                tripSchedule.get().setAvailableSeats(tripSchedule.get().getAvailableSeats() - 1); //reduce availability by 1
                tripScheduleRepository.save(tripSchedule.get());//update schedule
                return TicketMapper.toTicketDto(ticket);
            }
            throw exceptionWithId(TRIP, ENTITY_NOT_FOUND, 2, tripScheduleDto.getTripId().toString(), tripScheduleDto.getTripDate());
        }
        throw exception(USER, ENTITY_NOT_FOUND, userDto.getEmail());
    }

    /**
     * Search for all Trips between src and dest stops
     *
     * @param sourceStopCode
     * @param destinationStopCode
     * @return
     */
    private List<Trip> findTripsBetweenStops(String sourceStopCode, String destinationStopCode) {
        Optional<Stop> sourceStop = Optional
                .ofNullable(stopRepository.findByCode(sourceStopCode));
        if (sourceStop.isPresent()) {
            Optional<Stop> destStop = Optional
                    .ofNullable(stopRepository.findByCode(destinationStopCode));
            if (destStop.isPresent()) {
                List<Trip> availableTrips = tripRepository.findAllBySourceStopAndDestStop(sourceStop.get(), destStop.get());
                if (!availableTrips.isEmpty()) {
                    return availableTrips;
                }
                return Collections.emptyList();
            }
            throw exception(STOP, ENTITY_NOT_FOUND, destinationStopCode);
        }
        throw exception(STOP, ENTITY_NOT_FOUND, sourceStopCode);
    }

    /**
     * Fetch user from UserDto
     *
     * @param email
     * @return
     */
    private User getUser(String email) {
        return userRepository.findByEmail(email);
    }

    /**
     * Fetch Stop from stopCode
     *
     * @param stopCode
     * @return
     */
    private Stop getStop(String stopCode) {
        return stopRepository.findByCode(stopCode);
    }

    /**
     * Fetch Bus from busCode, since it is unique we don't have issues of finding duplicate Buses
     *
     * @param busCode
     * @return
     */
    private Bus getBus(String busCode) {
        return busRepository.findByCode(busCode);
    }

    /**
     * Fetch Agency from agencyCode
     *
     * @param agencyCode
     * @return
     */
    private Agency getAgency(String agencyCode) {
        return agencyRepository.findByCode(agencyCode);
    }

    /**
     * Returns a new RuntimeException
     *
     * @param entityType
     * @param exceptionType
     * @param args
     * @return
     */
    private RuntimeException exception(EntityType entityType, ExceptionType exceptionType, String... args) {
        return BRSException.throwException(entityType, exceptionType, args);
    }

    /**
     * Returns a new RuntimeException
     *
     * @param entityType
     * @param exceptionType
     * @param args
     * @return
     */
    private RuntimeException exceptionWithId(EntityType entityType, ExceptionType exceptionType, Integer id, String... args) {
        return BRSException.throwExceptionWithId(entityType, exceptionType, id, args);
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/service/UserService.java
================================================
package com.starterkit.springboot.brs.service;

import com.starterkit.springboot.brs.dto.model.user.UserDto;

/**
 * Created by Arpit Khandelwal.
 */
public interface UserService {
    /**
     * Register a new user
     *
     * @param userDto
     * @return
     */
    UserDto signup(UserDto userDto);

    /**
     * Search an existing user
     *
     * @param email
     * @return
     */
    UserDto findUserByEmail(String email);

    /**
     * Update profile of the user
     *
     * @param userDto
     * @return
     */
    UserDto updateProfile(UserDto userDto);

    /**
     * Update password
     *
     * @param newPassword
     * @return
     */
    UserDto changePassword(UserDto userDto, String newPassword);
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/service/UserServiceImpl.java
================================================
package com.starterkit.springboot.brs.service;

import com.starterkit.springboot.brs.dto.mapper.UserMapper;
import com.starterkit.springboot.brs.dto.model.user.UserDto;
import com.starterkit.springboot.brs.exception.BRSException;
import com.starterkit.springboot.brs.exception.EntityType;
import com.starterkit.springboot.brs.exception.ExceptionType;
import com.starterkit.springboot.brs.model.user.Role;
import com.starterkit.springboot.brs.model.user.User;
import com.starterkit.springboot.brs.model.user.UserRoles;
import com.starterkit.springboot.brs.repository.user.RoleRepository;
import com.starterkit.springboot.brs.repository.user.UserRepository;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Optional;

import static com.starterkit.springboot.brs.exception.EntityType.USER;
import static com.starterkit.springboot.brs.exception.ExceptionType.DUPLICATE_ENTITY;
import static com.starterkit.springboot.brs.exception.ExceptionType.ENTITY_NOT_FOUND;

/**
 * Created by Arpit Khandelwal.
 */
@Component
public class UserServiceImpl implements UserService {
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Autowired
    private RoleRepository roleRepository;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private BusReservationService busReservationService;

    @Autowired
    private ModelMapper modelMapper;

    @Override
    public UserDto signup(UserDto userDto) {
        Role userRole;
        User user = userRepository.findByEmail(userDto.getEmail());
        if (user == null) {
            if (userDto.isAdmin()) {
                userRole = roleRepository.findByRole(UserRoles.ADMIN);
            } else {
                userRole = roleRepository.findByRole(UserRoles.PASSENGER);
            }
            user = new User()
                    .setEmail(userDto.getEmail())
                    .setPassword(bCryptPasswordEncoder.encode(userDto.getPassword()))
                    .setRoles(new HashSet<>(Arrays.asList(userRole)))
                    .setFirstName(userDto.getFirstName())
                    .setLastName(userDto.getLastName())
                    .setMobileNumber(userDto.getMobileNumber());
            return UserMapper.toUserDto(userRepository.save(user));
        }
        throw exception(USER, DUPLICATE_ENTITY, userDto.getEmail());
    }

    /**
     * Search an existing user
     *
     * @param email
     * @return
     */
    @Transactional
    public UserDto findUserByEmail(String email) {
        Optional<User> user = Optional.ofNullable(userRepository.findByEmail(email));
        if (user.isPresent()) {
            return modelMapper.map(user.get(), UserDto.class);
        }
        throw exception(USER, ENTITY_NOT_FOUND, email);
    }

    /**
     * Update User Profile
     *
     * @param userDto
     * @return
     */
    @Override
    public UserDto updateProfile(UserDto userDto) {
        Optional<User> user = Optional.ofNullable(userRepository.findByEmail(userDto.getEmail()));
        if (user.isPresent()) {
            User userModel = user.get();
            userModel.setFirstName(userDto.getFirstName())
                    .setLastName(userDto.getLastName())
                    .setMobileNumber(userDto.getMobileNumber());
            return UserMapper.toUserDto(userRepository.save(userModel));
        }
        throw exception(USER, ENTITY_NOT_FOUND, userDto.getEmail());
    }

    /**
     * Change Password
     *
     * @param userDto
     * @param newPassword
     * @return
     */
    @Override
    public UserDto changePassword(UserDto userDto, String newPassword) {
        Optional<User> user = Optional.ofNullable(userRepository.findByEmail(userDto.getEmail()));
        if (user.isPresent()) {
            User userModel = user.get();
            userModel.setPassword(bCryptPasswordEncoder.encode(newPassword));
            return UserMapper.toUserDto(userRepository.save(userModel));
        }
        throw exception(USER, ENTITY_NOT_FOUND, userDto.getEmail());
    }

    /**
     * Returns a new RuntimeException
     *
     * @param entityType
     * @param exceptionType
     * @param args
     * @return
     */
    private RuntimeException exception(EntityType entityType, ExceptionType exceptionType, String... args) {
        return BRSException.throwException(entityType, exceptionType, args);
    }
}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/util/DateUtils.java
================================================
package com.starterkit.springboot.brs.util;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by Arpit Khandelwal.
 */
public class DateUtils {

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * Returns today's date as java.util.Date object
     *
     * @return today's date as java.util.Date object
     */
    public static Date today() {
        return new Date();
    }

    /**
     * Returns today's date as yyyy-MM-dd format
     *
     * @return today's date as yyyy-MM-dd format
     */
    public static String todayStr() {
        return sdf.format(today());
    }

    /**
     * Returns the formatted String date for the passed java.util.Date object
     *
     * @param date
     * @return
     */
    public static String formattedDate(Date date) {
        return date != null ? sdf.format(date) : todayStr();
    }

}


================================================
FILE: src/main/java/com/starterkit/springboot/brs/util/RandomStringUtil.java
================================================
package com.starterkit.springboot.brs.util;

/**
 * Created by Arpit Khandelwal.
 */
public class RandomStringUtil {
    // function to generate a random string of length n
    public static String getAlphaNumericString(int n, String inputString) {

        // chose a Character random from this String
        String inputStringUcase = inputString.trim().toUpperCase().replaceAll(" ", "").concat("123456789");

        // create StringBuffer size of inputString
        StringBuilder sb = new StringBuilder(n);

        for (int i = 0; i < n; i++) {

            // generate a random number between
            // 0 to inputString variable length
            int index
                    = (int) (inputStringUcase.length()
                    * Math.random());

            // add Character one by one in end of sb
            sb.append(inputStringUcase
                    .charAt(index));
        }

        return sb.toString();
    }
}



================================================
FILE: src/main/resources/application-prod.properties
================================================
#Default server port
server.port=8080

================================================
FILE: src/main/resources/application-uat.properties
================================================
#Default server port
server.port=8090

================================================
FILE: src/main/resources/application.properties
================================================
#Default server port
server.port=8080

## MySQL
spring.datasource.url=jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:brs}?useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=${MYSQL_USER:root}
spring.datasource.password=${MYSQL_USER_PASSWORD:root}

# drop n create table, good for testing, comment this in production
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=${SHOW_SQL:false}

#Set active profile
spring.profiles.active=@activatedProperties@

logging.level.web=${LOG_LEVEL:DEBUG}
management.endpoints.web.exposure.include=*
server.error.whitelabel.enabled=false

================================================
FILE: src/main/resources/banner.txt
================================================
 +-+ +-+ +-+   +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+   +-+ +-+ +-+
 |T| |h| |e|   |R| |e| |s| |o| |n| |a| |n| |t|   |W| |e| |b|
 +-+ +-+ +-+   +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+   +-+ +-+ +-+

================================================
FILE: src/main/resources/custom.properties
================================================
#Exception Messages
stop.not.found=Requested stop with code - {0} does not exist.
stop.duplicate=Stop with code - {0} already exists.
agency.not.found=Agency with code - {0} does not exist.
agency.not.found.2=User with email - {0} does not own any agency yet.
agency.duplicate=The Agency with code/Name - {0} already exists.
user.not.found=Requested user with email - {0} does not exist.
user.duplicate=User with email - {0} already exists.
bus.duplicate=The Bus with code - {0} already exists.
bus.duplicate.2=The Bus with code - {0} already exists under agency - {1}.
trip.not.found=Requested trip with id - {0} does not exist.
trip.duplicate=Trip with id - {0} already exists.
trip.exception=The source and destination stops cannot be the same, please select different stop codes.
tripschedule.not.found=Requested schedule for Trip with ID - {0} does not exist.
tripschedule.not.found.2=Requested schedule for Trip with ID - {0} and Journey Date - {1} does not exist.

================================================
FILE: src/main/resources/static/auth/css/style.css
================================================
/* @extend display-flex; */
display-flex, .display-flex, .display-flex-center, .signup-content, .signin-content, .social-login, .socials {
  display: flex;
  display: -webkit-flex; }

/* @extend list-type-ulli; */
list-type-ulli, .socials {
  list-style-type: none;
  margin: 0;
  padding: 0; }

/* poppins-300 - latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 300;
  src: url("../fonts/poppins/poppins-v5-latin-300.eot");
  /* IE9 Compat Modes */
  src: local("Poppins Light"), local("Poppins-Light"), url("../fonts/poppins/poppins-v5-latin-300.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-300.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-300.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-300.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-300.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-300italic - latin */
@font-face {
  font-family: 'Poppins';
  font-style: italic;
  font-weight: 300;
  src: url("../fonts/poppins/poppins-v5-latin-300italic.eot");
  /* IE9 Compat Modes */
  src: local("Poppins Light Italic"), local("Poppins-LightItalic"), url("../fonts/poppins/poppins-v5-latin-300italic.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-300italic.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-300italic.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-300italic.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-300italic.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-regular - latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  src: url("../fonts/poppins/poppins-v5-latin-regular.eot");
  /* IE9 Compat Modes */
  src: local("Poppins Regular"), local("Poppins-Regular"), url("../fonts/poppins/poppins-v5-latin-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-regular.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-regular.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-regular.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-regular.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-italic - latin */
@font-face {
  font-family: 'Poppins';
  font-style: italic;
  font-weight: 400;
  src: url("../fonts/poppins/poppins-v5-latin-italic.eot");
  /* IE9 Compat Modes */
  src: local("Poppins Italic"), local("Poppins-Italic"), url("../fonts/poppins/poppins-v5-latin-italic.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-italic.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-italic.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-italic.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-italic.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-500 - latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 500;
  src: url("../fonts/poppins/poppins-v5-latin-500.eot");
  /* IE9 Compat Modes */
  src: local("Poppins Medium"), local("Poppins-Medium"), url("../fonts/poppins/poppins-v5-latin-500.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-500.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-500.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-500.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-500.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-500italic - latin */
@font-face {
  font-family: 'Poppins';
  font-style: italic;
  font-weight: 500;
  src: url("../fonts/poppins/poppins-v5-latin-500italic.eot");
  /* IE9 Compat Modes */
  src: local("Poppins Medium Italic"), local("Poppins-MediumItalic"), url("../fonts/poppins/poppins-v5-latin-500italic.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-500italic.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-500italic.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-500italic.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-500italic.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-600 - latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 600;
  src: url("../fonts/poppins/poppins-v5-latin-600.eot");
  /* IE9 Compat Modes */
  src: local("Poppins SemiBold"), local("Poppins-SemiBold"), url("../fonts/poppins/poppins-v5-latin-600.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-600.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-600.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-600.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-600.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-700 - latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 700;
  src: url("../fonts/poppins/poppins-v5-latin-700.eot");
  /* IE9 Compat Modes */
  src: local("Poppins Bold"), local("Poppins-Bold"), url("../fonts/poppins/poppins-v5-latin-700.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-700.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-700.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-700.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-700.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-700italic - latin */
@font-face {
  font-family: 'Poppins';
  font-style: italic;
  font-weight: 700;
  src: url("../fonts/poppins/poppins-v5-latin-700italic.eot");
  /* IE9 Compat Modes */
  src: local("Poppins Bold Italic"), local("Poppins-BoldItalic"), url("../fonts/poppins/poppins-v5-latin-700italic.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-700italic.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-700italic.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-700italic.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-700italic.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-800 - latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 800;
  src: url("../fonts/poppins/poppins-v5-latin-800.eot");
  /* IE9 Compat Modes */
  src: local("Poppins ExtraBold"), local("Poppins-ExtraBold"), url("../fonts/poppins/poppins-v5-latin-800.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-800.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-800.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-800.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-800.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-800italic - latin */
@font-face {
  font-family: 'Poppins';
  font-style: italic;
  font-weight: 800;
  src: url("../fonts/poppins/poppins-v5-latin-800italic.eot");
  /* IE9 Compat Modes */
  src: local("Poppins ExtraBold Italic"), local("Poppins-ExtraBoldItalic"), url("../fonts/poppins/poppins-v5-latin-800italic.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-800italic.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-800italic.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-800italic.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-800italic.svg#Poppins") format("svg");
  /* Legacy iOS */ }
/* poppins-900 - latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 900;
  src: url("../fonts/poppins/poppins-v5-latin-900.eot");
  /* IE9 Compat Modes */
  src: local("Poppins Black"), local("Poppins-Black"), url("../fonts/poppins/poppins-v5-latin-900.eot?#iefix") format("embedded-opentype"), url("../fonts/poppins/poppins-v5-latin-900.woff2") format("woff2"), url("../fonts/poppins/poppins-v5-latin-900.woff") format("woff"), url("../fonts/poppins/poppins-v5-latin-900.ttf") format("truetype"), url("../fonts/poppins/poppins-v5-latin-900.svg#Poppins") format("svg");
  /* Legacy iOS */ }
a:focus, a:active {
  text-decoration: none;
  outline: none;
  transition: all 300ms ease 0s;
  -moz-transition: all 300ms ease 0s;
  -webkit-transition: all 300ms ease 0s;
  -o-transition: all 300ms ease 0s;
  -ms-transition: all 300ms ease 0s; }

input, select, textarea {
  outline: none;
  appearance: unset !important;
  -moz-appearance: unset !important;
  -webkit-appearance: unset !important;
  -o-appearance: unset !important;
  -ms-appearance: unset !important; }

input::-webkit-outer-spin-button, input::-webkit-inner-spin-button {
  appearance: none !important;
  -moz-appearance: none !important;
  -webkit-appearance: none !important;
  -o-appearance: none !important;
  -ms-appearance: none !important;
  margin: 0; }

input:focus, select:focus, textarea:focus {
  outline: none;
  box-shadow: none !important;
  -moz-box-shadow: none !important;
  -webkit-box-shadow: none !important;
  -o-box-shadow: none !important;
  -ms-box-shadow: none !important; }

input[type=checkbox] {
  appearance: checkbox !important;
  -moz-appearance: checkbox !important;
  -webkit-appearance: checkbox !important;
  -o-appearance: checkbox !important;
  -ms-appearance: checkbox !important; }

input[type=radio] {
  appearance: radio !important;
  -moz-appearance: radio !important;
  -webkit-appearance: radio !important;
  -o-appearance: radio !important;
  -ms-appearance: radio !important; }

img {
  max-width: 100%;
  height: auto; }

figure {
  margin: 0; }

p {
  margin-bottom: 0px;
  font-size: 15px;
  color: #777; }

h2 {
  line-height: 1.66;
  margin: 0;
  padding: 0;
  font-weight: bold;
  color: #222;
  font-family: Poppins;
  font-size: 36px; }


.main {
  background: #f8f8f8; }

.clear {
  clear: both; }

body {
  font-size: 13px;
  line-height: 1.8;
  color: #222;
  background: #f8f8f8;
  font-weight: 400;
  font-family: Poppins; }

.container {
  width: 900px;
  background: #fff;
  margin: 0 auto;
  box-shadow: 0px 15px 16.83px 0.17px rgba(0, 0, 0, 0.05);
  -moz-box-shadow: 0px 15px 16.83px 0.17px rgba(0, 0, 0, 0.05);
  -webkit-box-shadow: 0px 15px 16.83px 0.17px rgba(0, 0, 0, 0.05);
  -o-box-shadow: 0px 15px 16.83px 0.17px rgba(0, 0, 0, 0.05);
  -ms-box-shadow: 0px 15px 16.83px 0.17px rgba(0, 0, 0, 0.05);
  border-radius: 20px;
  -moz-border-radius: 20px;
  -webkit-border-radius: 20px;
  -o-border-radius: 20px;
  -ms-border-radius: 20px; }

.display-flex {
  justify-content: space-between;
  -moz-justify-content: space-between;
  -webkit-justify-content: space-between;
  -o-justify-content: space-between;
  -ms-justify-content: space-between;
  align-items: center;
  -moz-align-items: center;
  -webkit-align-items: center;
  -o-align-items: center;
  -ms-align-items: center; }

.display-flex-center {
  justify-content: center;
  -moz-justify-content: center;
  -webkit-justify-content: center;
  -o-justify-content: center;
  -ms-justify-content: center;
  align-items: center;
  -moz-align-items: center;
  -webkit-align-items: center;
  -o-align-items: center;
  -ms-align-items: center; }

.position-center {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  -o-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%); }

.signup {
  margin-bottom: 150px; }

.signup-content {
  padding: 75px 0; }

.signup-form, .signup-image, .signin-form, .signin-image {
  width: 50%;
  overflow: hidden; }

.signup-image {
  margin: 0 55px; }

.form-title {
  margin-bottom: 33px; }

.signup-image {
  margin-top: 45px; }

.text-danger {
  color: #fc4b6c !important; }

figure {
  margin-bottom: 50px;
  text-align: center; }

.form-submit {
  display: inline-block;
  background: #6dabe4;
  color: #fff;
  border-bottom: none;
  width: auto;
  padding: 15px 39px;
  border-radius: 5px;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  -o-border-radius: 5px;
  -ms-border-radius: 5px;
  margin-top: 25px;
  cursor: pointer; }
  .form-submit:hover {
    background: #4292dc; }

#signin {
  margin-top: 16px; }

.signup-image-link {
  font-size: 14px;
  color: #222;
  display: block;
  text-align: center; }

.term-service {
  font-size: 13px;
  color: #222; }

.signup-form {
  margin-left: 75px;
  margin-right: 75px;
  padding-left: 34px; }

.register-form {
  width: 100%; }

.form-group {
  position: relative;
  margin-bottom: 25px;
  overflow: hidden; }
  .form-group:last-child {
    margin-bottom: 0px; }

input {
  width: 100%;
  display: block;
  border: none;
  border-bottom: 1px solid #999;
  padding: 6px 30px;
  font-family: Poppins;
  box-sizing: border-box; }
  input::-webkit-input-placeholder {
    color: #999; }
  input::-moz-placeholder {
    color: #999; }
  input:-ms-input-placeholder {
    color: #999; }
  input:-moz-placeholder {
    color: #999; }
  input:focus {
    border-bottom: 1px solid #222; }
    input:focus::-webkit-input-placeholder {
      color: #222; }
    input:focus::-moz-placeholder {
      color: #222; }
    input:focus:-ms-input-placeholder {
      color: #222; }
    input:focus:-moz-placeholder {
      color: #222; }

input[type=checkbox]:not(old) {
  width: 2em;
  margin: 0;
  padding: 0;
  font-size: 1em;
  display: none; }

input[type=checkbox]:not(old) + label {
  display: inline-block;
  line-height: 1.5em;
  margin-top: 6px; }

input[type=checkbox]:not(old) + label > span {
  display: inline-block;
  width: 13px;
  height: 13px;
  margin-right: 15px;
  margin-bottom: 3px;
  border: 1px solid #999;
  border-radius: 2px;
  -moz-border-radius: 2px;
  -webkit-border-radius: 2px;
  -o-border-radius: 2px;
  -ms-border-radius: 2px;
  background: white;
  background-image: -moz-linear-gradient(white, white);
  background-image: -ms-linear-gradient(white, white);
  background-image: -o-linear-gradient(white, white);
  background-image: -webkit-linear-gradient(white, white);
  background-image: linear-gradient(white, white);
  vertical-align: bottom; }

input[type=checkbox]:not(old):checked + label > span {
  background-image: -moz-linear-gradient(white, white);
  background-image: -ms-linear-gradient(white, white);
  background-image: -o-linear-gradient(white, white);
  background-image: -webkit-linear-gradient(white, white);
  background-image: linear-gradient(white, white); }

input[type=checkbox]:not(old):checked + label > span:before {
  content: '\f26b';
  display: block;
  color: #222;
  font-size: 11px;
  line-height: 1.2;
  text-align: center;
  font-family: 'Material-Design-Iconic-Font';
  font-weight: bold; }

.agree-term {
  display: inline-block;
  width: auto; }

label {
  position: absolute;
  left: 0;
  top: 15px;
  transform: translateY(-50%);
  -moz-transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
  -o-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  color: #222; }

.label-has-error {
  top: 22%; }

label.error {
  position: relative;
  background: url("../images/unchecked.gif") no-repeat;
  background-position-y: 3px;
  padding-left: 20px;
  display: block;
  margin-top: 20px; }

label.valid {
  display: block;
  position: absolute;
  right: 0;
  left: auto;
  margin-top: -6px;
  width: 20px;
  height: 20px;
  background: transparent; }
  label.valid:after {
    font-family: 'Material-Design-Iconic-Font';
    content: '\f269';
    width: 100%;
    height: 100%;
    position: absolute;
    /* right: 0; */
    font-size: 16px;
    color: green; }

.label-agree-term {
  position: relative;
  top: 0%;
  transform: translateY(0);
  -moz-transform: translateY(0);
  -webkit-transform: translateY(0);
  -o-transform: translateY(0);
  -ms-transform: translateY(0); }

.material-icons-name {
  font-size: 18px; }

.signin-content {
  padding-top: 67px;
  padding-bottom: 87px; }

.social-login {
  align-items: center;
  -moz-align-items: center;
  -webkit-align-items: center;
  -o-align-items: center;
  -ms-align-items: center;
  margin-top: 80px; }

.social-label {
  display: inline-block;
  margin-right: 15px; }

.socials li {
  padding: 5px; }
  .socials li:last-child {
    margin-right: 0px; }
  .socials li a {
    text-decoration: none; }
    .socials li a i {
      width: 30px;
      height: 30px;
      color: #fff;
      font-size: 14px;
      border-radius: 5px;
      -moz-border-radius: 5px;
      -webkit-border-radius: 5px;
      -o-border-radius: 5px;
      -ms-border-radius: 5px;
      transform: translateZ(0);
      -moz-transform: translateZ(0);
      -webkit-transform: translateZ(0);
      -o-transform: translateZ(0);
      -ms-transform: translateZ(0);
      -webkit-transition-duration: 0.3s;
      transition-duration: 0.3s;
      -webkit-transition-property: transform;
      transition-property: transform;
      -webkit-transition-timing-function: ease-out;
      transition-timing-function: ease-out; }
  .socials li:hover a i {
    -webkit-transform: scale(1.3) translateZ(0);
    transform: scale(1.3) translateZ(0); }

.zmdi-facebook {
  background: #3b5998; }

.zmdi-twitter {
  background: #1da0f2; }

.zmdi-google {
  background: #e72734; }

.signin-form {
  margin-right: 90px;
  margin-left: 80px; }

.signin-image {
  margin-left: 110px;
  margin-right: 20px;
  margin-top: 10px; }

@media screen and (max-width: 1200px) {
  .container {
    width: calc( 100% - 30px);
    max-width: 100%; } }
@media screen and (min-width: 1024px) {
  .container {
    max-width: 1200px; } }
@media screen and (max-width: 768px) {
  .signup-content, .signin-content {
    flex-direction: column;
    -moz-flex-direction: column;
    -webkit-flex-direction: column;
    -o-flex-direction: column;
    -ms-flex-direction: column;
    justify-content: center;
    -moz-justify-content: center;
    -webkit-justify-content: center;
    -o-justify-content: center;
    -ms-justify-content: center; }

  .signup-form {
    margin-left: 0px;
    margin-right: 0px;
    padding-left: 0px;
    /* box-sizing: border-box; */
    padding: 0 30px; }

  .signin-image {
    margin-left: 0px;
    margin-right: 0px;
    margin-top: 50px;
    order: 2;
    -moz-order: 2;
    -webkit-order: 2;
    -o-order: 2;
    -ms-order: 2; }

  .signup-form, .signup-image, .signin-form, .signin-image {
    width: auto; }

  .social-login {
    justify-content: center;
    -moz-justify-content: center;
    -webkit-justify-content: center;
    -o-justify-content: center;
    -ms-justify-content: center; }

  .form-button {
    text-align: center; }

  .signin-form {
    order: 1;
    -moz-order: 1;
    -webkit-order: 1;
    -o-order: 1;
    -ms-order: 1;
    margin-right: 0px;
    margin-left: 0px;
    padding: 0 30px; }

  .form-title {
    text-align: center; } }
@media screen and (max-width: 400px) {
  .social-login {
    flex-direction: column;
    -moz-flex-direction: column;
    -webkit-flex-direction: column;
    -o-flex-direction: column;
    -ms-flex-direction: column; }

  .social-label {
    margin-right: 0px;
    margin-bottom: 10px; } }

/*# sourceMappingURL=style.css.map */


================================================
FILE: src/main/resources/static/auth/fonts/material-icon/css/material-design-iconic-font.css
================================================
/*!
 *  Material Design Iconic Font by Sergey Kupletsky (@zavoloklom) - http://zavoloklom.github.io/material-design-iconic-font/
 *  License - http://zavoloklom.github.io/material-design-iconic-font/license (Font: SIL OFL 1.1, CSS: MIT License)
 */
@font-face {
  font-family: 'Material-Design-Iconic-Font';
  src: url('../fonts/Material-Design-Iconic-Font.woff2?v=2.2.0') format('woff2'), url('../fonts/Material-Design-Iconic-Font.woff?v=2.2.0') format('woff'), url('../fonts/Material-Design-Iconic-Font.ttf?v=2.2.0') format('truetype');
  font-weight: normal;
  font-style: normal;
}
.zmdi {
  display: inline-block;
  font: normal normal normal 14px/1 'Material-Design-Iconic-Font';
  font-size: inherit;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.zmdi-hc-lg {
  font-size: 1.33333333em;
  line-height: 0.75em;
  vertical-align: -15%;
}
.zmdi-hc-2x {
  font-size: 2em;
}
.zmdi-hc-3x {
  font-size: 3em;
}
.zmdi-hc-4x {
  font-size: 4em;
}
.zmdi-hc-5x {
  font-size: 5em;
}
.zmdi-hc-fw {
  width: 1.28571429em;
  text-align: center;
}
.zmdi-hc-ul {
  padding-left: 0;
  margin-left: 2.14285714em;
  list-style-type: none;
}
.zmdi-hc-ul > li {
  position: relative;
}
.zmdi-hc-li {
  position: absolute;
  left: -2.14285714em;
  width: 2.14285714em;
  top: 0.14285714em;
  text-align: center;
}
.zmdi-hc-li.zmdi-hc-lg {
  left: -1.85714286em;
}
.zmdi-hc-border {
  padding: .1em .25em;
  border: solid 0.1em #9e9e9e;
  border-radius: 2px;
}
.zmdi-hc-border-circle {
  padding: .1em .25em;
  border: solid 0.1em #9e9e9e;
  border-radius: 50%;
}
.zmdi.pull-left {
  float: left;
  margin-right: .15em;
}
.zmdi.pull-right {
  float: right;
  margin-left: .15em;
}
.zmdi-hc-spin {
  -webkit-animation: zmdi-spin 1.5s infinite linear;
          animation: zmdi-spin 1.5s infinite linear;
}
.zmdi-hc-spin-reverse {
  -webkit-animation: zmdi-spin-reverse 1.5s infinite linear;
          animation: zmdi-spin-reverse 1.5s infinite linear;
}
@-webkit-keyframes zmdi-spin {
  0% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(359deg);
            transform: rotate(359deg);
  }
}
@keyframes zmdi-spin {
  0% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(359deg);
            transform: rotate(359deg);
  }
}
@-webkit-keyframes zmdi-spin-reverse {
  0% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(-359deg);
            transform: rotate(-359deg);
  }
}
@keyframes zmdi-spin-reverse {
  0% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(-359deg);
            transform: rotate(-359deg);
  }
}
.zmdi-hc-rotate-90 {
  -webkit-transform: rotate(90deg);
      -ms-transform: rotate(90deg);
          transform: rotate(90deg);
}
.zmdi-hc-rotate-180 {
  -webkit-transform: rotate(180deg);
      -ms-transform: rotate(180deg);
          transform: rotate(180deg);
}
.zmdi-hc-rotate-270 {
  -webkit-transform: rotate(270deg);
      -ms-transform: rotate(270deg);
          transform: rotate(270deg);
}
.zmdi-hc-flip-horizontal {
  -webkit-transform: scale(-1, 1);
      -ms-transform: scale(-1, 1);
          transform: scale(-1, 1);
}
.zmdi-hc-flip-vertical {
  -webkit-transform: scale(1, -1);
      -ms-transform: scale(1, -1);
          transform: scale(1, -1);
}
.zmdi-hc-stack {
  position: relative;
  display: inline-block;
  width: 2em;
  height: 2em;
  line-height: 2em;
  vertical-align: middle;
}
.zmdi-hc-stack-1x,
.zmdi-hc-stack-2x {
  position: absolute;
  left: 0;
  width: 100%;
  text-align: center;
}
.zmdi-hc-stack-1x {
  line-height: inherit;
}
.zmdi-hc-stack-2x {
  font-size: 2em;
}
.zmdi-hc-inverse {
  color: #ffffff;
}
/* Material Design Iconic Font uses the Unicode Private Use Area (PUA) to ensure screen
   readers do not read off random characters that represent icons */
.zmdi-3d-rotation:before {
  content: '\f101';
}
.zmdi-airplane-off:before {
  content: '\f102';
}
.zmdi-airplane:before {
  content: '\f103';
}
.zmdi-album:before {
  content: '\f104';
}
.zmdi-archive:before {
  content: '\f105';
}
.zmdi-assignment-account:before {
  content: '\f106';
}
.zmdi-assignment-alert:before {
  content: '\f107';
}
.zmdi-assignment-check:before {
  content: '\f108';
}
.zmdi-assignment-o:before {
  content: '\f109';
}
.zmdi-assignment-return:before {
  content: '\f10a';
}
.zmdi-assignment-returned:before {
  content: '\f10b';
}
.zmdi-assignment:before {
  content: '\f10c';
}
.zmdi-attachment-alt:before {
  content: '\f10d';
}
.zmdi-attachment:before {
  content: '\f10e';
}
.zmdi-audio:before {
  content: '\f10f';
}
.zmdi-badge-check:before {
  content: '\f110';
}
.zmdi-balance-wallet:before {
  content: '\f111';
}
.zmdi-balance:before {
  content: '\f112';
}
.zmdi-battery-alert:before {
  content: '\f113';
}
.zmdi-battery-flash:before {
  content: '\f114';
}
.zmdi-battery-unknown:before {
  content: '\f115';
}
.zmdi-battery:before {
  content: '\f116';
}
.zmdi-bike:before {
  content: '\f117';
}
.zmdi-block-alt:before {
  content: '\f118';
}
.zmdi-block:before {
  content: '\f119';
}
.zmdi-boat:before {
  content: '\f11a';
}
.zmdi-book-image:before {
  content: '\f11b';
}
.zmdi-book:before {
  content: '\f11c';
}
.zmdi-bookmark-outline:before {
  content: '\f11d';
}
.zmdi-bookmark:before {
  content: '\f11e';
}
.zmdi-brush:before {
  content: '\f11f';
}
.zmdi-bug:before {
  content: '\f120';
}
.zmdi-bus:before {
  content: '\f121';
}
.zmdi-cake:before {
  content: '\f122';
}
.zmdi-car-taxi:before {
  content: '\f123';
}
.zmdi-car-wash:before {
  content: '\f124';
}
.zmdi-car:before {
  content: '\f125';
}
.zmdi-card-giftcard:before {
  content: '\f126';
}
.zmdi-card-membership:before {
  content: '\f127';
}
.zmdi-card-travel:before {
  content: '\f128';
}
.zmdi-card:before {
  content: '\f129';
}
.zmdi-case-check:before {
  content: '\f12a';
}
.zmdi-case-download:before {
  content: '\f12b';
}
.zmdi-case-play:before {
  content: '\f12c';
}
.zmdi-case:before {
  content: '\f12d';
}
.zmdi-cast-connected:before {
  content: '\f12e';
}
.zmdi-cast:before {
  content: '\f12f';
}
.zmdi-chart-donut:before {
  content: '\f130';
}
.zmdi-chart:before {
  content: '\f131';
}
.zmdi-city-alt:before {
  content: '\f132';
}
.zmdi-city:before {
  content: '\f133';
}
.zmdi-close-circle-o:before {
  content: '\f134';
}
.zmdi-close-circle:before {
  content: '\f135';
}
.zmdi-close:before {
  content: '\f136';
}
.zmdi-cocktail:before {
  content: '\f137';
}
.zmdi-code-setting:before {
  content: '\f138';
}
.zmdi-code-smartphone:before {
  content: '\f139';
}
.zmdi-code:before {
  content: '\f13a';
}
.zmdi-coffee:before {
  content: '\f13b';
}
.zmdi-collection-bookmark:before {
  content: '\f13c';
}
.zmdi-collection-case-play:before {
  content: '\f13d';
}
.zmdi-collection-folder-image:before {
  content: '\f13e';
}
.zmdi-collection-image-o:before {
  content: '\f13f';
}
.zmdi-collection-image:before {
  content: '\f140';
}
.zmdi-collection-item-1:before {
  content: '\f141';
}
.zmdi-collection-item-2:before {
  content: '\f142';
}
.zmdi-collection-item-3:before {
  content: '\f143';
}
.zmdi-collection-item-4:before {
  content: '\f144';
}
.zmdi-collection-item-5:before {
  content: '\f145';
}
.zmdi-collection-item-6:before {
  content: '\f146';
}
.zmdi-collection-item-7:before {
  content: '\f147';
}
.zmdi-collection-item-8:before {
  content: '\f148';
}
.zmdi-collection-item-9-plus:before {
  content: '\f149';
}
.zmdi-collection-item-9:before {
  content: '\f14a';
}
.zmdi-collection-item:before {
  content: '\f14b';
}
.zmdi-collection-music:before {
  content: '\f14c';
}
.zmdi-collection-pdf:before {
  content: '\f14d';
}
.zmdi-collection-plus:before {
  content: '\f14e';
}
.zmdi-collection-speaker:before {
  content: '\f14f';
}
.zmdi-collection-text:before {
  content: '\f150';
}
.zmdi-collection-video:before {
  content: '\f151';
}
.zmdi-compass:before {
  content: '\f152';
}
.zmdi-cutlery:before {
  content: '\f153';
}
.zmdi-delete:before {
  content: '\f154';
}
.zmdi-dialpad:before {
  content: '\f155';
}
.zmdi-dns:before {
  content: '\f156';
}
.zmdi-drink:before {
  content: '\f157';
}
.zmdi-edit:before {
  content: '\f158';
}
.zmdi-email-open:before {
  content: '\f159';
}
.zmdi-email:before {
  content: '\f15a';
}
.zmdi-eye-off:before {
  content: '\f15b';
}
.zmdi-eye:before {
  content: '\f15c';
}
.zmdi-eyedropper:before {
  content: '\f15d';
}
.zmdi-favorite-outline:before {
  content: '\f15e';
}
.zmdi-favorite:before {
  content: '\f15f';
}
.zmdi-filter-list:before {
  content: '\f160';
}
.zmdi-fire:before {
  content: '\f161';
}
.zmdi-flag:before {
  content: '\f162';
}
.zmdi-flare:before {
  content: '\f163';
}
.zmdi-flash-auto:before {
  content: '\f164';
}
.zmdi-flash-off:before {
  content: '\f165';
}
.zmdi-flash:before {
  content: '\f166';
}
.zmdi-flip:before {
  content: '\f167';
}
.zmdi-flower-alt:before {
  content: '\f168';
}
.zmdi-flower:before {
  content: '\f169';
}
.zmdi-font:before {
  content: '\f16a';
}
.zmdi-fullscreen-alt:before {
  content: '\f16b';
}
.zmdi-fullscreen-exit:before {
  content: '\f16c';
}
.zmdi-fullscreen:before {
  content: '\f16d';
}
.zmdi-functions:before {
  content: '\f16e';
}
.zmdi-gas-station:before {
  content: '\f16f';
}
.zmdi-gesture:before {
  content: '\f170';
}
.zmdi-globe-alt:before {
  content: '\f171';
}
.zmdi-globe-lock:before {
  content: '\f172';
}
.zmdi-globe:before {
  content: '\f173';
}
.zmdi-graduation-cap:before {
  content: '\f174';
}
.zmdi-home:before {
  content: '\f175';
}
.zmdi-hospital-alt:before {
  content: '\f176';
}
.zmdi-hospital:before {
  content: '\f177';
}
.zmdi-hotel:before {
  content: '\f178';
}
.zmdi-hourglass-alt:before {
  content: '\f179';
}
.zmdi-hourglass-outline:before {
  content: '\f17a';
}
.zmdi-hourglass:before {
  content: '\f17b';
}
.zmdi-http:before {
  content: '\f17c';
}
.zmdi-image-alt:before {
  content: '\f17d';
}
.zmdi-image-o:before {
  content: '\f17e';
}
.zmdi-image:before {
  content: '\f17f';
}
.zmdi-inbox:before {
  content: '\f180';
}
.zmdi-invert-colors-off:before {
  content: '\f181';
}
.zmdi-invert-colors:before {
  content: '\f182';
}
.zmdi-key:before {
  content: '\f183';
}
.zmdi-label-alt-outline:before {
  content: '\f184';
}
.zmdi-label-alt:before {
  content: '\f185';
}
.zmdi-label-heart:before {
  content: '\f186';
}
.zmdi-label:before {
  content: '\f187';
}
.zmdi-labels:before {
  content: '\f188';
}
.zmdi-lamp:before {
  content: '\f189';
}
.zmdi-landscape:before {
  content: '\f18a';
}
.zmdi-layers-off:before {
  content: '\f18b';
}
.zmdi-layers:before {
  content: '\f18c';
}
.zmdi-library:before {
  content: '\f18d';
}
.zmdi-link:before {
  content: '\f18e';
}
.zmdi-lock-open:before {
  content: '\f18f';
}
.zmdi-lock-outline:before {
  content: '\f190';
}
.zmdi-lock:before {
  content: '\f191';
}
.zmdi-mail-reply-all:before {
  content: '\f192';
}
.zmdi-mail-reply:before {
  content: '\f193';
}
.zmdi-mail-send:before {
  content: '\f194';
}
.zmdi-mall:before {
  content: '\f195';
}
.zmdi-map:before {
  content: '\f196';
}
.zmdi-menu:before {
  content: '\f197';
}
.zmdi-money-box:before {
  content: '\f198';
}
.zmdi-money-off:before {
  content: '\f199';
}
.zmdi-money:before {
  content: '\f19a';
}
.zmdi-more-vert:before {
  content: '\f19b';
}
.zmdi-more:before {
  content: '\f19c';
}
.zmdi-movie-alt:before {
  content: '\f19d';
}
.zmdi-movie:before {
  content: '\f19e';
}
.zmdi-nature-people:before {
  content: '\f19f';
}
.zmdi-nature:before {
  content: '\f1a0';
}
.zmdi-navigation:before {
  content: '\f1a1';
}
.zmdi-open-in-browser:before {
  content: '\f1a2';
}
.zmdi-open-in-new:before {
  content: '\f1a3';
}
.zmdi-palette:before {
  content: '\f1a4';
}
.zmdi-parking:before {
  content: '\f1a5';
}
.zmdi-pin-account:before {
  content: '\f1a6';
}
.zmdi-pin-assistant:before {
  content: '\f1a7';
}
.zmdi-pin-drop:before {
  content: '\f1a8';
}
.zmdi-pin-help:before {
  content: '\f1a9';
}
.zmdi-pin-off:before {
  content: '\f1aa';
}
.zmdi-pin:before {
  content: '\f1ab';
}
.zmdi-pizza:before {
  content: '\f1ac';
}
.zmdi-plaster:before {
  content: '\f1ad';
}
.zmdi-power-setting:before {
  content: '\f1ae';
}
.zmdi-power:before {
  content: '\f1af';
}
.zmdi-print:before {
  content: '\f1b0';
}
.zmdi-puzzle-piece:before {
  content: '\f1b1';
}
.zmdi-quote:before {
  content: '\f1b2';
}
.zmdi-railway:before {
  content: '\f1b3';
}
.zmdi-receipt:before {
  content: '\f1b4';
}
.zmdi-refresh-alt:before {
  content: '\f1b5';
}
.zmdi-refresh-sync-alert:before {
  content: '\f1b6';
}
.zmdi-refresh-sync-off:before {
  content: '\f1b7';
}
.zmdi-refresh-sync:before {
  content: '\f1b8';
}
.zmdi-refresh:before {
  content: '\f1b9';
}
.zmdi-roller:before {
  content: '\f1ba';
}
.zmdi-ruler:before {
  content: '\f1bb';
}
.zmdi-scissors:before {
  content: '\f1bc';
}
.zmdi-screen-rotation-lock:before {
  content: '\f1bd';
}
.zmdi-screen-rotation:before {
  content: '\f1be';
}
.zmdi-search-for:before {
  content: '\f1bf';
}
.zmdi-search-in-file:before {
  content: '\f1c0';
}
.zmdi-search-in-page:before {
  content: '\f1c1';
}
.zmdi-search-replace:before {
  content: '\f1c2';
}
.zmdi-search:before {
  content: '\f1c3';
}
.zmdi-seat:before {
  content: '\f1c4';
}
.zmdi-settings-square:before {
  content: '\f1c5';
}
.zmdi-se
Download .txt
gitextract_v8vgjgt0/

├── .dockerignore
├── .gitignore
├── Dockerfile
├── LICENSE
├── docker-compose.yml
├── pom.xml
├── readme.md
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── starterkit/
    │   │           └── springboot/
    │   │               └── brs/
    │   │                   ├── BusReservationSystemApplication.java
    │   │                   ├── config/
    │   │                   │   ├── BrsConfiguration.java
    │   │                   │   ├── FakeController.java
    │   │                   │   ├── PageConfig.java
    │   │                   │   └── PropertiesConfig.java
    │   │                   ├── controller/
    │   │                   │   └── v1/
    │   │                   │       ├── api/
    │   │                   │       │   ├── BusReservationController.java
    │   │                   │       │   └── UserController.java
    │   │                   │       ├── command/
    │   │                   │       │   ├── AdminSignupFormCommand.java
    │   │                   │       │   ├── AgencyFormCommand.java
    │   │                   │       │   ├── BusFormCommand.java
    │   │                   │       │   ├── PasswordFormCommand.java
    │   │                   │       │   ├── ProfileFormCommand.java
    │   │                   │       │   └── TripFormCommand.java
    │   │                   │       ├── request/
    │   │                   │       │   ├── BookTicketRequest.java
    │   │                   │       │   ├── GetTripSchedulesRequest.java
    │   │                   │       │   └── UserSignupRequest.java
    │   │                   │       └── ui/
    │   │                   │           ├── AdminController.java
    │   │                   │           └── DashboardController.java
    │   │                   ├── dto/
    │   │                   │   ├── mapper/
    │   │                   │   │   ├── TicketMapper.java
    │   │                   │   │   ├── TripMapper.java
    │   │                   │   │   ├── TripScheduleMapper.java
    │   │                   │   │   └── UserMapper.java
    │   │                   │   ├── model/
    │   │                   │   │   ├── bus/
    │   │                   │   │   │   ├── AgencyDto.java
    │   │                   │   │   │   ├── BusDto.java
    │   │                   │   │   │   ├── StopDto.java
    │   │                   │   │   │   ├── TicketDto.java
    │   │                   │   │   │   ├── TripDto.java
    │   │                   │   │   │   └── TripScheduleDto.java
    │   │                   │   │   └── user/
    │   │                   │   │       ├── RoleDto.java
    │   │                   │   │       └── UserDto.java
    │   │                   │   └── response/
    │   │                   │       ├── Response.java
    │   │                   │       └── ResponseError.java
    │   │                   ├── exception/
    │   │                   │   ├── BRSException.java
    │   │                   │   ├── CustomizedResponseEntityExceptionHandler.java
    │   │                   │   ├── EntityType.java
    │   │                   │   └── ExceptionType.java
    │   │                   ├── model/
    │   │                   │   ├── bus/
    │   │                   │   │   ├── Agency.java
    │   │                   │   │   ├── Bus.java
    │   │                   │   │   ├── Stop.java
    │   │                   │   │   ├── Ticket.java
    │   │                   │   │   ├── Trip.java
    │   │                   │   │   └── TripSchedule.java
    │   │                   │   └── user/
    │   │                   │       ├── Role.java
    │   │                   │       ├── User.java
    │   │                   │       └── UserRoles.java
    │   │                   ├── repository/
    │   │                   │   ├── bus/
    │   │                   │   │   ├── AgencyRepository.java
    │   │                   │   │   ├── BusRepository.java
    │   │                   │   │   ├── StopRepository.java
    │   │                   │   │   ├── TicketRepository.java
    │   │                   │   │   ├── TripRepository.java
    │   │                   │   │   └── TripScheduleRepository.java
    │   │                   │   └── user/
    │   │                   │       ├── RoleRepository.java
    │   │                   │       └── UserRepository.java
    │   │                   ├── security/
    │   │                   │   ├── CustomUserDetailsService.java
    │   │                   │   ├── MultiHttpSecurityConfig.java
    │   │                   │   ├── SecurityConstants.java
    │   │                   │   ├── api/
    │   │                   │   │   ├── ApiJWTAuthenticationFilter.java
    │   │                   │   │   └── ApiJWTAuthorizationFilter.java
    │   │                   │   └── form/
    │   │                   │       ├── CustomAuthenticationSuccessHandler.java
    │   │                   │       ├── CustomLogoutSuccessHandler.java
    │   │                   │       └── FormBasedJWTAuthenticationFilter.java
    │   │                   ├── service/
    │   │                   │   ├── BusReservationService.java
    │   │                   │   ├── BusReservationServiceImpl.java
    │   │                   │   ├── UserService.java
    │   │                   │   └── UserServiceImpl.java
    │   │                   └── util/
    │   │                       ├── DateUtils.java
    │   │                       └── RandomStringUtil.java
    │   └── resources/
    │       ├── application-prod.properties
    │       ├── application-uat.properties
    │       ├── application.properties
    │       ├── banner.txt
    │       ├── custom.properties
    │       ├── static/
    │       │   ├── auth/
    │       │   │   ├── css/
    │       │   │   │   └── style.css
    │       │   │   ├── fonts/
    │       │   │   │   └── material-icon/
    │       │   │   │       └── css/
    │       │   │   │           └── material-design-iconic-font.css
    │       │   │   └── scss/
    │       │   │       ├── common/
    │       │   │       │   ├── extend.scss
    │       │   │       │   ├── fonts.scss
    │       │   │       │   ├── global.scss
    │       │   │       │   ├── minxi.scss
    │       │   │       │   └── variables.scss
    │       │   │       ├── layouts/
    │       │   │       │   ├── main.scss
    │       │   │       │   └── responsive.scss
    │       │   │       └── style.scss
    │       │   └── dashboard/
    │       │       ├── assets/
    │       │       │   └── plugins/
    │       │       │       ├── bootstrap/
    │       │       │       │   ├── css/
    │       │       │       │   │   ├── bootstrap-grid.css
    │       │       │       │   │   ├── bootstrap-reboot.css
    │       │       │       │   │   └── bootstrap.css
    │       │       │       │   └── js/
    │       │       │       │       └── bootstrap.js
    │       │       │       ├── chartist-js/
    │       │       │       │   └── dist/
    │       │       │       │       ├── chartist-init.css
    │       │       │       │       ├── chartist-init.js
    │       │       │       │       ├── chartist.css
    │       │       │       │       ├── chartist.js
    │       │       │       │       └── scss/
    │       │       │       │           ├── chartist.scss
    │       │       │       │           └── settings/
    │       │       │       │               └── _chartist-settings.scss
    │       │       │       ├── chartist-plugin-tooltip-master/
    │       │       │       │   ├── .gitignore
    │       │       │       │   ├── CHANGELOG.md
    │       │       │       │   ├── Gruntfile.js
    │       │       │       │   ├── LICENSE
    │       │       │       │   ├── README.md
    │       │       │       │   ├── bower.json
    │       │       │       │   ├── dist/
    │       │       │       │   │   ├── LICENSE
    │       │       │       │   │   ├── chartist-plugin-tooltip.css
    │       │       │       │   │   └── chartist-plugin-tooltip.js
    │       │       │       │   ├── package.json
    │       │       │       │   ├── src/
    │       │       │       │   │   ├── css/
    │       │       │       │   │   │   └── chartist-plugin-tooltip.css
    │       │       │       │   │   ├── scripts/
    │       │       │       │   │   │   └── chartist-plugin-tooltip.js
    │       │       │       │   │   └── scss/
    │       │       │       │   │       └── chartist-plugin-tooltip.scss
    │       │       │       │   ├── tasks/
    │       │       │       │   │   ├── aliases.yml
    │       │       │       │   │   ├── clean.js
    │       │       │       │   │   ├── copy.js
    │       │       │       │   │   ├── jasmine.js
    │       │       │       │   │   ├── jshint.js
    │       │       │       │   │   ├── sass.js
    │       │       │       │   │   ├── uglify.js
    │       │       │       │   │   └── umd.js
    │       │       │       │   └── test/
    │       │       │       │       ├── .jshintrc
    │       │       │       │       ├── runner.html
    │       │       │       │       └── spec/
    │       │       │       │           └── spec-tooltip.js
    │       │       │       ├── d3/
    │       │       │       │   ├── API.md
    │       │       │       │   ├── CHANGES.md
    │       │       │       │   ├── LICENSE
    │       │       │       │   ├── README.md
    │       │       │       │   ├── d3.js
    │       │       │       │   └── d3.min-v4.js
    │       │       │       ├── gmaps/
    │       │       │       │   ├── gmaps.js
    │       │       │       │   ├── jquery.gmaps.js
    │       │       │       │   └── lib/
    │       │       │       │       ├── gmaps.controls.js
    │       │       │       │       ├── gmaps.core.js
    │       │       │       │       ├── gmaps.events.js
    │       │       │       │       ├── gmaps.geofences.js
    │       │       │       │       ├── gmaps.geometry.js
    │       │       │       │       ├── gmaps.layers.js
    │       │       │       │       ├── gmaps.map_types.js
    │       │       │       │       ├── gmaps.markers.js
    │       │       │       │       ├── gmaps.native_extensions.js
    │       │       │       │       ├── gmaps.overlays.js
    │       │       │       │       ├── gmaps.routes.js
    │       │       │       │       ├── gmaps.static.js
    │       │       │       │       ├── gmaps.streetview.js
    │       │       │       │       ├── gmaps.styles.js
    │       │       │       │       └── gmaps.utils.js
    │       │       │       └── sticky-kit-master/
    │       │       │           └── dist/
    │       │       │               └── sticky-kit.js
    │       │       └── html/
    │       │           ├── css/
    │       │           │   ├── animate.css
    │       │           │   ├── colors/
    │       │           │   │   └── blue.css
    │       │           │   ├── spinners.css
    │       │           │   └── style.css
    │       │           ├── js/
    │       │           │   ├── custom.js
    │       │           │   ├── dashboard1.js
    │       │           │   ├── jquery.slimscroll.js
    │       │           │   ├── sidebarmenu.js
    │       │           │   └── waves.js
    │       │           └── scss/
    │       │               ├── app.scss
    │       │               ├── colors/
    │       │               │   └── blue.scss
    │       │               ├── grid.scss
    │       │               ├── icons/
    │       │               │   ├── font-awesome/
    │       │               │   │   ├── css/
    │       │               │   │   │   └── font-awesome.css
    │       │               │   │   ├── fonts/
    │       │               │   │   │   └── FontAwesome.otf
    │       │               │   │   ├── less/
    │       │               │   │   │   ├── animated.less
    │       │               │   │   │   ├── bordered-pulled.less
    │       │               │   │   │   ├── core.less
    │       │               │   │   │   ├── fixed-width.less
    │       │               │   │   │   ├── font-awesome.less
    │       │               │   │   │   ├── icons.less
    │       │               │   │   │   ├── larger.less
    │       │               │   │   │   ├── list.less
    │       │               │   │   │   ├── mixins.less
    │       │               │   │   │   ├── path.less
    │       │               │   │   │   ├── rotated-flipped.less
    │       │               │   │   │   ├── screen-reader.less
    │       │               │   │   │   ├── stacked.less
    │       │               │   │   │   └── variables.less
    │       │               │   │   ├── old/
    │       │               │   │   │   ├── .bower.json
    │       │               │   │   │   ├── .gitignore
    │       │               │   │   │   ├── .npmignore
    │       │               │   │   │   ├── HELP-US-OUT.txt
    │       │               │   │   │   ├── bower.json
    │       │               │   │   │   ├── css/
    │       │               │   │   │   │   └── font-awesome.css
    │       │               │   │   │   ├── fonts/
    │       │               │   │   │   │   └── FontAwesome.otf
    │       │               │   │   │   ├── less/
    │       │               │   │   │   │   ├── animated.less
    │       │               │   │   │   │   ├── bordered-pulled.less
    │       │               │   │   │   │   ├── core.less
    │       │               │   │   │   │   ├── extras.less
    │       │               │   │   │   │   ├── fixed-width.less
    │       │               │   │   │   │   ├── font-awesome.less
    │       │               │   │   │   │   ├── icons.less
    │       │               │   │   │   │   ├── larger.less
    │       │               │   │   │   │   ├── list.less
    │       │               │   │   │   │   ├── mixins.less
    │       │               │   │   │   │   ├── path.less
    │       │               │   │   │   │   ├── rotated-flipped.less
    │       │               │   │   │   │   ├── spinning.less
    │       │               │   │   │   │   ├── stacked.less
    │       │               │   │   │   │   └── variables.less
    │       │               │   │   │   └── scss/
    │       │               │   │   │       ├── _animated.scss
    │       │               │   │   │       ├── _bordered-pulled.scss
    │       │               │   │   │       ├── _core.scss
    │       │               │   │   │       ├── _extras.scss
    │       │               │   │   │       ├── _fixed-width.scss
    │       │               │   │   │       ├── _icons.scss
    │       │               │   │   │       ├── _larger.scss
    │       │               │   │   │       ├── _list.scss
    │       │               │   │   │       ├── _mixins.scss
    │       │               │   │   │       ├── _path.scss
    │       │               │   │   │       ├── _rotated-flipped.scss
    │       │               │   │   │       ├── _spinning.scss
    │       │               │   │   │       ├── _stacked.scss
    │       │               │   │   │       ├── _variables.scss
    │       │               │   │   │       └── font-awesome.scss
    │       │               │   │   └── scss/
    │       │               │   │       ├── _animated.scss
    │       │               │   │       ├── _bordered-pulled.scss
    │       │               │   │       ├── _core.scss
    │       │               │   │       ├── _fixed-width.scss
    │       │               │   │       ├── _icons.scss
    │       │               │   │       ├── _larger.scss
    │       │               │   │       ├── _list.scss
    │       │               │   │       ├── _mixins.scss
    │       │               │   │       ├── _path.scss
    │       │               │   │       ├── _rotated-flipped.scss
    │       │               │   │       ├── _screen-reader.scss
    │       │               │   │       ├── _stacked.scss
    │       │               │   │       ├── _variables.scss
    │       │               │   │       └── font-awesome.scss
    │       │               │   ├── linea-icons/
    │       │               │   │   ├── linea.css
    │       │               │   │   ├── linea.less
    │       │               │   │   └── linea.scss
    │       │               │   ├── material-design-iconic-font/
    │       │               │   │   └── css/
    │       │               │   │       └── material-design-iconic-font.css
    │       │               │   ├── simple-line-icons/
    │       │               │   │   ├── css/
    │       │               │   │   │   └── simple-line-icons.css
    │       │               │   │   ├── less/
    │       │               │   │   │   └── simple-line-icons.less
    │       │               │   │   └── scss/
    │       │               │   │       └── simple-line-icons.scss
    │       │               │   ├── themify-icons/
    │       │               │   │   ├── ie7/
    │       │               │   │   │   ├── ie7.css
    │       │               │   │   │   └── ie7.js
    │       │               │   │   ├── themify-icons.css
    │       │               │   │   └── themify-icons.less
    │       │               │   └── weather-icons/
    │       │               │       ├── css/
    │       │               │       │   ├── weather-icons-core.css
    │       │               │       │   ├── weather-icons-variables.css
    │       │               │       │   ├── weather-icons-wind.css
    │       │               │       │   └── weather-icons.css
    │       │               │       ├── less/
    │       │               │       │   ├── css/
    │       │               │       │   │   ├── variables-beaufort.css
    │       │               │       │   │   ├── variables-day.css
    │       │               │       │   │   ├── variables-direction.css
    │       │               │       │   │   ├── variables-misc.css
    │       │               │       │   │   ├── variables-moon.css
    │       │               │       │   │   ├── variables-neutral.css
    │       │               │       │   │   ├── variables-night.css
    │       │               │       │   │   ├── variables-time.css
    │       │               │       │   │   └── variables-wind-names.css
    │       │               │       │   ├── icon-classes/
    │       │               │       │   │   ├── classes-beaufort.less
    │       │               │       │   │   ├── classes-day.less
    │       │               │       │   │   ├── classes-direction.less
    │       │               │       │   │   ├── classes-misc.less
    │       │               │       │   │   ├── classes-moon-aliases.less
    │       │               │       │   │   ├── classes-moon.less
    │       │               │       │   │   ├── classes-neutral.less
    │       │               │       │   │   ├── classes-night.less
    │       │               │       │   │   ├── classes-time.less
    │       │               │       │   │   ├── classes-wind-aliases.less
    │       │               │       │   │   ├── classes-wind-degrees.less
    │       │               │       │   │   └── classes-wind.less
    │       │               │       │   ├── icon-variables/
    │       │               │       │   │   ├── variables-beaufort.less
    │       │               │       │   │   ├── variables-day.less
    │       │               │       │   │   ├── variables-direction.less
    │       │               │       │   │   ├── variables-misc.less
    │       │               │       │   │   ├── variables-moon.less
    │       │               │       │   │   ├── variables-neutral.less
    │       │               │       │   │   ├── variables-night.less
    │       │               │       │   │   ├── variables-time.less
    │       │               │       │   │   └── variables-wind-names.less
    │       │               │       │   ├── mappings/
    │       │               │       │   │   ├── wi-forecast-io.less
    │       │               │       │   │   ├── wi-owm.less
    │       │               │       │   │   ├── wi-wmo4680.less
    │       │               │       │   │   └── wi-yahoo.less
    │       │               │       │   ├── weather-icons-classes.less
    │       │               │       │   ├── weather-icons-core.less
    │       │               │       │   ├── weather-icons-variables.less
    │       │               │       │   ├── weather-icons-wind.less
    │       │               │       │   ├── weather-icons-wind.min.less
    │       │               │       │   ├── weather-icons.less
    │       │               │       │   └── weather-icons.min.less
    │       │               │       └── sass/
    │       │               │           ├── icon-classes/
    │       │               │           │   ├── classes-beaufort.scss
    │       │               │           │   ├── classes-day.scss
    │       │               │           │   ├── classes-direction.scss
    │       │               │           │   ├── classes-misc.scss
    │       │               │           │   ├── classes-moon-aliases.scss
    │       │               │           │   ├── classes-moon.scss
    │       │               │           │   ├── classes-neutral.scss
    │       │               │           │   ├── classes-night.scss
    │       │               │           │   ├── classes-time.scss
    │       │               │           │   ├── classes-wind-aliases.scss
    │       │               │           │   ├── classes-wind-degrees.scss
    │       │               │           │   └── classes-wind.scss
    │       │               │           ├── icon-variables/
    │       │               │           │   ├── variables-beaufort.scss
    │       │               │           │   ├── variables-day.scss
    │       │               │           │   ├── variables-direction.scss
    │       │               │           │   ├── variables-misc.scss
    │       │               │           │   ├── variables-moon.scss
    │       │               │           │   ├── variables-neutral.scss
    │       │               │           │   ├── variables-night.scss
    │       │               │           │   ├── variables-time.scss
    │       │               │           │   └── variables-wind-names.scss
    │       │               │           ├── mappings/
    │       │               │           │   ├── wi-forecast-io.scss
    │       │               │           │   ├── wi-owm.scss
    │       │               │           │   ├── wi-wmo4680.scss
    │       │               │           │   └── wi-yahoo.scss
    │       │               │           ├── weather-icons-classes.scss
    │       │               │           ├── weather-icons-core.scss
    │       │               │           ├── weather-icons-variables.scss
    │       │               │           ├── weather-icons-wind.min.scss
    │       │               │           ├── weather-icons-wind.scss
    │       │               │           ├── weather-icons.min.scss
    │       │               │           └── weather-icons.scss
    │       │               ├── material.scss
    │       │               ├── pages.scss
    │       │               ├── prepros-6.config
    │       │               ├── responsive.scss
    │       │               ├── sidebar.scss
    │       │               ├── style.scss
    │       │               ├── variable.scss
    │       │               └── widgets.scss
    │       └── templates/
    │           ├── agency.html
    │           ├── bus.html
    │           ├── dashboard.html
    │           ├── error.html
    │           ├── fragments/
    │           │   ├── footer.html
    │           │   ├── header.html
    │           │   ├── navigation.html
    │           │   └── sidebar.html
    │           ├── layout/
    │           │   └── layout.html
    │           ├── login.html
    │           ├── profile.html
    │           ├── signup.html
    │           └── trip.html
    └── test/
        └── java/
            └── com/
                └── starterkit/
                    └── springboot/
                        └── brs/
                            └── BusReservationSystemApplicationTests.java
Download .txt
SYMBOL INDEX (1757 symbols across 81 files)

FILE: src/main/java/com/starterkit/springboot/brs/BusReservationSystemApplication.java
  class BusReservationSystemApplication (line 20) | @SpringBootApplication
    method main (line 23) | public static void main(String[] args) {
    method init (line 27) | @Bean

FILE: src/main/java/com/starterkit/springboot/brs/config/BrsConfiguration.java
  class BrsConfiguration (line 23) | @Configuration
    method bCryptPasswordEncoder (line 26) | @Bean
    method modelMapper (line 31) | @Bean
    method swaggerBRSApi (line 45) | @Bean
    method swaggerUserApi (line 60) | @Bean
    method apiInfo (line 72) | private ApiInfo apiInfo() {
    method apiKey (line 82) | private ApiKey apiKey() {

FILE: src/main/java/com/starterkit/springboot/brs/config/FakeController.java
  class FakeController (line 25) | @RestController
    method fakeLogin (line 29) | @ApiOperation("Login")
    method fakeLogout (line 35) | @ApiOperation("Logout")
    class LoginRequest (line 41) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/config/PageConfig.java
  class PageConfig (line 10) | @Configuration
    method addViewControllers (line 13) | @Override

FILE: src/main/java/com/starterkit/springboot/brs/config/PropertiesConfig.java
  class PropertiesConfig (line 11) | @Component
    method getConfigValue (line 17) | public String getConfigValue(String configKey) {

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/api/BusReservationController.java
  class BusReservationController (line 28) | @RestController
    method getAllStops (line 38) | @GetMapping("/stops")
    method getTripsByStops (line 46) | @GetMapping("/tripsbystops")
    method getTripSchedules (line 59) | @GetMapping("/tripschedules")
    method bookTicket (line 73) | @PostMapping("/bookticket")

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/api/UserController.java
  class UserController (line 19) | @RestController
    method signup (line 32) | @PostMapping("/signup")
    method registerUser (line 43) | private UserDto registerUser(UserSignupRequest userSignupRequest, bool...

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/AdminSignupFormCommand.java
  class AdminSignupFormCommand (line 13) | @Data

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/AgencyFormCommand.java
  class AgencyFormCommand (line 12) | @Data

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/BusFormCommand.java
  class BusFormCommand (line 13) | @Data

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/PasswordFormCommand.java
  class PasswordFormCommand (line 12) | @Data

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/ProfileFormCommand.java
  class ProfileFormCommand (line 12) | @Data

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/command/TripFormCommand.java
  class TripFormCommand (line 12) | @Data

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/request/BookTicketRequest.java
  class BookTicketRequest (line 19) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/request/GetTripSchedulesRequest.java
  class GetTripSchedulesRequest (line 18) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/request/UserSignupRequest.java
  class UserSignupRequest (line 14) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/ui/AdminController.java
  class AdminController (line 24) | @Controller
    method login (line 32) | @GetMapping(value = {"/", "/login"})
    method logout (line 37) | @GetMapping(value = {"/logout"})
    method home (line 43) | @GetMapping(value = "/home")
    method signup (line 48) | @GetMapping(value = "/signup")
    method createNewAdmin (line 55) | @PostMapping(value = "/signup")
    method registerAdmin (line 77) | private UserDto registerAdmin(@Valid AdminSignupFormCommand adminSignu...

FILE: src/main/java/com/starterkit/springboot/brs/controller/v1/ui/DashboardController.java
  class DashboardController (line 28) | @Controller
    method dashboard (line 37) | @GetMapping(value = "/dashboard")
    method agencyDetails (line 47) | @GetMapping(value = "/agency")
    method updateAgency (line 62) | @PostMapping(value = "/agency")
    method busDetails (line 80) | @GetMapping(value = "/bus")
    method addNewBus (line 92) | @PostMapping(value = "/bus")
    method tripDetails (line 116) | @GetMapping(value = "/trip")
    method addNewTrip (line 132) | @PostMapping(value = "/trip")
    method getUserProfile (line 167) | @GetMapping(value = "/profile")
    method updateProfile (line 185) | @PostMapping(value = "/profile")
    method changePassword (line 205) | @PostMapping(value = "/password")

FILE: src/main/java/com/starterkit/springboot/brs/dto/mapper/TicketMapper.java
  class TicketMapper (line 9) | public class TicketMapper {
    method toTicketDto (line 10) | public static TicketDto toTicketDto(Ticket ticket) {

FILE: src/main/java/com/starterkit/springboot/brs/dto/mapper/TripMapper.java
  class TripMapper (line 9) | public class TripMapper {
    method toTripDto (line 10) | public static TripDto toTripDto(Trip trip) {

FILE: src/main/java/com/starterkit/springboot/brs/dto/mapper/TripScheduleMapper.java
  class TripScheduleMapper (line 10) | public class TripScheduleMapper {
    method toTripScheduleDto (line 11) | public static TripScheduleDto toTripScheduleDto(TripSchedule tripSched...

FILE: src/main/java/com/starterkit/springboot/brs/dto/mapper/UserMapper.java
  class UserMapper (line 15) | @Component
    method toUserDto (line 18) | public static UserDto toUserDto(User user) {

FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/AgencyDto.java
  class AgencyDto (line 17) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/BusDto.java
  class BusDto (line 14) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/StopDto.java
  class StopDto (line 14) | @Getter
    method compareTo (line 27) | @Override

FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/TicketDto.java
  class TicketDto (line 15) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/TripDto.java
  class TripDto (line 14) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/dto/model/bus/TripScheduleDto.java
  class TripScheduleDto (line 15) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/dto/model/user/RoleDto.java
  class RoleDto (line 14) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/dto/model/user/UserDto.java
  class UserDto (line 17) | @Getter
    method getFullName (line 33) | public String getFullName() {

FILE: src/main/java/com/starterkit/springboot/brs/dto/response/Response.java
  class Response (line 14) | @Getter
    method badRequest (line 27) | public static <T> Response<T> badRequest() {
    method ok (line 33) | public static <T> Response<T> ok() {
    method unauthorized (line 39) | public static <T> Response<T> unauthorized() {
    method validationException (line 45) | public static <T> Response<T> validationException() {
    method wrongCredentials (line 51) | public static <T> Response<T> wrongCredentials() {
    method accessDenied (line 57) | public static <T> Response<T> accessDenied() {
    method exception (line 63) | public static <T> Response<T> exception() {
    method notFound (line 69) | public static <T> Response<T> notFound() {
    method duplicateEntity (line 75) | public static <T> Response<T> duplicateEntity() {
    method addErrorMsgToResponse (line 81) | public void addErrorMsgToResponse(String errorMsg, Exception ex) {
    type Status (line 89) | public enum Status {
    class PageMetadata (line 93) | @Getter
      method PageMetadata (line 103) | public PageMetadata(int size, long totalElements, int totalPages, in...

FILE: src/main/java/com/starterkit/springboot/brs/dto/response/ResponseError.java
  class ResponseError (line 15) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/exception/BRSException.java
  class BRSException (line 15) | @Component
    method BRSException (line 20) | @Autowired
    method throwException (line 32) | public static RuntimeException throwException(String messageTemplate, ...
    method throwException (line 44) | public static RuntimeException throwException(EntityType entityType, E...
    method throwExceptionWithId (line 57) | public static RuntimeException throwExceptionWithId(EntityType entityT...
    method throwExceptionWithTemplate (line 71) | public static RuntimeException throwExceptionWithTemplate(EntityType e...
    method throwException (line 82) | private static RuntimeException throwException(ExceptionType exception...
    method getMessageTemplate (line 91) | private static String getMessageTemplate(EntityType entityType, Except...
    method format (line 95) | private static String format(String template, String ... args) {
    class EntityNotFoundException (line 103) | public static class EntityNotFoundException extends RuntimeException {
      method EntityNotFoundException (line 104) | public EntityNotFoundException(String message) {
    class DuplicateEntityException (line 109) | public static class DuplicateEntityException extends RuntimeException {
      method DuplicateEntityException (line 110) | public DuplicateEntityException(String message) {

FILE: src/main/java/com/starterkit/springboot/brs/exception/CustomizedResponseEntityExceptionHandler.java
  class CustomizedResponseEntityExceptionHandler (line 15) | @ControllerAdvice
    method handleNotFountExceptions (line 19) | @ExceptionHandler(BRSException.EntityNotFoundException.class)
    method handleNotFountExceptions1 (line 26) | @ExceptionHandler(BRSException.DuplicateEntityException.class)

FILE: src/main/java/com/starterkit/springboot/brs/exception/EntityType.java
  type EntityType (line 6) | public enum EntityType {

FILE: src/main/java/com/starterkit/springboot/brs/exception/ExceptionType.java
  type ExceptionType (line 6) | public enum ExceptionType {
    method ExceptionType (line 13) | ExceptionType(String value) {
    method getValue (line 17) | String getValue() {

FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Agency.java
  class Agency (line 15) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Bus.java
  class Bus (line 13) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Stop.java
  class Stop (line 13) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Ticket.java
  class Ticket (line 14) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/model/bus/Trip.java
  class Trip (line 13) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/model/bus/TripSchedule.java
  class TripSchedule (line 14) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/model/user/Role.java
  class Role (line 14) | @Getter

FILE: src/main/java/com/starterkit/springboot/brs/model/user/User.java
  class User (line 15) | @Getter
    method getFullName (line 51) | public String getFullName() {

FILE: src/main/java/com/starterkit/springboot/brs/model/user/UserRoles.java
  type UserRoles (line 6) | public enum UserRoles {

FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/AgencyRepository.java
  type AgencyRepository (line 10) | public interface AgencyRepository extends CrudRepository<Agency, Long> {
    method findByCode (line 11) | Agency findByCode(String agencyCode);
    method findByOwner (line 13) | Agency findByOwner(User owner);
    method findByName (line 15) | Agency findByName(String name);

FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/BusRepository.java
  type BusRepository (line 10) | public interface BusRepository extends CrudRepository<Bus, Long> {
    method findByCode (line 11) | Bus findByCode(String busCode);
    method findByCodeAndAgency (line 13) | Bus findByCodeAndAgency(String busCode, Agency agency);

FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/StopRepository.java
  type StopRepository (line 9) | public interface StopRepository extends CrudRepository<Stop, Long> {
    method findByCode (line 10) | Stop findByCode(String code);

FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/TicketRepository.java
  type TicketRepository (line 9) | public interface TicketRepository extends CrudRepository<Ticket, Long> {

FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/TripRepository.java
  type TripRepository (line 14) | public interface TripRepository extends CrudRepository<Trip, Long> {
    method findBySourceStopAndDestStopAndBus (line 15) | Trip findBySourceStopAndDestStopAndBus(Stop source, Stop destination, ...
    method findAllBySourceStopAndDestStop (line 17) | List<Trip> findAllBySourceStopAndDestStop(Stop source, Stop destination);
    method findByAgency (line 19) | List<Trip> findByAgency(Agency agency);

FILE: src/main/java/com/starterkit/springboot/brs/repository/bus/TripScheduleRepository.java
  type TripScheduleRepository (line 10) | public interface TripScheduleRepository extends CrudRepository<TripSched...
    method findByTripDetailAndTripDate (line 11) | TripSchedule findByTripDetailAndTripDate(Trip tripDetail, String tripD...

FILE: src/main/java/com/starterkit/springboot/brs/repository/user/RoleRepository.java
  type RoleRepository (line 10) | public interface RoleRepository extends CrudRepository<Role, Long> {
    method findByRole (line 12) | Role findByRole(UserRoles role);

FILE: src/main/java/com/starterkit/springboot/brs/repository/user/UserRepository.java
  type UserRepository (line 9) | public interface UserRepository extends CrudRepository<User, Long> {
    method findByEmail (line 11) | User findByEmail(String email);

FILE: src/main/java/com/starterkit/springboot/brs/security/CustomUserDetailsService.java
  class CustomUserDetailsService (line 19) | @Service
    method loadUserByUsername (line 25) | @Override
    method getUserAuthority (line 36) | private List<GrantedAuthority> getUserAuthority(Collection<RoleDto> us...
    method buildUserForAuthentication (line 44) | private UserDetails buildUserForAuthentication(UserDto user, List<Gran...

FILE: src/main/java/com/starterkit/springboot/brs/security/MultiHttpSecurityConfig.java
  class MultiHttpSecurityConfig (line 24) | @EnableWebSecurity
    class ApiWebSecurityConfigurationAdapter (line 27) | @Configuration
      method configure (line 36) | @Override
      method configure (line 44) | protected void configure(HttpSecurity http) throws Exception {
    class FormLoginWebSecurityConfigurerAdapter (line 66) | @Order(2)
      method configure (line 78) | @Override
      method configure (line 86) | @Override
      method configure (line 119) | @Override

FILE: src/main/java/com/starterkit/springboot/brs/security/SecurityConstants.java
  type SecurityConstants (line 6) | public interface SecurityConstants {

FILE: src/main/java/com/starterkit/springboot/brs/security/api/ApiJWTAuthenticationFilter.java
  class ApiJWTAuthenticationFilter (line 29) | public class ApiJWTAuthenticationFilter extends UsernamePasswordAuthenti...
    method ApiJWTAuthenticationFilter (line 32) | public ApiJWTAuthenticationFilter(AuthenticationManager authentication...
    method attemptAuthentication (line 37) | @Override
    method successfulAuthentication (line 53) | @Override

FILE: src/main/java/com/starterkit/springboot/brs/security/api/ApiJWTAuthorizationFilter.java
  class ApiJWTAuthorizationFilter (line 24) | public class ApiJWTAuthorizationFilter extends BasicAuthenticationFilter {
    method ApiJWTAuthorizationFilter (line 25) | public ApiJWTAuthorizationFilter(AuthenticationManager authManager) {
    method doFilterInternal (line 29) | @Override
    method getAuthentication (line 43) | private UsernamePasswordAuthenticationToken getAuthentication(HttpServ...

FILE: src/main/java/com/starterkit/springboot/brs/security/form/CustomAuthenticationSuccessHandler.java
  class CustomAuthenticationSuccessHandler (line 16) | @Component
    method onAuthenticationSuccess (line 18) | @Override

FILE: src/main/java/com/starterkit/springboot/brs/security/form/CustomLogoutSuccessHandler.java
  class CustomLogoutSuccessHandler (line 15) | public class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHa...
    method onLogoutSuccess (line 17) | @Override

FILE: src/main/java/com/starterkit/springboot/brs/security/form/FormBasedJWTAuthenticationFilter.java
  class FormBasedJWTAuthenticationFilter (line 27) | public class FormBasedJWTAuthenticationFilter extends UsernamePasswordAu...
    method FormBasedJWTAuthenticationFilter (line 30) | public FormBasedJWTAuthenticationFilter(AuthenticationManager authenti...
    method attemptAuthentication (line 34) | @Override
    method successfulAuthentication (line 52) | @Override

FILE: src/main/java/com/starterkit/springboot/brs/service/BusReservationService.java
  type BusReservationService (line 12) | public interface BusReservationService {
    method getAllStops (line 15) | Set<StopDto> getAllStops();
    method getStopByCode (line 17) | StopDto getStopByCode(String stopCode);
    method getAgency (line 20) | AgencyDto getAgency(UserDto userDto);
    method addAgency (line 22) | AgencyDto addAgency(AgencyDto agencyDto);
    method updateAgency (line 24) | AgencyDto updateAgency(AgencyDto agencyDto, BusDto busDto);
    method getTripById (line 27) | TripDto getTripById(Long tripID);
    method addTrip (line 29) | List<TripDto> addTrip(TripDto tripDto);
    method getAgencyTrips (line 31) | List<TripDto> getAgencyTrips(String agencyCode);
    method getAvailableTripsBetweenStops (line 33) | List<TripDto> getAvailableTripsBetweenStops(String sourceStopCode, Str...
    method getAvailableTripSchedules (line 36) | List<TripScheduleDto> getAvailableTripSchedules(String sourceStopCode,...
    method getTripSchedule (line 38) | TripScheduleDto getTripSchedule(TripDto tripDto, String tripDate, bool...
    method bookTicket (line 41) | TicketDto bookTicket(TripScheduleDto tripScheduleDto, UserDto passenger);

FILE: src/main/java/com/starterkit/springboot/brs/service/BusReservationServiceImpl.java
  class BusReservationServiceImpl (line 31) | @Component
    method getAllStops (line 62) | @Override
    method getStopByCode (line 76) | @Override
    method getAgency (line 91) | @Override
    method addAgency (line 110) | @Override
    method updateAgency (line 136) | @Transactional
    method getTripById (line 172) | @Override
    method addTrip (line 187) | @Override
    method getAgencyTrips (line 237) | @Override
    method getAvailableTripsBetweenStops (line 260) | @Override
    method getAvailableTripSchedules (line 282) | @Override
    method getTripSchedule (line 305) | @Override
    method bookTicket (line 334) | @Override
    method findTripsBetweenStops (line 364) | private List<Trip> findTripsBetweenStops(String sourceStopCode, String...
    method getUser (line 388) | private User getUser(String email) {
    method getStop (line 398) | private Stop getStop(String stopCode) {
    method getBus (line 408) | private Bus getBus(String busCode) {
    method getAgency (line 418) | private Agency getAgency(String agencyCode) {
    method exception (line 430) | private RuntimeException exception(EntityType entityType, ExceptionTyp...
    method exceptionWithId (line 442) | private RuntimeException exceptionWithId(EntityType entityType, Except...

FILE: src/main/java/com/starterkit/springboot/brs/service/UserService.java
  type UserService (line 8) | public interface UserService {
    method signup (line 15) | UserDto signup(UserDto userDto);
    method findUserByEmail (line 23) | UserDto findUserByEmail(String email);
    method updateProfile (line 31) | UserDto updateProfile(UserDto userDto);
    method changePassword (line 39) | UserDto changePassword(UserDto userDto, String newPassword);

FILE: src/main/java/com/starterkit/springboot/brs/service/UserServiceImpl.java
  class UserServiceImpl (line 30) | @Component
    method signup (line 47) | @Override
    method findUserByEmail (line 75) | @Transactional
    method updateProfile (line 90) | @Override
    method changePassword (line 110) | @Override
    method exception (line 129) | private RuntimeException exception(EntityType entityType, ExceptionTyp...

FILE: src/main/java/com/starterkit/springboot/brs/util/DateUtils.java
  class DateUtils (line 9) | public class DateUtils {
    method today (line 18) | public static Date today() {
    method todayStr (line 27) | public static String todayStr() {
    method formattedDate (line 37) | public static String formattedDate(Date date) {

FILE: src/main/java/com/starterkit/springboot/brs/util/RandomStringUtil.java
  class RandomStringUtil (line 6) | public class RandomStringUtil {
    method getAlphaNumericString (line 8) | public static String getAlphaNumericString(int n, String inputString) {

FILE: src/main/resources/static/dashboard/assets/plugins/bootstrap/js/bootstrap.js
  function defineProperties (line 23) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _possibleConstructorReturn (line 25) | function _possibleConstructorReturn(self, call) { if (!self) { throw new...
  function _inherits (line 27) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
  function _classCallCheck (line 29) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function toType (line 58) | function toType(obj) {
  function isElement (line 62) | function isElement(obj) {
  function getSpecialTransitionEndEvent (line 66) | function getSpecialTransitionEndEvent() {
  function transitionEndTest (line 79) | function transitionEndTest() {
  function transitionEndEmulator (line 97) | function transitionEndEmulator(duration) {
  function setTransitionEndSupport (line 115) | function setTransitionEndSupport() {
  function Alert (line 227) | function Alert(element) {
  function Button (line 408) | function Button(element) {
  function Carousel (line 609) | function Carousel(element, config) {
  function Collapse (line 1068) | function Collapse(element, config) {
  function Dropdown (line 1415) | function Dropdown(element) {
  function Modal (line 1713) | function Modal(element, config) {
  function ScrollSpy (line 2239) | function ScrollSpy(element, config) {
  function Tab (line 2538) | function Tab(element) {
  function Tooltip (line 2848) | function Tooltip(element, config) {
  function Popover (line 3416) | function Popover() {

FILE: src/main/resources/static/dashboard/assets/plugins/chartist-js/dist/chartist.js
  function recursiveConvert (line 425) | function recursiveConvert(value) {
  function recursiveHighLow (line 546) | function recursiveHighLow(data) {
  function gcd (line 663) | function gcd(p, q) {
  function f (line 671) | function f(x) {
  function updateCurrentOptions (line 967) | function updateCurrentOptions(preventChangedEvent) {
  function removeMediaQueryListeners (line 988) | function removeMediaQueryListeners() {
  function splitIntoSegments (line 1183) | function splitIntoSegments(pathCoordinates, valueData) {
  function addEventHandler (line 1372) | function addEventHandler(event, handler) {
  function removeEventHandler (line 1384) | function removeEventHandler(event, handler) {
  function emit (line 1407) | function emit(event, data) {
  function listToArray (line 1440) | function listToArray(list) {
  function extend (line 1491) | function extend(properties, superProtoOverride) {
  function cloneDefinitions (line 1519) | function cloneDefinitions() {
  function update (line 1565) | function update(data, options, override) {
  function detach (line 1600) | function detach() {
  function on (line 1620) | function on(event, handler) {
  function off (line 1632) | function off(event, handler) {
  function initialize (line 1637) | function initialize() {
  function Base (line 1685) | function Base(query, data, defaultOptions, options, responsiveOptions) {
  function Svg (line 1751) | function Svg(name, attributes, className, parent, insertFirst) {
  function attr (line 1791) | function attr(attributes, ns) {
  function elem (line 1827) | function elem(name, attributes, className, insertFirst) {
  function parent (line 1837) | function parent() {
  function root (line 1847) | function root() {
  function querySelector (line 1862) | function querySelector(selector) {
  function querySelectorAll (line 1874) | function querySelectorAll(selector) {
  function foreignObject (line 1889) | function foreignObject(content, attributes, className, insertFirst) {
  function text (line 1918) | function text(t) {
  function empty (line 1929) | function empty() {
  function remove (line 1943) | function remove() {
  function replace (line 1955) | function replace(newElement) {
  function append (line 1968) | function append(element, insertFirst) {
  function classes (line 1984) | function classes() {
  function addClass (line 1995) | function addClass(names) {
  function removeClass (line 2014) | function removeClass(names) {
  function removeAllClasses (line 2030) | function removeAllClasses() {
  function height (line 2042) | function height() {
  function width (line 2052) | function width() {
  function animate (line 2097) | function animate(animations, guided, eventEmitter) {
  function SvgList (line 2284) | function SvgList(nodeList) {
  function element (line 2351) | function element(command, params, pathElements, pos, relative, data) {
  function forEachParam (line 2359) | function forEachParam(pathElements, cb) {
  function SvgPath (line 2375) | function SvgPath(close, options) {
  function position (line 2389) | function position(pos) {
  function remove (line 2405) | function remove(count) {
  function move (line 2420) | function move(x, y, relative, data) {
  function line (line 2438) | function line(x, y, relative, data) {
  function curve (line 2460) | function curve(x1, y1, x2, y2, x, y, relative, data) {
  function arc (line 2487) | function arc(rx, ry, xAr, lAf, sf, x, y, relative, data) {
  function parse (line 2507) | function parse(path) {
  function stringify (line 2556) | function stringify() {
  function scale (line 2578) | function scale(x, y) {
  function translate (line 2593) | function translate(x, y) {
  function transform (line 2612) | function transform(transformFnc) {
  function clone (line 2629) | function clone(close) {
  function splitByCommand (line 2646) | function splitByCommand(command) {
  function join (line 2672) | function join(paths, close, options) {
  function Axis (line 2726) | function Axis(units, chartRect, ticks, options) {
  function createGridAndLabels (line 2736) | function createGridAndLabels(gridGroup, labelGroup, useForeignObject, ch...
  function AutoScaleAxis (line 2844) | function AutoScaleAxis(axisUnit, data, chartRect, options) {
  function projectValue (line 2860) | function projectValue(value) {
  function FixedScaleAxis (line 2893) | function FixedScaleAxis(axisUnit, data, chartRect, options) {
  function projectValue (line 2916) | function projectValue(value) {
  function StepAxis (line 2945) | function StepAxis(axisUnit, data, chartRect, options) {
  function projectValue (line 2955) | function projectValue(value, index) {
  function createChart (line 3077) | function createChart(options) {
  function Line (line 3360) | function Line(query, data, options, responsiveOptions) {
  function createChart (line 3484) | function createChart(options) {
  function Bar (line 3790) | function Bar(query, data, options, responsiveOptions) {
  function determineAnchorPosition (line 3869) | function determineAnchorPosition(center, label, direction) {
  function createChart (line 3888) | function createChart(options) {
  function Pie (line 4137) | function Pie(query, data, options, responsiveOptions) {

FILE: src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/dist/chartist-plugin-tooltip.js
  function on (line 71) | function on(event, selector, callback) {
  function setPosition (line 149) | function setPosition(event) {
  function show (line 176) | function show(element) {
  function hide (line 182) | function hide(element) {
  function hasClass (line 187) | function hasClass(element, className) {
  function next (line 191) | function next(element, className) {
  function text (line 198) | function text(element) {

FILE: src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/src/scripts/chartist-plugin-tooltip.js
  function on (line 55) | function on(event, selector, callback) {
  function setPosition (line 133) | function setPosition(event) {
  function show (line 160) | function show(element) {
  function hide (line 166) | function hide(element) {
  function hasClass (line 171) | function hasClass(element, className) {
  function next (line 175) | function next(element, className) {
  function text (line 182) | function text(element) {

FILE: src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/test/spec/spec-tooltip.js
  function getTooltip (line 32) | function getTooltip() {
  function hasClass (line 36) | function hasClass(el, cls) {

FILE: src/main/resources/static/dashboard/assets/plugins/d3/d3.js
  function ascendingComparator (line 40) | function ascendingComparator(f) {
  function pair (line 57) | function pair(a, b) {
  function tickIncrement (line 225) | function tickIncrement(start, stop, count) {
  function tickStep (line 234) | function tickStep(start, stop, count) {
  function histogram (line 253) | function histogram(data) {
  function length (line 549) | function length(d) {
  function translateX (line 569) | function translateX(x) {
  function translateY (line 573) | function translateY(y) {
  function center (line 577) | function center(scale) {
  function entering (line 585) | function entering() {
  function axis (line 589) | function axis(orient, scale) {
  function axisTop (line 713) | function axisTop(scale) {
  function axisRight (line 717) | function axisRight(scale) {
  function axisBottom (line 721) | function axisBottom(scale) {
  function axisLeft (line 725) | function axisLeft(scale) {
  function dispatch (line 731) | function dispatch() {
  function Dispatch (line 739) | function Dispatch(_) {
  function parseTypenames (line 743) | function parseTypenames(typenames, types) {
  function get (line 793) | function get(type, name) {
  function set (line 801) | function set(type, name, callback) {
  function creatorInherit (line 828) | function creatorInherit(name) {
  function creatorFixed (line 838) | function creatorFixed(fullname) {
  function local$1 (line 853) | function local$1() {
  function Local (line 857) | function Local() {
  function filterContextListener (line 913) | function filterContextListener(listener, index, group) {
  function contextListener (line 923) | function contextListener(listener, index, group) {
  function parseTypenames$1 (line 935) | function parseTypenames$1(typenames) {
  function onRemove (line 943) | function onRemove(typename) {
  function onAdd (line 959) | function onAdd(typename, value, capture) {
  function customEvent (line 999) | function customEvent(event1, listener, that, args) {
  function none (line 1036) | function none() {}
  function empty$1 (line 1059) | function empty$1() {
  function EnterNode (line 1106) | function EnterNode(parent, datum) {
  function bindIndex (line 1130) | function bindIndex(parent, group, enter, update, exit, data) {
  function bindKey (line 1156) | function bindKey(parent, group, enter, update, exit, data, key) {
  function compareNode (line 1281) | function compareNode(a, b) {
  function ascending$1 (line 1297) | function ascending$1(a, b) {
  function attrRemove (line 1347) | function attrRemove(name) {
  function attrRemoveNS (line 1353) | function attrRemoveNS(fullname) {
  function attrConstant (line 1359) | function attrConstant(name, value) {
  function attrConstantNS (line 1365) | function attrConstantNS(fullname, value) {
  function attrFunction (line 1371) | function attrFunction(name, value) {
  function attrFunctionNS (line 1379) | function attrFunctionNS(fullname, value) {
  function styleRemove (line 1409) | function styleRemove(name) {
  function styleConstant (line 1415) | function styleConstant(name, value, priority) {
  function styleFunction (line 1421) | function styleFunction(name, value, priority) {
  function styleValue (line 1438) | function styleValue(node, name) {
  function propertyRemove (line 1443) | function propertyRemove(name) {
  function propertyConstant (line 1449) | function propertyConstant(name, value) {
  function propertyFunction (line 1455) | function propertyFunction(name, value) {
  function classArray (line 1472) | function classArray(string) {
  function classList (line 1476) | function classList(node) {
  function ClassList (line 1480) | function ClassList(node) {
  function classedAdd (line 1505) | function classedAdd(node, names) {
  function classedRemove (line 1510) | function classedRemove(node, names) {
  function classedTrue (line 1515) | function classedTrue(names) {
  function classedFalse (line 1521) | function classedFalse(names) {
  function classedFunction (line 1527) | function classedFunction(names, value) {
  function textRemove (line 1548) | function textRemove() {
  function textConstant (line 1552) | function textConstant(value) {
  function textFunction (line 1558) | function textFunction(value) {
  function htmlRemove (line 1574) | function htmlRemove() {
  function htmlConstant (line 1578) | function htmlConstant(value) {
  function htmlFunction (line 1584) | function htmlFunction(value) {
  function raise (line 1600) | function raise() {
  function lower (line 1608) | function lower() {
  function constantNull (line 1623) | function constantNull() {
  function remove (line 1635) | function remove() {
  function dispatchEvent (line 1650) | function dispatchEvent(node, type, params) {
  function dispatchConstant (line 1665) | function dispatchConstant(type, params) {
  function dispatchFunction (line 1671) | function dispatchFunction(type, params) {
  function Selection (line 1685) | function Selection(groups, parents) {
  function selection (line 1690) | function selection() {
  function nopropagation (line 1761) | function nopropagation() {
  function yesdrag (line 1781) | function yesdrag(view, noclick) {
  function DragEvent (line 1802) | function DragEvent(target, type, subject, id, active, x, y, dx, dy, disp...
  function defaultFilter$1 (line 1821) | function defaultFilter$1() {
  function defaultContainer (line 1825) | function defaultContainer() {
  function defaultSubject (line 1829) | function defaultSubject(d) {
  function drag (line 1846) | function drag(selection$$1) {
  function mousedowned (line 1855) | function mousedowned() {
  function mousemoved (line 1868) | function mousemoved() {
  function mouseupped (line 1877) | function mouseupped() {
  function touchstarted (line 1884) | function touchstarted() {
  function touchmoved (line 1898) | function touchmoved() {
  function touchended (line 1910) | function touchended() {
  function beforestart (line 1924) | function beforestart(id, container, point, that, args) {
  function extend (line 1975) | function extend(parent, definition) {
  function Color (line 1981) | function Color() {}
  function color (line 2158) | function color(format) {
  function rgbn (line 2174) | function rgbn(n) {
  function rgba (line 2178) | function rgba(r, g, b, a) {
  function rgbConvert (line 2183) | function rgbConvert(o) {
  function rgb (line 2190) | function rgb(r, g, b, opacity) {
  function Rgb (line 2194) | function Rgb(r, g, b, opacity) {
  function hsla (line 2229) | function hsla(h, s, l, a) {
  function hslConvert (line 2236) | function hslConvert(o) {
  function hsl (line 2262) | function hsl(h, s, l, opacity) {
  function Hsl (line 2266) | function Hsl(h, s, l, opacity) {
  function hsl2rgb (line 2303) | function hsl2rgb(h, m1, m2) {
  function labConvert (line 2322) | function labConvert(o) {
  function lab (line 2338) | function lab(l, a, b, opacity) {
  function Lab (line 2342) | function Lab(l, a, b, opacity) {
  function xyz2lab (line 2372) | function xyz2lab(t) {
  function lab2xyz (line 2376) | function lab2xyz(t) {
  function xyz2rgb (line 2380) | function xyz2rgb(x) {
  function rgb2xyz (line 2384) | function rgb2xyz(x) {
  function hclConvert (line 2388) | function hclConvert(o) {
  function hcl (line 2395) | function hcl(h, c, l, opacity) {
  function Hcl (line 2399) | function Hcl(h, c, l, opacity) {
  function cubehelixConvert (line 2427) | function cubehelixConvert(o) {
  function cubehelix (line 2441) | function cubehelix(h, s, l, opacity) {
  function Cubehelix (line 2445) | function Cubehelix(h, s, l, opacity) {
  function basis (line 2476) | function basis(t1, v0, v1, v2, v3) {
  function linear (line 2514) | function linear(a, d) {
  function exponential (line 2520) | function exponential(a, b, y) {
  function hue (line 2526) | function hue(a, b) {
  function gamma (line 2531) | function gamma(y) {
  function nogamma (line 2537) | function nogamma(a, b) {
  function rgb$$1 (line 2545) | function rgb$$1(start, end) {
  function rgbSpline (line 2564) | function rgbSpline(spline) {
  function zero (line 2647) | function zero(b) {
  function one (line 2653) | function one(b) {
  function parseCss (line 2757) | function parseCss(value) {
  function parseSvg (line 2767) | function parseSvg(value) {
  function interpolateTransform (line 2776) | function interpolateTransform(parse, pxComma, pxParen, degParen) {
  function cosh (line 2842) | function cosh(x) {
  function sinh (line 2846) | function sinh(x) {
  function tanh (line 2850) | function tanh(x) {
  function hsl$1 (line 2902) | function hsl$1(hue$$1) {
  function lab$1 (line 2921) | function lab$1(start, end) {
  function hcl$1 (line 2935) | function hcl$1(hue$$1) {
  function cubehelix$1 (line 2954) | function cubehelix$1(hue$$1) {
  function now (line 2999) | function now() {
  function clearNow (line 3003) | function clearNow() {
  function Timer (line 3007) | function Timer() {
  function timer (line 3036) | function timer(callback, delay, time) {
  function timerFlush (line 3042) | function timerFlush() {
  function wake (line 3053) | function wake() {
  function poke (line 3065) | function poke() {
  function nap (line 3070) | function nap() {
  function sleep (line 3085) | function sleep(time) {
  function init (line 3150) | function init(node, id) {
  function set$1 (line 3156) | function set$1(node, id) {
  function get$1 (line 3162) | function get$1(node, id) {
  function create (line 3168) | function create(node, id, self) {
  function tweenRemove (line 3302) | function tweenRemove(id, name) {
  function tweenFunction (line 3326) | function tweenFunction(id, name, value) {
  function tweenValue (line 3369) | function tweenValue(transition, name, value) {
  function attrRemove$1 (line 3390) | function attrRemove$1(name) {
  function attrRemoveNS$1 (line 3396) | function attrRemoveNS$1(fullname) {
  function attrConstant$1 (line 3402) | function attrConstant$1(name, interpolate$$1, value1) {
  function attrConstantNS$1 (line 3413) | function attrConstantNS$1(fullname, interpolate$$1, value1) {
  function attrFunction$1 (line 3424) | function attrFunction$1(name, interpolate$$1, value) {
  function attrFunctionNS$1 (line 3438) | function attrFunctionNS$1(fullname, interpolate$$1, value) {
  function attrTweenNS (line 3460) | function attrTweenNS(fullname, value) {
  function attrTween (line 3471) | function attrTween(name, value) {
  function delayFunction (line 3491) | function delayFunction(id, value) {
  function delayConstant (line 3497) | function delayConstant(id, value) {
  function durationFunction (line 3513) | function durationFunction(id, value) {
  function durationConstant (line 3519) | function durationConstant(id, value) {
  function easeConstant (line 3535) | function easeConstant(id, value) {
  function start (line 3582) | function start(name) {
  function onFunction (line 3590) | function onFunction(id, name, listener) {
  function removeFunction (line 3613) | function removeFunction(id) {
  function styleRemove$1 (line 3673) | function styleRemove$1(name, interpolate$$2) {
  function styleRemoveEnd (line 3686) | function styleRemoveEnd(name) {
  function styleConstant$1 (line 3692) | function styleConstant$1(name, interpolate$$2, value1) {
  function styleFunction$1 (line 3703) | function styleFunction$1(name, interpolate$$2, value) {
  function styleTween (line 3727) | function styleTween(name, value, priority) {
  function textConstant$1 (line 3746) | function textConstant$1(value) {
  function textFunction$1 (line 3752) | function textFunction$1(value) {
  function Transition (line 3789) | function Transition(groups, parents, name, id) {
  function transition (line 3796) | function transition(name) {
  function newId (line 3800) | function newId() {
  function linear$1 (line 3833) | function linear$1(t) {
  function quadIn (line 3837) | function quadIn(t) {
  function quadOut (line 3841) | function quadOut(t) {
  function quadInOut (line 3845) | function quadInOut(t) {
  function cubicIn (line 3849) | function cubicIn(t) {
  function cubicOut (line 3853) | function cubicOut(t) {
  function cubicInOut (line 3857) | function cubicInOut(t) {
  function polyIn (line 3866) | function polyIn(t) {
  function polyOut (line 3878) | function polyOut(t) {
  function polyInOut (line 3890) | function polyInOut(t) {
  function sinIn (line 3902) | function sinIn(t) {
  function sinOut (line 3906) | function sinOut(t) {
  function sinInOut (line 3910) | function sinInOut(t) {
  function expIn (line 3914) | function expIn(t) {
  function expOut (line 3918) | function expOut(t) {
  function expInOut (line 3922) | function expInOut(t) {
  function circleIn (line 3926) | function circleIn(t) {
  function circleOut (line 3930) | function circleOut(t) {
  function circleInOut (line 3934) | function circleInOut(t) {
  function bounceIn (line 3949) | function bounceIn(t) {
  function bounceOut (line 3953) | function bounceOut(t) {
  function bounceInOut (line 3957) | function bounceInOut(t) {
  function backIn (line 3966) | function backIn(t) {
  function backOut (line 3978) | function backOut(t) {
  function backInOut (line 3990) | function backInOut(t) {
  function elasticIn (line 4006) | function elasticIn(t) {
  function elasticOut (line 4019) | function elasticOut(t) {
  function elasticInOut (line 4032) | function elasticInOut(t) {
  function inherit (line 4051) | function inherit(node, id) {
  function nopropagation$1 (line 4116) | function nopropagation$1() {
  function type (line 4208) | function type(t) {
  function defaultFilter (line 4213) | function defaultFilter() {
  function defaultExtent (line 4217) | function defaultExtent() {
  function local$$1 (line 4223) | function local$$1(node) {
  function empty (line 4228) | function empty(extent) {
  function brushSelection (line 4233) | function brushSelection(node) {
  function brushX (line 4238) | function brushX() {
  function brushY (line 4242) | function brushY() {
  function brush$1 (line 4250) | function brush$1(dim) {
  function compareValue (line 4663) | function compareValue(compare) {
  function chord (line 4678) | function chord(matrix) {
  function Path (line 4795) | function Path() {
  function path (line 4801) | function path() {
  function defaultSource (line 4919) | function defaultSource(d) {
  function defaultTarget (line 4923) | function defaultTarget(d) {
  function defaultRadius (line 4927) | function defaultRadius(d) {
  function defaultStartAngle (line 4931) | function defaultStartAngle(d) {
  function defaultEndAngle (line 4935) | function defaultEndAngle(d) {
  function ribbon (line 4947) | function ribbon() {
  function Map (line 5004) | function Map() {}
  function map$1 (line 5054) | function map$1(object, f) {
  function apply (line 5083) | function apply(array, depth, createResult, setResult) {
  function entries (line 5113) | function entries(map, depth) {
  function createObject (line 5132) | function createObject() {
  function setObject (line 5136) | function setObject(object, key, value) {
  function createMap (line 5140) | function createMap() {
  function setMap (line 5144) | function setMap(map, key, value) {
  function Set (line 5148) | function Set() {}
  function set$2 (line 5168) | function set$2(object, f) {
  function objectConverter (line 5202) | function objectConverter(columns) {
  function customConverter (line 5208) | function customConverter(columns, f) {
  function inferColumns (line 5216) | function inferColumns(rows) {
  function parse (line 5235) | function parse(text, f) {
  function parseRows (line 5244) | function parseRows(text, f) {
  function format (line 5306) | function format(rows, columns) {
  function formatRows (line 5315) | function formatRows(rows) {
  function formatRow (line 5319) | function formatRow(row) {
  function formatValue (line 5323) | function formatValue(text) {
  function force (line 5357) | function force() {
  function add (line 5404) | function add(tree, x, y, d) {
  function addAll (line 5447) | function addAll(data) {
  function removeAll (line 5692) | function removeAll(data) {
  function defaultX (line 5744) | function defaultX(d) {
  function defaultY (line 5752) | function defaultY(d) {
  function quadtree (line 5760) | function quadtree(nodes, x, y) {
  function Quadtree (line 5765) | function Quadtree(x, y, x0, y0, x1, y1) {
  function leaf_copy (line 5775) | function leaf_copy(leaf) {
  function x (line 5821) | function x(d) {
  function y (line 5825) | function y(d) {
  function force (line 5837) | function force() {
  function prepare (line 5880) | function prepare(quad) {
  function initialize (line 5889) | function initialize() {
  function index (line 5916) | function index(d) {
  function find (line 5920) | function find(nodeById, nodeId) {
  function defaultStrength (line 5939) | function defaultStrength(link) {
  function force (line 5943) | function force(alpha) {
  function initialize (line 5960) | function initialize() {
  function initializeStrength (line 5985) | function initializeStrength() {
  function initializeDistance (line 5993) | function initializeDistance() {
  function x$1 (line 6029) | function x$1(d) {
  function y$1 (line 6033) | function y$1(d) {
  function step (line 6053) | function step() {
  function tick (line 6062) | function tick() {
  function initializeNodes (line 6080) | function initializeNodes() {
  function initializeForce (line 6094) | function initializeForce(force) {
  function force (line 6179) | function force(_) {
  function initialize (line 6184) | function initialize() {
  function accumulate (line 6191) | function accumulate(quad) {
  function apply (line 6217) | function apply(quad, x1, _, x2) {
  function force (line 6287) | function force(alpha) {
  function initialize (line 6293) | function initialize() {
  function force (line 6327) | function force(alpha) {
  function initialize (line 6333) | function initialize() {
  function formatSpecifier (line 6465) | function formatSpecifier(specifier) {
  function FormatSpecifier (line 6471) | function FormatSpecifier(specifier) {
  function newFormat (line 6530) | function newFormat(specifier) {
  function formatPrefix (line 6626) | function formatPrefix(specifier, value) {
  function defaultLocale (line 6653) | function defaultLocale(definition) {
  function Adder (line 6684) | function Adder() {
  function add$1 (line 6707) | function add$1(adder, a, b) {
  function acos (line 6738) | function acos(x) {
  function asin (line 6742) | function asin(x) {
  function haversin (line 6746) | function haversin(x) {
  function noop$1 (line 6750) | function noop$1() {}
  function streamGeometry (line 6752) | function streamGeometry(geometry, stream) {
  function streamLine (line 6800) | function streamLine(coordinates, stream, closed) {
  function streamPolygon (line 6807) | function streamPolygon(coordinates, stream) {
  function areaRingStart (line 6850) | function areaRingStart() {
  function areaRingEnd (line 6854) | function areaRingEnd() {
  function areaPointFirst (line 6858) | function areaPointFirst(lambda, phi) {
  function areaPoint (line 6865) | function areaPoint(lambda, phi) {
  function spherical (line 6892) | function spherical(cartesian) {
  function cartesian (line 6896) | function cartesian(spherical) {
  function cartesianDot (line 6901) | function cartesianDot(a, b) {
  function cartesianCross (line 6905) | function cartesianCross(a, b) {
  function cartesianAddInPlace (line 6910) | function cartesianAddInPlace(a, b) {
  function cartesianScale (line 6914) | function cartesianScale(vector, k) {
  function cartesianNormalizeInPlace (line 6919) | function cartesianNormalizeInPlace(d) {
  function boundsPoint (line 6959) | function boundsPoint(lambda, phi) {
  function linePoint (line 6965) | function linePoint(lambda, phi) {
  function boundsLineStart (line 7014) | function boundsLineStart() {
  function boundsLineEnd (line 7018) | function boundsLineEnd() {
  function boundsRingPoint (line 7024) | function boundsRingPoint(lambda, phi) {
  function boundsRingStart (line 7035) | function boundsRingStart() {
  function boundsRingEnd (line 7039) | function boundsRingEnd() {
  function angle (line 7050) | function angle(lambda0, lambda1) {
  function rangeCompare (line 7054) | function rangeCompare(a, b) {
  function rangeContains (line 7058) | function rangeContains(range, x) {
  function centroidPoint (line 7132) | function centroidPoint(lambda, phi) {
  function centroidPointCartesian (line 7138) | function centroidPointCartesian(x, y, z) {
  function centroidLineStart (line 7145) | function centroidLineStart() {
  function centroidLinePointFirst (line 7149) | function centroidLinePointFirst(lambda, phi) {
  function centroidLinePoint (line 7159) | function centroidLinePoint(lambda, phi) {
  function centroidLineEnd (line 7173) | function centroidLineEnd() {
  function centroidRingStart (line 7179) | function centroidRingStart() {
  function centroidRingEnd (line 7183) | function centroidRingEnd() {
  function centroidRingPointFirst (line 7188) | function centroidRingPointFirst(lambda, phi) {
  function centroidRingPoint (line 7199) | function centroidRingPoint(lambda, phi) {
  function compose (line 7254) | function compose(x, y) {
  function rotationIdentity (line 7265) | function rotationIdentity(lambda, phi) {
  function rotateRadians (line 7271) | function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
  function forwardRotationLambda (line 7278) | function forwardRotationLambda(deltaLambda) {
  function rotationLambda (line 7284) | function rotationLambda(deltaLambda) {
  function rotationPhiGamma (line 7290) | function rotationPhiGamma(deltaPhi, deltaGamma) {
  function forward (line 7326) | function forward(coordinates) {
  function circleStream (line 7340) | function circleStream(stream, radius, delta, direction, t0, t1) {
  function circleRadius (line 7360) | function circleRadius(cosRadius, point) {
  function point (line 7375) | function point(x, y) {
  function circle (line 7380) | function circle() {
  function Intersection (line 7494) | function Intersection(point, points, other, entry) {
  function link$1 (line 7579) | function link$1(array) {
  function clipExtent (line 7600) | function clipExtent(x0, y0, x1, y1) {
  function lengthLineStart (line 7856) | function lengthLineStart() {
  function lengthLineEnd (line 7861) | function lengthLineEnd() {
  function lengthPointFirst (line 7865) | function lengthPointFirst(lambda, phi) {
  function lengthPoint (line 7871) | function lengthPoint(lambda, phi) {
  function containsGeometry (line 7946) | function containsGeometry(geometry, point) {
  function containsPoint (line 7952) | function containsPoint(coordinates, point) {
  function containsLine (line 7956) | function containsLine(coordinates, point) {
  function containsPolygon (line 7963) | function containsPolygon(coordinates, point) {
  function ringRadians (line 7967) | function ringRadians(ring) {
  function pointRadians (line 7971) | function pointRadians(point) {
  function graticuleX (line 7981) | function graticuleX(y0, y1, dy) {
  function graticuleY (line 7986) | function graticuleY(x0, x1, dx) {
  function graticule (line 7991) | function graticule() {
  function graticule10 (line 8080) | function graticule10() {
  function areaRingStart$1 (line 8150) | function areaRingStart$1() {
  function areaPointFirst$1 (line 8154) | function areaPointFirst$1(x, y) {
  function areaPoint$1 (line 8159) | function areaPoint$1(x, y) {
  function areaRingEnd$1 (line 8164) | function areaRingEnd$1() {
  function boundsPoint$1 (line 8186) | function boundsPoint$1(x, y) {
  function centroidPoint$1 (line 8234) | function centroidPoint$1(x, y) {
  function centroidLineStart$1 (line 8240) | function centroidLineStart$1() {
  function centroidPointFirstLine (line 8244) | function centroidPointFirstLine(x, y) {
  function centroidPointLine (line 8249) | function centroidPointLine(x, y) {
  function centroidLineEnd$1 (line 8257) | function centroidLineEnd$1() {
  function centroidRingStart$1 (line 8261) | function centroidRingStart$1() {
  function centroidRingEnd$1 (line 8265) | function centroidRingEnd$1() {
  function centroidPointFirstRing (line 8269) | function centroidPointFirstRing(x, y) {
  function centroidPointRing (line 8274) | function centroidPointRing(x, y) {
  function PathContext (line 8290) | function PathContext(context) {
  function lengthPointFirst$1 (line 8362) | function lengthPointFirst$1(x, y) {
  function lengthPoint$1 (line 8367) | function lengthPoint$1(x, y) {
  function PathString (line 8373) | function PathString() {
  function circle$1 (line 8426) | function circle$1(radius) {
  function path (line 8438) | function path(object) {
  function point (line 8535) | function point(lambda, phi) {
  function pointLine (line 8540) | function pointLine(lambda, phi) {
  function lineStart (line 8545) | function lineStart() {
  function lineEnd (line 8550) | function lineEnd() {
  function pointRing (line 8555) | function pointRing(lambda, phi) {
  function ringStart (line 8561) | function ringStart() {
  function ringEnd (line 8566) | function ringEnd() {
  function validSegment (line 8605) | function validSegment(segment) {
  function compareIntersection (line 8611) | function compareIntersection(a, b) {
  function clipAntimeridianLine (line 8626) | function clipAntimeridianLine(stream) {
  function clipAntimeridianIntersect (line 8671) | function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
  function clipAntimeridianInterpolate (line 8682) | function clipAntimeridianInterpolate(from, to, direction, stream) {
  function interpolate (line 8711) | function interpolate(from, to, direction, stream) {
  function visible (line 8715) | function visible(lambda, phi) {
  function clipLine (line 8723) | function clipLine(stream) {
  function intersect (line 8803) | function intersect(a, b, two) {
  function code (line 8869) | function code(lambda, phi) {
  function transformer (line 8888) | function transformer(methods) {
  function TransformStream (line 8897) | function TransformStream() {}
  function fitExtent (line 8909) | function fitExtent(projection, extent, object) {
  function fitSize (line 8934) | function fitSize(projection, size, object) {
  function resampleNone (line 8945) | function resampleNone(project) {
  function resample$1 (line 8954) | function resample$1(project, delta2) {
  function projection (line 9043) | function projection(project) {
  function projectionMutator (line 9047) | function projectionMutator(projectAt) {
  function conicProjection (line 9133) | function conicProjection(projectAt) {
  function cylindricalEqualAreaRaw (line 9146) | function cylindricalEqualAreaRaw(phi0) {
  function conicEqualAreaRaw (line 9160) | function conicEqualAreaRaw(y0, y1) {
  function multiplex (line 9198) | function multiplex(streams) {
  function albersUsa (line 9223) | function albersUsa(coordinates) {
  function reset (line 9287) | function reset() {
  function azimuthalRaw (line 9295) | function azimuthalRaw(scale) {
  function azimuthalInvert (line 9307) | function azimuthalInvert(angle) {
  function mercatorRaw (line 9348) | function mercatorRaw(lambda, phi) {
  function mercatorProjection (line 9361) | function mercatorProjection(project) {
  function tany (line 9397) | function tany(y) {
  function conicConformalRaw (line 9401) | function conicConformalRaw(y0, y1) {
  function equirectangularRaw (line 9429) | function equirectangularRaw(lambda, phi) {
  function conicEquidistantRaw (line 9440) | function conicEquidistantRaw(y0, y1) {
  function gnomonicRaw (line 9466) | function gnomonicRaw(x, y) {
  function scaleTranslate (line 9479) | function scaleTranslate(kx, ky, tx, ty) {
  function reset (line 9494) | function reset() {
  function orthographicRaw (line 9527) | function orthographicRaw(x, y) {
  function stereographicRaw (line 9539) | function stereographicRaw(x, y) {
  function transverseMercatorRaw (line 9554) | function transverseMercatorRaw(lambda, phi) {
  function defaultSeparation (line 9579) | function defaultSeparation(a, b) {
  function meanX (line 9583) | function meanX(children) {
  function meanXReduce (line 9587) | function meanXReduce(x, c) {
  function maxY (line 9591) | function maxY(children) {
  function maxYReduce (line 9595) | function maxYReduce(y, c) {
  function leafLeft (line 9599) | function leafLeft(node) {
  function leafRight (line 9605) | function leafRight(node) {
  function cluster (line 9617) | function cluster(root) {
  function count (line 9664) | function count(node) {
  function leastCommonAncestor (line 9750) | function leastCommonAncestor(a, b) {
  function hierarchy (line 9801) | function hierarchy(data, children) {
  function node_copy (line 9828) | function node_copy() {
  function defaultChildren (line 9832) | function defaultChildren(d) {
  function copyData (line 9836) | function copyData(node) {
  function computeHeight (line 9840) | function computeHeight(node) {
  function Node (line 9846) | function Node(data) {
  function Node$2 (line 9869) | function Node$2(value) {
  function encloses (line 9897) | function encloses(a, b) {
  function encloseN (line 9905) | function encloseN(L, B) {
  function enclose1 (line 9945) | function enclose1(a) {
  function enclose2 (line 9953) | function enclose2(a, b) {
  function enclose3 (line 9965) | function enclose3(a, b, c) {
  function place (line 9993) | function place(a, b, c) {
  function intersects (line 10012) | function intersects(a, b) {
  function distance2 (line 10019) | function distance2(node, x, y) {
  function Node$1 (line 10028) | function Node$1(circle) {
  function packEnclose (line 10034) | function packEnclose(circles) {
  function optional (line 10121) | function optional(f) {
  function required (line 10125) | function required(f) {
  function constantZero (line 10130) | function constantZero() {
  function defaultRadius$1 (line 10140) | function defaultRadius$1(d) {
  function pack (line 10150) | function pack(root) {
  function radiusLeaf (line 10180) | function radiusLeaf(radius) {
  function packChildren (line 10188) | function packChildren(padding, k) {
  function translateChild (line 10205) | function translateChild(k) {
  function partition (line 10242) | function partition(root) {
  function positionNode (line 10253) | function positionNode(dy, n) {
  function defaultId (line 10290) | function defaultId(d) {
  function defaultParentId (line 10294) | function defaultParentId(d) {
  function stratify (line 10302) | function stratify(data) {
  function defaultSeparation$1 (line 10357) | function defaultSeparation$1(a, b) {
  function nextLeft (line 10369) | function nextLeft(v) {
  function nextRight (line 10375) | function nextRight(v) {
  function moveSubtree (line 10382) | function moveSubtree(wm, wp, shift) {
  function executeShifts (line 10394) | function executeShifts(v) {
  function nextAncestor (line 10410) | function nextAncestor(vim, v, ancestor) {
  function TreeNode (line 10414) | function TreeNode(node, i) {
  function treeRoot (line 10430) | function treeRoot(root) {
  function tree (line 10460) | function tree(root) {
  function firstWalk (line 10498) | function firstWalk(v) {
  function secondWalk (line 10518) | function secondWalk(v) {
  function apportion (line 10534) | function apportion(v, w, ancestor) {
  function sizeNode (line 10573) | function sizeNode(node) {
  function squarifyRatio (line 10608) | function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
  function squarify (line 10659) | function squarify(parent, x0, y0, x1, y1) {
  function treemap (line 10682) | function treemap(root) {
  function positionNode (line 10693) | function positionNode(node) {
  function partition (line 10771) | function partition(i, j, value, x0, y0, x1, y1) {
  function resquarify (line 10813) | function resquarify(parent, x0, y0, x1, y1) {
  function lexicographicOrder (line 10889) | function lexicographicOrder(a, b) {
  function computeUpperHullIndexes (line 10896) | function computeUpperHullIndexes(points) {
  function Queue (line 10982) | function Queue(size) {
  function poke$1 (line 11026) | function poke$1(q) {
  function start$1 (line 11036) | function start$1(q) {
  function end (line 11050) | function end(q, i) {
  function abort (line 11066) | function abort(q, e) {
  function maybeNotify (line 11086) | function maybeNotify(q) {
  function queue (line 11094) | function queue(concurrency) {
  function randomUniform (line 11105) | function randomUniform(min, max) {
  function randomNormal (line 11121) | function randomNormal(mu, sigma) {
  function randomLogNormal (line 11148) | function randomLogNormal() {
  function randomIrwinHall (line 11161) | function randomIrwinHall(n) {
  function randomBates (line 11174) | function randomBates(n) {
  function randomExponential (line 11187) | function randomExponential(lambda) {
  function respond (line 11219) | function respond(o) {
  function fixCallback (line 11334) | function fixCallback(callback) {
  function hasResponse (line 11340) | function hasResponse(xhr) {
  function responseOf (line 11386) | function responseOf(parse, row) {
  function ordinal (line 11403) | function ordinal(range) {
  function band (line 11445) | function band() {
  function pointish (line 11526) | function pointish(scale) {
  function point$1 (line 11540) | function point$1() {
  function deinterpolateLinear (line 11556) | function deinterpolateLinear(a, b) {
  function deinterpolateClamp (line 11562) | function deinterpolateClamp(deinterpolate) {
  function reinterpolateClamp (line 11569) | function reinterpolateClamp(reinterpolate) {
  function bimap (line 11576) | function bimap(domain, range$$1, deinterpolate, reinterpolate) {
  function polymap (line 11583) | function polymap(domain, range$$1, deinterpolate, reinterpolate) {
  function copy (line 11606) | function copy(source, target) {
  function continuous (line 11616) | function continuous(deinterpolate, reinterpolate) {
  function linearish (line 11691) | function linearish(scale) {
  function linear$2 (line 11746) | function linear$2() {
  function identity$6 (line 11756) | function identity$6() {
  function deinterpolate (line 11795) | function deinterpolate(a, b) {
  function reinterpolate$1 (line 11801) | function reinterpolate$1(a, b) {
  function pow10 (line 11807) | function pow10(x) {
  function powp (line 11811) | function powp(base) {
  function logp (line 11817) | function logp(base) {
  function reflect (line 11824) | function reflect(f) {
  function log$1 (line 11830) | function log$1() {
  function raise$1 (line 11918) | function raise$1(x, exponent) {
  function pow$1 (line 11922) | function pow$1() {
  function sqrt$1 (line 11949) | function sqrt$1() {
  function quantile$$1 (line 11953) | function quantile$$1() {
  function quantize$1 (line 12002) | function quantize$1() {
  function threshold$1 (line 12045) | function threshold$1() {
  function newInterval (line 12079) | function newInterval(floori, offseti, count, field) {
  function weekday (line 12218) | function weekday(i) {
  function utcWeekday (line 12318) | function utcWeekday(i) {
  function localDate (line 12382) | function localDate(d) {
  function utcDate (line 12391) | function utcDate(d) {
  function newYear (line 12400) | function newYear(y) {
  function formatLocale$1 (line 12404) | function formatLocale$1(locale) {
  function pad (line 12700) | function pad(value, fill, width) {
  function requote (line 12707) | function requote(s) {
  function formatRe (line 12711) | function formatRe(names) {
  function formatLookup (line 12715) | function formatLookup(names) {
  function parseWeekdayNumber (line 12721) | function parseWeekdayNumber(d, string, i) {
  function parseWeekNumberSunday (line 12726) | function parseWeekNumberSunday(d, string, i) {
  function parseWeekNumberMonday (line 12731) | function parseWeekNumberMonday(d, string, i) {
  function parseFullYear (line 12736) | function parseFullYear(d, string, i) {
  function parseYear (line 12741) | function parseYear(d, string, i) {
  function parseZone (line 12746) | function parseZone(d, string, i) {
  function parseMonthNumber (line 12751) | function parseMonthNumber(d, string, i) {
  function parseDayOfMonth (line 12756) | function parseDayOfMonth(d, string, i) {
  function parseDayOfYear (line 12761) | function parseDayOfYear(d, string, i) {
  function parseHour24 (line 12766) | function parseHour24(d, string, i) {
  function parseMinutes (line 12771) | function parseMinutes(d, string, i) {
  function parseSeconds (line 12776) | function parseSeconds(d, string, i) {
  function parseMilliseconds (line 12781) | function parseMilliseconds(d, string, i) {
  function parseLiteralPercent (line 12786) | function parseLiteralPercent(d, string, i) {
  function formatDayOfMonth (line 12791) | function formatDayOfMonth(d, p) {
  function formatHour24 (line 12795) | function formatHour24(d, p) {
  function formatHour12 (line 12799) | function formatHour12(d, p) {
  function formatDayOfYear (line 12803) | function formatDayOfYear(d, p) {
  function formatMilliseconds (line 12807) | function formatMilliseconds(d, p) {
  function formatMonthNumber (line 12811) | function formatMonthNumber(d, p) {
  function formatMinutes (line 12815) | function formatMinutes(d, p) {
  function formatSeconds (line 12819) | function formatSeconds(d, p) {
  function formatWeekNumberSunday (line 12823) | function formatWeekNumberSunday(d, p) {
  function formatWeekdayNumber (line 12827) | function formatWeekdayNumber(d) {
  function formatWeekNumberMonday (line 12831) | function formatWeekNumberMonday(d, p) {
  function formatYear (line 12835) | function formatYear(d, p) {
  function formatFullYear (line 12839) | function formatFullYear(d, p) {
  function formatZone (line 12843) | function formatZone(d) {
  function formatUTCDayOfMonth (line 12850) | function formatUTCDayOfMonth(d, p) {
  function formatUTCHour24 (line 12854) | function formatUTCHour24(d, p) {
  function formatUTCHour12 (line 12858) | function formatUTCHour12(d, p) {
  function formatUTCDayOfYear (line 12862) | function formatUTCDayOfYear(d, p) {
  function formatUTCMilliseconds (line 12866) | function formatUTCMilliseconds(d, p) {
  function formatUTCMonthNumber (line 12870) | function formatUTCMonthNumber(d, p) {
  function formatUTCMinutes (line 12874) | function formatUTCMinutes(d, p) {
  function formatUTCSeconds (line 12878) | function formatUTCSeconds(d, p) {
  function formatUTCWeekNumberSunday (line 12882) | function formatUTCWeekNumberSunday(d, p) {
  function formatUTCWeekdayNumber (line 12886) | function formatUTCWeekdayNumber(d) {
  function formatUTCWeekNumberMonday (line 12890) | function formatUTCWeekNumberMonday(d, p) {
  function formatUTCYear (line 12894) | function formatUTCYear(d, p) {
  function formatUTCFullYear (line 12898) | function formatUTCFullYear(d, p) {
  function formatUTCZone (line 12902) | function formatUTCZone() {
  function formatLiteralPercent (line 12906) | function formatLiteralPercent() {
  function defaultLocale$1 (line 12927) | function defaultLocale$1(definition) {
  function formatIsoNative (line 12938) | function formatIsoNative(date) {
  function parseIsoNative (line 12946) | function parseIsoNative(string) {
  function date$1 (line 12963) | function date$1(t) {
  function number$2 (line 12967) | function number$2(t) {
  function calendar (line 12971) | function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, s...
  function ramp (line 13118) | function ramp(range) {
  function sequential (line 13133) | function sequential(interpolator) {
  function acos$1 (line 13181) | function acos$1(x) {
  function asin$1 (line 13185) | function asin$1(x) {
  function arcInnerRadius (line 13189) | function arcInnerRadius(d) {
  function arcOuterRadius (line 13193) | function arcOuterRadius(d) {
  function arcStartAngle (line 13197) | function arcStartAngle(d) {
  function arcEndAngle (line 13201) | function arcEndAngle(d) {
  function arcPadAngle (line 13205) | function arcPadAngle(d) {
  function intersect (line 13209) | function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
  function cornerTangents (line 13218) | function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
  function arc (line 13269) | function arc() {
  function Linear (line 13445) | function Linear(context) {
  function x$3 (line 13477) | function x$3(p) {
  function y$3 (line 13481) | function y$3(p) {
  function line (line 13493) | function line(data) {
  function area (line 13546) | function area(data) {
  function arealine (line 13584) | function arealine() {
  function pie (line 13656) | function pie(data) {
  function Radial (line 13725) | function Radial(curve) {
  function curveRadial (line 13747) | function curveRadial(curve) {
  function radialLine (line 13758) | function radialLine(l) {
  function linkSource (line 13807) | function linkSource(d) {
  function linkTarget (line 13811) | function linkTarget(d) {
  function link$2 (line 13815) | function link$2(curve) {
  function curveHorizontal (line 13852) | function curveHorizontal(context, x0, y0, x1, y1) {
  function curveVertical (line 13857) | function curveVertical(context, x0, y0, x1, y1) {
  function curveRadial$1 (line 13862) | function curveRadial$1(context, x0, y0, x1, y1) {
  function linkHorizontal (line 13871) | function linkHorizontal() {
  function linkVertical (line 13875) | function linkVertical() {
  function linkRadial (line 13879) | function linkRadial() {
  function symbol (line 14013) | function symbol() {
  function point$2 (line 14037) | function point$2(that, x, y) {
  function Basis (line 14048) | function Basis(context) {
  function BasisClosed (line 14089) | function BasisClosed(context) {
  function BasisOpen (line 14139) | function BasisOpen(context) {
  function Bundle (line 14177) | function Bundle(context, beta) {
  function bundle (line 14221) | function bundle(context) {
  function point$3 (line 14232) | function point$3(that, x, y) {
  function Cardinal (line 14243) | function Cardinal(context, tension) {
  function cardinal (line 14283) | function cardinal(context) {
  function CardinalClosed (line 14294) | function CardinalClosed(context, tension) {
  function cardinal (line 14342) | function cardinal(context) {
  function CardinalOpen (line 14353) | function CardinalOpen(context, tension) {
  function cardinal (line 14390) | function cardinal(context) {
  function point$4 (line 14401) | function point$4(that, x, y) {
  function CatmullRom (line 14424) | function CatmullRom(context, alpha) {
  function catmullRom (line 14476) | function catmullRom(context) {
  function CatmullRomClosed (line 14487) | function CatmullRomClosed(context, alpha) {
  function catmullRom (line 14547) | function catmullRom(context) {
  function CatmullRomOpen (line 14558) | function CatmullRomOpen(context, alpha) {
  function catmullRom (line 14607) | function catmullRom(context) {
  function LinearClosed (line 14618) | function LinearClosed(context) {
  function sign$1 (line 14642) | function sign$1(x) {
  function slope3 (line 14650) | function slope3(that, x2, y2) {
  function slope2 (line 14660) | function slope2(that, t) {
  function point$5 (line 14668) | function point$5(that, t0, t1) {
  function MonotoneX (line 14677) | function MonotoneX(context) {
  function MonotoneY (line 14720) | function MonotoneY(context) {
  function ReflectContext (line 14728) | function ReflectContext(context) {
  function monotoneX (line 14739) | function monotoneX(context) {
  function monotoneY (line 14743) | function monotoneY(context) {
  function Natural (line 14747) | function Natural(context) {
  function controlPoints (line 14791) | function controlPoints(x) {
  function Step (line 14813) | function Step(context, t) {
  function stepBefore (line 14859) | function stepBefore(context) {
  function stepAfter (line 14863) | function stepAfter(context) {
  function stackValue (line 14883) | function stackValue(d, key) {
  function stack (line 14893) | function stack(data) {
  function sum$2 (line 14997) | function sum$2(series) {
  function x$4 (line 15042) | function x$4(d) {
  function y$4 (line 15046) | function y$4(d) {
  function RedBlackTree (line 15050) | function RedBlackTree() {
  function RedBlackNode (line 15054) | function RedBlackNode(node) {
  function RedBlackRotateLeft (line 15243) | function RedBlackRotateLeft(tree, node) {
  function RedBlackRotateRight (line 15262) | function RedBlackRotateRight(tree, node) {
  function RedBlackFirst (line 15281) | function RedBlackFirst(node) {
  function createEdge (line 15286) | function createEdge(left, right, v0, v1) {
  function createBorderEdge (line 15298) | function createBorderEdge(left, v0, v1) {
  function setEdgeEnd (line 15304) | function setEdgeEnd(edge, left, right, vertex) {
  function clipEdge (line 15317) | function clipEdge(edge, x0, y0, x1, y1) {
  function connectEdge (line 15381) | function connectEdge(edge, x0, y0, x1, y1) {
  function clipEdges (line 15439) | function clipEdges(x0, y0, x1, y1) {
  function createCell (line 15453) | function createCell(site) {
  function cellHalfedgeAngle (line 15460) | function cellHalfedgeAngle(cell, edge) {
  function cellHalfedgeStart (line 15471) | function cellHalfedgeStart(cell, edge) {
  function cellHalfedgeEnd (line 15475) | function cellHalfedgeEnd(cell, edge) {
  function sortCellHalfedges (line 15479) | function sortCellHalfedges() {
  function clipCells (line 15492) | function clipCells(x0, y0, x1, y1) {
  function Circle (line 15581) | function Circle() {
  function attachCircle (line 15590) | function attachCircle(arc) {
  function detachCircle (line 15642) | function detachCircle(arc) {
  function Beach (line 15655) | function Beach() {
  function createBeach (line 15662) | function createBeach(site) {
  function detachBeach (line 15668) | function detachBeach(beach) {
  function removeBeach (line 15675) | function removeBeach(beach) {
  function addBeach (line 15728) | function addBeach(site) {
  function leftBreakPoint (line 15807) | function leftBreakPoint(arc, directrix) {
  function rightBreakPoint (line 15834) | function rightBreakPoint(arc, directrix) {
  function triangleArea (line 15848) | function triangleArea(a, b, c) {
  function lexicographic (line 15852) | function lexicographic(a, b) {
  function Diagram (line 15857) | function Diagram(sites, extent) {
  function voronoi (line 15983) | function voronoi(data) {
  function ZoomEvent (line 16029) | function ZoomEvent(target, type, transform) {
  function Transform (line 16035) | function Transform(k, x, y) {
  function transform$1 (line 16082) | function transform$1(node) {
  function nopropagation$2 (line 16086) | function nopropagation$2() {
  function defaultFilter$2 (line 16096) | function defaultFilter$2() {
  function defaultExtent$1 (line 16100) | function defaultExtent$1() {
  function defaultTransform (line 16113) | function defaultTransform() {
  function zoom (line 16136) | function zoom(selection$$1) {
  function scale (line 16191) | function scale(transform, k) {
  function translate (line 16196) | function translate(transform, p0, p1) {
  function constrain (line 16201) | function constrain(transform, extent) {
  function centroid (line 16212) | function centroid(extent) {
  function schedule (line 16216) | function schedule(transition$$1, transform, center) {
  function gesture (line 16238) | function gesture(that, args) {
  function Gesture (line 16247) | function Gesture(that, args) {
  function wheeled (line 16284) | function wheeled() {
  function mousedowned (line 16320) | function mousedowned() {
  function dblclicked (line 16351) | function dblclicked() {
  function touchstarted (line 16364) | function touchstarted() {
  function touchmoved (line 16397) | function touchmoved() {
  function touchended (line 16424) | function touchended() {

FILE: src/main/resources/static/dashboard/assets/plugins/d3/d3.min-v4.js
  function n (line 2) | function n(t){return function(n,e){return js(t(n),e)}}
  function e (line 2) | function e(t,n){return[t,n]}
  function r (line 2) | function r(t,n,e){var r=(n-t)/Math.max(0,e),i=Math.floor(Math.log(r)/Mat...
  function i (line 2) | function i(t,n,e){var r=Math.abs(n-t)/Math.max(0,e),i=Math.pow(10,Math.f...
  function o (line 2) | function o(t){return t.length}
  function u (line 2) | function u(t){return"translate("+(t+.5)+",0)"}
  function a (line 2) | function a(t){return"translate(0,"+(t+.5)+")"}
  function c (line 2) | function c(t){var n=Math.max(0,t.bandwidth()-1)/2;return t.round()&&(n=M...
  function s (line 2) | function s(){return!this.__axis}
  function f (line 2) | function f(t,n){function e(e){var u=null==i?n.ticks?n.ticks.apply(n,r):n...
  function l (line 2) | function l(t){return f(zf,t)}
  function h (line 2) | function h(t){return f(Pf,t)}
  function p (line 2) | function p(t){return f(Lf,t)}
  function d (line 2) | function d(t){return f(Rf,t)}
  function v (line 2) | function v(){for(var t,n=0,e=arguments.length,r={};n<e;++n){if(!(t=argum...
  function _ (line 2) | function _(t){this._=t}
  function y (line 2) | function y(t,n){return t.trim().split(/^|\s+/).map(function(t){var e="",...
  function g (line 2) | function g(t,n){for(var e,r=0,i=t.length;r<i;++r)if((e=t[r]).name===n)re...
  function m (line 2) | function m(t,n,e){for(var r=0,i=t.length;r<i;++r)if(t[r].name===n){t[r]=...
  function x (line 2) | function x(t){return function(){var n=this.ownerDocument,e=this.namespac...
  function b (line 2) | function b(t){return function(){return this.ownerDocument.createElementN...
  function w (line 2) | function w(){return new M}
  function M (line 2) | function M(){this._="@"+(++Yf).toString(36)}
  function T (line 2) | function T(t,n,e){return t=k(t,n,e),function(n){var e=n.relatedTarget;e&...
  function k (line 2) | function k(n,e,r){return function(i){var o=t.event;t.event=i;try{n.call(...
  function N (line 2) | function N(t){return t.trim().split(/^|\s+/).map(function(t){var n="",e=...
  function S (line 2) | function S(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1...
  function E (line 2) | function E(t,n,e){var r=$f.hasOwnProperty(t.type)?T:k;return function(i,...
  function A (line 2) | function A(n,e,r,i){var o=t.event;n.sourceEvent=t.event,t.event=n;try{re...
  function C (line 2) | function C(){}
  function z (line 2) | function z(){return[]}
  function P (line 2) | function P(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.n...
  function L (line 2) | function L(t,n,e,r,i,o){for(var u,a=0,c=n.length,s=o.length;a<s;++a)(u=n...
  function R (line 2) | function R(t,n,e,r,i,o,u){var a,c,s,f={},l=n.length,h=o.length,p=new Arr...
  function q (line 2) | function q(t,n){return t<n?-1:t>n?1:t>=n?0:NaN}
  function U (line 2) | function U(t){return function(){this.removeAttribute(t)}}
  function D (line 2) | function D(t){return function(){this.removeAttributeNS(t.space,t.local)}}
  function O (line 2) | function O(t,n){return function(){this.setAttribute(t,n)}}
  function F (line 2) | function F(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}
  function I (line 2) | function I(t,n){return function(){var e=n.apply(this,arguments);null==e?...
  function Y (line 2) | function Y(t,n){return function(){var e=n.apply(this,arguments);null==e?...
  function B (line 2) | function B(t){return function(){this.style.removeProperty(t)}}
  function H (line 2) | function H(t,n,e){return function(){this.style.setProperty(t,n,e)}}
  function j (line 2) | function j(t,n,e){return function(){var r=n.apply(this,arguments);null==...
  function X (line 2) | function X(t,n){return t.style.getPropertyValue(n)||gl(t).getComputedSty...
  function $ (line 2) | function $(t){return function(){delete this[t]}}
  function V (line 2) | function V(t,n){return function(){this[t]=n}}
  function W (line 2) | function W(t,n){return function(){var e=n.apply(this,arguments);null==e?...
  function Z (line 2) | function Z(t){return t.trim().split(/^|\s+/)}
  function G (line 2) | function G(t){return t.classList||new J(t)}
  function J (line 2) | function J(t){this._node=t,this._names=Z(t.getAttribute("class")||"")}
  function Q (line 2) | function Q(t,n){for(var e=G(t),r=-1,i=n.length;++r<i;)e.add(n[r])}
  function K (line 2) | function K(t,n){for(var e=G(t),r=-1,i=n.length;++r<i;)e.remove(n[r])}
  function tt (line 2) | function tt(t){return function(){Q(this,t)}}
  function nt (line 2) | function nt(t){return function(){K(this,t)}}
  function et (line 2) | function et(t,n){return function(){(n.apply(this,arguments)?Q:K)(this,t)}}
  function rt (line 2) | function rt(){this.textContent=""}
  function it (line 2) | function it(t){return function(){this.textContent=t}}
  function ot (line 2) | function ot(t){return function(){var n=t.apply(this,arguments);this.text...
  function ut (line 2) | function ut(){this.innerHTML=""}
  function at (line 2) | function at(t){return function(){this.innerHTML=t}}
  function ct (line 2) | function ct(t){return function(){var n=t.apply(this,arguments);this.inne...
  function st (line 2) | function st(){this.nextSibling&&this.parentNode.appendChild(this)}
  function ft (line 2) | function ft(){this.previousSibling&&this.parentNode.insertBefore(this,th...
  function lt (line 2) | function lt(){return null}
  function ht (line 2) | function ht(){var t=this.parentNode;t&&t.removeChild(this)}
  function pt (line 2) | function pt(t,n,e){var r=gl(t),i=r.CustomEvent;"function"==typeof i?i=ne...
  function dt (line 2) | function dt(t,n){return function(){return pt(this,t,n)}}
  function vt (line 2) | function vt(t,n){return function(){return pt(this,t,n.apply(this,argumen...
  function _t (line 2) | function _t(t,n){this._groups=t,this._parents=n}
  function yt (line 2) | function yt(){return new _t([[document.documentElement]],zl)}
  function gt (line 2) | function gt(){t.event.stopImmediatePropagation()}
  function mt (line 2) | function mt(t,n){var e=t.document.documentElement,r=Pl(t).on("dragstart....
  function xt (line 2) | function xt(t,n,e,r,i,o,u,a,c,s){this.target=t,this.type=n,this.subject=...
  function bt (line 2) | function bt(){return!t.event.button}
  function wt (line 2) | function wt(){return this.parentNode}
  function Mt (line 2) | function Mt(n){return null==n?{x:t.event.x,y:t.event.y}:n}
  function Tt (line 2) | function Tt(t,n){var e=Object.create(t.prototype);for(var r in n)e[r]=n[...
  function kt (line 2) | function kt(){}
  function Nt (line 2) | function Nt(t){var n;return t=(t+"").trim().toLowerCase(),(n=jl.exec(t))...
  function St (line 2) | function St(t){return new zt(t>>16&255,t>>8&255,255&t,1)}
  function Et (line 2) | function Et(t,n,e,r){return r<=0&&(t=n=e=NaN),new zt(t,n,e,r)}
  function At (line 2) | function At(t){return t instanceof kt||(t=Nt(t)),t?(t=t.rgb(),new zt(t.r...
  function Ct (line 2) | function Ct(t,n,e,r){return 1===arguments.length?At(t):new zt(t,n,e,null...
  function zt (line 2) | function zt(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}
  function Pt (line 2) | function Pt(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=N...
  function Lt (line 2) | function Lt(t){if(t instanceof qt)return new qt(t.h,t.s,t.l,t.opacity);i...
  function Rt (line 2) | function Rt(t,n,e,r){return 1===arguments.length?Lt(t):new qt(t,n,e,null...
  function qt (line 2) | function qt(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}
  function Ut (line 2) | function Ut(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(...
  function Dt (line 2) | function Dt(t){if(t instanceof Ft)return new Ft(t.l,t.a,t.b,t.opacity);i...
  function Ot (line 2) | function Ot(t,n,e,r){return 1===arguments.length?Dt(t):new Ft(t,n,e,null...
  function Ft (line 2) | function Ft(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}
  function It (line 2) | function It(t){return t>ah?Math.pow(t,1/3):t/uh+ih}
  function Yt (line 2) | function Yt(t){return t>oh?t*t*t:uh*(t-ih)}
  function Bt (line 2) | function Bt(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-....
  function Ht (line 2) | function Ht(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}
  function jt (line 2) | function jt(t){if(t instanceof $t)return new $t(t.h,t.c,t.l,t.opacity);t...
  function Xt (line 2) | function Xt(t,n,e,r){return 1===arguments.length?jt(t):new $t(t,n,e,null...
  function $t (line 2) | function $t(t,n,e,r){this.h=+t,this.c=+n,this.l=+e,this.opacity=+r}
  function Vt (line 2) | function Vt(t){if(t instanceof Zt)return new Zt(t.h,t.s,t.l,t.opacity);t...
  function Wt (line 2) | function Wt(t,n,e,r){return 1===arguments.length?Vt(t):new Zt(t,n,e,null...
  function Zt (line 2) | function Zt(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}
  function Gt (line 2) | function Gt(t,n,e,r,i){var o=t*t,u=o*t;return((1-3*t+3*o-u)*n+(4-6*o+3*u...
  function Jt (line 2) | function Jt(t,n){return function(e){return t+e*n}}
  function Qt (line 2) | function Qt(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,functi...
  function Kt (line 2) | function Kt(t,n){var e=n-t;return e?Jt(t,e>180||e<-180?e-360*Math.round(...
  function tn (line 2) | function tn(t){return 1==(t=+t)?nn:function(n,e){return e-n?Qt(n,e,t):Th...
  function nn (line 2) | function nn(t,n){var e=n-t;return e?Jt(t,e):Th(isNaN(t)?n:t)}
  function en (line 2) | function en(t){return function(n){var e,r,i=n.length,o=new Array(i),u=ne...
  function rn (line 2) | function rn(t){return function(){return t}}
  function on (line 2) | function on(t){return function(n){return t(n)+""}}
  function un (line 2) | function un(t){return"none"===t?Oh:(_h||(_h=document.createElement("DIV"...
  function an (line 2) | function an(t){return null==t?Oh:(mh||(mh=document.createElementNS("http...
  function cn (line 2) | function cn(t,n,e,r){function i(t){return t.length?t.pop()+" ":""}functi...
  function sn (line 2) | function sn(t){return((t=Math.exp(t))+1/t)/2}
  function fn (line 2) | function fn(t){return((t=Math.exp(t))-1/t)/2}
  function ln (line 2) | function ln(t){return((t=Math.exp(2*t))-1)/(t+1)}
  function hn (line 2) | function hn(t){return function(n,e){var r=t((n=Rt(n)).h,(e=Rt(e)).h),i=n...
  function pn (line 2) | function pn(t,n){var e=nn((t=Ot(t)).l,(n=Ot(n)).l),r=nn(t.a,n.a),i=nn(t....
  function dn (line 2) | function dn(t){return function(n,e){var r=t((n=Xt(n)).h,(e=Xt(e)).h),i=n...
  function vn (line 2) | function vn(t){return function n(e){function r(n,r){var i=t((n=Wt(n)).h,...
  function _n (line 2) | function _n(){return ep||(op(yn),ep=ip.now()+rp)}
  function yn (line 2) | function yn(){ep=0}
  function gn (line 2) | function gn(){this._call=this._time=this._next=null}
  function mn (line 2) | function mn(t,n,e){var r=new gn;return r.restart(t,n,e),r}
  function xn (line 2) | function xn(){_n(),++Jh;for(var t,n=xh;n;)(t=ep-n._time)>=0&&n._call.cal...
  function bn (line 2) | function bn(){ep=(np=ip.now())+rp,Jh=Qh=0;try{xn()}finally{Jh=0,Mn(),ep=0}}
  function wn (line 2) | function wn(){var t=ip.now(),n=t-np;n>tp&&(rp-=n,np=t)}
  function Mn (line 2) | function Mn(){for(var t,n,e=xh,r=1/0;e;)e._call?(r>e._time&&(r=e._time),...
  function Tn (line 2) | function Tn(t){if(!Jh){Qh&&(Qh=clearTimeout(Qh));var n=t-ep;n>24?(t<1/0&...
  function kn (line 2) | function kn(t,n){var e=t.__transition;if(!e||!(e=e[n])||e.state>fp)throw...
  function Nn (line 2) | function Nn(t,n){var e=t.__transition;if(!e||!(e=e[n])||e.state>hp)throw...
  function Sn (line 2) | function Sn(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("...
  function En (line 2) | function En(t,n,e){function r(t){e.state=lp,e.timer.restart(i,e.delay,e....
  function An (line 2) | function An(t,n){var e,r;return function(){var i=Nn(this,t),o=i.tween;if...
  function Cn (line 2) | function Cn(t,n,e){var r,i;if("function"!=typeof e)throw new Error;retur...
  function zn (line 2) | function zn(t,n,e){var r=t._id;return t.each(function(){var t=Nn(this,r)...
  function Pn (line 2) | function Pn(t){return function(){this.removeAttribute(t)}}
  function Ln (line 2) | function Ln(t){return function(){this.removeAttributeNS(t.space,t.local)}}
  function Rn (line 2) | function Rn(t,n,e){var r,i;return function(){var o=this.getAttribute(t);...
  function qn (line 2) | function qn(t,n,e){var r,i;return function(){var o=this.getAttributeNS(t...
  function Un (line 2) | function Un(t,n,e){var r,i,o;return function(){var u,a=e(this);return nu...
  function Dn (line 2) | function Dn(t,n,e){var r,i,o;return function(){var u,a=e(this);return nu...
  function On (line 2) | function On(t,n){function e(){var e=this,r=n.apply(e,arguments);return r...
  function Fn (line 2) | function Fn(t,n){function e(){var e=this,r=n.apply(e,arguments);return r...
  function In (line 2) | function In(t,n){return function(){kn(this,t).delay=+n.apply(this,argume...
  function Yn (line 2) | function Yn(t,n){return n=+n,function(){kn(this,t).delay=n}}
  function Bn (line 2) | function Bn(t,n){return function(){Nn(this,t).duration=+n.apply(this,arg...
  function Hn (line 2) | function Hn(t,n){return n=+n,function(){Nn(this,t).duration=n}}
  function jn (line 2) | function jn(t,n){if("function"!=typeof n)throw new Error;return function...
  function Xn (line 2) | function Xn(t){return(t+"").trim().split(/^|\s+/).every(function(t){var ...
  function $n (line 2) | function $n(t,n,e){var r,i,o=Xn(n)?kn:Nn;return function(){var u=o(this,...
  function Vn (line 2) | function Vn(t){return function(){var n=this.parentNode;for(var e in this...
  function Wn (line 2) | function Wn(t,n){var e,r,i;return function(){var o=X(this,t),u=(this.sty...
  function Zn (line 2) | function Zn(t){return function(){this.style.removeProperty(t)}}
  function Gn (line 2) | function Gn(t,n,e){var r,i;return function(){var o=X(this,t);return o===...
  function Jn (line 2) | function Jn(t,n,e){var r,i,o;return function(){var u=X(this,t),a=e(this)...
  function Qn (line 2) | function Qn(t,n,e){function r(){var r=this,i=n.apply(r,arguments);return...
  function Kn (line 2) | function Kn(t){return function(){this.textContent=t}}
  function te (line 2) | function te(t){return function(){var n=t(this);this.textContent=null==n?...
  function ne (line 2) | function ne(t,n,e,r){this._groups=t,this._parents=n,this._name=e,this._i...
  function ee (line 2) | function ee(t){return yt().transition(t)}
  function re (line 2) | function re(){return++Fp}
  function ie (line 2) | function ie(t){return+t}
  function oe (line 2) | function oe(t){return t*t}
  function ue (line 2) | function ue(t){return t*(2-t)}
  function ae (line 2) | function ae(t){return((t*=2)<=1?t*t:--t*(2-t)+1)/2}
  function ce (line 2) | function ce(t){return t*t*t}
  function se (line 2) | function se(t){return--t*t*t+1}
  function fe (line 2) | function fe(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}
  function le (line 2) | function le(t){return 1-Math.cos(t*Xp)}
  function he (line 2) | function he(t){return Math.sin(t*Xp)}
  function pe (line 2) | function pe(t){return(1-Math.cos(jp*t))/2}
  function de (line 2) | function de(t){return Math.pow(2,10*t-10)}
  function ve (line 2) | function ve(t){return 1-Math.pow(2,-10*t)}
  function _e (line 2) | function _e(t){return((t*=2)<=1?Math.pow(2,10*t-10):2-Math.pow(2,10-10*t...
  function ye (line 2) | function ye(t){return 1-Math.sqrt(1-t*t)}
  function ge (line 2) | function ge(t){return Math.sqrt(1- --t*t)}
  function me (line 2) | function me(t){return((t*=2)<=1?1-Math.sqrt(1-t*t):Math.sqrt(1-(t-=2)*t)...
  function xe (line 2) | function xe(t){return 1-be(1-t)}
  function be (line 2) | function be(t){return(t=+t)<$p?nd*t*t:t<Wp?nd*(t-=Vp)*t+Zp:t<Jp?nd*(t-=G...
  function we (line 2) | function we(t){return((t*=2)<=1?1-be(1-t):be(t-1)+1)/2}
  function Me (line 2) | function Me(t,n){for(var e;!(e=t.__transition)||!(e=e[n]);)if(!(t=t.pare...
  function Te (line 2) | function Te(){t.event.stopImmediatePropagation()}
  function ke (line 2) | function ke(t){return{type:t}}
  function Ne (line 2) | function Ne(){return!t.event.button}
  function Se (line 2) | function Se(){var t=this.ownerSVGElement||this;return[[0,0],[t.width.bas...
  function Ee (line 2) | function Ee(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__b...
  function Ae (line 2) | function Ae(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}
  function Ce (line 2) | function Ce(t){var n=t.__brush;return n?n.dim.output(n.selection):null}
  function ze (line 2) | function ze(){return Le(xd)}
  function Pe (line 2) | function Pe(){return Le(bd)}
  function Le (line 2) | function Le(n){function e(t){var e=t.property("__brush",a).selectAll(".o...
  function Re (line 2) | function Re(t){return function(n,e){return t(n.source.value+n.target.val...
  function qe (line 2) | function qe(){this._x0=this._y0=this._x1=this._y1=null,this._=""}
  function Ue (line 2) | function Ue(){return new qe}
  function De (line 2) | function De(t){return t.source}
  function Oe (line 2) | function Oe(t){return t.target}
  function Fe (line 2) | function Fe(t){return t.radius}
  function Ie (line 2) | function Ie(t){return t.startAngle}
  function Ye (line 2) | function Ye(t){return t.endAngle}
  function Be (line 2) | function Be(){}
  function He (line 2) | function He(t,n){var e=new Be;if(t instanceof Be)t.each(function(t,n){e....
  function je (line 2) | function je(){return{}}
  function Xe (line 2) | function Xe(t,n,e){t[n]=e}
  function $e (line 2) | function $e(){return He()}
  function Ve (line 2) | function Ve(t,n,e){t.set(n,e)}
  function We (line 2) | function We(){}
  function Ze (line 2) | function Ze(t,n){var e=new We;if(t instanceof We)t.each(function(t){e.ad...
  function Ge (line 2) | function Ge(t){return new Function("d","return {"+t.map(function(t,n){re...
  function Je (line 2) | function Je(t,n){var e=Ge(t);return function(r,i){return n(e(r),i,t)}}
  function Qe (line 2) | function Qe(t){var n=Object.create(null),e=[];return t.forEach(function(...
  function Ke (line 2) | function Ke(t,n,e,r){if(isNaN(n)||isNaN(e))return t;var i,o,u,a,c,s,f,l,...
  function tr (line 2) | function tr(t){var n,e,r,i,o=t.length,u=new Array(o),a=new Array(o),c=1/...
  function nr (line 2) | function nr(t){for(var n=0,e=t.length;n<e;++n)this.remove(t[n]);return t...
  function er (line 2) | function er(t){return t[0]}
  function rr (line 2) | function rr(t){return t[1]}
  function ir (line 2) | function ir(t,n,e){var r=new or(null==n?er:n,null==e?rr:e,NaN,NaN,NaN,Na...
  function or (line 2) | function or(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this....
  function ur (line 2) | function ur(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.da...
  function ar (line 2) | function ar(t){return t.x+t.vx}
  function cr (line 2) | function cr(t){return t.y+t.vy}
  function sr (line 2) | function sr(t){return t.index}
  function fr (line 2) | function fr(t,n){var e=t.get(n);if(!e)throw new Error("missing: "+n);ret...
  function lr (line 2) | function lr(t){return t.x}
  function hr (line 2) | function hr(t){return t.y}
  function pr (line 2) | function pr(t){return new dr(t)}
  function dr (line 2) | function dr(t){if(!(n=Ov.exec(t)))throw new Error("invalid format: "+t);...
  function vr (line 3) | function vr(n){return Fv=Bv(n),t.format=Fv.format,t.formatPrefix=Fv.form...
  function _r (line 3) | function _r(){this.reset()}
  function yr (line 3) | function yr(t,n,e){var r=t.s=n+e,i=r-n,o=r-i;t.t=n-o+(e-i)}
  function gr (line 3) | function gr(t){return t>1?0:t<-1?N_:Math.acos(t)}
  function mr (line 3) | function mr(t){return t>1?S_:t<-1?-S_:Math.asin(t)}
  function xr (line 3) | function xr(t){return(t=I_(t/2))*t}
  function br (line 3) | function br(){}
  function wr (line 3) | function wr(t,n){t&&X_.hasOwnProperty(t.type)&&X_[t.type](t,n)}
  function Mr (line 3) | function Mr(t,n,e){var r,i=-1,o=t.length-e;for(n.lineStart();++i<o;)r=t[...
  function Tr (line 3) | function Tr(t,n){var e=-1,r=t.length;for(n.polygonStart();++e<r;)Mr(t[e]...
  function kr (line 3) | function kr(){Z_.point=Sr}
  function Nr (line 3) | function Nr(){Er(Vv,Wv)}
  function Sr (line 3) | function Sr(t,n){Z_.point=Er,Vv=t,Wv=n,t*=z_,n*=z_,Zv=t,Gv=q_(n=n/2+E_),...
  function Er (line 3) | function Er(t,n){t*=z_,n*=z_,n=n/2+E_;var e=t-Zv,r=e>=0?1:-1,i=r*e,o=q_(...
  function Ar (line 3) | function Ar(t){return[R_(t[1],t[0]),mr(t[2])]}
  function Cr (line 3) | function Cr(t){var n=t[0],e=t[1],r=q_(e);return[r*q_(n),r*I_(n),I_(e)]}
  function zr (line 3) | function zr(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}
  function Pr (line 3) | function Pr(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1...
  function Lr (line 3) | function Lr(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}
  function Rr (line 3) | function Rr(t,n){return[t[0]*n,t[1]*n,t[2]*n]}
  function qr (line 3) | function qr(t){var n=B_(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t...
  function Ur (line 3) | function Ur(t,n){u_.push(a_=[Qv=t,t_=t]),n<Kv&&(Kv=n),n>n_&&(n_=n)}
  function Dr (line 3) | function Dr(t,n){var e=Cr([t*z_,n*z_]);if(o_){var r=Pr(o_,e),i=[r[1],-r[...
  function Or (line 3) | function Or(){Q_.point=Dr}
  function Fr (line 3) | function Fr(){a_[0]=Qv,a_[1]=t_,Q_.point=Ur,o_=null}
  function Ir (line 3) | function Ir(t,n){if(o_){var e=t-e_;J_.add(P_(e)>180?e+(e>0?360:-360):e)}...
  function Yr (line 3) | function Yr(){Z_.lineStart()}
  function Br (line 3) | function Br(){Ir(r_,i_),Z_.lineEnd(),P_(J_)>k_&&(Qv=-(t_=180)),a_[0]=Qv,...
  function Hr (line 3) | function Hr(t,n){return(n-=t)<0?n+360:n}
  function jr (line 3) | function jr(t,n){return t[0]-n[0]}
  function Xr (line 3) | function Xr(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}
  function $r (line 3) | function $r(t,n){t*=z_,n*=z_;var e=q_(n);Vr(e*q_(t),e*I_(t),I_(n))}
  function Vr (line 3) | function Vr(t,n,e){++c_,f_+=(t-f_)/c_,l_+=(n-l_)/c_,h_+=(e-h_)/c_}
  function Wr (line 3) | function Wr(){ty.point=Zr}
  function Zr (line 3) | function Zr(t,n){t*=z_,n*=z_;var e=q_(n);b_=e*q_(t),w_=e*I_(t),M_=I_(n),...
  function Gr (line 3) | function Gr(t,n){t*=z_,n*=z_;var e=q_(n),r=e*q_(t),i=e*I_(t),o=I_(n),u=R...
  function Jr (line 3) | function Jr(){ty.point=$r}
  function Qr (line 3) | function Qr(){ty.point=ti}
  function Kr (line 3) | function Kr(){ni(m_,x_),ty.point=$r}
  function ti (line 3) | function ti(t,n){m_=t,x_=n,t*=z_,n*=z_,ty.point=ni;var e=q_(n);b_=e*q_(t...
  function ni (line 3) | function ni(t,n){t*=z_,n*=z_;var e=q_(n),r=e*q_(t),i=e*I_(t),o=I_(n),u=w...
  function ei (line 3) | function ei(t,n){return[t>N_?t-A_:t<-N_?t+A_:t,n]}
  function ri (line 3) | function ri(t,n,e){return(t%=A_)?n||e?ry(oi(t),ui(n,e)):oi(t):n||e?ui(n,...
  function ii (line 3) | function ii(t){return function(n,e){return n+=t,[n>N_?n-A_:n<-N_?n+A_:n,...
  function oi (line 3) | function oi(t){var n=ii(t);return n.invert=ii(-t),n}
  function ui (line 3) | function ui(t,n){function e(t,n){var e=q_(n),a=q_(t)*e,c=I_(t)*e,s=I_(n)...
  function ai (line 3) | function ai(t,n,e,r,i,o){if(e){var u=q_(n),a=I_(n),c=r*e;null==i?(i=n+r*...
  function ci (line 3) | function ci(t,n){n=Cr(n),n[0]-=t,qr(n);var e=gr(-n[1]);return((-n[2]<0?-...
  function si (line 3) | function si(t,n,e,r){this.x=t,this.z=n,this.o=e,this.e=r,this.v=!1,this....
  function fi (line 3) | function fi(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r<n;)i.n=e=t[r],e...
  function li (line 3) | function li(t,n,e,r){function i(i,o){return t<=i&&i<=e&&n<=o&&o<=r}funct...
  function hi (line 3) | function hi(){Sy.point=di,Sy.lineEnd=pi}
  function pi (line 3) | function pi(){Sy.point=Sy.lineEnd=br}
  function di (line 3) | function di(t,n){t*=z_,n*=z_,iy=t,oy=I_(n),uy=q_(n),Sy.point=vi}
  function vi (line 3) | function vi(t,n){t*=z_,n*=z_;var e=I_(n),r=q_(n),i=P_(t-iy),o=q_(i),u=I_...
  function _i (line 3) | function _i(t,n){return!(!t||!Ly.hasOwnProperty(t.type))&&Ly[t.type](t,n)}
  function yi (line 3) | function yi(t,n){return 0===zy(t,n)}
  function gi (line 3) | function gi(t,n){var e=zy(t[0],t[1]);return zy(t[0],n)+zy(n,t[1])<=e+k_}
  function mi (line 3) | function mi(t,n){return!!ky(t.map(xi),bi(n))}
  function xi (line 3) | function xi(t){return t=t.map(bi),t.pop(),t}
  function bi (line 3) | function bi(t){return[t[0]*z_,t[1]*z_]}
  function wi (line 3) | function wi(t,n,e){var r=cf(t,n-k_,e).concat(n);return function(t){retur...
  function Mi (line 3) | function Mi(t,n,e){var r=cf(t,n-k_,e).concat(n);return function(t){retur...
  function Ti (line 3) | function Ti(){function t(){return{type:"MultiLineString",coordinates:n()...
  function ki (line 3) | function ki(){return Ti()()}
  function Ni (line 3) | function Ni(){Fy.point=Si}
  function Si (line 3) | function Si(t,n){Fy.point=Ei,ay=sy=t,cy=fy=n}
  function Ei (line 3) | function Ei(t,n){Oy.add(fy*t-sy*n),sy=t,fy=n}
  function Ai (line 3) | function Ai(){Ei(ay,cy)}
  function Ci (line 3) | function Ci(t,n){t<Iy&&(Iy=t),t>By&&(By=t),n<Yy&&(Yy=n),n>Hy&&(Hy=n)}
  function zi (line 3) | function zi(t,n){Xy+=t,$y+=n,++Vy}
  function Pi (line 3) | function Pi(){tg.point=Li}
  function Li (line 3) | function Li(t,n){tg.point=Ri,zi(py=t,dy=n)}
  function Ri (line 3) | function Ri(t,n){var e=t-py,r=n-dy,i=B_(e*e+r*r);Wy+=i*(py+t)/2,Zy+=i*(d...
  function qi (line 3) | function qi(){tg.point=zi}
  function Ui (line 3) | function Ui(){tg.point=Oi}
  function Di (line 3) | function Di(){Fi(ly,hy)}
  function Oi (line 3) | function Oi(t,n){tg.point=Fi,zi(ly=py=t,hy=dy=n)}
  function Fi (line 3) | function Fi(t,n){var e=t-py,r=n-dy,i=B_(e*e+r*r);Wy+=i*(py+t)/2,Zy+=i*(d...
  function Ii (line 3) | function Ii(t){this._context=t}
  function Yi (line 3) | function Yi(t,n){ag.point=Bi,eg=ig=t,rg=og=n}
  function Bi (line 3) | function Bi(t,n){ig-=t,og-=n,ug.add(B_(ig*ig+og*og)),ig=t,og=n}
  function Hi (line 3) | function Hi(){this._string=[]}
  function ji (line 3) | function ji(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" ...
  function Xi (line 3) | function Xi(t){return t.length>1}
  function $i (line 3) | function $i(t,n){return((t=t.x)[0]<0?t[1]-S_-k_:S_-t[1])-((n=n.x)[0]<0?n...
  function Vi (line 3) | function Vi(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lin...
  function Wi (line 3) | function Wi(t,n,e,r){var i,o,u=I_(t-e);return P_(u)>k_?L_((I_(n)*(o=q_(r...
  function Zi (line 3) | function Zi(t,n,e,r){var i;if(null==t)i=e*S_,r.point(-N_,i),r.point(0,i)...
  function Gi (line 3) | function Gi(t){return function(n){var e=new Ji;for(var r in t)e[r]=t[r];...
  function Ji (line 3) | function Ji(){}
  function Qi (line 3) | function Qi(t,n,e){var r=n[1][0]-n[0][0],i=n[1][1]-n[0][1],o=t.clipExten...
  function Ki (line 3) | function Ki(t,n,e){return Qi(t,[[0,0],n],e)}
  function to (line 3) | function to(t){return Gi({point:function(n,e){n=t(n,e),this.stream.point...
  function no (line 3) | function no(t,n){function e(r,i,o,u,a,c,s,f,l,h,p,d,v,_){var y=s-r,g=f-i...
  function eo (line 3) | function eo(t){return ro(function(){return t})()}
  function ro (line 3) | function ro(t){function n(t){return t=f(t[0]*z_,t[1]*z_),[t[0]*_+a,c-t[1...
  function io (line 3) | function io(t){var n=0,e=N_/3,r=ro(t),i=r(n,e);return i.parallels=functi...
  function oo (line 3) | function oo(t){function n(t,n){return[t*e,I_(n)/e]}var e=q_(t);return n....
  function uo (line 3) | function uo(t,n){function e(t,n){var e=B_(o-2*i*I_(n))/i;return[e*I_(t*=...
  function ao (line 3) | function ao(t){var n=t.length;return{point:function(e,r){for(var i=-1;++...
  function co (line 3) | function co(t){return function(n,e){var r=q_(n),i=q_(e),o=t(r*i);return[...
  function so (line 3) | function so(t){return function(n,e){var r=B_(n*n+e*e),i=t(r),o=I_(i),u=q...
  function fo (line 3) | function fo(t,n){return[t,O_(H_((S_+n)/2))]}
  function lo (line 3) | function lo(t){function n(){var n=N_*a(),u=o(vy(o.rotate()).invert([0,0]...
  function ho (line 3) | function ho(t){return H_((S_+t)/2)}
  function po (line 3) | function po(t,n){function e(t,n){o>0?n<-S_+k_&&(n=-S_+k_):n>S_-k_&&(n=S_...
  function vo (line 3) | function vo(t,n){return[t,n]}
  function _o (line 3) | function _o(t,n){function e(t,n){var e=o-n,r=i*t;return[e*I_(r),o-e*q_(r...
  function yo (line 3) | function yo(t,n){var e=q_(n),r=q_(t)*e;return[e*I_(t)/r,I_(n)/r]}
  function go (line 3) | function go(t,n,e,r){return 1===t&&1===n&&0===e&&0===r?Uy:Gi({point:func...
  function mo (line 3) | function mo(t,n){return[q_(n)*I_(t),I_(n)]}
  function xo (line 3) | function xo(t,n){var e=q_(n),r=1+q_(t)*e;return[e*I_(t)/r,I_(n)/r]}
  function bo (line 3) | function bo(t,n){return[O_(H_((S_+n)/2)),-t]}
  function wo (line 3) | function wo(t,n){return t.parent===n.parent?1:2}
  function Mo (line 3) | function Mo(t){return t.reduce(To,0)/t.length}
  function To (line 3) | function To(t,n){return t+n.x}
  function ko (line 3) | function ko(t){return 1+t.reduce(No,0)}
  function No (line 3) | function No(t,n){return Math.max(t,n.y)}
  function So (line 3) | function So(t){for(var n;n=t.children;)t=n[0];return t}
  function Eo (line 3) | function Eo(t){for(var n;n=t.children;)t=n[n.length-1];return t}
  function Ao (line 3) | function Ao(t){var n=0,e=t.children,r=e&&e.length;if(r)for(;--r>=0;)n+=e...
  function Co (line 3) | function Co(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i...
  function zo (line 3) | function zo(t,n){var e,r,i,o,u,a=new Uo(t),c=+t.value&&(a.value=t.value)...
  function Po (line 3) | function Po(){return zo(this).eachBefore(Ro)}
  function Lo (line 3) | function Lo(t){return t.children}
  function Ro (line 3) | function Ro(t){t.data=t.data.data}
  function qo (line 3) | function qo(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}
  function Uo (line 3) | function Uo(t){this.data=t,this.depth=this.height=0,this.parent=null}
  function Do (line 3) | function Do(t){this._=t,this.next=null}
  function Oo (line 3) | function Oo(t,n){var e=n.x-t.x,r=n.y-t.y,i=t.r-n.r;return i*i+1e-6>e*e+r*r}
  function Fo (line 3) | function Fo(t,n){var e,r,i,o=null,u=t.head;switch(n.length){case 1:e=Io(...
  function Io (line 3) | function Io(t){return{x:t.x,y:t.y,r:t.r}}
  function Yo (line 3) | function Yo(t,n){var e=t.x,r=t.y,i=t.r,o=n.x,u=n.y,a=n.r,c=o-e,s=u-r,f=a...
  function Bo (line 3) | function Bo(t,n,e){var r=t.x,i=t.y,o=t.r,u=n.x,a=n.y,c=n.r,s=e.x,f=e.y,l...
  function Ho (line 3) | function Ho(t,n,e){var r=t.x,i=t.y,o=n.r+e.r,u=t.r+e.r,a=n.x-r,c=n.y-i,s...
  function jo (line 3) | function jo(t,n){var e=n.x-t.x,r=n.y-t.y,i=t.r+n.r;return i*i-1e-6>e*e+r*r}
  function Xo (line 3) | function Xo(t,n,e){var r=t._,i=t.next._,o=r.r+i.r,u=(r.x*i.r+i.x*r.r)/o-...
  function $o (line 3) | function $o(t){this._=t,this.next=null,this.previous=null}
  function Vo (line 3) | function Vo(t){if(!(i=t.length))return 0;var n,e,r,i;if(n=t[0],n.x=0,n.y...
  function Wo (line 3) | function Wo(t){return null==t?null:Zo(t)}
  function Zo (line 3) | function Zo(t){if("function"!=typeof t)throw new Error;return t}
  function Go (line 3) | function Go(){return 0}
  function Jo (line 3) | function Jo(t){return Math.sqrt(t.value)}
  function Qo (line 3) | function Qo(t){return function(n){n.children||(n.r=Math.max(0,+t(n)||0))}}
  function Ko (line 3) | function Ko(t,n){return function(e){if(r=e.children){var r,i,o,u=r.lengt...
  function tu (line 3) | function tu(t){return function(n){var e=n.parent;n.r*=t,e&&(n.x=e.x+t*n....
  function nu (line 3) | function nu(t){return t.id}
  function eu (line 3) | function eu(t){return t.parentId}
  function ru (line 3) | function ru(t,n){return t.parent===n.parent?1:2}
  function iu (line 3) | function iu(t){var n=t.children;return n?n[0]:t.t}
  function ou (line 3) | function ou(t){var n=t.children;return n?n[n.length-1]:t.t}
  function uu (line 3) | function uu(t,n,e){var r=e/(n.i-t.i);n.c-=r,n.s+=e,t.c+=r,n.z+=e,n.m+=e}
  function au (line 3) | function au(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)n=i[o],...
  function cu (line 3) | function cu(t,n,e){return t.a.parent===n.parent?t.a:e}
  function su (line 3) | function su(t,n){this._=t,this.parent=null,this.children=null,this.A=nul...
  function fu (line 3) | function fu(t){for(var n,e,r,i,o,u=new su(t,0),a=[u];n=a.pop();)if(r=n._...
  function lu (line 3) | function lu(t,n,e,r,i,o){for(var u,a,c,s,f,l,h,p,d,v,_,y=[],g=n.children...
  function hu (line 3) | function hu(t,n){return t[0]-n[0]||t[1]-n[1]}
  function pu (line 3) | function pu(t){for(var n=t.length,e=[0,1],r=2,i=2;i<n;++i){for(;r>1&&pm(...
  function du (line 3) | function du(t){this._size=t,this._call=this._error=null,this._tasks=[],t...
  function vu (line 3) | function vu(t){if(!t._start)try{_u(t)}catch(n){if(t._tasks[t._ended+t._a...
  function _u (line 3) | function _u(t){for(;t._start=t._waiting&&t._active<t._size;){var n=t._en...
  function yu (line 3) | function yu(t,n){return function(e,r){t._tasks[n]&&(--t._active,++t._end...
  function gu (line 3) | function gu(t,n){var e,r=t._tasks.length;for(t._error=n,t._data=void 0,t...
  function mu (line 3) | function mu(t){if(!t._active&&t._call){var n=t._data;t._data=void 0,t._c...
  function xu (line 3) | function xu(t){if(null==t)t=1/0;else if(!((t=+t)>=1))throw new Error("in...
  function bu (line 3) | function bu(t){return function(n,e){t(null==n?e:null)}}
  function wu (line 3) | function wu(t){var n=t.responseType;return n&&"text"!==n?t.response:t.re...
  function Mu (line 3) | function Mu(t,n){return function(e){return t(e.responseText,n)}}
  function Tu (line 3) | function Tu(t){function n(n){var o=n+"",u=e.get(o);if(!u){if(i!==Om)retu...
  function ku (line 3) | function ku(){function t(){var t=i().length,r=u[1]<u[0],l=u[r-0],h=u[1-r...
  function Nu (line 3) | function Nu(t){var n=t.copy;return t.padding=t.paddingOuter,delete t.pad...
  function Su (line 3) | function Su(){return Nu(ku().paddingInner(1))}
  function Eu (line 3) | function Eu(t,n){return(n-=t=+t)?function(e){return(e-t)/n}:Fm(n)}
  function Au (line 3) | function Au(t){return function(n,e){var r=t(n=+n,e=+e);return function(t...
  function Cu (line 3) | function Cu(t){return function(n,e){var r=t(n=+n,e=+e);return function(t...
  function zu (line 3) | function zu(t,n,e,r){var i=t[0],o=t[1],u=n[0],a=n[1];return o<i?(i=e(o,i...
  function Pu (line 3) | function Pu(t,n,e,r){var i=Math.min(t.length,n.length)-1,o=new Array(i),...
  function Lu (line 3) | function Lu(t,n){return n.domain(t.domain()).range(t.range()).interpolat...
  function Ru (line 3) | function Ru(t,n){function e(){return i=Math.min(a.length,c.length)>2?Pu:...
  function qu (line 3) | function qu(t){var n=t.domain;return t.ticks=function(t){var e=n();retur...
  function Uu (line 3) | function Uu(){var t=Ru(Eu,Ch);return t.copy=function(){return Lu(t,Uu())...
  function Du (line 3) | function Du(){function t(t){return+t}var n=[0,1];return t.invert=t,t.dom...
  function Ou (line 3) | function Ou(t,n){return(n=Math.log(n/t))?function(e){return Math.log(e/t...
  function Fu (line 3) | function Fu(t,n){return t<0?function(e){return-Math.pow(-n,e)*Math.pow(-...
  function Iu (line 3) | function Iu(t){return isFinite(t)?+("1e"+t):t<0?0:t}
  function Yu (line 3) | function Yu(t){return 10===t?Iu:t===Math.E?Math.exp:function(n){return M...
  function Bu (line 3) | function Bu(t){return t===Math.E?Math.log:10===t&&Math.log10||2===t&&Mat...
  function Hu (line 3) | function Hu(t){return function(n){return-t(-n)}}
  function ju (line 3) | function ju(){function n(){return o=Bu(i),u=Yu(i),r()[0]<0&&(o=Hu(o),u=H...
  function Xu (line 3) | function Xu(t,n){return t<0?-Math.pow(-t,n):Math.pow(t,n)}
  function $u (line 3) | function $u(){function t(t,n){return(n=Xu(n,e)-(t=Xu(t,e)))?function(r){...
  function Vu (line 3) | function Vu(){return $u().exponent(.5)}
  function Wu (line 3) | function Wu(){function t(){var t=0,o=Math.max(1,r.length);for(i=new Arra...
  function Zu (line 3) | function Zu(){function t(t){if(t<=t)return u[Vs(o,t,0,i)]}function n(){v...
  function Gu (line 3) | function Gu(){function t(t){if(t<=t)return e[Vs(n,t,0,r)]}var n=[.5],e=[...
  function Ju (line 3) | function Ju(t,n,e,r){function i(n){return t(n=new Date(+n)),n}return i.f...
  function Qu (line 3) | function Qu(t){return Ju(function(n){n.setDate(n.getDate()-(n.getDay()+7...
  function Ku (line 3) | function Ku(t){return Ju(function(n){n.setUTCDate(n.getUTCDate()-(n.getU...
  function ta (line 3) | function ta(t){if(0<=t.y&&t.y<100){var n=new Date(-1,t.m,t.d,t.H,t.M,t.S...
  function na (line 3) | function na(t){if(0<=t.y&&t.y<100){var n=new Date(Date.UTC(-1,t.m,t.d,t....
  function ea (line 3) | function ea(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}
  function ra (line 3) | function ra(t){function n(t,n){return function(e){var r,i,o,u=[],a=-1,c=...
  function ia (line 4) | function ia(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o...
  function oa (line 4) | function oa(t){return t.replace(Gx,"\\$&")}
  function ua (line 4) | function ua(t){return new RegExp("^(?:"+t.map(oa).join("|")+")","i")}
  function aa (line 4) | function aa(t){for(var n={},e=-1,r=t.length;++e<r;)n[t[e].toLowerCase()]...
  function ca (line 4) | function ca(t,n,e){var r=Wx.exec(n.slice(e,e+1));return r?(t.w=+r[0],e+r...
  function sa (line 4) | function sa(t,n,e){var r=Wx.exec(n.slice(e));return r?(t.U=+r[0],e+r[0]....
  function fa (line 4) | function fa(t,n,e){var r=Wx.exec(n.slice(e));return r?(t.W=+r[0],e+r[0]....
  function la (line 4) | function la(t,n,e){var r=Wx.exec(n.slice(e,e+4));return r?(t.y=+r[0],e+r...
  function ha (line 4) | function ha(t,n,e){var r=Wx.exec(n.slice(e,e+2));return r?(t.y=+r[0]+(+r...
  function pa (line 4) | function pa(t,n,e){var r=/^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(n.slice(e,...
  function da (line 4) | function da(t,n,e){var r=Wx.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+...
  function va (line 4) | function va(t,n,e){var r=Wx.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r...
  function _a (line 4) | function _a(t,n,e){var r=Wx.exec(n.slice(e,e+3));return r?(t.m=0,t.d=+r[...
  function ya (line 4) | function ya(t,n,e){var r=Wx.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r...
  function ga (line 4) | function ga(t,n,e){var r=Wx.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r...
  function ma (line 4) | function ma(t,n,e){var r=Wx.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r...
  function xa (line 4) | function xa(t,n,e){var r=Wx.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r...
  function ba (line 4) | function ba(t,n,e){var r=Zx.exec(n.slice(e,e+1));return r?e+r[0].length:-1}
  function wa (line 4) | function wa(t,n){return ia(t.getDate(),n,2)}
  function Ma (line 4) | function Ma(t,n){return ia(t.getHours(),n,2)}
  function Ta (line 4) | function Ta(t,n){return ia(t.getHours()%12||12,n,2)}
  function ka (line 4) | function ka(t,n){return ia(1+ex.count(xx(t),t),n,3)}
  function Na (line 4) | function Na(t,n){return ia(t.getMilliseconds(),n,3)}
  function Sa (line 4) | function Sa(t,n){return ia(t.getMonth()+1,n,2)}
  function Ea (line 4) | function Ea(t,n){return ia(t.getMinutes(),n,2)}
  function Aa (line 4) | function Aa(t,n){return ia(t.getSeconds(),n,2)}
  function Ca (line 4) | function Ca(t,n){return ia(ix.count(xx(t),t),n,2)}
  function za (line 4) | function za(t){return t.getDay()}
  function Pa (line 4) | function Pa(t,n){return ia(ox.count(xx(t),t),n,2)}
  function La (line 4) | function La(t,n){return ia(t.getFullYear()%100,n,2)}
  function Ra (line 4) | function Ra(t,n){return ia(t.getFullYear()%1e4,n,4)}
  function qa (line 4) | function qa(t){var n=t.getTimezoneOffset();return(n>0?"-":(n*=-1,"+"))+i...
  function Ua (line 4) | function Ua(t,n){return ia(t.getUTCDate(),n,2)}
  function Da (line 4) | function Da(t,n){return ia(t.getUTCHours(),n,2)}
  function Oa (line 4) | function Oa(t,n){return ia(t.getUTCHours()%12||12,n,2)}
  function Fa (line 4) | function Fa(t,n){return ia(1+Nx.count(jx(t),t),n,3)}
  function Ia (line 4) | function Ia(t,n){return ia(t.getUTCMilliseconds(),n,3)}
  function Ya (line 4) | function Ya(t,n){return ia(t.getUTCMonth()+1,n,2)}
  function Ba (line 4) | function Ba(t,n){return ia(t.getUTCMinutes(),n,2)}
  function Ha (line 4) | function Ha(t,n){return ia(t.getUTCSeconds(),n,2)}
  function ja (line 4) | function ja(t,n){return ia(Ex.count(jx(t),t),n,2)}
  function Xa (line 4) | function Xa(t){return t.getUTCDay()}
  function $a (line 4) | function $a(t,n){return ia(Ax.count(jx(t),t),n,2)}
  function Va (line 4) | function Va(t,n){return ia(t.getUTCFullYear()%100,n,2)}
  function Wa (line 4) | function Wa(t,n){return ia(t.getUTCFullYear()%1e4,n,4)}
  function Za (line 4) | function Za(){return"+0000"}
  function Ga (line 4) | function Ga(){return"%"}
  function Ja (line 4) | function Ja(n){return Xx=ra(n),t.timeFormat=Xx.format,t.timeParse=Xx.par...
  function Qa (line 4) | function Qa(t){return t.toISOString()}
  function Ka (line 4) | function Ka(t){var n=new Date(t);return isNaN(n)?null:n}
  function tc (line 4) | function tc(t){return new Date(t)}
  function nc (line 4) | function nc(t){return t instanceof Date?+t:+new Date(+t)}
  function ec (line 4) | function ec(t,n,e,r,o,u,a,c,s){function f(i){return(a(i)<i?v:u(i)<i?_:o(...
  function rc (line 4) | function rc(t){var n=t.length;return function(e){return t[Math.max(0,Mat...
  function ic (line 4) | function ic(t){function n(n){var o=(n-e)/(r-e);return t(i?Math.max(0,Mat...
  function oc (line 4) | function oc(t){return t>1?0:t<-1?zb:Math.acos(t)}
  function uc (line 4) | function uc(t){return t>=1?Pb:t<=-1?-Pb:Math.asin(t)}
  function ac (line 4) | function ac(t){return t.innerRadius}
  function cc (line 4) | function cc(t){return t.outerRadius}
  function sc (line 4) | function sc(t){return t.startAngle}
  function fc (line 4) | function fc(t){return t.endAngle}
  function lc (line 4) | function lc(t){return t&&t.padAngle}
  function hc (line 4) | function hc(t,n,e,r,i,o,u,a){var c=e-t,s=r-n,f=u-i,l=a-o,h=(f*(n-o)-l*(t...
  function pc (line 4) | function pc(t,n,e,r,i,o,u){var a=t-e,c=n-r,s=(u?o:-o)/Ab(a*a+c*c),f=s*c,...
  function dc (line 4) | function dc(t){this._context=t}
  function vc (line 4) | function vc(t){return t[0]}
  function _c (line 4) | function _c(t){return t[1]}
  function yc (line 4) | function yc(t){this._curve=t}
  function gc (line 4) | function gc(t){function n(n){return new yc(t(n))}return n._curve=t,n}
  function mc (line 4) | function mc(t){var n=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,...
  function xc (line 4) | function xc(t){return t.source}
  function bc (line 4) | function bc(t){return t.target}
  function wc (line 4) | function wc(t){function n(){var n,a=jb.call(arguments),c=e.apply(this,a)...
  function Mc (line 4) | function Mc(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n=(n+r)/2,e,n,i,r,i)}
  function Tc (line 4) | function Tc(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n,e=(e+i)/2,r,e,r,i)}
  function kc (line 4) | function kc(t,n,e,r,i){var o=Xb(n,e),u=Xb(n,e=(e+i)/2),a=Xb(r,e),c=Xb(r,...
  function Nc (line 4) | function Nc(){return wc(Mc)}
  function Sc (line 4) | function Sc(){return wc(Tc)}
  function Ec (line 4) | function Ec(){var t=wc(kc);return t.angle=t.x,delete t.x,t.radius=t.y,de...
  function Ac (line 4) | function Ac(t,n,e){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t...
  function Cc (line 4) | function Cc(t){this._context=t}
  function zc (line 4) | function zc(t){this._context=t}
  function Pc (line 4) | function Pc(t){this._context=t}
  function Lc (line 4) | function Lc(t,n){this._basis=new Cc(t),this._beta=n}
  function Rc (line 4) | function Rc(t,n,e){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._...
  function qc (line 4) | function qc(t,n){this._context=t,this._k=(1-n)/6}
  function Uc (line 4) | function Uc(t,n){this._context=t,this._k=(1-n)/6}
  function Dc (line 4) | function Dc(t,n){this._context=t,this._k=(1-n)/6}
  function Oc (line 4) | function Oc(t,n,e){var r=t._x1,i=t._y1,o=t._x2,u=t._y2;if(t._l01_a>Cb){v...
  function Fc (line 4) | function Fc(t,n){this._context=t,this._alpha=n}
  function Ic (line 4) | function Ic(t,n){this._context=t,this._alpha=n}
  function Yc (line 4) | function Yc(t,n){this._context=t,this._alpha=n}
  function Bc (line 4) | function Bc(t){this._context=t}
  function Hc (line 4) | function Hc(t){return t<0?-1:1}
  function jc (line 4) | function jc(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&...
  function Xc (line 4) | function Xc(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}
  function $c (line 4) | function $c(t,n,e){var r=t._x0,i=t._y0,o=t._x1,u=t._y1,a=(o-r)/3;t._cont...
  function Vc (line 4) | function Vc(t){this._context=t}
  function Wc (line 4) | function Wc(t){this._context=new Zc(t)}
  function Zc (line 4) | function Zc(t){this._context=t}
  function Gc (line 4) | function Gc(t){return new Vc(t)}
  function Jc (line 4) | function Jc(t){return new Wc(t)}
  function Qc (line 4) | function Qc(t){this._context=t}
  function Kc (line 4) | function Kc(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),u=new ...
  function ts (line 4) | function ts(t,n){this._context=t,this._t=n}
  function ns (line 4) | function ns(t){return new ts(t,0)}
  function es (line 4) | function es(t){return new ts(t,1)}
  function rs (line 4) | function rs(t,n){return t[n]}
  function is (line 4) | function is(t){for(var n,e=0,r=-1,i=t.length;++r<i;)(n=+t[r][1])&&(e+=n)...
  function os (line 4) | function os(t){return t[0]}
  function us (line 4) | function us(t){return t[1]}
  function as (line 4) | function as(){this._=null}
  function cs (line 4) | function cs(t){t.U=t.C=t.L=t.R=t.P=t.N=null}
  function ss (line 4) | function ss(t,n){var e=n,r=n.R,i=e.U;i?i.L===e?i.L=r:i.R=r:t._=r,r.U=i,e...
  function fs (line 4) | function fs(t,n){var e=n,r=n.L,i=e.U;i?i.L===e?i.L=r:i.R=r:t._=r,r.U=i,e...
  function ls (line 4) | function ls(t){for(;t.L;)t=t.L;return t}
  function hs (line 4) | function hs(t,n,e,r){var i=[null,null],o=Yw.push(i)-1;return i.left=t,i....
  function ps (line 4) | function ps(t,n,e){var r=[n,e];return r.left=t,r}
  function ds (line 4) | function ds(t,n,e,r){t[0]||t[1]?t.left===e?t[1]=r:t[0]=r:(t[0]=r,t.left=...
  function vs (line 4) | function vs(t,n,e,r,i){var o,u=t[0],a=t[1],c=u[0],s=u[1],f=a[0],l=a[1],h...
  function _s (line 4) | function _s(t,n,e,r,i){var o=t[1];if(o)return!0;var u,a,c=t[0],s=t.left,...
  function ys (line 4) | function ys(t,n,e,r){for(var i,o=Yw.length;o--;)_s(i=Yw[o],t,n,e,r)&&vs(...
  function gs (line 4) | function gs(t){return Fw[t.index]={site:t,halfedges:[]}}
  function ms (line 4) | function ms(t,n){var e=t.site,r=n.left,i=n.right;return e===i&&(i=r,r=e)...
  function xs (line 4) | function xs(t,n){return n[+(n.left!==t.site)]}
  function bs (line 4) | function bs(t,n){return n[+(n.left===t.site)]}
  function ws (line 4) | function ws(){for(var t,n,e,r,i=0,o=Fw.length;i<o;++i)if((t=Fw[i])&&(r=(...
  function Ms (line 4) | function Ms(t,n,e,r){var i,o,u,a,c,s,f,l,h,p,d,v,_=Fw.length,y=!0;for(i=...
  function Ts (line 4) | function Ts(){cs(this),this.x=this.y=this.arc=this.site=this.cy=null}
  function ks (line 4) | function ks(t){var n=t.P,e=t.N;if(n&&e){var r=n.site,i=t.site,o=e.site;i...
  function Ns (line 4) | function Ns(t){var n=t.circle;n&&(n.P||(Dw=n.N),Iw.remove(n),Bw.push(n),...
  function Ss (line 4) | function Ss(){cs(this),this.edge=this.site=this.circle=null}
  function Es (line 4) | function Es(t){var n=Hw.pop()||new Ss;return n.site=t,n}
  function As (line 4) | function As(t){Ns(t),Ow.remove(t),Hw.push(t),cs(t)}
  function Cs (line 4) | function Cs(t){var n=t.circle,e=n.x,r=n.cy,i=[e,r],o=t.P,u=t.N,a=[t];As(...
  function zs (line 4) | function zs(t){for(var n,e,r,i,o=t[0],u=t[1],a=Ow._;a;)if((r=Ps(a,u)-o)>...
  function Ps (line 4) | function Ps(t,n){var e=t.site,r=e[0],i=e[1],o=i-n;if(!o)return r;var u=t...
  function Ls (line 4) | function Ls(t,n){var e=t.N;if(e)return Ps(e,n);var r=t.site;return r[1]=...
  function Rs (line 4) | function Rs(t,n,e){return(t[0]-e[0])*(n[1]-t[1])-(t[0]-n[0])*(e[1]-t[1])}
  function qs (line 4) | function qs(t,n){return n[1]-t[1]||n[0]-t[0]}
  function Us (line 4) | function Us(t,n){var e,r,i,o=t.sort(qs).pop();for(Yw=[],Fw=new Array(t.l...
  function Ds (line 4) | function Ds(t,n,e){this.target=t,this.type=n,this.transform=e}
  function Os (line 4) | function Os(t,n,e){this.k=t,this.x=n,this.y=e}
  function Fs (line 4) | function Fs(t){return t.__zoom||Ww}
  function Is (line 4) | function Is(){t.event.stopImmediatePropagation()}
  function Ys (line 4) | function Ys(){return!t.event.button}
  function Bs (line 4) | function Bs(){var t,n,e=this;return e instanceof SVGElement?(e=e.ownerSV...
  function Hs (line 4) | function Hs(){return this.__zoom||Ww}
  function t (line 4) | function t(t){var o,u,a=t.length,c=new Array(a);for(o=0;o<a;++o)c[o]=n(t...
  function n (line 4) | function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}
  function n (line 5) | function n(t){t.on("mousedown.drag",e).on("touchstart.drag",o).on("touch...
  function e (line 5) | function e(){if(!h&&p.apply(this,arguments)){var n=c("mouse",d.apply(thi...
  function r (line 5) | function r(){if(Ul(),!l){var n=t.event.clientX-s,e=t.event.clientY-f;l=n...
  function i (line 5) | function i(){Pl(t.event.view).on("mousemove.drag mouseup.drag",null),mt(...
  function o (line 5) | function o(){if(p.apply(this,arguments)){var n,e,r=t.event.changedTouche...
  function u (line 5) | function u(){var n,e,r=t.event.changedTouches,i=r.length;for(n=0;n<i;++n...
  function a (line 5) | function a(){var n,e,r=t.event.changedTouches,i=r.length;for(h&&clearTim...
  function c (line 5) | function c(e,r,i,o,u){var a,c,s,f=i(r,e),l=g.copy();if(A(new xt(n,"befor...
  function e (line 5) | function e(t,n){var e=r((t=Ct(t)).r,(n=Ct(n)).r),i=r(t.g,n.g),o=r(t.b,n....
  function e (line 5) | function e(t){return Math.pow(t,n)}
  function e (line 5) | function e(t){return 1-Math.pow(1-t,n)}
  function e (line 5) | function e(t){return((t*=2)<=1?Math.pow(t,n):2-Math.pow(2-t,n))/2}
  function e (line 5) | function e(t){return t*t*((n+1)*t-n)}
  function e (line 5) | function e(t){return--t*t*((n+1)*t+n)+1}
  function e (line 5) | function e(t){return((t*=2)<1?t*t*((n+1)*t-n):(t-=2)*t*((n+1)*t+n)+2)/2}
  function r (line 5) | function r(t){return n*Math.pow(2,10*--t)*Math.sin((i-t)/e)}
  function r (line 5) | function r(t){return 1-n*Math.pow(2,-10*(t=+t))*Math.sin((t+i)/e)}
  function r (line 5) | function r(t){return((t=2*t-1)<0?n*Math.pow(2,10*t)*Math.sin((i-t)/e):2-...
  function t (line 5) | function t(t){var o,u,a,c,s,f,l=t.length,h=[],p=cf(l),d=[],v=[],_=v.grou...
  function t (line 5) | function t(){var t,a=Ud.call(arguments),c=n.apply(this,a),s=e.apply(this...
  function t (line 5) | function t(n,i,u,a){if(i>=o.length)return null!=r?r(n):null!=e?n.sort(e)...
  function n (line 5) | function n(t,e){if(++e>o.length)return t;var i,a=u[e-1];return null!=r&&...
  function n (line 5) | function n(t,n){var r,i,o=e(t,function(t,e){if(r)return r(t,e-1);i=t,r=n...
  function e (line 5) | function e(t,n){function e(){if(f>=s)return u;if(i)return i=!1,o;var n,e...
  function r (line 5) | function r(n,e){return null==e&&(e=Qe(n)),[e.map(u).join(t)].concat(n.ma...
  function i (line 5) | function i(t){return t.map(o).join("\n")}
  function o (line 5) | function o(n){return n.map(u).join(t)}
  function u (line 5) | function u(t){return null==t?"":a.test(t+="")?'"'+t.replace(/\"/g,'""')+...
  function e (line 5) | function e(){var e,i,o=r.length,u=0,a=0;for(e=0;e<o;++e)i=r[e],u+=i.x,a+...
  function n (line 5) | function n(){function t(t,n,e,r,i){var o=t.data,a=t.r,p=l+a;{if(!o)retur...
  function e (line 5) | function e(t){if(t.data)return t.r=o[t.data.index];for(var n=t.r=0;n<4;+...
  function r (line 5) | function r(){if(i){var n,e,r=i.length;for(o=new Array(r),n=0;n<r;++n)e=i...
  function n (line 6) | function n(t){return 1/Math.min(s[t.source.index],s[t.target.index])}
  function e (line 6) | function e(n){for(var e=0,r=t.length;e<d;++e)for(var i,o,c,s,l,h,p,v=0;v...
  function r (line 6) | function r(){if(c){var n,e,r=c.length,h=t.length,p=He(c,l);for(n=0,s=new...
  function i (line 6) | function i(){if(c)for(var n=0,e=t.length;n<e;++n)u[n]=+h(t[n],n,t)}
  function o (line 6) | function o(){if(c)for(var n=0,e=t.length;n<e;++n)a[n]=+p(t[n],n,t)}
  function n (line 6) | function n(){e(),p.call("tick",o),u<a&&(h.stop(),p.call("end",o))}
  function e (line 6) | function e(){var n,e,r=t.length;for(u+=(s-u)*c,l.each(function(t){t(u)})...
  function r (line 6) | function r(){for(var n,e=0,r=t.length;e<r;++e){if(n=t[e],n.index=e,isNaN...
  function i (line 6) | function i(n){return n.initialize&&n.initialize(t),n}
  function t (line 6) | function t(t){var n,a=i.length,c=ir(i,lr,hr).visitAfter(e);for(u=t,n=0;n...
  function n (line 6) | function n(){if(i){var t,n,e=i.length;for(a=new Array(e),t=0;t<e;++t)n=i...
  function e (line 6) | function e(t){var n,e,r,i,o,u=0;if(t.length){for(r=i=o=0;o<4;++o)(n=t[o]...
  function r (line 6) | function r(t,n,e,r){if(!t.value)return!0;var i=t.x-o.x,c=t.y-o.y,h=r-n,p...
  function n (line 6) | function n(t){for(var n,e=0,u=r.length;e<u;++e)n=r[e],n.vx+=(o[e]-n.x)*i...
  function e (line 6) | function e(){if(r){var n,e=r.length;for(i=new Array(e),o=new Array(e),n=...
  function n (line 6) | function n(t){for(var n,e=0,u=r.length;e<u;++e)n=r[e],n.vy+=(o[e]-n.y)*i...
  function e (line 6) | function e(){if(r){var n,e=r.length;for(i=new Array(e),o=new Array(e),n=...
  function n (line 6) | function n(t){function n(t){var n,i,a,f=_,x=y;if("c"===v)x=g(t)+x,t="";e...
  function e (line 6) | function e(t,e){var r=n((t=pr(t),t.type="f",t)),i=3*Math.max(-8,Math.min...
  function e (line 6) | function e(e,r){return e=t(e,r),n(e[0],e[1])}
  function n (line 6) | function n(n){return n=t(n[0]*z_,n[1]*z_),n[0]*=C_,n[1]*=C_,n}
  function t (line 6) | function t(t,n){e.push(t=r(t,n)),t[0]*=C_,t[1]*=C_}
  function n (line 6) | function n(){var t=i.apply(this,arguments),n=o.apply(this,arguments)*z_,...
  function e (line 6) | function e(t){return t&&("function"==typeof o&&i.pointRadius(+o.apply(th...
  function u (line 6) | function u(n,e){var r=i(n,e);t(n=r[0],e=r[1])&&o.point(n,e)}
  function a (line 6) | function a(t,n){var e=i(t,n);_.point(e[0],e[1])}
  function c (line 6) | function c(){b.point=a,_.lineStart()}
  function s (line 6) | function s(){b.point=u,_.lineEnd()}
  function f (line 6) | function f(t,n){v.push([t,n]);var e=i(t,n);m.point(e[0],e[1])}
  function l (line 6) | function l(){m.lineStart(),v=[]}
  function h (line 6) | function h(){f(v[0][0],v[0][1]),m.lineEnd();var t,n,e,r,i=m.clean(),u=g....
  function e (line 6) | function e(e,r,i,o){ai(o,t,n,i,e,r)}
  function r (line 6) | function r(t,n){return q_(t)*q_(n)>a}
  function i (line 6) | function i(t){var n,e,i,a,f;return{lineStart:function(){a=i=!1,f=1},poin...
  function o (line 6) | function o(t,n,e){var r=Cr(t),i=Cr(n),o=[1,0,0],u=Pr(r,i),c=zr(u,u),s=u[...
  function u (line 6) | function u(n,e){var r=c?t:N_-t,i=0;return n<-r?i|=1:n>r&&(i|=2),e<-r?i|=...
  function t (line 6) | function t(t){var n=t[0],e=t[1];return a=null,i.point(n,e),a||(o.point(n...
  function n (line 6) | function n(){return e=r=null,t}
  function t (line 6) | function t(){return i=o=null,u}
  function t (line 6) | function t(t){var o,u=0;t.eachAfter(function(t){var e=t.children;e?(t.x=...
  function t (line 6) | function t(t){return t.x=e/2,t.y=r/2,n?t.eachBefore(Qo(n)).eachAfter(Ko(...
  function t (line 6) | function t(t){var u=t.height+1;return t.x0=t.y0=i,t.x1=e,t.y1=r/u,t.each...
  function n (line 6) | function n(t,n){return function(e){e.children&&Jg(e,e.x0,t*(e.depth+1)/n...
  function t (line 6) | function t(t){var r,i,o,u,a,c,s,f=t.length,l=new Array(f),h={};for(i=0;i...
  function t (line 6) | function t(t){var r=fu(t);if(r.eachAfter(n),r.parent.m=-r.z,r.eachBefore...
  function n (line 6) | function n(t){var n=t.children,e=t.parent.children,i=t.i?e[t.i-1]:null;i...
  function e (line 6) | function e(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}
  function r (line 6) | function r(t,n,e){if(n){for(var r,i=t,u=t,a=n,c=i.parent.children[0],s=i...
  function i (line 6) | function i(t){t.x*=u,t.y=t.depth*a}
  function e (line 6) | function e(t,e,r,i,o){lu(n,t,e,r,i,o)}
  function t (line 6) | function t(t){return t.x0=t.y0=0,t.x1=i,t.y1=o,t.eachBefore(n),u=[0],r&&...
  function n (line 6) | function n(t){var n=u[t.depth],r=t.x0+n,i=t.y0+n,o=t.x1-n,h=t.y1-n;o<r&&...
  function o (line 7) | function o(t,n,e,r,i,u,a){if(t>=n-1){var s=c[t];return s.x0=r,s.y0=i,s.x...
  function e (line 7) | function e(t,e,r,i,o){if((u=t._squarify)&&u.ratio===n)for(var u,a,c,s,f,...
  function e (line 7) | function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,1===arguments.lengt...
  function e (line 7) | function e(t,e){var r,i;return t=null==t?0:+t,e=null==e?1:+e,function(){...
  function e (line 7) | function e(){var t=bm.source(n).apply(this,arguments);return function(){...
  function e (line 7) | function e(t){return function(){for(var e=0,r=0;r<t;++r)e+=n();return e}}
  function e (line 7) | function e(t){var e=Mm.source(n)(t);return function(){return e()/t}}
  function e (line 7) | function e(t){return function(){return-Math.log(1-n())/t}}
  function e (line 7) | function e(t){var n,e=s.status;if(!e&&wu(s)||e>=200&&e<300||304===e){if(...
  function t (line 7) | function t(){var t,s,f=+n.apply(this,arguments),l=+e.apply(this,argument...
  function t (line 7) | function t(t){var a,c,s,f=t.length,l=!1;for(null==i&&(u=o(s=Ue())),a=0;a...
  function t (line 7) | function t(t){var n,f,l,h,p,d=t.length,v=!1,_=new Array(d),y=new Array(d...
  function n (line 7) | function n(){return Ub().defined(u).curve(c).context(a)}
  function t (line 7) | function t(t){var a,c,s,f,l,h=t.length,p=0,d=new Array(h),v=new Array(h)...
  function t (line 7) | function t(){var t;if(r||(r=t=Ue()),n.apply(this,arguments).draw(r,+e.ap...
  function e (line 7) | function e(t){return 1===n?new Cc(t):new Lc(t,n)}
  function e (line 8) | function e(t){return new qc(t,n)}
  function e (line 8) | function e(t){return new Uc(t,n)}
  function e (line 8) | function e(t){return new Dc(t,n)}
  function e (line 8) | function e(t){return n?new Fc(t,n):new qc(t,0)}
  function e (line 8) | function e(t){return n?new Ic(t,n):new Uc(t,0)}
  function e (line 8) | function e(t){return n?new Yc(t,n):new Dc(t,0)}
  function t (line 8) | function t(t){var o,u,a=n.apply(this,arguments),c=t.length,s=a.length,f=...
  function t (line 8) | function t(t){return new Us(t.map(function(r,i){var o=[Math.round(n(r,i,...
  function n (line 8) | function n(t){t.on("wheel.zoom",s).on("mousedown.zoom",f).on("dblclick.z...
  function e (line 8) | function e(t,n){return n=Math.max(x,Math.min(b,n)),n===t.k?t:new Os(n,t....
  function r (line 8) | function r(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i=...
  function i (line 8) | function i(t,n){var e=t.invertX(n[0][0])-w,r=t.invertX(n[1][0])-M,i=t.in...
  function o (line 8) | function o(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}
  function u (line 8) | function u(t,n,e){t.on("start.zoom",function(){a(this,arguments).start()...
  function a (line 8) | function a(t,n){for(var e,r=0,i=E.length;r<i;++r)if((e=E[r]).that===t)re...
  function c (line 8) | function c(t,n){this.that=t,this.args=n,this.index=-1,this.active=0,this...
  function s (line 8) | function s(){function n(){o.wheel=null,o.end()}if(g.apply(this,arguments...
  function f (line 8) | function f(){function n(){if(Zw(),!o.moved){var n=t.event.clientX-s,e=t....
  function l (line 8) | function l(){if(g.apply(this,arguments)){var o=this.__zoom,a=Gf(this),c=...
  function h (line 8) | function h(){if(g.apply(this,arguments)){var n,e,r,i,o=a(this,arguments)...
  function p (line 8) | function p(){var n,o,u,c,s=a(this,arguments),f=t.event.changedTouches,l=...
  function d (line 8) | function d(){var n,e,r=a(this,arguments),i=t.event.changedTouches,o=i.le...

FILE: src/main/resources/static/dashboard/assets/plugins/gmaps/gmaps.js
  function parseColor (line 1837) | function parseColor(color, opacity) {

FILE: src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.static.js
  function parseColor (line 186) | function parseColor(color, opacity) {

FILE: src/main/resources/static/dashboard/html/js/jquery.slimscroll.js
  function o (line 1) | function o(t){if(h){var t=t||window.event,i=0;t.wheelDelta&&(i=-t.wheelD...
  function r (line 1) | function r(e,t,i){y=!1;var o=e,r=x.outerHeight()-R.outerHeight();if(t&&(...
  function a (line 1) | function a(e){window.addEventListener?(e.addEventListener("DOMMouseScrol...
  function l (line 1) | function l(){f=Math.max(x.outerHeight()/x[0].scrollHeight*x.outerHeight(...
  function n (line 1) | function n(){if(l(),clearTimeout(p),v==~~v){if(y=s.allowPageScroll,b!=v)...
  function c (line 1) | function c(){s.alwaysVisible||(p=setTimeout(function(){s.disableFadeOut&...

FILE: src/main/resources/static/dashboard/html/js/sidebarmenu.js
  function _interopRequireDefault (line 24) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 36) | function _classCallCheck(instance, Constructor) {
  function getSpecialTransitionEndEvent (line 52) | function getSpecialTransitionEndEvent() {
  function transitionEndTest (line 65) | function transitionEndTest() {
  function transitionEndEmulator (line 83) | function transitionEndEmulator(duration) {
  function setTransitionEndSupport (line 101) | function setTransitionEndSupport() {
  function MetisMenu (line 156) | function MetisMenu(element, config) {

FILE: src/main/resources/static/dashboard/html/js/waves.js
  function e (line 1) | function e(t){return null!==t&&t===t.window}
  function n (line 1) | function n(t){return e(t)?t:9===t.nodeType&&t.defaultView}
  function a (line 1) | function a(t){var e,a,i={top:0,left:0},o=t&&t.ownerDocument;return e=o.d...
  function i (line 1) | function i(t){var e="";for(var n in t)t.hasOwnProperty(n)&&(e+=n+":"+t[n...
  function o (line 1) | function o(t){if(d.allowEvent(t)===!1)return null;for(var e=null,n=t.tar...
  function r (line 1) | function r(e){var n=o(e);null!==n&&(c.show(e,n),"ontouchstart"in t&&(n.a...

FILE: src/main/resources/static/dashboard/html/scss/icons/themify-icons/ie7/ie7.js
  function addIcon (line 11) | function addIcon(el, entity) {

FILE: src/test/java/com/starterkit/springboot/brs/BusReservationSystemApplicationTests.java
  class BusReservationSystemApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test
Condensed preview — 336 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,826K chars).
[
  {
    "path": ".dockerignore",
    "chars": 155,
    "preview": "db/data\ntarget/classes\ntarget/generated-sources\ntarget/generated-test-sources\ntarget/maven-archiver\ntarget/maven-status\n"
  },
  {
    "path": ".gitignore",
    "chars": 320,
    "preview": "HELP.md\n/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n"
  },
  {
    "path": "Dockerfile",
    "chars": 579,
    "preview": "# our base build image\nFROM maven:3.6.0-jdk-8 as maven\n\n# copy the project files\nCOPY ./pom.xml ./pom.xml\n\n# build all d"
  },
  {
    "path": "LICENSE",
    "chars": 1073,
    "preview": "MIT License\n\nCopyright (c) 2020 Arpit Khandelwal\n\nPermission is hereby granted, free of charge, to any person obtaining "
  },
  {
    "path": "docker-compose.yml",
    "chars": 657,
    "preview": "version: '3.5'\nservices:\n  mysql:\n    image: mysql:latest\n    restart: always\n    container_name: \"mysql\"\n    volumes:\n "
  },
  {
    "path": "pom.xml",
    "chars": 3837,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "readme.md",
    "chars": 27105,
    "preview": "<h1 align=\"center\">\n  <br>\n  <a><img src=\"https://github.com/khandelwal-arpit/springboot-starterkit-mysql/blob/master/do"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/BusReservationSystemApplication.java",
    "chars": 6638,
    "preview": "package com.starterkit.springboot.brs;\n\nimport com.starterkit.springboot.brs.model.bus.*;\nimport com.starterkit.springbo"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/config/BrsConfiguration.java",
    "chars": 3226,
    "preview": "package com.starterkit.springboot.brs.config;\n\nimport org.modelmapper.ModelMapper;\nimport org.modelmapper.convention.Nam"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/config/FakeController.java",
    "chars": 1935,
    "preview": "package com.starterkit.springboot.brs.config;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport io.s"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/config/PageConfig.java",
    "chars": 1143,
    "preview": "package com.starterkit.springboot.brs.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.s"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/config/PropertiesConfig.java",
    "chars": 550,
    "preview": "package com.starterkit.springboot.brs.config;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/api/BusReservationController.java",
    "chars": 4985,
    "preview": "package com.starterkit.springboot.brs.controller.v1.api;\n\nimport com.starterkit.springboot.brs.controller.v1.request.Boo"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/api/UserController.java",
    "chars": 1948,
    "preview": "package com.starterkit.springboot.brs.controller.v1.api;\n\nimport com.starterkit.springboot.brs.controller.v1.request.Use"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/command/AdminSignupFormCommand.java",
    "chars": 790,
    "preview": "package com.starterkit.springboot.brs.controller.v1.command;\n\nimport lombok.Data;\nimport lombok.experimental.Accessors;\n"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/command/AgencyFormCommand.java",
    "chars": 461,
    "preview": "package com.starterkit.springboot.brs.controller.v1.command;\n\nimport lombok.Data;\nimport lombok.experimental.Accessors;\n"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/command/BusFormCommand.java",
    "chars": 572,
    "preview": "package com.starterkit.springboot.brs.controller.v1.command;\n\nimport lombok.Data;\nimport lombok.experimental.Accessors;\n"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/command/PasswordFormCommand.java",
    "chars": 417,
    "preview": "package com.starterkit.springboot.brs.controller.v1.command;\n\nimport lombok.Data;\nimport lombok.experimental.Accessors;\n"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/command/ProfileFormCommand.java",
    "chars": 511,
    "preview": "package com.starterkit.springboot.brs.controller.v1.command;\n\nimport lombok.Data;\nimport lombok.experimental.Accessors;\n"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/command/TripFormCommand.java",
    "chars": 543,
    "preview": "package com.starterkit.springboot.brs.controller.v1.command;\n\nimport lombok.Data;\nimport lombok.experimental.Accessors;\n"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/request/BookTicketRequest.java",
    "chars": 934,
    "preview": "package com.starterkit.springboot.brs.controller.v1.request;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/request/GetTripSchedulesRequest.java",
    "chars": 941,
    "preview": "package com.starterkit.springboot.brs.controller.v1.request;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/request/UserSignupRequest.java",
    "chars": 849,
    "preview": "package com.starterkit.springboot.brs.controller.v1.request;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperti"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/ui/AdminController.java",
    "chars": 3450,
    "preview": "package com.starterkit.springboot.brs.controller.v1.ui;\n\n\nimport com.starterkit.springboot.brs.controller.v1.command.Adm"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/controller/v1/ui/DashboardController.java",
    "chars": 11262,
    "preview": "package com.starterkit.springboot.brs.controller.v1.ui;\n\nimport com.starterkit.springboot.brs.controller.v1.command.*;\ni"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/mapper/TicketMapper.java",
    "chars": 968,
    "preview": "package com.starterkit.springboot.brs.dto.mapper;\n\nimport com.starterkit.springboot.brs.dto.model.bus.TicketDto;\nimport "
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/mapper/TripMapper.java",
    "chars": 837,
    "preview": "package com.starterkit.springboot.brs.dto.mapper;\n\nimport com.starterkit.springboot.brs.dto.model.bus.TripDto;\nimport co"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/mapper/TripScheduleMapper.java",
    "chars": 967,
    "preview": "package com.starterkit.springboot.brs.dto.mapper;\n\nimport com.starterkit.springboot.brs.dto.model.bus.TripScheduleDto;\ni"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/mapper/UserMapper.java",
    "chars": 1000,
    "preview": "package com.starterkit.springboot.brs.dto.mapper;\n\nimport com.starterkit.springboot.brs.dto.model.user.RoleDto;\nimport c"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/model/bus/AgencyDto.java",
    "chars": 765,
    "preview": "package com.starterkit.springboot.brs.dto.model.bus;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimpo"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/model/bus/BusDto.java",
    "chars": 618,
    "preview": "package com.starterkit.springboot.brs.dto.model.bus;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimpo"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/model/bus/StopDto.java",
    "chars": 763,
    "preview": "package com.starterkit.springboot.brs.dto.model.bus;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimpo"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/model/bus/TicketDto.java",
    "chars": 835,
    "preview": "package com.starterkit.springboot.brs.dto.model.bus;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimpo"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/model/bus/TripDto.java",
    "chars": 829,
    "preview": "package com.starterkit.springboot.brs.dto.model.bus;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimpo"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/model/bus/TripScheduleDto.java",
    "chars": 810,
    "preview": "package com.starterkit.springboot.brs.dto.model.bus;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimpo"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/model/user/RoleDto.java",
    "chars": 565,
    "preview": "package com.starterkit.springboot.brs.dto.model.user;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimp"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/model/user/UserDto.java",
    "chars": 928,
    "preview": "package com.starterkit.springboot.brs.dto.model.user;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimp"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/response/Response.java",
    "chars": 3317,
    "preview": "package com.starterkit.springboot.brs.dto.response;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimpor"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/dto/response/ResponseError.java",
    "chars": 609,
    "preview": "package com.starterkit.springboot.brs.dto.response;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimpor"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/exception/BRSException.java",
    "chars": 4002,
    "preview": "package com.starterkit.springboot.brs.exception;\n\nimport com.starterkit.springboot.brs.config.PropertiesConfig;\nimport o"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/exception/CustomizedResponseEntityExceptionHandler.java",
    "chars": 1413,
    "preview": "package com.starterkit.springboot.brs.exception;\n\nimport com.starterkit.springboot.brs.dto.response.Response;\nimport org"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/exception/EntityType.java",
    "chars": 207,
    "preview": "package com.starterkit.springboot.brs.exception;\n\n/**\n * Created by Arpit Khandelwal.\n */\npublic enum EntityType {\n    U"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/exception/ExceptionType.java",
    "chars": 371,
    "preview": "package com.starterkit.springboot.brs.exception;\n\n/**\n * Created by Arpit Khandelwal.\n */\npublic enum ExceptionType {\n  "
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/model/bus/Agency.java",
    "chars": 967,
    "preview": "package com.starterkit.springboot.brs.model.bus;\n\nimport com.starterkit.springboot.brs.model.user.User;\nimport lombok.Ge"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/model/bus/Bus.java",
    "chars": 794,
    "preview": "package com.starterkit.springboot.brs.model.bus;\n\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.S"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/model/bus/Stop.java",
    "chars": 696,
    "preview": "package com.starterkit.springboot.brs.model.bus;\n\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.S"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/model/bus/Ticket.java",
    "chars": 911,
    "preview": "package com.starterkit.springboot.brs.model.bus;\n\nimport com.starterkit.springboot.brs.model.user.User;\nimport lombok.Ge"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/model/bus/Trip.java",
    "chars": 964,
    "preview": "package com.starterkit.springboot.brs.model.bus;\n\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.S"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/model/bus/TripSchedule.java",
    "chars": 852,
    "preview": "package com.starterkit.springboot.brs.model.bus;\n\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.S"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/model/user/Role.java",
    "chars": 627,
    "preview": "package com.starterkit.springboot.brs.model.user;\n\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok."
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/model/user/User.java",
    "chars": 1271,
    "preview": "package com.starterkit.springboot.brs.model.user;\n\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok."
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/model/user/UserRoles.java",
    "chars": 138,
    "preview": "package com.starterkit.springboot.brs.model.user;\n\n/**\n * Created by Arpit Khandelwal.\n */\npublic enum UserRoles {\n    A"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/repository/bus/AgencyRepository.java",
    "chars": 455,
    "preview": "package com.starterkit.springboot.brs.repository.bus;\n\nimport com.starterkit.springboot.brs.model.bus.Agency;\nimport com"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/repository/bus/BusRepository.java",
    "chars": 428,
    "preview": "package com.starterkit.springboot.brs.repository.bus;\n\nimport com.starterkit.springboot.brs.model.bus.Agency;\nimport com"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/repository/bus/StopRepository.java",
    "chars": 313,
    "preview": "package com.starterkit.springboot.brs.repository.bus;\n\nimport com.starterkit.springboot.brs.model.bus.Stop;\nimport org.s"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/repository/bus/TicketRepository.java",
    "chars": 285,
    "preview": "package com.starterkit.springboot.brs.repository.bus;\n\nimport com.starterkit.springboot.brs.model.bus.Ticket;\nimport org"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/repository/bus/TripRepository.java",
    "chars": 671,
    "preview": "package com.starterkit.springboot.brs.repository.bus;\n\nimport com.starterkit.springboot.brs.model.bus.Agency;\nimport com"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/repository/bus/TripScheduleRepository.java",
    "chars": 435,
    "preview": "package com.starterkit.springboot.brs.repository.bus;\n\nimport com.starterkit.springboot.brs.model.bus.Trip;\nimport com.s"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/repository/user/RoleRepository.java",
    "chars": 379,
    "preview": "package com.starterkit.springboot.brs.repository.user;\n\nimport com.starterkit.springboot.brs.model.user.Role;\nimport com"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/repository/user/UserRepository.java",
    "chars": 319,
    "preview": "package com.starterkit.springboot.brs.repository.user;\n\nimport com.starterkit.springboot.brs.model.user.User;\nimport org"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/security/CustomUserDetailsService.java",
    "chars": 1924,
    "preview": "package com.starterkit.springboot.brs.security;\n\nimport com.starterkit.springboot.brs.dto.model.user.RoleDto;\nimport com"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/security/MultiHttpSecurityConfig.java",
    "chars": 5587,
    "preview": "package com.starterkit.springboot.brs.security;\n\nimport com.starterkit.springboot.brs.security.api.ApiJWTAuthenticationF"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/security/SecurityConstants.java",
    "chars": 345,
    "preview": "package com.starterkit.springboot.brs.security;\n\n/**\n * Created by Arpit Khandelwal.\n */\npublic interface SecurityConsta"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/security/api/ApiJWTAuthenticationFilter.java",
    "chars": 3431,
    "preview": "package com.starterkit.springboot.brs.security.api;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.star"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/security/api/ApiJWTAuthorizationFilter.java",
    "chars": 2818,
    "preview": "package com.starterkit.springboot.brs.security.api;\n\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.Jwts;\nimport "
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/security/form/CustomAuthenticationSuccessHandler.java",
    "chars": 1108,
    "preview": "package com.starterkit.springboot.brs.security.form;\n\nimport org.springframework.security.core.Authentication;\nimport or"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/security/form/CustomLogoutSuccessHandler.java",
    "chars": 858,
    "preview": "package com.starterkit.springboot.brs.security.form;\n\nimport org.springframework.security.core.Authentication;\nimport or"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/security/form/FormBasedJWTAuthenticationFilter.java",
    "chars": 3514,
    "preview": "package com.starterkit.springboot.brs.security.form;\n\nimport com.starterkit.springboot.brs.model.user.User;\nimport io.js"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/service/BusReservationService.java",
    "chars": 1215,
    "preview": "package com.starterkit.springboot.brs.service;\n\nimport com.starterkit.springboot.brs.dto.model.bus.*;\nimport com.starter"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/service/BusReservationServiceImpl.java",
    "chars": 16739,
    "preview": "package com.starterkit.springboot.brs.service;\n\nimport com.starterkit.springboot.brs.dto.mapper.TicketMapper;\nimport com"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/service/UserService.java",
    "chars": 732,
    "preview": "package com.starterkit.springboot.brs.service;\n\nimport com.starterkit.springboot.brs.dto.model.user.UserDto;\n\n/**\n * Cre"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/service/UserServiceImpl.java",
    "chars": 4677,
    "preview": "package com.starterkit.springboot.brs.service;\n\nimport com.starterkit.springboot.brs.dto.mapper.UserMapper;\nimport com.s"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/util/DateUtils.java",
    "chars": 910,
    "preview": "package com.starterkit.springboot.brs.util;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/**\n * Created b"
  },
  {
    "path": "src/main/java/com/starterkit/springboot/brs/util/RandomStringUtil.java",
    "chars": 943,
    "preview": "package com.starterkit.springboot.brs.util;\n\n/**\n * Created by Arpit Khandelwal.\n */\npublic class RandomStringUtil {\n   "
  },
  {
    "path": "src/main/resources/application-prod.properties",
    "chars": 37,
    "preview": "#Default server port\nserver.port=8080"
  },
  {
    "path": "src/main/resources/application-uat.properties",
    "chars": 37,
    "preview": "#Default server port\nserver.port=8090"
  },
  {
    "path": "src/main/resources/application.properties",
    "chars": 607,
    "preview": "#Default server port\nserver.port=8080\n\n## MySQL\nspring.datasource.url=jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/"
  },
  {
    "path": "src/main/resources/banner.txt",
    "chars": 182,
    "preview": " +-+ +-+ +-+   +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+   +-+ +-+ +-+\n |T| |h| |e|   |R| |e| |s| |o| |n| |a| |n| |t|   |W| |e| |b"
  },
  {
    "path": "src/main/resources/custom.properties",
    "chars": 970,
    "preview": "#Exception Messages\nstop.not.found=Requested stop with code - {0} does not exist.\nstop.duplicate=Stop with code - {0} al"
  },
  {
    "path": "src/main/resources/static/auth/css/style.css",
    "chars": 19720,
    "preview": "/* @extend display-flex; */\r\ndisplay-flex, .display-flex, .display-flex-center, .signup-content, .signin-content, .socia"
  },
  {
    "path": "src/main/resources/static/auth/fonts/material-icon/css/material-design-iconic-font.css",
    "chars": 90470,
    "preview": "/*!\r\n *  Material Design Iconic Font by Sergey Kupletsky (@zavoloklom) - http://zavoloklom.github.io/material-design-ico"
  },
  {
    "path": "src/main/resources/static/auth/scss/common/extend.scss",
    "chars": 209,
    "preview": "/* @extend display-flex; */\r\ndisplay-flex {\r\n    display: flex;\r\n    display: -webkit-flex;\r\n}\r\n/* @extend list-type-ull"
  },
  {
    "path": "src/main/resources/static/auth/scss/common/fonts.scss",
    "chars": 10195,
    "preview": "/* poppins-300 - latin */\r\n@font-face {\r\n    font-family: 'Poppins';\r\n    font-style: normal;\r\n    font-weight: 300;\r\n  "
  },
  {
    "path": "src/main/resources/static/auth/scss/common/global.scss",
    "chars": 1591,
    "preview": " a:focus, a:active { text-decoration: none; outline: none; @include transition(all 300ms ease 0s); }\r\ninput, select, tex"
  },
  {
    "path": "src/main/resources/static/auth/scss/common/minxi.scss",
    "chars": 4114,
    "preview": "// mixin\r\n@mixin border-radius($value) {\r\n    border-radius: $value;\r\n    -moz-border-radius: $value;\r\n    -webkit-borde"
  },
  {
    "path": "src/main/resources/static/auth/scss/common/variables.scss",
    "chars": 64,
    "preview": "$black-color : #222;\r\n$blue-color : #6dabe4;\r\n$grey-light: #999;"
  },
  {
    "path": "src/main/resources/static/auth/scss/layouts/main.scss",
    "chars": 6093,
    "preview": ".signup {\r\n    margin-bottom: 150px;\r\n}\r\n.signup-content {\r\n    @extend display-flex;\r\n    padding: 75px 0;\r\n    // flex"
  },
  {
    "path": "src/main/resources/static/auth/scss/layouts/responsive.scss",
    "chars": 1823,
    "preview": "@media screen and (max-width: 1600px) {\r\n\r\n}\r\n\r\n@media screen and (max-width: 1300px) {\r\n\r\n}\r\n\r\n//end 1200px\r\n@media scr"
  },
  {
    "path": "src/main/resources/static/auth/scss/style.scss",
    "chars": 259,
    "preview": "//Common\r\n@import 'common/extend.scss';\r\n@import 'common/fonts.scss';\r\n@import 'common/minxi.scss';\r\n@import 'common/var"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/bootstrap/css/bootstrap-grid.css",
    "chars": 25510,
    "preview": "@-ms-viewport {\n  width: device-width;\n}\n\nhtml {\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n  -"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/bootstrap/css/bootstrap-reboot.css",
    "chars": 5916,
    "preview": "/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */\nhtml {\n  font-family: sans-serif;\n  line-he"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/bootstrap/css/bootstrap.css",
    "chars": 191738,
    "preview": "/*!\n * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 201"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/bootstrap/js/bootstrap.js",
    "chars": 99753,
    "preview": "/*!\n * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors (https://github."
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-js/dist/chartist-init.css",
    "chars": 2571,
    "preview": ".ct-sm-line-chart,\n.ct-area-ln-chart,\n#ct-polar-chart,\n.ct-svg-chartct-bar-chart, .total-revenue, .chartist-chart {\n    "
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-js/dist/chartist-init.js",
    "chars": 8114,
    "preview": "//Simple line chart \n\nnew Chartist.Line('.ct-sm-line-chart', {\n  labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', "
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-js/dist/chartist.css",
    "chars": 13755,
    "preview": ".ct-label {\n  fill: rgba(0, 0, 0, 0.4);\n  color: rgba(0, 0, 0, 0.4);\n  font-size: 0.75rem;\n  line-height: 1; }\n\n.ct-char"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-js/dist/chartist.js",
    "chars": 166078,
    "preview": "(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous mod"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-js/dist/scss/chartist.scss",
    "chars": 6857,
    "preview": "@import \"settings/chartist-settings\";\n\n@mixin ct-responsive-svg-container($width: 100%, $ratio: $ct-container-ratio) {\n "
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-js/dist/scss/settings/_chartist-settings.scss",
    "chars": 3126,
    "preview": "// Scales for responsive SVG containers\n$ct-scales: ((1), (15/16), (8/9), (5/6), (4/5), (3/4), (2/3), (5/8), (1/1.618), "
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/.gitignore",
    "chars": 630,
    "preview": "# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nl"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/CHANGELOG.md",
    "chars": 465,
    "preview": "# Chartist Plugin Tooltip Changelog\n\n### master\n\n### 0.0.11\n* [BUGFIX] Tooltips now working properly on Firefox\n* [ENHAN"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/Gruntfile.js",
    "chars": 530,
    "preview": "/**\n * Grunt Configurations\n * ====================\n *\n * Seperate tasks and configurations are declared in '/tasks'.\n *"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/LICENSE",
    "chars": 1083,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Markus Padourek\n\nPermission is hereby granted, free of charge, to any person o"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/README.md",
    "chars": 3533,
    "preview": "# Tooltip plugin for Chartist.js\n\nThis plugin provides quick and easy tooltips for your chartist charts. Touch support i"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/bower.json",
    "chars": 304,
    "preview": "{\n  \"name\": \"chartist-plugin-tooltip\",\n  \"main\": [\n    \"./dist/chartist-plugin-tooltip.min.js\",\n    \"./dist/chartist-plu"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/dist/LICENSE",
    "chars": 1083,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Markus Padourek\n\nPermission is hereby granted, free of charge, to any person o"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/dist/chartist-plugin-tooltip.css",
    "chars": 795,
    "preview": ".chartist-tooltip {\n  position: absolute;\n  display: inline-block;\n  opacity: 0;\n  min-width: 50px;\n  padding: 5px 10px;"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/dist/chartist-plugin-tooltip.js",
    "chars": 6963,
    "preview": "(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous mod"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/package.json",
    "chars": 1872,
    "preview": "{\n  \"name\": \"chartist-plugin-tooltips\",\n  \"description\": \"Point Labels Plugin for Chartist.js\",\n  \"version\": \"0.0.17\",\n "
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/src/css/chartist-plugin-tooltip.css",
    "chars": 821,
    "preview": ".chartist-tooltip {\n  position: absolute;\n  display: inline-block;\n  opacity: 0;\n  min-width: 5em;\n  padding: .5em;\n  ba"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/src/scripts/chartist-plugin-tooltip.js",
    "chars": 6023,
    "preview": "/**\n * Chartist.js plugin to display a data label on top of the points in a line chart.\n *\n */\n/* global Chartist */\n(fu"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/src/scss/chartist-plugin-tooltip.scss",
    "chars": 828,
    "preview": "$chart-tooltip-bg: #F4C63D;\n$chart-tooltip-color: #453D3F;\n.chartist-tooltip {\n  position: absolute;\n  display: inline-b"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/tasks/aliases.yml",
    "chars": 290,
    "preview": "# Grunt Commands\n# ==============\n#\n# Use `grunt` in the root directory to select and run a specific task.\n\ndefault:\n  -"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/tasks/clean.js",
    "chars": 266,
    "preview": "/**\n * clean\n * =====\n *\n * Remove temporary and unused files.\n *\n * Link: https://github.com/gruntjs/grunt-contrib-clea"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/tasks/copy.js",
    "chars": 548,
    "preview": "/**\n * copy\n * ====\n *\n * Copies remaining files to places other tasks can use.\n *\n * Link: https://github.com/gruntjs/g"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/tasks/jasmine.js",
    "chars": 560,
    "preview": "/**\n * jasmine\n * =======\n *\n * Test settings\n *\n * Link: https://github.com/gruntjs/grunt-contrib-jasmine\n */\n\n'use str"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/tasks/jshint.js",
    "chars": 609,
    "preview": "/**\n * jshint\n * ======\n *\n * Make sure code styles are up to par and there are no obvious mistakes.\n *\n * Link: https:/"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/tasks/sass.js",
    "chars": 377,
    "preview": "/**\n * sass\n * ======\n *\n * Compile scss to css\n *\n * Link: https://github.com/gruntjs/grunt-contrib-sass\n */\n\n'use stri"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/tasks/uglify.js",
    "chars": 484,
    "preview": "/**\n * uglify\n * ======\n *\n * Minify the library.\n *\n * Link: https://github.com/gruntjs/grunt-contrib-uglify\n */\n\n'use "
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/tasks/umd.js",
    "chars": 595,
    "preview": "/**\n * umd\n * ===\n *\n * Wraps the library into an universal module definition (AMD + CommonJS + Global).\n *\n * Link: htt"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/test/.jshintrc",
    "chars": 631,
    "preview": "{\n  \"node\": true,\n  \"browser\": true,\n  \"esnext\": true,\n  \"bitwise\": true,\n  \"camelcase\": true,\n  \"curly\": true,\n  \"eqeqe"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/test/runner.html",
    "chars": 840,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <title>End2end Test Runner</title>\n</head>\n<body>\n<header class=\"page-header\">"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/chartist-plugin-tooltip-master/test/spec/spec-tooltip.js",
    "chars": 2323,
    "preview": "describe('ctPointLabels', function () {\n  'use strict';\n\n  var chart;\n  var listeners;\n  var event;\n\n  beforeEach(functi"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/d3/API.md",
    "chars": 124743,
    "preview": "# D3 API Reference\n\nD3 4.0 is a [collection of modules](https://github.com/d3) that are designed to work together; you c"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/d3/CHANGES.md",
    "chars": 138907,
    "preview": "# Changes in D3 4.0\n\nD3 4.0 is modular. Instead of one library, D3 is now [many small libraries](#table-of-contents) tha"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/d3/LICENSE",
    "chars": 1475,
    "preview": "Copyright 2010-2017 Mike Bostock\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or withou"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/d3/README.md",
    "chars": 2293,
    "preview": "# D3: Data-Driven Documents\n\n<a href=\"https://d3js.org\"><img src=\"https://d3js.org/logo.svg\" align=\"left\" hspace=\"10\" vs"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/d3/d3.js",
    "chars": 463807,
    "preview": "// https://d3js.org Version 4.9.1. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'objec"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/d3/d3.min-v4.js",
    "chars": 218925,
    "preview": "// https://d3js.org Version 4.9.1. Copyright 2017 Mike Bostock.\n(function(t,n){\"object\"==typeof exports&&\"undefined\"!=ty"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/gmaps.js",
    "chars": 58826,
    "preview": "\"use strict\";\n(function(root, factory) {\n  if(typeof exports === 'object') {\n    module.exports = factory();\n  }\n  else "
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/jquery.gmaps.js",
    "chars": 262,
    "preview": "$(function() {\n    map = new GMaps({\n        el: '#gmaps-simple',\n        lat: 34.05,\n        lng: -78.72,\n        zoom:"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.controls.js",
    "chars": 1942,
    "preview": "GMaps.prototype.createControl = function(options) {\n  var control = document.createElement('div');\n\n  control.style.curs"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.core.js",
    "chars": 13600,
    "preview": "if (!(typeof window.google === 'object' && window.google.maps)) {\n  throw 'Google Maps API is required. Please register "
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.events.js",
    "chars": 1703,
    "preview": "GMaps.prototype.on = function(event_name, handler) {\n  return GMaps.on(event_name, this, handler);\n};\n\nGMaps.prototype.o"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.geofences.js",
    "chars": 449,
    "preview": "GMaps.prototype.checkGeofence = function(lat, lng, fence) {\n  return fence.containsLatLng(new google.maps.LatLng(lat, ln"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.geometry.js",
    "chars": 5137,
    "preview": "GMaps.prototype.drawPolyline = function(options) {\n  var path = [],\n      points = options.path;\n\n  if (points.length) {"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.layers.js",
    "chars": 4434,
    "preview": "GMaps.prototype.getFromFusionTables = function(options) {\n  var events = options.events;\n\n  delete options.events;\n\n  va"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.map_types.js",
    "chars": 880,
    "preview": "GMaps.prototype.addMapType = function(mapTypeId, options) {\n  if (options.hasOwnProperty(\"getTileUrl\") && typeof(options"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.markers.js",
    "chars": 5497,
    "preview": "GMaps.prototype.createMarker = function(options) {\n  if (options.lat == undefined && options.lng == undefined && options"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.native_extensions.js",
    "chars": 3563,
    "preview": "//==========================\n// Polygon containsLatLng\n// https://github.com/tparkin/Google-Maps-Point-in-Polygon\n// Poy"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.overlays.js",
    "chars": 3565,
    "preview": "GMaps.prototype.drawOverlay = function(options) {\n  var overlay = new google.maps.OverlayView(),\n      auto_show = true;"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.routes.js",
    "chars": 8736,
    "preview": "var travelMode, unitSystem;\n\nGMaps.prototype.getRoutes = function(options) {\n  switch (options.travelMode) {\n    case 'b"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.static.js",
    "chars": 6226,
    "preview": "GMaps.prototype.toImage = function(options) {\n  var options = options || {},\n      static_map_options = {};\n\n  static_ma"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.streetview.js",
    "chars": 1366,
    "preview": "GMaps.prototype.createPanorama = function(streetview_options) {\n  if (!streetview_options.hasOwnProperty('lat') || !stre"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.styles.js",
    "chars": 301,
    "preview": "GMaps.prototype.addStyle = function(options) {\n  var styledMapType = new google.maps.StyledMapType(options.styles, { nam"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/gmaps/lib/gmaps.utils.js",
    "chars": 1000,
    "preview": "GMaps.geolocate = function(options) {\n  var complete_callback = options.always || options.complete;\n\n  if (navigator.geo"
  },
  {
    "path": "src/main/resources/static/dashboard/assets/plugins/sticky-kit-master/dist/sticky-kit.js",
    "chars": 8589,
    "preview": "// Generated by CoffeeScript 1.10.0\n\n/**\n@license Sticky-kit v1.1.3 | MIT | Leaf Corcoran 2015 | http://leafo.net\n */\n\n("
  },
  {
    "path": "src/main/resources/static/dashboard/html/css/animate.css",
    "chars": 56449,
    "preview": "@charset \"UTF-8\";/*!\n * animate.css -http://daneden.me/animate\n * Version - 3.5.1\n * Licensed under the MIT license - ht"
  },
  {
    "path": "src/main/resources/static/dashboard/html/css/colors/blue.css",
    "chars": 3827,
    "preview": "/*\nTemplate Name: Material Pro Admin\nAuthor: Themedesigner\nEmail: niravjoshi87@gmail.com\nFile: scss\n*/\n/*\nTemplate Name:"
  },
  {
    "path": "src/main/resources/static/dashboard/html/css/spinners.css",
    "chars": 18964,
    "preview": "\n\n.preloader{\n  position: relative;\n  margin: 0 auto;\n  width: 100px;\n}\n.preloader:before{\n    content: '';\n    display:"
  },
  {
    "path": "src/main/resources/static/dashboard/html/css/style.css",
    "chars": 222385,
    "preview": "/*\nTemplate Name: Material Pro Admin\nAuthor: Themedesigner\nEmail: niravjoshi87@gmail.com\nFile: scss\n*/\n/**\n * Table Of C"
  },
  {
    "path": "src/main/resources/static/dashboard/html/js/custom.js",
    "chars": 3543,
    "preview": "/*\nTemplate Name: Material Pro Admin\nAuthor: Themedesigner\nEmail: niravjoshi87@gmail.com\nFile: js\n*/\n$(function() {\n    "
  },
  {
    "path": "src/main/resources/static/dashboard/html/js/dashboard1.js",
    "chars": 3348,
    "preview": "/*\nTemplate Name: Material Pro Admin\nAuthor: Themedesigner\nEmail: niravjoshi87@gmail.com\nFile: js\n*/\n$(function() {\n    "
  },
  {
    "path": "src/main/resources/static/dashboard/html/js/jquery.slimscroll.js",
    "chars": 4475,
    "preview": "!function(e){e.fn.extend({slimScroll:function(i){var o={width:\"auto\",height:\"250px\",size:\"7px\",color:\"#000\",position:\"ri"
  },
  {
    "path": "src/main/resources/static/dashboard/html/js/sidebarmenu.js",
    "chars": 10303,
    "preview": "/*\nTemplate Name: Material Pro Admin\nAuthor: Themedesigner\nEmail: niravjoshi87@gmail.com\nFile: js\n*/\n(function (global, "
  },
  {
    "path": "src/main/resources/static/dashboard/html/js/waves.js",
    "chars": 4237,
    "preview": "!function(t){\"use strict\";function e(t){return null!==t&&t===t.window}function n(t){return e(t)?t:9===t.nodeType&&t.defa"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/app.scss",
    "chars": 38897,
    "preview": "/*\nTemplate Name: Material Pro Admin\nAuthor: Themedesigner\nEmail: niravjoshi87@gmail.com\nFile: scss\n*/\n/**\n * Table Of C"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/colors/blue.scss",
    "chars": 3666,
    "preview": "/*\nTemplate Name: Material Pro Admin\nAuthor: Themedesigner\nEmail: niravjoshi87@gmail.com\nFile: scss\n*/\n\n@import '../vari"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/grid.scss",
    "chars": 4310,
    "preview": "/*\nTemplate Name: Material Pro Admin\nAuthor: Themedesigner\nEmail: niravjoshi87@gmail.com\nFile: scss\n*/\n@media (min-width"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/css/font-awesome.css",
    "chars": 37420,
    "preview": "/*!\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/lice"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/animated.less",
    "chars": 713,
    "preview": "// Animated Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linea"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/bordered-pulled.less",
    "chars": 585,
    "preview": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: sol"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/core.less",
    "chars": 452,
    "preview": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n  display: inline-block;\n  font: normal norma"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/fixed-width.less",
    "chars": 119,
    "preview": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/font-awesome.less",
    "chars": 495,
    "preview": "/*!\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/lice"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/icons.less",
    "chars": 49712,
    "preview": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters th"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/larger.less",
    "chars": 370,
    "preview": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-pre"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/list.less",
    "chars": 377,
    "preview": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: @fa-li-width;\n  lis"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/mixins.less",
    "chars": 1603,
    "preview": "// Mixins\n// --------------------------\n\n.fa-icon() {\n  display: inline-block;\n  font: normal normal normal @fa-font-siz"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/path.less",
    "chars": 771,
    "preview": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('@{fa-font-path}/fo"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/rotated-flipped.less",
    "chars": 622,
    "preview": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }\n.@"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/screen-reader.less",
    "chars": 118,
    "preview": "// Screen Readers\n// -------------------------\n\n.sr-only { .sr-only(); }\n.sr-only-focusable { .sr-only-focusable(); }\n"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/stacked.less",
    "chars": 476,
    "preview": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/less/variables.less",
    "chars": 22563,
    "preview": "// Variables\n// --------------------------\n\n@fa-font-path:        \"../fonts\";\n@fa-font-size-base:   14px;\n@fa-line-heigh"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/.bower.json",
    "chars": 698,
    "preview": "{\n  \"name\": \"font-awesome\",\n  \"description\": \"Font Awesome\",\n  \"version\": \"4.2.0\",\n  \"keywords\": [],\n  \"homepage\": \"http"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/.gitignore",
    "chars": 293,
    "preview": "*.pyc\n*.egg-info\n*.db\n*.db.old\n*.swp\n*.db-journal\n\n.coverage\n.DS_Store\n.installed.cfg\n_gh_pages/*\n\n.idea/*\n.svn/*\nsrc/we"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/.npmignore",
    "chars": 427,
    "preview": "*.pyc\n*.egg-info\n*.db\n*.db.old\n*.swp\n*.db-journal\n\n.coverage\n.DS_Store\n.installed.cfg\n_gh_pages/*\n\n.idea/*\n.svn/*\nsrc/we"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/HELP-US-OUT.txt",
    "chars": 318,
    "preview": "I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,\nFonticons"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/bower.json",
    "chars": 413,
    "preview": "{\n  \"name\": \"font-awesome\",\n  \"description\": \"Font Awesome\",\n  \"version\": \"4.2.0\",\n  \"keywords\": [],\n  \"homepage\": \"http"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/css/font-awesome.css",
    "chars": 33239,
    "preview": "/*!\n *  Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/lice"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/animated.less",
    "chars": 713,
    "preview": "// Animated Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linea"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/bordered-pulled.less",
    "chars": 585,
    "preview": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: sol"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/core.less",
    "chars": 452,
    "preview": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n  display: inline-block;\n  font: normal norma"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/extras.less",
    "chars": 40,
    "preview": "// Extras\n// --------------------------\n"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/fixed-width.less",
    "chars": 119,
    "preview": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/font-awesome.less",
    "chars": 465,
    "preview": "/*!\n *  Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/lice"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/icons.less",
    "chars": 43859,
    "preview": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters th"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/larger.less",
    "chars": 370,
    "preview": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-pre"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/list.less",
    "chars": 377,
    "preview": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: @fa-li-width;\n  lis"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/mixins.less",
    "chars": 926,
    "preview": "// Mixins\n// --------------------------\n\n.fa-icon() {\n  display: inline-block;\n  font: normal normal normal @fa-font-siz"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/path.less",
    "chars": 889,
    "preview": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../less/icons/font"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/rotated-flipped.less",
    "chars": 622,
    "preview": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }\n.@"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/spinning.less",
    "chars": 582,
    "preview": "// Spinning Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linea"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/stacked.less",
    "chars": 476,
    "preview": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/less/variables.less",
    "chars": 19778,
    "preview": "// Variables\n// --------------------------\n\n@fa-font-path:        \"../fonts\";\n@fa-font-size-base:   14px;\n@fa-line-heigh"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/scss/_animated.scss",
    "chars": 715,
    "preview": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite line"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/scss/_bordered-pulled.scss",
    "chars": 592,
    "preview": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: so"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/scss/_core.scss",
    "chars": 459,
    "preview": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n  display: inline-block;\n  font: normal norm"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/scss/_extras.scss",
    "chars": 1238,
    "preview": "/* EXTRAS\n * -------------------------- */\n\n/* Stacked and layered icon */\n\n/* Animated rotating icon */\n.#{$fa-css-pref"
  },
  {
    "path": "src/main/resources/static/dashboard/html/scss/icons/font-awesome/old/scss/_fixed-width.scss",
    "chars": 120,
    "preview": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  }
]

// ... and 136 more files (download for full content)

About this extraction

This page contains the full source code of the khandelwal-arpit/springboot-starterkit-mysql GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 336 files (3.5 MB), approximately 927.8k tokens, and a symbol index with 1757 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!