├── .gitignore ├── README.md ├── src ├── api │ ├── adminGroup.go │ ├── cookieGroup.go │ ├── handlers │ │ ├── adminhandlers.go │ │ ├── authenticationhandlers.go │ │ ├── cathandlers.go │ │ ├── cookiehandlers.go │ │ ├── doghandlers.go │ │ ├── generalhandlers.go │ │ ├── hamsterhandlers.go │ │ └── jwthandlers.go │ ├── jwtGroup.go │ ├── mainGroup.go │ └── middlewares │ │ ├── adminMiddlewares.go │ │ ├── cookieMiddlewares.go │ │ ├── jwtMiddlewares.go │ │ └── mainMiddlewares.go ├── main │ └── main.go ├── router │ └── router.go └── webserver │ └── webserver.go └── static ├── css ├── animate.css ├── preloader.css ├── responsive.css ├── simple-line-icons.css └── style.css ├── fonts ├── Simple-Line-Icons.dev.svg ├── Simple-Line-Icons.eot ├── Simple-Line-Icons.svg ├── Simple-Line-Icons.ttf └── Simple-Line-Icons.woff ├── img ├── after_effects.svg ├── amazon.png ├── apple-touch-icon-ipad-retina.png ├── apple-touch-icon-ipad.png ├── apple-touch-icon-iphone-retina.png ├── apple-touch-icon-iphone.png ├── bill.jpg ├── curb.png ├── dan.jpg ├── elance-odesk.png ├── eric.png ├── favicon.png ├── flash.svg ├── hero-img.png ├── icon.png ├── illustrator.svg ├── indesign.svg ├── payoneer.png ├── photoshop.svg ├── ramil.jpg ├── s1.png ├── s2.png ├── s3.png ├── s4.png ├── s5.png ├── s6.png ├── trianglify-background.svg └── user.png ├── index.html └── js ├── drifolio.js ├── jquery.easing.min.js ├── jquery.jribbble-1.0.1.ugly.js ├── jquery.nicescroll.min.js └── wow.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | pkg/ 3 | src/github.com/ 4 | src/golang.org/ 5 | .idea/ 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Golnag Server using Echo Tutorials Series - [Link](https://www.youtube.com/watch?v=_pww3NJuWnk&list=PLFmONUGpIk0YwlJMZOo21a9Q1juVrk4YY) 2 | Sources for [tutorial series on Youtube](https://www.youtube.com/watch?v=_pww3NJuWnk&list=PLFmONUGpIk0YwlJMZOo21a9Q1juVrk4YY) for creating a web server in Golang using the [Echo](https://github.com/labstack/echo) Package. 3 | 4 | ## Description 5 | The [Series](https://www.youtube.com/watch?v=_pww3NJuWnk&list=PLFmONUGpIk0YwlJMZOo21a9Q1juVrk4YY) will go through most of [Echo](https://github.com/labstack/echo) features like requests types, CRUD, playing with headers, cookies 6 | Middlewares and more. 7 | Starting from the very basic 'hello world' and finishing with a full production server ready for a real 8 | life app. 9 | 10 | ## Structure 11 | Each part have a video and a branch of the end state, each next part starts on top of the one before it. 12 | master is the last published part. 13 | 14 | ## Installation 15 | Clone the project: 16 | ``` 17 | git clone https://github.com/verybluebot/echo-server-tutorial.git 18 | ``` 19 | cd into it: 20 | ``` 21 | cd echo-server-tutorial 22 | ``` 23 | 24 | define `GOPATH`: 25 | note: this is asuming you are inside the root of the project. 26 | ``` 27 | echo GOPATH=`pwd` 28 | ``` 29 | 30 | build binaries: 31 | ``` 32 | go install main 33 | 34 | ``` 35 | 36 | run the server: 37 | 38 | ``` 39 | bin/main 40 | 41 | ``` 42 | 43 | Note: if you want to use anything other the `master` aka the last publish part, switch to 44 | its branch and build binaries. 45 | 46 | list all branches: 47 | ``` 48 | git branch -a 49 | ``` 50 | checkout to the branch you want and build/run like before: 51 | ``` 52 | git checkout part_1_hello_world 53 | 54 | go install main 55 | 56 | bin/main 57 | ``` 58 | 59 | -------------------------------------------------------------------------------- /src/api/adminGroup.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "api/handlers" 6 | ) 7 | 8 | func AdminGroup(g *echo.Group) { 9 | g.GET("/main", handlers.MainAdmin) 10 | } 11 | -------------------------------------------------------------------------------- /src/api/cookieGroup.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "api/handlers" 5 | 6 | "github.com/labstack/echo" 7 | ) 8 | 9 | func CookieGroup(g *echo.Group) { 10 | g.GET("/main", handlers.MainCookie) 11 | } 12 | -------------------------------------------------------------------------------- /src/api/handlers/adminhandlers.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/labstack/echo" 7 | ) 8 | 9 | func MainAdmin(c echo.Context) error { 10 | return c.String(http.StatusOK, "horay you are on the secret amdin main page!") 11 | } 12 | -------------------------------------------------------------------------------- /src/api/handlers/authenticationhandlers.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import ( 4 | "log" 5 | "net/http" 6 | "time" 7 | 8 | "github.com/dgrijalva/jwt-go" 9 | "github.com/labstack/echo" 10 | ) 11 | 12 | type JwtClaims struct { 13 | Name string `json:"name"` 14 | jwt.StandardClaims 15 | } 16 | 17 | func Login(c echo.Context) error { 18 | username := c.QueryParam("username") 19 | password := c.QueryParam("password") 20 | 21 | // check username and password against DB after hashing the password 22 | if username == "jack" && password == "1234" { 23 | cookie := &http.Cookie{} 24 | 25 | // this is the same 26 | //cookie := new(http.Cookie) 27 | 28 | cookie.Name = "sessionID" 29 | cookie.Value = "some_string" 30 | cookie.Expires = time.Now().Add(48 * time.Hour) 31 | 32 | c.SetCookie(cookie) 33 | 34 | // create jwt token 35 | token, err := createJwtToken() 36 | if err != nil { 37 | log.Println("Error Creating JWT token", err) 38 | return c.String(http.StatusInternalServerError, "something went wrong") 39 | } 40 | 41 | return c.JSON(http.StatusOK, map[string]string{ 42 | "message": "You were logged in!", 43 | "token": token, 44 | }) 45 | } 46 | 47 | return c.String(http.StatusUnauthorized, "Your username or password were wrong") 48 | } 49 | 50 | func createJwtToken() (string, error) { 51 | claims := JwtClaims{ 52 | "jack", 53 | jwt.StandardClaims{ 54 | Id: "main_user_id", 55 | ExpiresAt: time.Now().Add(24 * time.Hour).Unix(), 56 | }, 57 | } 58 | 59 | rawToken := jwt.NewWithClaims(jwt.SigningMethodHS512, claims) 60 | 61 | token, err := rawToken.SignedString([]byte("mySecret")) 62 | if err != nil { 63 | return "", err 64 | } 65 | 66 | return token, nil 67 | } 68 | -------------------------------------------------------------------------------- /src/api/handlers/cathandlers.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import ( 4 | "net/http" 5 | "fmt" 6 | "log" 7 | "io/ioutil" 8 | "encoding/json" 9 | 10 | "github.com/labstack/echo" 11 | ) 12 | 13 | type Cat struct { 14 | Name string `json:"name"` 15 | Type string `json:"type"` 16 | } 17 | 18 | func GetCats(c echo.Context) error { 19 | catName := c.QueryParam("name") 20 | catType := c.QueryParam("type") 21 | 22 | dataType := c.Param("data") 23 | 24 | if dataType == "string" { 25 | return c.String(http.StatusOK, fmt.Sprintf("your cat name is: %s\nand his type is: %s\n", catName, catType)) 26 | } 27 | 28 | if dataType == "json" { 29 | return c.JSON(http.StatusOK, map[string]string{ 30 | "name": catName, 31 | "type": catType, 32 | }) 33 | } 34 | 35 | return c.JSON(http.StatusBadRequest, map[string]string{ 36 | "error": "you need to lets us know if you want json or string data", 37 | }) 38 | } 39 | 40 | func AddCat(c echo.Context) error { 41 | cat := Cat{} 42 | 43 | defer c.Request().Body.Close() 44 | 45 | b, err := ioutil.ReadAll(c.Request().Body) 46 | if err != nil { 47 | log.Printf("Failed reading the request body for addCats: %s\n", err) 48 | return c.String(http.StatusInternalServerError, "") 49 | } 50 | 51 | err = json.Unmarshal(b, &cat) 52 | if err != nil { 53 | log.Printf("Failed unmarshaling in addCats: %s\n", err) 54 | return c.String(http.StatusInternalServerError, "") 55 | } 56 | 57 | log.Printf("this is your cat: %#v\n", cat) 58 | return c.String(http.StatusOK, "we got your cat!") 59 | } -------------------------------------------------------------------------------- /src/api/handlers/cookiehandlers.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/labstack/echo" 7 | ) 8 | 9 | func MainCookie(c echo.Context) error { 10 | return c.String(http.StatusOK, "you are on the secret cookie page!") 11 | } -------------------------------------------------------------------------------- /src/api/handlers/doghandlers.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import ( 4 | "encoding/json" 5 | "net/http" 6 | "log" 7 | 8 | "github.com/labstack/echo" 9 | ) 10 | 11 | type Dog struct { 12 | Name string `json:"name"` 13 | Type string `json:"type"` 14 | } 15 | 16 | func AddDog(c echo.Context) error { 17 | dog := Dog{} 18 | 19 | defer c.Request().Body.Close() 20 | 21 | err := json.NewDecoder(c.Request().Body).Decode(&dog) 22 | if err != nil { 23 | log.Printf("Failed processing addDog request: %s\n", err) 24 | return echo.NewHTTPError(http.StatusInternalServerError) 25 | } 26 | 27 | log.Printf("this is your dog: %#v", dog) 28 | return c.String(http.StatusOK, "we got your dog!") 29 | } 30 | -------------------------------------------------------------------------------- /src/api/handlers/generalhandlers.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "net/http" 6 | ) 7 | 8 | func Yallo(c echo.Context) error { 9 | return c.String(http.StatusOK, "yallo from the web side!") 10 | } -------------------------------------------------------------------------------- /src/api/handlers/hamsterhandlers.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import ( 4 | "log" 5 | "github.com/labstack/echo" 6 | "net/http" 7 | ) 8 | 9 | type Hamster struct { 10 | Name string `json:"name"` 11 | Type string `json:"type"` 12 | } 13 | 14 | func AddHamster(c echo.Context) error { 15 | hamster := Hamster{} 16 | 17 | err := c.Bind(&hamster) 18 | if err != nil { 19 | log.Printf("Failed processing addHamster request: %s\n", err) 20 | return echo.NewHTTPError(http.StatusInternalServerError) 21 | } 22 | 23 | log.Printf("this is your hamster: %#v", hamster) 24 | return c.String(http.StatusOK, "we got your hamster!") 25 | } -------------------------------------------------------------------------------- /src/api/handlers/jwthandlers.go: -------------------------------------------------------------------------------- 1 | package handlers 2 | 3 | import ( 4 | "net/http" 5 | "log" 6 | 7 | "github.com/labstack/echo" 8 | "github.com/dgrijalva/jwt-go" 9 | ) 10 | 11 | func MainJwt(c echo.Context) error { 12 | user := c.Get("user") 13 | token := user.(*jwt.Token) 14 | 15 | claims := token.Claims.(jwt.MapClaims) 16 | 17 | log.Println("User Name: ", claims["name"], "User ID: ", claims["jti"]) 18 | 19 | return c.String(http.StatusOK, "you are on the top secret jwt page!") 20 | } -------------------------------------------------------------------------------- /src/api/jwtGroup.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "api/handlers" 5 | 6 | "github.com/labstack/echo" 7 | ) 8 | 9 | func JwtGroup(g *echo.Group) { 10 | g.GET("/main", handlers.MainJwt) 11 | } 12 | -------------------------------------------------------------------------------- /src/api/mainGroup.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "api/handlers" 5 | "github.com/labstack/echo" 6 | ) 7 | 8 | func MainGroup(e *echo.Echo) { 9 | e.GET("/login", handlers.Login) 10 | e.GET("/yallo", handlers.Yallo) 11 | e.GET("/cats/:data", handlers.GetCats) 12 | 13 | e.POST("/cats", handlers.AddCat) 14 | e.POST("/dogs", handlers.AddDog) 15 | e.POST("/hamsters", handlers.AddHamster) 16 | } 17 | -------------------------------------------------------------------------------- /src/api/middlewares/adminMiddlewares.go: -------------------------------------------------------------------------------- 1 | package middlewares 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "github.com/labstack/echo/middleware" 6 | ) 7 | 8 | func SetAdminMiddlewares(g *echo.Group) { 9 | // this logs the webserver interaction 10 | g.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ 11 | Format: `[${time_rfc3339}] ${status} ${method} ${host}${path} ${latency_human}` + "\n", 12 | })) 13 | 14 | g.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) { 15 | // check in the DB 16 | if username == "jack" && password == "1234" { 17 | return true, nil 18 | } 19 | 20 | return true, nil 21 | })) 22 | } 23 | -------------------------------------------------------------------------------- /src/api/middlewares/cookieMiddlewares.go: -------------------------------------------------------------------------------- 1 | package middlewares 2 | 3 | import ( 4 | "strings" 5 | "net/http" 6 | "log" 7 | 8 | "github.com/labstack/echo" 9 | ) 10 | 11 | func SetCookieMiddlewares(g *echo.Group) { 12 | g.Use(checkCookie) 13 | } 14 | 15 | func checkCookie(next echo.HandlerFunc) echo.HandlerFunc { 16 | return func(c echo.Context) error { 17 | cookie, err := c.Cookie("sessionID") 18 | if err != nil { 19 | if strings.Contains(err.Error(), "named cookie not present") { 20 | return c.String(http.StatusUnauthorized, "you dont have any cookie") 21 | } 22 | 23 | log.Println(err) 24 | return err 25 | } 26 | 27 | if cookie.Value == "some_string" { 28 | return next(c) 29 | } 30 | 31 | return c.String(http.StatusUnauthorized, "you dont have the right cookie, cookie") 32 | } 33 | } -------------------------------------------------------------------------------- /src/api/middlewares/jwtMiddlewares.go: -------------------------------------------------------------------------------- 1 | package middlewares 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "github.com/labstack/echo/middleware" 6 | ) 7 | 8 | func SetJwtMiddlewares(g *echo.Group) { 9 | g.Use(middleware.JWTWithConfig(middleware.JWTConfig{ 10 | SigningMethod: "HS512", 11 | SigningKey: []byte("mySecret"), 12 | })) 13 | } -------------------------------------------------------------------------------- /src/api/middlewares/mainMiddlewares.go: -------------------------------------------------------------------------------- 1 | package middlewares 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "github.com/labstack/echo/middleware" 6 | ) 7 | 8 | func SetMainMiddlewares(e *echo.Echo) { 9 | e.Use(middleware.StaticWithConfig(middleware.StaticConfig{ 10 | Root: "../static", 11 | })) 12 | 13 | e.Use(serverHeader) 14 | } 15 | 16 | func serverHeader(next echo.HandlerFunc) echo.HandlerFunc { 17 | return func(c echo.Context) error { 18 | c.Response().Header().Set(echo.HeaderServer, "BlueBot/1.0") 19 | c.Response().Header().Set("notReallyHeader", "thisHaveNoMeaning") 20 | 21 | return next(c) 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "router" 6 | ) 7 | 8 | func main() { 9 | fmt.Println("Welcome to the webserver") 10 | e := router.New() 11 | 12 | e.Start(":8000") 13 | } 14 | -------------------------------------------------------------------------------- /src/router/router.go: -------------------------------------------------------------------------------- 1 | package router 2 | 3 | import ( 4 | "api/middlewares" 5 | "github.com/labstack/echo" 6 | "api" 7 | ) 8 | 9 | func New() *echo.Echo { 10 | e := echo.New() 11 | 12 | // create groups 13 | adminGroup := e.Group("/admin") 14 | cookieGroup := e.Group("/cookie") 15 | jwtGroup := e.Group("/jwt") 16 | 17 | // set all middlewares 18 | middlewares.SetMainMiddlewares(e) 19 | middlewares.SetAdminMiddlewares(adminGroup) 20 | middlewares.SetCookieMiddlewares(cookieGroup) 21 | middlewares.SetJwtMiddlewares(jwtGroup) 22 | 23 | // set main routes 24 | api.MainGroup(e) 25 | 26 | // set group routes 27 | api.AdminGroup(adminGroup) 28 | api.CookieGroup(cookieGroup) 29 | api.JwtGroup(jwtGroup) 30 | 31 | return e 32 | } -------------------------------------------------------------------------------- /src/webserver/webserver.go: -------------------------------------------------------------------------------- 1 | package webserver 2 | 3 | import ( 4 | "sync" 5 | "router" 6 | "log" 7 | "github.com/labstack/echo" 8 | ) 9 | 10 | var initWebServer sync.Once 11 | var ws *WebServer 12 | 13 | type WebServer struct { 14 | router *echo.Echo 15 | } 16 | 17 | func Instance() *WebServer { 18 | initWebServer.Do(func() { 19 | ws = &WebServer{} 20 | ws.router = router.New() 21 | }) 22 | 23 | return ws 24 | } 25 | 26 | func (w *WebServer) Start() { 27 | // start the server 28 | 29 | var wg sync.WaitGroup 30 | 31 | wg.Add(1) 32 | go func() { 33 | defer wg.Done() 34 | log.Println("Start HTTP server on port :8000") 35 | log.Fatal(w.router.Start(":8000")) 36 | }() 37 | 38 | 39 | wg.Wait() 40 | } -------------------------------------------------------------------------------- /static/css/preloader.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | body { 3 | overflow: hidden; 4 | margin: auto; 5 | } 6 | 7 | /* Preloader */ 8 | #preloader { 9 | position: fixed; 10 | top: 0; 11 | left: 0; 12 | right: 0; 13 | bottom: 0; 14 | background-color: #363942; /* preloader background color */ 15 | z-index: 99; /* makes sure it stays on top */ 16 | } 17 | 18 | #status { 19 | color: #fff; 20 | font-size: 6em; 21 | text-align: center; 22 | position: absolute; 23 | width: 200px; 24 | height: 200px; 25 | left: 50%; /* centers the loading animation horizontally one the screen */ 26 | top: 55%; /* centers the loading animation vertically one the screen */ 27 | background-repeat: no-repeat; 28 | background-position: center; 29 | margin: -100px 0 0 -100px; /* is width and height divided by two */ 30 | } -------------------------------------------------------------------------------- /static/css/responsive.css: -------------------------------------------------------------------------------- 1 | /* Medium Devices, Desktops */ 2 | @media only screen and (max-width : 1024px) { 3 | /*HREO AREA */ 4 | #hero{max-height: 660px;} 5 | 6 | /* FEATURED CLIENTS SECTION*/ 7 | #clients img{height: 50px;} 8 | } 9 | 10 | /* Small Devices, Tablets */ 11 | @media only screen and (max-width : 980px) { 12 | 13 | /*HREO AREA */ 14 | #hero{height: 540px;} 15 | 16 | /*ABOUT SECTION*/ 17 | #about{padding-top: 40px;} 18 | 19 | /* FEATURED CLIENTS SECTION*/ 20 | #clients {text-align: center;} 21 | #clients img{height: 40px;} 22 | #clients ul{float: none;} 23 | #clients h4 {display: none;} 24 | 25 | /* PORTFOLIO SECTION */ 26 | #shotsByPlayerId li{width: 47%;} 27 | #shotsByPlayerId li:first-child{width: 97%;} 28 | 29 | .myphoto{text-align: center;} 30 | 31 | /*COLLUPSABLE NAVIGATION MENU*/ 32 | .navbar-header {float: none;} 33 | .navbar-left,.navbar-right {float: none !important;} 34 | .navbar-toggle {display: block;} 35 | .navbar-collapse.collapse {display: none!important;} 36 | .navbar-nav>li { 37 | float: none; 38 | padding-left: 30px; 39 | overflow: hidden; 40 | } 41 | .collapse.in{display:block !important;} 42 | } 43 | 44 | 45 | /* Mobile Devices */ 46 | @media only screen and (max-width : 640px) { 47 | 48 | h2 {font-size: 1.9em;} 49 | h3{font-size: 1.5em} 50 | h4{font-size: 1.1em;} 51 | 52 | 53 | .myphoto{display: none;} 54 | 55 | 56 | /*Hero area*/ 57 | #hero{height: 400px;} 58 | .herocontent{padding-top: 30px;} 59 | 60 | /*About section*/ 61 | #about{text-align: center;} 62 | 63 | /*Portfolio*/ 64 | #shotsByPlayerId li {width: 96%;} 65 | 66 | /*Footer*/ 67 | .footerlinks li{display: none;} 68 | } 69 | 70 | /* Smaller Mobile Devices */ 71 | @media only screen and (max-width : 480px) { 72 | #hero{height: 320px;} 73 | #clients {display: none;} 74 | .footersocial li{font-size: 1.5em} 75 | } 76 | 77 | /* Smallest Mobile Devices */ 78 | @media only screen and (max-width : 320px) { 79 | #hero{height: 480px;} 80 | .herocontent{padding-top: 100px; padding-bottom: 30px;} 81 | 82 | } 83 | 84 | 85 | -------------------------------------------------------------------------------- /static/css/simple-line-icons.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Simple-Line-Icons'; 3 | src:url('../fonts/Simple-Line-Icons.eot'); 4 | src:url('../fonts/Simple-Line-Icons.eot?#iefix') format('embedded-opentype'), 5 | url('../fonts/Simple-Line-Icons.woff') format('woff'), 6 | url('../fonts/Simple-Line-Icons.ttf') format('truetype'), 7 | url('../fonts/Simple-Line-Icons.svg#Simple-Line-Icons') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | 12 | /* Use the following CSS code if you want to use data attributes for inserting your icons */ 13 | [data-icon]:before { 14 | font-family: 'Simple-Line-Icons'; 15 | content: attr(data-icon); 16 | speak: none; 17 | font-weight: normal; 18 | font-variant: normal; 19 | text-transform: none; 20 | line-height: 1; 21 | -webkit-font-smoothing: antialiased; 22 | -moz-osx-font-smoothing: grayscale; 23 | } 24 | 25 | /* Use the following CSS code if you want to have a class per icon */ 26 | /* 27 | Instead of a list of all class selectors, 28 | you can use the generic selector below, but it's slower: 29 | [class*="icon-"] { 30 | */ 31 | .icon-user-female, .icon-user-follow, .icon-user-following, .icon-user-unfollow, .icon-trophy, .icon-screen-smartphone, .icon-screen-desktop, .icon-plane, .icon-notebook, .icon-moustache, .icon-mouse, .icon-magnet, .icon-energy, .icon-emoticon-smile, .icon-disc, .icon-cursor-move, .icon-crop, .icon-credit-card, .icon-chemistry, .icon-user, .icon-speedometer, .icon-social-youtube, .icon-social-twitter, .icon-social-tumblr, .icon-social-facebook, .icon-social-dropbox, .icon-social-dribbble, .icon-shield, .icon-screen-tablet, .icon-magic-wand, .icon-hourglass, .icon-graduation, .icon-ghost, .icon-game-controller, .icon-fire, .icon-eyeglasses, .icon-envelope-open, .icon-envelope-letter, .icon-bell, .icon-badge, .icon-anchor, .icon-wallet, .icon-vector, .icon-speech, .icon-puzzle, .icon-printer, .icon-present, .icon-playlist, .icon-pin, .icon-picture, .icon-map, .icon-layers, .icon-handbag, .icon-globe-alt, .icon-globe, .icon-frame, .icon-folder-alt, .icon-film, .icon-feed, .icon-earphones-alt, .icon-earphones, .icon-drop, .icon-drawer, .icon-docs, .icon-directions, .icon-direction, .icon-diamond, .icon-cup, .icon-compass, .icon-call-out, .icon-call-in, .icon-call-end, .icon-calculator, .icon-bubbles, .icon-briefcase, .icon-book-open, .icon-basket-loaded, .icon-basket, .icon-bag, .icon-action-undo, .icon-action-redo, .icon-wrench, .icon-umbrella, .icon-trash, .icon-tag, .icon-support, .icon-size-fullscreen, .icon-size-actual, .icon-shuffle, .icon-share-alt, .icon-share, .icon-rocket, .icon-question, .icon-pie-chart, .icon-pencil, .icon-note, .icon-music-tone-alt, .icon-music-tone, .icon-microphone, .icon-loop, .icon-logout, .icon-login, .icon-list, .icon-like, .icon-home, .icon-grid, .icon-graph, .icon-equalizer, .icon-dislike, .icon-cursor, .icon-control-start, .icon-control-rewind, .icon-control-play, .icon-control-pause, .icon-control-forward, .icon-control-end, .icon-calendar, .icon-bulb, .icon-bar-chart, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .icon-ban, .icon-bubble, .icon-camcorder, .icon-camera, .icon-check, .icon-clock, .icon-close, .icon-cloud-download, .icon-cloud-upload, .icon-doc, .icon-envelope, .icon-eye, .icon-flag, .icon-folder, .icon-heart, .icon-info, .icon-key, .icon-link, .icon-lock, .icon-lock-open, .icon-magnifier, .icon-magnifier-add, .icon-magnifier-remove, .icon-paper-clip, .icon-paper-plane, .icon-plus, .icon-pointer, .icon-power, .icon-refresh, .icon-reload, .icon-settings, .icon-star, .icon-symbol-female, .icon-symbol-male, .icon-target, .icon-volume-1, .icon-volume-2, .icon-volume-off, .icon-users { 32 | font-family: 'Simple-Line-Icons'; 33 | speak: none; 34 | font-style: normal; 35 | font-weight: normal; 36 | font-variant: normal; 37 | text-transform: none; 38 | line-height: 1; 39 | -webkit-font-smoothing: antialiased; 40 | } 41 | .icon-user-female:before { 42 | content: "\e000"; 43 | } 44 | .icon-user-follow:before { 45 | content: "\e002"; 46 | } 47 | .icon-user-following:before { 48 | content: "\e003"; 49 | } 50 | .icon-user-unfollow:before { 51 | content: "\e004"; 52 | } 53 | .icon-trophy:before { 54 | content: "\e006"; 55 | } 56 | .icon-screen-smartphone:before { 57 | content: "\e010"; 58 | } 59 | .icon-screen-desktop:before { 60 | content: "\e011"; 61 | } 62 | .icon-plane:before { 63 | content: "\e012"; 64 | } 65 | .icon-notebook:before { 66 | content: "\e013"; 67 | } 68 | .icon-moustache:before { 69 | content: "\e014"; 70 | } 71 | .icon-mouse:before { 72 | content: "\e015"; 73 | } 74 | .icon-magnet:before { 75 | content: "\e016"; 76 | } 77 | .icon-energy:before { 78 | content: "\e020"; 79 | } 80 | .icon-emoticon-smile:before { 81 | content: "\e021"; 82 | } 83 | .icon-disc:before { 84 | content: "\e022"; 85 | } 86 | .icon-cursor-move:before { 87 | content: "\e023"; 88 | } 89 | .icon-crop:before { 90 | content: "\e024"; 91 | } 92 | .icon-credit-card:before { 93 | content: "\e025"; 94 | } 95 | .icon-chemistry:before { 96 | content: "\e026"; 97 | } 98 | .icon-user:before { 99 | content: "\e005"; 100 | } 101 | .icon-speedometer:before { 102 | content: "\e007"; 103 | } 104 | .icon-social-youtube:before { 105 | content: "\e008"; 106 | } 107 | .icon-social-twitter:before { 108 | content: "\e009"; 109 | } 110 | .icon-social-tumblr:before { 111 | content: "\e00a"; 112 | } 113 | .icon-social-facebook:before { 114 | content: "\e00b"; 115 | } 116 | .icon-social-dropbox:before { 117 | content: "\e00c"; 118 | } 119 | .icon-social-dribbble:before { 120 | content: "\e00d"; 121 | } 122 | .icon-shield:before { 123 | content: "\e00e"; 124 | } 125 | .icon-screen-tablet:before { 126 | content: "\e00f"; 127 | } 128 | .icon-magic-wand:before { 129 | content: "\e017"; 130 | } 131 | .icon-hourglass:before { 132 | content: "\e018"; 133 | } 134 | .icon-graduation:before { 135 | content: "\e019"; 136 | } 137 | .icon-ghost:before { 138 | content: "\e01a"; 139 | } 140 | .icon-game-controller:before { 141 | content: "\e01b"; 142 | } 143 | .icon-fire:before { 144 | content: "\e01c"; 145 | } 146 | .icon-eyeglasses:before { 147 | content: "\e01d"; 148 | } 149 | .icon-envelope-open:before { 150 | content: "\e01e"; 151 | } 152 | .icon-envelope-letter:before { 153 | content: "\e01f"; 154 | } 155 | .icon-bell:before { 156 | content: "\e027"; 157 | } 158 | .icon-badge:before { 159 | content: "\e028"; 160 | } 161 | .icon-anchor:before { 162 | content: "\e029"; 163 | } 164 | .icon-wallet:before { 165 | content: "\e02a"; 166 | } 167 | .icon-vector:before { 168 | content: "\e02b"; 169 | } 170 | .icon-speech:before { 171 | content: "\e02c"; 172 | } 173 | .icon-puzzle:before { 174 | content: "\e02d"; 175 | } 176 | .icon-printer:before { 177 | content: "\e02e"; 178 | } 179 | .icon-present:before { 180 | content: "\e02f"; 181 | } 182 | .icon-playlist:before { 183 | content: "\e030"; 184 | } 185 | .icon-pin:before { 186 | content: "\e031"; 187 | } 188 | .icon-picture:before { 189 | content: "\e032"; 190 | } 191 | .icon-map:before { 192 | content: "\e033"; 193 | } 194 | .icon-layers:before { 195 | content: "\e034"; 196 | } 197 | .icon-handbag:before { 198 | content: "\e035"; 199 | } 200 | .icon-globe-alt:before { 201 | content: "\e036"; 202 | } 203 | .icon-globe:before { 204 | content: "\e037"; 205 | } 206 | .icon-frame:before { 207 | content: "\e038"; 208 | } 209 | .icon-folder-alt:before { 210 | content: "\e039"; 211 | } 212 | .icon-film:before { 213 | content: "\e03a"; 214 | } 215 | .icon-feed:before { 216 | content: "\e03b"; 217 | } 218 | .icon-earphones-alt:before { 219 | content: "\e03c"; 220 | } 221 | .icon-earphones:before { 222 | content: "\e03d"; 223 | } 224 | .icon-drop:before { 225 | content: "\e03e"; 226 | } 227 | .icon-drawer:before { 228 | content: "\e03f"; 229 | } 230 | .icon-docs:before { 231 | content: "\e040"; 232 | } 233 | .icon-directions:before { 234 | content: "\e041"; 235 | } 236 | .icon-direction:before { 237 | content: "\e042"; 238 | } 239 | .icon-diamond:before { 240 | content: "\e043"; 241 | } 242 | .icon-cup:before { 243 | content: "\e044"; 244 | } 245 | .icon-compass:before { 246 | content: "\e045"; 247 | } 248 | .icon-call-out:before { 249 | content: "\e046"; 250 | } 251 | .icon-call-in:before { 252 | content: "\e047"; 253 | } 254 | .icon-call-end:before { 255 | content: "\e048"; 256 | } 257 | .icon-calculator:before { 258 | content: "\e049"; 259 | } 260 | .icon-bubbles:before { 261 | content: "\e04a"; 262 | } 263 | .icon-briefcase:before { 264 | content: "\e04b"; 265 | } 266 | .icon-book-open:before { 267 | content: "\e04c"; 268 | } 269 | .icon-basket-loaded:before { 270 | content: "\e04d"; 271 | } 272 | .icon-basket:before { 273 | content: "\e04e"; 274 | } 275 | .icon-bag:before { 276 | content: "\e04f"; 277 | } 278 | .icon-action-undo:before { 279 | content: "\e050"; 280 | } 281 | .icon-action-redo:before { 282 | content: "\e051"; 283 | } 284 | .icon-wrench:before { 285 | content: "\e052"; 286 | } 287 | .icon-umbrella:before { 288 | content: "\e053"; 289 | } 290 | .icon-trash:before { 291 | content: "\e054"; 292 | } 293 | .icon-tag:before { 294 | content: "\e055"; 295 | } 296 | .icon-support:before { 297 | content: "\e056"; 298 | } 299 | .icon-size-fullscreen:before { 300 | content: "\e057"; 301 | } 302 | .icon-size-actual:before { 303 | content: "\e058"; 304 | } 305 | .icon-shuffle:before { 306 | content: "\e059"; 307 | } 308 | .icon-share-alt:before { 309 | content: "\e05a"; 310 | } 311 | .icon-share:before { 312 | content: "\e05b"; 313 | } 314 | .icon-rocket:before { 315 | content: "\e05c"; 316 | } 317 | .icon-question:before { 318 | content: "\e05d"; 319 | } 320 | .icon-pie-chart:before { 321 | content: "\e05e"; 322 | } 323 | .icon-pencil:before { 324 | content: "\e05f"; 325 | } 326 | .icon-note:before { 327 | content: "\e060"; 328 | } 329 | .icon-music-tone-alt:before { 330 | content: "\e061"; 331 | } 332 | .icon-music-tone:before { 333 | content: "\e062"; 334 | } 335 | .icon-microphone:before { 336 | content: "\e063"; 337 | } 338 | .icon-loop:before { 339 | content: "\e064"; 340 | } 341 | .icon-logout:before { 342 | content: "\e065"; 343 | } 344 | .icon-login:before { 345 | content: "\e066"; 346 | } 347 | .icon-list:before { 348 | content: "\e067"; 349 | } 350 | .icon-like:before { 351 | content: "\e068"; 352 | } 353 | .icon-home:before { 354 | content: "\e069"; 355 | } 356 | .icon-grid:before { 357 | content: "\e06a"; 358 | } 359 | .icon-graph:before { 360 | content: "\e06b"; 361 | } 362 | .icon-equalizer:before { 363 | content: "\e06c"; 364 | } 365 | .icon-dislike:before { 366 | content: "\e06d"; 367 | } 368 | .icon-cursor:before { 369 | content: "\e06e"; 370 | } 371 | .icon-control-start:before { 372 | content: "\e06f"; 373 | } 374 | .icon-control-rewind:before { 375 | content: "\e070"; 376 | } 377 | .icon-control-play:before { 378 | content: "\e071"; 379 | } 380 | .icon-control-pause:before { 381 | content: "\e072"; 382 | } 383 | .icon-control-forward:before { 384 | content: "\e073"; 385 | } 386 | .icon-control-end:before { 387 | content: "\e074"; 388 | } 389 | .icon-calendar:before { 390 | content: "\e075"; 391 | } 392 | .icon-bulb:before { 393 | content: "\e076"; 394 | } 395 | .icon-bar-chart:before { 396 | content: "\e077"; 397 | } 398 | .icon-arrow-up:before { 399 | content: "\e078"; 400 | } 401 | .icon-arrow-right:before { 402 | content: "\e079"; 403 | } 404 | .icon-arrow-left:before { 405 | content: "\e07a"; 406 | } 407 | .icon-arrow-down:before { 408 | content: "\e07b"; 409 | } 410 | .icon-ban:before { 411 | content: "\e07c"; 412 | } 413 | .icon-bubble:before { 414 | content: "\e07d"; 415 | } 416 | .icon-camcorder:before { 417 | content: "\e07e"; 418 | } 419 | .icon-camera:before { 420 | content: "\e07f"; 421 | } 422 | .icon-check:before { 423 | content: "\e080"; 424 | } 425 | .icon-clock:before { 426 | content: "\e081"; 427 | } 428 | .icon-close:before { 429 | content: "\e082"; 430 | } 431 | .icon-cloud-download:before { 432 | content: "\e083"; 433 | } 434 | .icon-cloud-upload:before { 435 | content: "\e084"; 436 | } 437 | .icon-doc:before { 438 | content: "\e085"; 439 | } 440 | .icon-envelope:before { 441 | content: "\e086"; 442 | } 443 | .icon-eye:before { 444 | content: "\e087"; 445 | } 446 | .icon-flag:before { 447 | content: "\e088"; 448 | } 449 | .icon-folder:before { 450 | content: "\e089"; 451 | } 452 | .icon-heart:before { 453 | content: "\e08a"; 454 | } 455 | .icon-info:before { 456 | content: "\e08b"; 457 | } 458 | .icon-key:before { 459 | content: "\e08c"; 460 | } 461 | .icon-link:before { 462 | content: "\e08d"; 463 | } 464 | .icon-lock:before { 465 | content: "\e08e"; 466 | } 467 | .icon-lock-open:before { 468 | content: "\e08f"; 469 | } 470 | .icon-magnifier:before { 471 | content: "\e090"; 472 | } 473 | .icon-magnifier-add:before { 474 | content: "\e091"; 475 | } 476 | .icon-magnifier-remove:before { 477 | content: "\e092"; 478 | } 479 | .icon-paper-clip:before { 480 | content: "\e093"; 481 | } 482 | .icon-paper-plane:before { 483 | content: "\e094"; 484 | } 485 | .icon-plus:before { 486 | content: "\e095"; 487 | } 488 | .icon-pointer:before { 489 | content: "\e096"; 490 | } 491 | .icon-power:before { 492 | content: "\e097"; 493 | } 494 | .icon-refresh:before { 495 | content: "\e098"; 496 | } 497 | .icon-reload:before { 498 | content: "\e099"; 499 | } 500 | .icon-settings:before { 501 | content: "\e09a"; 502 | } 503 | .icon-star:before { 504 | content: "\e09b"; 505 | } 506 | .icon-symbol-female:before { 507 | content: "\e09c"; 508 | } 509 | .icon-symbol-male:before { 510 | content: "\e09d"; 511 | } 512 | .icon-target:before { 513 | content: "\e09e"; 514 | } 515 | .icon-volume-1:before { 516 | content: "\e09f"; 517 | } 518 | .icon-volume-2:before { 519 | content: "\e0a0"; 520 | } 521 | .icon-volume-off:before { 522 | content: "\e0a1"; 523 | } 524 | .icon-users:before { 525 | content: "\e001"; 526 | } -------------------------------------------------------------------------------- /static/css/style.css: -------------------------------------------------------------------------------- 1 | *{ -webkit-transition: .7s ease-out; 2 | -moz-transition: .7s ease-out; 3 | -o-transition: .7s ease-out; 4 | transition: .7s ease-out; 5 | list-style: none; 6 | } 7 | 8 | /*================================ 9 | TYPOGRAPHY 10 | ================================*/ 11 | body { 12 | font-family: 'Raleway', sans-serif; 13 | line-height: 1.8em; 14 | } 15 | 16 | .bigicon {font-size: 3em;} 17 | h2{font-size: 42px;} 18 | h3{font-size: 28px;} 19 | h4{font-size: 18px; line-height: 1.4em;} 20 | 21 | p{ 22 | letter-spacing: 1px; 23 | color: #c3c3c3; 24 | font-weight: lighter; 25 | } 26 | 27 | 28 | /*================================ 29 | DEFAULT STYLE & FORMATING 30 | ================================*/ 31 | ul{padding: 0;} 32 | a{color: #ea9312} 33 | a:hover{color: #c3c3c3; text-decoration: none;} 34 | 35 | #services{text-align: center;} 36 | .col-md-4, .col-md-6{padding-bottom: 50px;} 37 | .col-md-3 {padding: 0;} 38 | 39 | .sectionhead{ 40 | text-align: center; 41 | padding-top: 100px; 42 | padding-bottom: 50px; 43 | } 44 | 45 | hr.separetor{ 46 | width: 80px; 47 | color: #363942; 48 | border-top: 2px solid #ea9312; 49 | } 50 | 51 | 52 | .btn-default{ 53 | background: none; 54 | border: none; 55 | text-transform: uppercase; 56 | margin: 50px 0; 57 | color: #c3c3c3; 58 | letter-spacing: 2px; 59 | } 60 | 61 | .btn-default:hover{ 62 | background: none; 63 | color: #ea9312; 64 | } 65 | 66 | .btnicon, .brandicon{ 67 | margin-right: 10px; 68 | } 69 | 70 | 71 | /*================================ 72 | HERO AREA 73 | ================================*/ 74 | #hero{ 75 | color: #fff; 76 | text-align: center; 77 | background: url(../img/trianglify-background.svg)no-repeat; /*your background image*/ 78 | background-size: cover; 79 | max-height: 880px; 80 | overflow: hidden; 81 | } 82 | 83 | .herocontent{ 84 | padding-top: 100px; 85 | width: 100%; 86 | max-width: 900px; 87 | } 88 | .heroshot{ 89 | margin-top: 20px; 90 | width: 100%; 91 | max-width: 1200px; 92 | 93 | } 94 | 95 | /*================================ 96 | CLIENTS SECTION 97 | ================================*/ 98 | #clients{ 99 | padding-top: 30px; 100 | } 101 | #clients h4{ 102 | text-transooteorm: uppercase; 103 | padding-top: 10px; 104 | } 105 | 106 | #clients .col-md-4{ 107 | padding-bottom: 0; 108 | } 109 | 110 | #clients ul{float: right} 111 | 112 | #clients li{ 113 | display: inline; 114 | margin-right: 35px; 115 | } 116 | 117 | #clients li:last-child{ 118 | margin-right: 0px; 119 | } 120 | 121 | 122 | /*================================ 123 | ABOUT SECTION 124 | ================================*/ 125 | #about{padding-top: 100px;} 126 | 127 | .myapps{margin-top: 25px;} 128 | .myapps li{display: inline} 129 | .myapps li img{ 130 | width: 30px; 131 | } 132 | 133 | /*================================ 134 | PORTFOLIO SECTION 135 | ================================*/ 136 | #portfolio{ 137 | background: #efefef; 138 | margin-top: 50px; 139 | padding: 30px 0; 140 | text-align: center; 141 | } 142 | 143 | #shotsByPlayerId li{ 144 | width: 31%; 145 | float: left; 146 | padding: 15px; 147 | margin: 10px; 148 | background: #fff; 149 | border-radius: 5px; 150 | } 151 | 152 | #shotsByPlayerId li:hover{ 153 | box-shadow: 1px 2px 25px rgba(160, 160, 160, 0.4); 154 | -webkit-transition: .7s ease-out; 155 | -moz-transition: .7s ease-out; 156 | -o-transition: .7s ease-out; 157 | transition: .7s ease-out; 158 | } 159 | 160 | #shotsByPlayerId li img{ 161 | width: 100%; 162 | border-radius: 5px; 163 | } 164 | 165 | #shotsByPlayerId img:hover{ 166 | opacity: .5; 167 | overflow: hidden; 168 | } 169 | 170 | #shotsByPlayerId a:hover{color: #ea9312;} 171 | 172 | #shotsByPlayerId h3{ 173 | text-align: left; 174 | font-size: 14px; 175 | letter-spacing: 1px; 176 | text-transform: uppercase; 177 | font-weight: normal; 178 | white-space: nowrap; 179 | width: 100%; 180 | overflow: hidden; 181 | text-overflow: ellipsis;} 182 | 183 | #shotsByPlayerId h3 a{color: #363942;} 184 | 185 | .likecount a{float: left; color: #c3c3c3;} 186 | .commentcount a{float: right; color: #c3c3c3;} 187 | 188 | /*================================ 189 | TESTIMONIAL SECTION 190 | ================================*/ 191 | 192 | .clientsphoto img{ 193 | width: 80px; 194 | float: left; 195 | margin-right: 20px; 196 | border-radius: 50%; 197 | } 198 | 199 | .clientsphoto img:hover{ 200 | border-radius: 15%; 201 | } 202 | 203 | blockquote{ 204 | margin: 0; 205 | padding: 0 0 10px 0; 206 | border: none; 207 | } 208 | 209 | blockquote p{ 210 | font-style: italic; 211 | font-size: 14px; 212 | } 213 | 214 | .quote{overflow: hidden} 215 | .quote h5{margin-bottom: 5px;} 216 | 217 | 218 | /*================================ 219 | FOOTER SECTION 220 | ================================*/ 221 | 222 | footer{ 223 | text-align: center; 224 | padding: 50px 0; 225 | background: #363942; 226 | } 227 | 228 | footer p, footer .bigicon {color: #7e7e7e;} 229 | 230 | .footerlinks{margin: 30px 0;} 231 | .footerlinks li{ 232 | display: inline; 233 | padding: 10px; 234 | text-transform: uppercase; 235 | letter-spacing: 3px; 236 | } 237 | 238 | .footersocial {margin-top: 30px;} 239 | 240 | .footersocial li{ 241 | display:inline; 242 | padding: 0 15px; 243 | font-size: 2em; 244 | } 245 | 246 | .footersocial li a {color: #7e7e7e;} 247 | .footersocial li a:hover {color: #ea9312;} 248 | 249 | /*================================ 250 | FOLLOW BUTTON 251 | ================================*/ 252 | .dribbble-follow-button { 253 | display: inline-block; 254 | margin-top: 15px; 255 | } 256 | 257 | .dribbble-follow-button .label, .dribbble-follow-button .count { 258 | font: bold 11px/18px 'Helvetica Neue', Helvetica, Arial, sans-serif; 259 | color: #333; 260 | border: 1px solid #ccc; 261 | text-decoration: none; 262 | display: inline-block; 263 | position: relative; 264 | border-radius: 3px; 265 | } 266 | 267 | .dribbble-follow-button .label { 268 | padding: 0 3px 0 1px; 269 | white-space: nowrap; 270 | background: #e3e3e3; 271 | background: linear-gradient(top, white, #dedede); 272 | } 273 | 274 | .dribbble-follow-button .label i { 275 | height: 18px; 276 | width: 18px; 277 | float: left; 278 | background: url(../img/icon.png) no-repeat top left; 279 | } 280 | 281 | .dribbble-follow-button .label:hover { 282 | border-color: #bbb; 283 | background: #fff; 284 | color: #333; 285 | } 286 | 287 | .dribbble-follow-button .label:active { 288 | box-shadow: 0 1px 5px rgba(0,0,0,.15) inset; 289 | } 290 | 291 | .dribbble-follow-button .count { 292 | margin-left: 5px; 293 | padding: 0 3px; 294 | color: #333; 295 | border-color: #bbb; 296 | font-weight: normal; 297 | background: white; 298 | } 299 | 300 | .dribbble-follow-button .count:hover { 301 | text-decoration: underline; 302 | } 303 | 304 | .dribbble-follow-button .count > * { 305 | top: 50%; 306 | left: 0; 307 | margin: -4px 0 0 -4px; 308 | border: 4px solid transparent; 309 | border-right-color: #aaa; 310 | border-left: 0; 311 | position: absolute; 312 | } 313 | 314 | .dribbble-follow-button .count u { 315 | margin-left: -3px; 316 | border-right-color: white; 317 | } 318 | 319 | -------------------------------------------------------------------------------- /static/fonts/Simple-Line-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/fonts/Simple-Line-Icons.eot -------------------------------------------------------------------------------- /static/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /static/fonts/Simple-Line-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/fonts/Simple-Line-Icons.woff -------------------------------------------------------------------------------- /static/img/after_effects.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/amazon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/amazon.png -------------------------------------------------------------------------------- /static/img/apple-touch-icon-ipad-retina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/apple-touch-icon-ipad-retina.png -------------------------------------------------------------------------------- /static/img/apple-touch-icon-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/apple-touch-icon-ipad.png -------------------------------------------------------------------------------- /static/img/apple-touch-icon-iphone-retina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/apple-touch-icon-iphone-retina.png -------------------------------------------------------------------------------- /static/img/apple-touch-icon-iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/apple-touch-icon-iphone.png -------------------------------------------------------------------------------- /static/img/bill.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/bill.jpg -------------------------------------------------------------------------------- /static/img/curb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/curb.png -------------------------------------------------------------------------------- /static/img/dan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/dan.jpg -------------------------------------------------------------------------------- /static/img/elance-odesk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/elance-odesk.png -------------------------------------------------------------------------------- /static/img/eric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/eric.png -------------------------------------------------------------------------------- /static/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/favicon.png -------------------------------------------------------------------------------- /static/img/flash.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/hero-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/hero-img.png -------------------------------------------------------------------------------- /static/img/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/icon.png -------------------------------------------------------------------------------- /static/img/illustrator.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/indesign.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/payoneer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/payoneer.png -------------------------------------------------------------------------------- /static/img/photoshop.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/ramil.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/ramil.jpg -------------------------------------------------------------------------------- /static/img/s1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/s1.png -------------------------------------------------------------------------------- /static/img/s2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/s2.png -------------------------------------------------------------------------------- /static/img/s3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/s3.png -------------------------------------------------------------------------------- /static/img/s4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/s4.png -------------------------------------------------------------------------------- /static/img/s5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/s5.png -------------------------------------------------------------------------------- /static/img/s6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/s6.png -------------------------------------------------------------------------------- /static/img/trianglify-background.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verybluebot/echo-server-tutorial/ef058839e06fe20dbc0597a7a548af9b9966c92e/static/img/user.png -------------------------------------------------------------------------------- /static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 20 | 21 | 24 | Drifolio Bootstrap 25 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 47 | 48 | 49 | 52 | 53 | 54 | 55 | 56 | 60 | 61 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
73 |
74 |
75 |
76 |
77 | 78 |
79 | 82 |
83 |
84 |

Drifolio the Awesome

85 |

Exclusively crafted for the super lazy designers like me who designed thousand of websites till today but never got a chance to build one himself.

86 |
87 | 88 | 89 | Featured Work 90 |
91 | 92 | 95 | 128 |
129 | 130 | 133 |
134 |
135 |
136 |

Proudly worked with:

137 |
138 |
139 |
    140 |
  • Payoneer
  • 141 |
  • Amazon
  • 142 |
  • Elance-oDesk
  • 143 |
  • Curb Envy
  • 144 |
145 |
146 |
147 |
148 |
149 | 150 | 151 | 154 |
155 | 156 | 157 |
158 |
159 |

I'm Mamun Srizon from Bangladesh

160 | 161 |

A freelance UI/UX wizard as well as a Daydreamer who workes on the Graveyard Shift and sleeps all the day!

162 | 163 |

I'm gonna build me an airport, put my name on it. Why, Michael? So you can fly away from your feelings? I don't care if it takes from now till the end of Shrimpfest.

164 |

Bugger bag egg's old boy willy jolly scrote munta skive pillock, bloody shambles nose rag blummin' scrote narky ever so, Lorem ipsum dolor sit amet, consectetur adipisicing elit.

165 | 166 | Follow 167 |
168 | 169 | 170 |
171 |
Tools and apps I use everyday:
172 | 173 |
    174 |
  • Photoshop
  • 175 |
  • Illustrator
  • 176 |
  • Adobe Flash
  • 177 |
  • After Effects
  • 178 |
  • InDesign
  • 179 |
180 |
181 |
182 | 183 | 184 | 185 |
186 | Mamun Srizon 187 |
188 |
189 | 190 |
191 | 192 | 195 |
196 | 197 | 198 |
199 | 200 |

This is what I can do for you

201 |
202 |
203 | 204 | 205 |
206 |
207 | 208 |

Responsive Web Design

209 |

Grinder affogato, dark, sweet carajillo, flavour seasonal aroma single origin cream. Percolator. Eligendi impedit dolores nulla.

210 |
211 | 212 |
213 | 214 |

Android App Design

215 |

Grinder affogato, dark, sweet carajillo, flavour seasonal aroma single origin cream. Percolator. Eligendi impedit dolores nulla.

216 |
217 | 218 |
219 | 220 |

iOS App Design

221 |

Grinder affogato, dark, sweet carajillo, flavour seasonal aroma single origin cream. Percolator. Eligendi impedit dolores nulla.

222 |
223 | 224 |
225 | 226 |

Windows App Design

227 |

Grinder affogato, dark, sweet carajillo, flavour seasonal aroma single origin cream. Percolator. Eligendi impedit dolores nulla.

228 |
229 | 230 |
231 | 232 |

Brand Identity Design

233 |

Grinder affogato, dark, sweet carajillo, flavour seasonal aroma single origin cream. Percolator. Eligendi impedit dolores nulla.

234 |
235 | 236 |
237 | 238 |

CMYK Print Design

239 |

Grinder affogato, dark, sweet carajillo, flavour seasonal aroma single origin cream. Percolator. Eligendi impedit dolores nulla.

240 |
241 |
242 |
243 | 244 | 247 |
248 |
249 | 250 |

A few recent works

251 |
252 |
253 | 254 | 255 |
256 | 257 |
258 | 259 | 260 | 261 | 262 | View all items 263 | 264 |
265 | 266 | 269 |
270 |
271 | 272 |

This is what I love to listen

273 |

Expedita nobis natus doloribus blanditiis quos, atque voluptatem, veritatis soluta eveniet ea!

274 |
275 |
276 | 277 | 278 |
279 | 280 |
281 |
282 | Dan 283 |
284 | 285 |
286 |
287 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quia et pariatur ipsam tempora officia ea iusto expedita, nulla, hic odit saepe repellat nesciunt dolorum, officiis laborum ad, aliquam. Quos, et.

288 |
289 |
Dan Cederholm
290 |

Co-Founder, Dribbble

291 |
292 |
293 | 294 | 295 |
296 |
297 | Bill 298 |
299 | 300 |
301 |
302 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quia et pariatur ipsam tempora officia ea iusto expedita, nulla, hic odit saepe repellat nesciunt dolorum, officiis laborum ad, aliquam. Quos, et. lorem

303 |
304 |
Bill S Kenney
305 |

Art Director at Focus Lab LLC.

306 |
307 |
308 | 309 | 310 |
311 |
312 | Eric 313 |
314 | 315 |
316 |
317 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quia et pariatur ipsam tempora officia ea iusto expedita, nulla, hic odit saepe repellat nesciunt dolorum, officiis laborum ad, aliquam. Quos, et.

318 |
319 |
Eric Hoffman
320 |

Principal Designer, JellyJar

321 |
322 |
323 | 324 | 325 |
326 |
327 | Ramil 328 |
329 | 330 |
331 |
332 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quia et pariatur ipsam tempora officia ea iusto expedita, nulla, hic odit saepe repellat nesciunt dolorum, officiis laborum ad, aliquam. Quos, et.

333 |
334 |
Ramil Derogongun
335 |

Visual Designer, Bluroon

336 |
337 |
338 |
339 |
340 | 341 | 344 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | -------------------------------------------------------------------------------- /static/js/drifolio.js: -------------------------------------------------------------------------------- 1 | //========================================================== 2 | //Replace srizon with your dribbble username 3 | //========================================================== 4 | $.jribbble.getShotsByPlayerId('srizon', function (playerShots) { 5 | var html = []; 6 | 7 | 8 | //======================== 9 | //PORTFOLIO SETUP 10 | //======================== 11 | $.each(playerShots.shots, function (i, shot) { 12 | html.push('
  • '); 13 | html.push(''); 15 | html.push('

    ' + shot.title + '

    '); 16 | html.push('
    ' + shot.likes_count + '
    '); 17 | html.push('
    ' + shot.comments_count + '
  • '); 18 | }); 19 | 20 | $('#shotsByPlayerId').html(html.join('')); 21 | }, {page: 1, per_page: 9}); 22 | 23 | //======================== 24 | //Follow button 25 | //======================== 26 | 27 | $(function() { 28 | 29 | 30 | // SOME VARIABLES 31 | var button = '.dribbble-follow-button', 32 | label = $(button).text(), 33 | username = $('a'+button).attr('href').toLowerCase().replace('http://dribbble.com/', ''), 34 | disableCount = $(button).attr('class'); 35 | 36 | // DISPLAYED WHEN THE API IS NOT RESPONDING 37 | $(button).wrap('
    ').removeClass().addClass('label').html(' '+label); 38 | 39 | // REQUESTS USER'S DATA FROM DRIBBBLE'S API AND APPENDS IT 40 | $.getJSON('http://api.dribbble.com/players/'+username+'?callback=?', function(data) { 41 | $(button).wrap('
    ') 42 | .parent().html(''+label+''+data.followers_count+' followers'); 43 | $(button+'.disableCount').find('.count').remove(); 44 | }); 45 | 46 | }); 47 | 48 | 49 | //======================== 50 | //PRELOADER 51 | //======================== 52 | $(window).load(function() { // makes sure the whole site is loaded 53 | $('#status').fadeOut(); // will first fade out the loading animation 54 | $('#preloader').delay(350).fadeOut('slow'); 55 | // will fade out the white DIV that covers the website. 56 | $('body').delay(350).css({'overflow':'visible'}); 57 | }) 58 | //======================== 59 | //CUSTOM SCROLLBAR 60 | //======================== 61 | $("html").niceScroll({ 62 | mousescrollstep: 70, 63 | cursorcolor: "#ea9312", 64 | cursorwidth: "5px", 65 | cursorborderradius: "10px", 66 | cursorborder: "none", 67 | }); 68 | 69 | 70 | //======================== 71 | //SMOOTHSCROLL 72 | //======================== 73 | $(function() { 74 | $('a[href*=#]:not([href=#])').click(function() { 75 | if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) { 76 | var target = $(this.hash); 77 | target = target.length ? target : $('[name=' + this.hash.slice(1) +']'); 78 | if (target.length) { 79 | $('html,body').animate({ 80 | scrollTop: target.offset().top 81 | }, 1000); 82 | return false; 83 | } 84 | } 85 | }); 86 | }); 87 | 88 | 89 | //======================== 90 | //NAVBAR 91 | //======================== 92 | (function ($) { 93 | $(document).ready(function(){ 94 | 95 | // hide .navbar first 96 | $(".navbar").hide(); 97 | 98 | // fade in .navbar 99 | $(function () { 100 | $(window).scroll(function () { 101 | 102 | // set distance user needs to scroll before we start fadeIn 103 | if ($(this).scrollTop() > 40) { 104 | $('.navbar') 105 | .removeClass('animated fadeOutUp') 106 | .addClass('animated fadeInDown') 107 | .fadeIn(); 108 | 109 | } else { 110 | $('.navbar') 111 | .removeClass('animated fadeInDown') 112 | .addClass('animated fadeOutUp') 113 | .fadeOut(); 114 | } 115 | }); 116 | }); 117 | 118 | }); 119 | }(jQuery)); 120 | 121 | //======================== 122 | //icon hover effect 123 | //======================== 124 | $('#services img').hover( 125 | function(){ $(this).addClass('animated pulse') }, 126 | function(){ $(this).removeClass('animated pulse') }) -------------------------------------------------------------------------------- /static/js/jquery.easing.min.js: -------------------------------------------------------------------------------- 1 | jQuery.easing["jswing"]=jQuery.easing["swing"];jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(x,t,b,c,d){return jQuery.easing[jQuery.easing.def](x,t,b,c,d)},easeInQuad:function(x,t,b,c,d){return c*(t/=d)*t+b},easeOutQuad:function(x,t,b,c,d){return-c*(t/=d)*(t-2)+b},easeInOutQuad:function(x,t,b,c,d){if((t/=d/2)<1)return c/2*t*t+b;return-c/2*(--t*(t-2)-1)+b},easeInCubic:function(x,t,b,c,d){return c*(t/=d)*t*t+b},easeOutCubic:function(x,t,b,c,d){return c*((t=t/d-1)*t*t+1)+b},easeInOutCubic:function(x,t,b,c,d){if((t/=d/2)<1)return c/2*t*t*t+b;return c/2*((t-=2)*t*t+2)+b},easeInQuart:function(x,t,b,c,d){return c*(t/=d)*t*t*t+b},easeOutQuart:function(x,t,b,c,d){return-c*((t=t/d-1)*t*t*t-1)+b},easeInOutQuart:function(x,t,b,c,d){if((t/=d/2)<1)return c/2*t*t*t*t+b;return-c/2*((t-=2)*t*t*t-2)+b},easeInQuint:function(x,t,b,c,d){return c*(t/=d)*t*t*t*t+b},easeOutQuint:function(x,t,b,c,d){return c*((t=t/d-1)*t*t*t*t+1)+b},easeInOutQuint:function(x,t,b,c,d){if((t/=d/2)<1)return c/2*t*t*t*t*t+b;return c/2*((t-=2)*t*t*t*t+2)+b},easeInSine:function(x,t,b,c,d){return-c*Math.cos(t/d*(Math.PI/2))+c+b},easeOutSine:function(x,t,b,c,d){return c*Math.sin(t/d*(Math.PI/2))+b},easeInOutSine:function(x,t,b,c,d){return-c/2*(Math.cos(Math.PI*t/d)-1)+b},easeInExpo:function(x,t,b,c,d){return t==0?b:c*Math.pow(2,10*(t/d-1))+b},easeOutExpo:function(x,t,b,c,d){return t==d?b+c:c*(-Math.pow(2,-10*t/d)+1)+b},easeInOutExpo:function(x,t,b,c,d){if(t==0)return b;if(t==d)return b+c;if((t/=d/2)<1)return c/2*Math.pow(2,10*(t-1))+b;return c/2*(-Math.pow(2,-10*--t)+2)+b},easeInCirc:function(x,t,b,c,d){return-c*(Math.sqrt(1-(t/=d)*t)-1)+b},easeOutCirc:function(x,t,b,c,d){return c*Math.sqrt(1-(t=t/d-1)*t)+b},easeInOutCirc:function(x,t,b,c,d){if((t/=d/2)<1)return-c/2*(Math.sqrt(1-t*t)-1)+b;return c/2*(Math.sqrt(1-(t-=2)*t)+1)+b},easeInElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;if(ad?a.getScrollLeft()>=a.page.maxw:0>=a.getScrollLeft())&&(e=d,d=0));d&&(a.scrollmom&&a.scrollmom.stop(),a.lastdeltax+=d,a.debounced("mousewheelx",function(){var b=a.lastdeltax;a.lastdeltax=0;a.rail.drag||a.doScrollLeftBy(b)},15));if(e){if(a.opt.nativeparentscrolling&&c&&!a.ispage&&!a.zoomactive)if(0>e){if(a.getScrollTop()>=a.page.maxh)return!0}else if(0>=a.getScrollTop())return!0;a.scrollmom&&a.scrollmom.stop();a.lastdeltay+=e;a.debounced("mousewheely", 13 | function(){var b=a.lastdeltay;a.lastdeltay=0;a.rail.drag||a.doScrollBy(b)},15)}b.stopImmediatePropagation();return b.preventDefault()}var a=this;this.version="3.6.0";this.name="nicescroll";this.me=c;this.opt={doc:f("body"),win:!1};f.extend(this.opt,I);this.opt.snapbackspeed=80;if(k)for(var G in a.opt)"undefined"!=typeof k[G]&&(a.opt[G]=k[G]);this.iddoc=(this.doc=a.opt.doc)&&this.doc[0]?this.doc[0].id||"":"";this.ispage=/^BODY|HTML/.test(a.opt.win?a.opt.win[0].nodeName:this.doc[0].nodeName);this.haswrapper= 14 | !1!==a.opt.win;this.win=a.opt.win||(this.ispage?f(window):this.doc);this.docscroll=this.ispage&&!this.haswrapper?f(window):this.win;this.body=f("body");this.iframe=this.isfixed=this.viewport=!1;this.isiframe="IFRAME"==this.doc[0].nodeName&&"IFRAME"==this.win[0].nodeName;this.istextarea="TEXTAREA"==this.win[0].nodeName;this.forcescreen=!1;this.canshowonmouseevent="scroll"!=a.opt.autohidemode;this.page=this.view=this.onzoomout=this.onzoomin=this.onscrollcancel=this.onscrollend=this.onscrollstart=this.onclick= 15 | this.ongesturezoom=this.onkeypress=this.onmousewheel=this.onmousemove=this.onmouseup=this.onmousedown=!1;this.scroll={x:0,y:0};this.scrollratio={x:0,y:0};this.cursorheight=20;this.scrollvaluemax=0;this.isrtlmode="auto"==this.opt.rtlmode?"rtl"==(this.win[0]==window?this.body:this.win).css("direction"):!0===this.opt.rtlmode;this.observerbody=this.observerremover=this.observer=this.scrollmom=this.scrollrunning=!1;do this.id="ascrail"+O++;while(document.getElementById(this.id));this.hasmousefocus=this.hasfocus= 16 | this.zoomactive=this.zoom=this.selectiondrag=this.cursorfreezed=this.cursor=this.rail=!1;this.visibility=!0;this.hidden=this.locked=this.railslocked=!1;this.cursoractive=!0;this.wheelprevented=!1;this.overflowx=a.opt.overflowx;this.overflowy=a.opt.overflowy;this.nativescrollingarea=!1;this.checkarea=0;this.events=[];this.saved={};this.delaylist={};this.synclist={};this.lastdeltay=this.lastdeltax=0;this.detected=Q();var e=f.extend({},this.detected);this.ishwscroll=(this.canhwscroll=e.hastransform&& 17 | a.opt.hwacceleration)&&a.haswrapper;this.hasreversehr=this.isrtlmode&&!e.iswebkit;this.istouchcapable=!1;!e.cantouch||e.isios||e.isandroid||!e.iswebkit&&!e.ismozilla||(this.istouchcapable=!0,e.cantouch=!1);a.opt.enablemouselockapi||(e.hasmousecapture=!1,e.haspointerlock=!1);this.debounced=function(b,g,c){var d=a.delaylist[b];a.delaylist[b]=g;d||setTimeout(function(){var g=a.delaylist[b];a.delaylist[b]=!1;g.call(a)},c)};var r=!1;this.synched=function(b,g){a.synclist[b]=g;(function(){r||(s(function(){r= 18 | !1;for(var b in a.synclist){var g=a.synclist[b];g&&g.call(a);a.synclist[b]=!1}}),r=!0)})();return b};this.unsynched=function(b){a.synclist[b]&&(a.synclist[b]=!1)};this.css=function(b,g){for(var c in g)a.saved.css.push([b,c,b.css(c)]),b.css(c,g[c])};this.scrollTop=function(b){return"undefined"==typeof b?a.getScrollTop():a.setScrollTop(b)};this.scrollLeft=function(b){return"undefined"==typeof b?a.getScrollLeft():a.setScrollLeft(b)};var A=function(a,g,c,d,e,f,h){this.st=a;this.ed=g;this.spd=c;this.p1= 19 | d||0;this.p2=e||1;this.p3=f||0;this.p4=h||1;this.ts=(new Date).getTime();this.df=this.ed-this.st};A.prototype={B2:function(a){return 3*a*a*(1-a)},B3:function(a){return 3*a*(1-a)*(1-a)},B4:function(a){return(1-a)*(1-a)*(1-a)},getNow:function(){var a=1-((new Date).getTime()-this.ts)/this.spd,g=this.B2(a)+this.B3(a)+this.B4(a);return 0>a?this.ed:this.st+Math.round(this.df*g)},update:function(a,g){this.st=this.getNow();this.ed=a;this.spd=g;this.ts=(new Date).getTime();this.df=this.ed-this.st;return this}}; 20 | if(this.ishwscroll){this.doc.translate={x:0,y:0,tx:"0px",ty:"0px"};e.hastranslate3d&&e.isios&&this.doc.css("-webkit-backface-visibility","hidden");this.getScrollTop=function(b){if(!b){if(b=h())return 16==b.length?-b[13]:-b[5];if(a.timerscroll&&a.timerscroll.bz)return a.timerscroll.bz.getNow()}return a.doc.translate.y};this.getScrollLeft=function(b){if(!b){if(b=h())return 16==b.length?-b[12]:-b[4];if(a.timerscroll&&a.timerscroll.bh)return a.timerscroll.bh.getNow()}return a.doc.translate.x};this.notifyScrollEvent= 21 | function(a){var g=document.createEvent("UIEvents");g.initUIEvent("scroll",!1,!0,window,1);g.niceevent=!0;a.dispatchEvent(g)};var K=this.isrtlmode?1:-1;e.hastranslate3d&&a.opt.enabletranslate3d?(this.setScrollTop=function(b,g){a.doc.translate.y=b;a.doc.translate.ty=-1*b+"px";a.doc.css(e.trstyle,"translate3d("+a.doc.translate.tx+","+a.doc.translate.ty+",0px)");g||a.notifyScrollEvent(a.win[0])},this.setScrollLeft=function(b,g){a.doc.translate.x=b;a.doc.translate.tx=b*K+"px";a.doc.css(e.trstyle,"translate3d("+ 22 | a.doc.translate.tx+","+a.doc.translate.ty+",0px)");g||a.notifyScrollEvent(a.win[0])}):(this.setScrollTop=function(b,g){a.doc.translate.y=b;a.doc.translate.ty=-1*b+"px";a.doc.css(e.trstyle,"translate("+a.doc.translate.tx+","+a.doc.translate.ty+")");g||a.notifyScrollEvent(a.win[0])},this.setScrollLeft=function(b,g){a.doc.translate.x=b;a.doc.translate.tx=b*K+"px";a.doc.css(e.trstyle,"translate("+a.doc.translate.tx+","+a.doc.translate.ty+")");g||a.notifyScrollEvent(a.win[0])})}else this.getScrollTop= 23 | function(){return a.docscroll.scrollTop()},this.setScrollTop=function(b){return a.docscroll.scrollTop(b)},this.getScrollLeft=function(){return a.detected.ismozilla&&a.isrtlmode?Math.abs(a.docscroll.scrollLeft()):a.docscroll.scrollLeft()},this.setScrollLeft=function(b){return a.docscroll.scrollLeft(a.detected.ismozilla&&a.isrtlmode?-b:b)};this.getTarget=function(a){return a?a.target?a.target:a.srcElement?a.srcElement:!1:!1};this.hasParent=function(a,g){if(!a)return!1;for(var c=a.target||a.srcElement|| 24 | a||!1;c&&c.id!=g;)c=c.parentNode||!1;return!1!==c};var w={thin:1,medium:3,thick:5};this.getDocumentScrollOffset=function(){return{top:window.pageYOffset||document.documentElement.scrollTop,left:window.pageXOffset||document.documentElement.scrollLeft}};this.getOffset=function(){if(a.isfixed){var b=a.win.offset(),g=a.getDocumentScrollOffset();b.top-=g.top;b.left-=g.left;return b}b=a.win.offset();if(!a.viewport)return b;g=a.viewport.offset();return{top:b.top-g.top,left:b.left-g.left}};this.updateScrollBar= 25 | function(b){if(a.ishwscroll)a.rail.css({height:a.win.innerHeight()-(a.opt.railpadding.top+a.opt.railpadding.bottom)}),a.railh&&a.railh.css({width:a.win.innerWidth()-(a.opt.railpadding.left+a.opt.railpadding.right)});else{var g=a.getOffset(),c=g.top,e=g.left-(a.opt.railpadding.left+a.opt.railpadding.right),c=c+d(a.win,"border-top-width",!0),e=e+(a.rail.align?a.win.outerWidth()-d(a.win,"border-right-width")-a.rail.width:d(a.win,"border-left-width")),f=a.opt.railoffset;f&&(f.top&&(c+=f.top),a.rail.align&& 26 | f.left&&(e+=f.left));a.railslocked||a.rail.css({top:c,left:e,height:(b?b.h:a.win.innerHeight())-(a.opt.railpadding.top+a.opt.railpadding.bottom)});a.zoom&&a.zoom.css({top:c+1,left:1==a.rail.align?e-20:e+a.rail.width+4});if(a.railh&&!a.railslocked){c=g.top;e=g.left;if(f=a.opt.railhoffset)f.top&&(c+=f.top),f.left&&(e+=f.left);b=a.railh.align?c+d(a.win,"border-top-width",!0)+a.win.innerHeight()-a.railh.height:c+d(a.win,"border-top-width",!0);e+=d(a.win,"border-left-width");a.railh.css({top:b-(a.opt.railpadding.top+ 27 | a.opt.railpadding.bottom),left:e,width:a.railh.width})}}};this.doRailClick=function(b,g,c){var e;a.railslocked||(a.cancelEvent(b),g?(g=c?a.doScrollLeft:a.doScrollTop,e=c?(b.pageX-a.railh.offset().left-a.cursorwidth/2)*a.scrollratio.x:(b.pageY-a.rail.offset().top-a.cursorheight/2)*a.scrollratio.y,g(e)):(g=c?a.doScrollLeftBy:a.doScrollBy,e=c?a.scroll.x:a.scroll.y,b=c?b.pageX-a.railh.offset().left:b.pageY-a.rail.offset().top,c=c?a.view.w:a.view.h,g(e>=b?c:-c)))};a.hasanimationframe=s;a.hascancelanimationframe= 28 | t;a.hasanimationframe?a.hascancelanimationframe||(t=function(){a.cancelAnimationFrame=!0}):(s=function(a){return setTimeout(a,15-Math.floor(+new Date/1E3)%16)},t=clearInterval);this.init=function(){a.saved.css=[];if(e.isie7mobile||e.isoperamini)return!0;e.hasmstouch&&a.css(a.ispage?f("html"):a.win,{"-ms-touch-action":"none"});a.zindex="auto";a.zindex=a.ispage||"auto"!=a.opt.zindex?a.opt.zindex:m()||"auto";!a.ispage&&"auto"!=a.zindex&&a.zindex>x&&(x=a.zindex);a.isie&&0==a.zindex&&"auto"==a.opt.zindex&& 29 | (a.zindex="auto");if(!a.ispage||!e.cantouch&&!e.isieold&&!e.isie9mobile){var b=a.docscroll;a.ispage&&(b=a.haswrapper?a.win:a.doc);e.isie9mobile||a.css(b,{"overflow-y":"hidden"});a.ispage&&e.isie7&&("BODY"==a.doc[0].nodeName?a.css(f("html"),{"overflow-y":"hidden"}):"HTML"==a.doc[0].nodeName&&a.css(f("body"),{"overflow-y":"hidden"}));!e.isios||a.ispage||a.haswrapper||a.css(f("body"),{"-webkit-overflow-scrolling":"touch"});var g=f(document.createElement("div"));g.css({position:"relative",top:0,"float":"right", 30 | width:a.opt.cursorwidth,height:"0px","background-color":a.opt.cursorcolor,border:a.opt.cursorborder,"background-clip":"padding-box","-webkit-border-radius":a.opt.cursorborderradius,"-moz-border-radius":a.opt.cursorborderradius,"border-radius":a.opt.cursorborderradius});g.hborder=parseFloat(g.outerHeight()-g.innerHeight());g.addClass("nicescroll-cursors");a.cursor=g;var c=f(document.createElement("div"));c.attr("id",a.id);c.addClass("nicescroll-rails nicescroll-rails-vr");var d,h,k=["left","right", 31 | "top","bottom"],J;for(J in k)h=k[J],(d=a.opt.railpadding[h])?c.css("padding-"+h,d+"px"):a.opt.railpadding[h]=0;c.append(g);c.width=Math.max(parseFloat(a.opt.cursorwidth),g.outerWidth());c.css({width:c.width+"px",zIndex:a.zindex,background:a.opt.background,cursor:"default"});c.visibility=!0;c.scrollable=!0;c.align="left"==a.opt.railalign?0:1;a.rail=c;g=a.rail.drag=!1;!a.opt.boxzoom||a.ispage||e.isieold||(g=document.createElement("div"),a.bind(g,"click",a.doZoom),a.bind(g,"mouseenter",function(){a.zoom.css("opacity", 32 | a.opt.cursoropacitymax)}),a.bind(g,"mouseleave",function(){a.zoom.css("opacity",a.opt.cursoropacitymin)}),a.zoom=f(g),a.zoom.css({cursor:"pointer","z-index":a.zindex,backgroundImage:"url("+a.opt.scriptpath+"zoomico.png)",height:18,width:18,backgroundPosition:"0px 0px"}),a.opt.dblclickzoom&&a.bind(a.win,"dblclick",a.doZoom),e.cantouch&&a.opt.gesturezoom&&(a.ongesturezoom=function(b){1.5b.scale&&a.doZoomOut(b);return a.cancelEvent(b)},a.bind(a.win,"gestureend",a.ongesturezoom))); 33 | a.railh=!1;var l;a.opt.horizrailenabled&&(a.css(b,{"overflow-x":"hidden"}),g=f(document.createElement("div")),g.css({position:"absolute",top:0,height:a.opt.cursorwidth,width:"0px","background-color":a.opt.cursorcolor,border:a.opt.cursorborder,"background-clip":"padding-box","-webkit-border-radius":a.opt.cursorborderradius,"-moz-border-radius":a.opt.cursorborderradius,"border-radius":a.opt.cursorborderradius}),e.isieold&&g.css({overflow:"hidden"}),g.wborder=parseFloat(g.outerWidth()-g.innerWidth()), 34 | g.addClass("nicescroll-cursors"),a.cursorh=g,l=f(document.createElement("div")),l.attr("id",a.id+"-hr"),l.addClass("nicescroll-rails nicescroll-rails-hr"),l.height=Math.max(parseFloat(a.opt.cursorwidth),g.outerHeight()),l.css({height:l.height+"px",zIndex:a.zindex,background:a.opt.background}),l.append(g),l.visibility=!0,l.scrollable=!0,l.align="top"==a.opt.railvalign?0:1,a.railh=l,a.railh.drag=!1);a.ispage?(c.css({position:"fixed",top:"0px",height:"100%"}),c.align?c.css({right:"0px"}):c.css({left:"0px"}), 35 | a.body.append(c),a.railh&&(l.css({position:"fixed",left:"0px",width:"100%"}),l.align?l.css({bottom:"0px"}):l.css({top:"0px"}),a.body.append(l))):(a.ishwscroll?("static"==a.win.css("position")&&a.css(a.win,{position:"relative"}),b="HTML"==a.win[0].nodeName?a.body:a.win,f(b).scrollTop(0).scrollLeft(0),a.zoom&&(a.zoom.css({position:"absolute",top:1,right:0,"margin-right":c.width+4}),b.append(a.zoom)),c.css({position:"absolute",top:0}),c.align?c.css({right:0}):c.css({left:0}),b.append(c),l&&(l.css({position:"absolute", 36 | left:0,bottom:0}),l.align?l.css({bottom:0}):l.css({top:0}),b.append(l))):(a.isfixed="fixed"==a.win.css("position"),b=a.isfixed?"fixed":"absolute",a.isfixed||(a.viewport=a.getViewport(a.win[0])),a.viewport&&(a.body=a.viewport,0==/fixed|absolute/.test(a.viewport.css("position"))&&a.css(a.viewport,{position:"relative"})),c.css({position:b}),a.zoom&&a.zoom.css({position:b}),a.updateScrollBar(),a.body.append(c),a.zoom&&a.body.append(a.zoom),a.railh&&(l.css({position:b}),a.body.append(l))),e.isios&&a.css(a.win, 37 | {"-webkit-tap-highlight-color":"rgba(0,0,0,0)","-webkit-touch-callout":"none"}),e.isie&&a.opt.disableoutline&&a.win.attr("hideFocus","true"),e.iswebkit&&a.opt.disableoutline&&a.win.css({outline:"none"}));!1===a.opt.autohidemode?(a.autohidedom=!1,a.rail.css({opacity:a.opt.cursoropacitymax}),a.railh&&a.railh.css({opacity:a.opt.cursoropacitymax})):!0===a.opt.autohidemode||"leave"===a.opt.autohidemode?(a.autohidedom=f().add(a.rail),e.isie8&&(a.autohidedom=a.autohidedom.add(a.cursor)),a.railh&&(a.autohidedom= 38 | a.autohidedom.add(a.railh)),a.railh&&e.isie8&&(a.autohidedom=a.autohidedom.add(a.cursorh))):"scroll"==a.opt.autohidemode?(a.autohidedom=f().add(a.rail),a.railh&&(a.autohidedom=a.autohidedom.add(a.railh))):"cursor"==a.opt.autohidemode?(a.autohidedom=f().add(a.cursor),a.railh&&(a.autohidedom=a.autohidedom.add(a.cursorh))):"hidden"==a.opt.autohidemode&&(a.autohidedom=!1,a.hide(),a.railslocked=!1);if(e.isie9mobile)a.scrollmom=new L(a),a.onmangotouch=function(){var b=a.getScrollTop(),c=a.getScrollLeft(); 39 | if(b==a.scrollmom.lastscrolly&&c==a.scrollmom.lastscrollx)return!0;var g=b-a.mangotouch.sy,e=c-a.mangotouch.sx;if(0!=Math.round(Math.sqrt(Math.pow(e,2)+Math.pow(g,2)))){var d=0>g?-1:1,f=0>e?-1:1,q=+new Date;a.mangotouch.lazy&&clearTimeout(a.mangotouch.lazy);80k?k=Math.round(k/2):k>a.page.maxh&&(k=a.page.maxh+Math.round((k-a.page.maxh)/2)):(0>k&&(q=k=0),k>a.page.maxh&&(k=a.page.maxh,q=0));var l;a.railh&&a.railh.scrollable&&(l=a.isrtlmode?u-a.rail.drag.sl:a.rail.drag.sl-u,a.ishwscroll&&a.opt.bouncescroll?0>l?l=Math.round(l/2):l>a.page.maxw&&(l=a.page.maxw+Math.round((l-a.page.maxw)/2)):(0>l&&(h=l=0),l>a.page.maxw&&(l=a.page.maxw,h=0)));g=!1;if(a.rail.drag.dl)g= 48 | !0,"v"==a.rail.drag.dl?l=a.rail.drag.sl:"h"==a.rail.drag.dl&&(k=a.rail.drag.st);else{d=Math.abs(d);var u=Math.abs(u),z=a.opt.directionlockdeadzone;if("v"==a.rail.drag.ck){if(d>z&&u<=.3*d)return a.rail.drag=!1,!0;u>z&&(a.rail.drag.dl="f",f("body").scrollTop(f("body").scrollTop()))}else if("h"==a.rail.drag.ck){if(u>z&&d<=.3*u)return a.rail.drag=!1,!0;d>z&&(a.rail.drag.dl="f",f("body").scrollLeft(f("body").scrollLeft()))}}a.synched("touchmove",function(){a.rail.drag&&2==a.rail.drag.pt&&(a.prepareTransition&& 49 | a.prepareTransition(0),a.rail.scrollable&&a.setScrollTop(k),a.scrollmom.update(h,q),a.railh&&a.railh.scrollable?(a.setScrollLeft(l),a.showCursor(k,l)):a.showCursor(k),e.isie10&&document.selection.clear())});e.ischrome&&a.istouchcapable&&(g=!1);if(g)return a.cancelEvent(b)}else if(1==a.rail.drag.pt)return a.onmousemove(b)}}a.onmousedown=function(b,c){if(!a.rail.drag||1==a.rail.drag.pt){if(a.railslocked)return a.cancelEvent(b);a.cancelScroll();a.rail.drag={x:b.clientX,y:b.clientY,sx:a.scroll.x,sy:a.scroll.y, 50 | pt:1,hr:!!c};var g=a.getTarget(b);!a.ispage&&e.hasmousecapture&&g.setCapture();a.isiframe&&!e.hasmousecapture&&(a.saved.csspointerevents=a.doc.css("pointer-events"),a.css(a.doc,{"pointer-events":"none"}));a.hasmoving=!1;return a.cancelEvent(b)}};a.onmouseup=function(b){if(a.rail.drag){if(1!=a.rail.drag.pt)return!0;e.hasmousecapture&&document.releaseCapture();a.isiframe&&!e.hasmousecapture&&a.doc.css("pointer-events",a.saved.csspointerevents);a.rail.drag=!1;a.hasmoving&&a.triggerScrollEnd();return a.cancelEvent(b)}}; 51 | a.onmousemove=function(b){if(a.rail.drag&&1==a.rail.drag.pt){if(e.ischrome&&0==b.which)return a.onmouseup(b);a.cursorfreezed=!0;a.hasmoving=!0;if(a.rail.drag.hr){a.scroll.x=a.rail.drag.sx+(b.clientX-a.rail.drag.x);0>a.scroll.x&&(a.scroll.x=0);var c=a.scrollvaluemaxw;a.scroll.x>c&&(a.scroll.x=c)}else a.scroll.y=a.rail.drag.sy+(b.clientY-a.rail.drag.y),0>a.scroll.y&&(a.scroll.y=0),c=a.scrollvaluemax,a.scroll.y>c&&(a.scroll.y=c);a.synched("mousemove",function(){a.rail.drag&&1==a.rail.drag.pt&&(a.showCursor(), 52 | a.rail.drag.hr?a.hasreversehr?a.doScrollLeft(a.scrollvaluemaxw-Math.round(a.scroll.x*a.scrollratio.x),a.opt.cursordragspeed):a.doScrollLeft(Math.round(a.scroll.x*a.scrollratio.x),a.opt.cursordragspeed):a.doScrollTop(Math.round(a.scroll.y*a.scrollratio.y),a.opt.cursordragspeed))});return a.cancelEvent(b)}};if(e.cantouch||a.opt.touchbehavior)a.onpreventclick=function(b){if(a.preventclick)return a.preventclick.tg.onclick=a.preventclick.click,a.preventclick=!1,a.cancelEvent(b)},a.bind(a.win,"mousedown", 53 | a.ontouchstart),a.onclick=e.isios?!1:function(b){return a.lastmouseup?(a.lastmouseup=!1,a.cancelEvent(b)):!0},a.opt.grabcursorenabled&&e.cursorgrabvalue&&(a.css(a.ispage?a.doc:a.win,{cursor:e.cursorgrabvalue}),a.css(a.rail,{cursor:e.cursorgrabvalue}));else{var p=function(b){if(a.selectiondrag){if(b){var c=a.win.outerHeight();b=b.pageY-a.selectiondrag.top;0=c&&(b-=c);a.selectiondrag.df=b}0!=a.selectiondrag.df&&(a.doScrollBy(2*-Math.floor(a.selectiondrag.df/6)),a.debounced("doselectionscroll", 54 | function(){p()},50))}};a.hasTextSelected="getSelection"in document?function(){return 0a.page.maxh?a.doScrollTop(a.page.maxh):(a.scroll.y=Math.round(a.getScrollTop()*(1/a.scrollratio.y)),a.scroll.x=Math.round(a.getScrollLeft()*(1/a.scrollratio.x)),a.cursoractive&&a.noticeCursor());a.scroll.y&&0==a.getScrollTop()&&a.doScrollTo(Math.floor(a.scroll.y*a.scrollratio.y));return a};this.resize=a.onResize;this.lazyResize=function(b){b=isNaN(b)?30:b;a.debounced("resize",a.resize,b);return a};this.jqbind=function(b, 80 | c,d){a.events.push({e:b,n:c,f:d,q:!0});f(b).bind(c,d)};this.bind=function(b,c,d,f){var h="jquery"in b?b[0]:b;"mousewheel"==c?window.addEventListener||"onwheel"in document?a._bind(h,"wheel",d,f||!1):(b="undefined"!=typeof document.onmousewheel?"mousewheel":"DOMMouseScroll",n(h,b,d,f||!1),"DOMMouseScroll"==b&&n(h,"MozMousePixelScroll",d,f||!1)):h.addEventListener?(e.cantouch&&/mouseup|mousedown|mousemove/.test(c)&&a._bind(h,"mousedown"==c?"touchstart":"mouseup"==c?"touchend":"touchmove",function(a){if(a.touches){if(2> 81 | a.touches.length){var b=a.touches.length?a.touches[0]:a;b.original=a;d.call(this,b)}}else a.changedTouches&&(b=a.changedTouches[0],b.original=a,d.call(this,b))},f||!1),a._bind(h,c,d,f||!1),e.cantouch&&"mouseup"==c&&a._bind(h,"touchcancel",d,f||!1)):a._bind(h,c,function(b){(b=b||window.event||!1)&&b.srcElement&&(b.target=b.srcElement);"pageY"in b||(b.pageX=b.clientX+document.documentElement.scrollLeft,b.pageY=b.clientY+document.documentElement.scrollTop);return!1===d.call(h,b)||!1===f?a.cancelEvent(b): 82 | !0})};e.haseventlistener?(this._bind=function(b,c,d,e){a.events.push({e:b,n:c,f:d,b:e,q:!1});b.addEventListener(c,d,e||!1)},this.cancelEvent=function(a){if(!a)return!1;a=a.original?a.original:a;a.preventDefault();a.stopPropagation();a.preventManipulation&&a.preventManipulation();return!1},this.stopPropagation=function(a){if(!a)return!1;a=a.original?a.original:a;a.stopPropagation();return!1},this._unbind=function(a,c,d,e){a.removeEventListener(c,d,e)}):(this._bind=function(b,c,d,e){a.events.push({e:b, 83 | n:c,f:d,b:e,q:!1});b.attachEvent?b.attachEvent("on"+c,d):b["on"+c]=d},this.cancelEvent=function(a){a=window.event||!1;if(!a)return!1;a.cancelBubble=!0;a.cancel=!0;return a.returnValue=!1},this.stopPropagation=function(a){a=window.event||!1;if(!a)return!1;a.cancelBubble=!0;return!1},this._unbind=function(a,c,d,e){a.detachEvent?a.detachEvent("on"+c,d):a["on"+c]=!1});this.unbindAll=function(){for(var b=0;b(a.newscrolly- 93 | f)*(c-f)||0>(a.newscrollx-h)*(b-h))&&a.cancelScroll();0==a.opt.bouncescroll&&(0>c?c=0:c>a.page.maxh&&(c=a.page.maxh),0>b?b=0:b>a.page.maxw&&(b=a.page.maxw));if(a.scrollrunning&&b==a.newscrollx&&c==a.newscrolly)return!1;a.newscrolly=c;a.newscrollx=b;a.newscrollspeed=d||!1;if(a.timer)return!1;a.timer=setTimeout(function(){var d=a.getScrollTop(),f=a.getScrollLeft(),h,k;h=b-f;k=c-d;h=Math.round(Math.sqrt(Math.pow(h,2)+Math.pow(k,2)));h=a.newscrollspeed&&1=a.newscrollspeed&&(h*=a.newscrollspeed);a.prepareTransition(h,!0);a.timerscroll&&a.timerscroll.tm&&clearInterval(a.timerscroll.tm);0b?b=0:b>a.page.maxh&&(b=a.page.maxh);0>c?c=0:c>a.page.maxw&&(c=a.page.maxw);if(b!=a.newscrolly||c!=a.newscrollx)return a.doScrollPos(c,b,a.opt.snapbackspeed);a.onscrollend&&a.scrollrunning&&a.triggerScrollEnd();a.scrollrunning=!1}):(this.doScrollLeft= 98 | function(b,c){var d=a.scrollrunning?a.newscrolly:a.getScrollTop();a.doScrollPos(b,d,c)},this.doScrollTop=function(b,c){var d=a.scrollrunning?a.newscrollx:a.getScrollLeft();a.doScrollPos(d,b,c)},this.doScrollPos=function(b,c,d){function e(){if(a.cancelAnimationFrame)return!0;a.scrollrunning=!0;if(n=1-n)return a.timer=s(e)||1;var b=0,c,d,g=d=a.getScrollTop();if(a.dst.ay){g=a.bzscroll?a.dst.py+a.bzscroll.getNow()*a.dst.ay:a.newscrolly;c=g-d;if(0>c&&ga.newscrolly)g=a.newscrolly; 99 | a.setScrollTop(g);g==a.newscrolly&&(b=1)}else b=1;d=c=a.getScrollLeft();if(a.dst.ax){d=a.bzscroll?a.dst.px+a.bzscroll.getNow()*a.dst.ax:a.newscrollx;c=d-c;if(0>c&&da.newscrollx)d=a.newscrollx;a.setScrollLeft(d);d==a.newscrollx&&(b+=1)}else b+=1;2==b?(a.timer=0,a.cursorfreezed=!1,a.bzscroll=!1,a.scrollrunning=!1,0>g?g=0:g>a.page.maxh&&(g=a.page.maxh),0>d?d=0:d>a.page.maxw&&(d=a.page.maxw),d!=a.newscrollx||g!=a.newscrolly?a.doScrollPos(d,g):a.onscrollend&&a.triggerScrollEnd()): 100 | a.timer=s(e)||1}c="undefined"==typeof c||!1===c?a.getScrollTop(!0):c;if(a.timer&&a.newscrolly==c&&a.newscrollx==b)return!0;a.timer&&t(a.timer);a.timer=0;var f=a.getScrollTop(),h=a.getScrollLeft();(0>(a.newscrolly-f)*(c-f)||0>(a.newscrollx-h)*(b-h))&&a.cancelScroll();a.newscrolly=c;a.newscrollx=b;a.bouncescroll&&a.rail.visibility||(0>a.newscrolly?a.newscrolly=0:a.newscrolly>a.page.maxh&&(a.newscrolly=a.page.maxh));a.bouncescroll&&a.railh.visibility||(0>a.newscrollx?a.newscrollx=0:a.newscrollx>a.page.maxw&& 101 | (a.newscrollx=a.page.maxw));a.dst={};a.dst.x=b-h;a.dst.y=c-f;a.dst.px=h;a.dst.py=f;var k=Math.round(Math.sqrt(Math.pow(a.dst.x,2)+Math.pow(a.dst.y,2)));a.dst.ax=a.dst.x/k;a.dst.ay=a.dst.y/k;var l=0,m=k;0==a.dst.x?(l=f,m=c,a.dst.ay=1,a.dst.py=0):0==a.dst.y&&(l=h,m=b,a.dst.ax=1,a.dst.px=0);k=a.getTransitionSpeed(k);d&&1>=d&&(k*=d);a.bzscroll=0=a.page.maxh||h==a.page.maxw&&b>=a.page.maxw)&&a.checkContentSize(); 102 | var n=1;a.cancelAnimationFrame=!1;a.timer=1;a.onscrollstart&&!a.scrollrunning&&a.onscrollstart.call(a,{type:"scrollstart",current:{x:h,y:f},request:{x:b,y:c},end:{x:a.newscrollx,y:a.newscrolly},speed:k});e();(f==a.page.maxh&&c>=f||h==a.page.maxw&&b>=h)&&a.checkContentSize();a.noticeCursor()}},this.cancelScroll=function(){a.timer&&t(a.timer);a.timer=0;a.bzscroll=!1;a.scrollrunning=!1;return a}):(this.doScrollLeft=function(b,c){var d=a.getScrollTop();a.doScrollPos(b,d,c)},this.doScrollTop=function(b, 103 | c){var d=a.getScrollLeft();a.doScrollPos(d,b,c)},this.doScrollPos=function(b,c,d){var e=b>a.page.maxw?a.page.maxw:b;0>e&&(e=0);var f=c>a.page.maxh?a.page.maxh:c;0>f&&(f=0);a.synched("scroll",function(){a.setScrollTop(f);a.setScrollLeft(e)})},this.cancelScroll=function(){});this.doScrollBy=function(b,c){var d=0,d=c?Math.floor((a.scroll.y-b)*a.scrollratio.y):(a.timer?a.newscrolly:a.getScrollTop(!0))-b;if(a.bouncescroll){var e=Math.round(a.view.h/2);d<-e?d=-e:d>a.page.maxh+e&&(d=a.page.maxh+e)}a.cursorfreezed= 104 | !1;e=a.getScrollTop(!0);if(0>d&&0>=e)return a.noticeCursor();if(d>a.page.maxh&&e>=a.page.maxh)return a.checkContentSize(),a.noticeCursor();a.doScrollTop(d)};this.doScrollLeftBy=function(b,c){var d=0,d=c?Math.floor((a.scroll.x-b)*a.scrollratio.x):(a.timer?a.newscrollx:a.getScrollLeft(!0))-b;if(a.bouncescroll){var e=Math.round(a.view.w/2);d<-e?d=-e:d>a.page.maxw+e&&(d=a.page.maxw+e)}a.cursorfreezed=!1;e=a.getScrollLeft(!0);if(0>d&&0>=e||d>a.page.maxw&&e>=a.page.maxw)return a.noticeCursor();a.doScrollLeft(d)}; 105 | this.doScrollTo=function(b,c){c&&Math.round(b*a.scrollratio.y);a.cursorfreezed=!1;a.doScrollTop(b)};this.checkContentSize=function(){var b=a.getContentSize();b.h==a.page.h&&b.w==a.page.w||a.resize(!1,b)};a.onscroll=function(b){a.rail.drag||a.cursorfreezed||a.synched("scroll",function(){a.scroll.y=Math.round(a.getScrollTop()*(1/a.scrollratio.y));a.railh&&(a.scroll.x=Math.round(a.getScrollLeft()*(1/a.scrollratio.x)));a.noticeCursor()})};a.bind(a.docscroll,"scroll",a.onscroll);this.doZoomIn=function(b){if(!a.zoomactive){a.zoomactive= 106 | !0;a.zoomrestore={style:{}};var c="position top left zIndex backgroundColor marginTop marginBottom marginLeft marginRight".split(" "),d=a.win[0].style,h;for(h in c){var k=c[h];a.zoomrestore.style[k]="undefined"!=typeof d[k]?d[k]:""}a.zoomrestore.style.width=a.win.css("width");a.zoomrestore.style.height=a.win.css("height");a.zoomrestore.padding={w:a.win.outerWidth()-a.win.width(),h:a.win.outerHeight()-a.win.height()};e.isios4&&(a.zoomrestore.scrollTop=f(window).scrollTop(),f(window).scrollTop(0)); 107 | a.win.css({position:e.isios4?"absolute":"fixed",top:0,left:0,"z-index":x+100,margin:"0px"});c=a.win.css("backgroundColor");(""==c||/transparent|rgba\(0, 0, 0, 0\)|rgba\(0,0,0,0\)/.test(c))&&a.win.css("backgroundColor","#fff");a.rail.css({"z-index":x+101});a.zoom.css({"z-index":x+102});a.zoom.css("backgroundPosition","0px -18px");a.resizeZoom();a.onzoomin&&a.onzoomin.call(a);return a.cancelEvent(b)}};this.doZoomOut=function(b){if(a.zoomactive)return a.zoomactive=!1,a.win.css("margin",""),a.win.css(a.zoomrestore.style), 108 | e.isios4&&f(window).scrollTop(a.zoomrestore.scrollTop),a.rail.css({"z-index":a.zindex}),a.zoom.css({"z-index":a.zindex}),a.zoomrestore=!1,a.zoom.css("backgroundPosition","0px 0px"),a.onResize(),a.onzoomout&&a.onzoomout.call(a),a.cancelEvent(b)};this.doZoom=function(b){return a.zoomactive?a.doZoomOut(b):a.doZoomIn(b)};this.resizeZoom=function(){if(a.zoomactive){var b=a.getScrollTop();a.win.css({width:f(window).width()-a.zoomrestore.padding.w+"px",height:f(window).height()-a.zoomrestore.padding.h+"px"}); 109 | a.onResize();a.setScrollTop(Math.min(a.page.maxh,b))}};this.init();f.nicescroll.push(this)},L=function(f){var c=this;this.nc=f;this.steptime=this.lasttime=this.speedy=this.speedx=this.lasty=this.lastx=0;this.snapy=this.snapx=!1;this.demuly=this.demulx=0;this.lastscrolly=this.lastscrollx=-1;this.timer=this.chky=this.chkx=0;this.time=function(){return+new Date};this.reset=function(f,k){c.stop();var d=c.time();c.steptime=0;c.lasttime=d;c.speedx=0;c.speedy=0;c.lastx=f;c.lasty=k;c.lastscrollx=-1;c.lastscrolly= 110 | -1};this.update=function(f,k){var d=c.time();c.steptime=d-c.lasttime;c.lasttime=d;var d=k-c.lasty,n=f-c.lastx,p=c.nc.getScrollTop(),a=c.nc.getScrollLeft(),p=p+d,a=a+n;c.snapx=0>a||a>c.nc.page.maxw;c.snapy=0>p||p>c.nc.page.maxh;c.speedx=n;c.speedy=d;c.lastx=f;c.lasty=k};this.stop=function(){c.nc.unsynched("domomentum2d");c.timer&&clearTimeout(c.timer);c.timer=0;c.lastscrollx=-1;c.lastscrolly=-1};this.doSnapy=function(f,k){var d=!1;0>k?(k=0,d=!0):k>c.nc.page.maxh&&(k=c.nc.page.maxh,d=!0);0>f?(f=0,d= 111 | !0):f>c.nc.page.maxw&&(f=c.nc.page.maxw,d=!0);d?c.nc.doScrollPos(f,k,c.nc.opt.snapbackspeed):c.nc.triggerScrollEnd()};this.doMomentum=function(f){var k=c.time(),d=f?k+f:c.lasttime;f=c.nc.getScrollLeft();var n=c.nc.getScrollTop(),p=c.nc.page.maxh,a=c.nc.page.maxw;c.speedx=0=k-d;if(0>n||n>p||0>f||f>a)d=!1;f=c.speedx&&d?c.speedx:!1;if(c.speedy&&d&&c.speedy||f){var s=Math.max(16,c.steptime);50e||e>a)&&(d=.1);c.speedy&&(r=Math.floor(c.lastscrolly-c.speedy*(1-c.demulxy)),c.lastscrolly=r,0>r||r>p)&&(d=.1);c.demulxy=Math.min(1,c.demulxy+d);c.nc.synched("domomentum2d",function(){c.speedx&&(c.nc.getScrollLeft()!= 113 | c.chkx&&c.stop(),c.chkx=e,c.nc.setScrollLeft(e));c.speedy&&(c.nc.getScrollTop()!=c.chky&&c.stop(),c.chky=r,c.nc.setScrollTop(r));c.timer||(c.nc.hideCursor(),c.doSnapy(e,r))});1>c.demulxy?c.timer=setTimeout(t,s):(c.stop(),c.nc.hideCursor(),c.doSnapy(e,r))};t()}else c.doSnapy(c.nc.getScrollLeft(),c.nc.getScrollTop())}},w=f.fn.scrollTop;f.cssHooks.pageYOffset={get:function(k,c,h){return(c=f.data(k,"__nicescroll")||!1)&&c.ishwscroll?c.getScrollTop():w.call(k)},set:function(k,c){var h=f.data(k,"__nicescroll")|| 114 | !1;h&&h.ishwscroll?h.setScrollTop(parseInt(c)):w.call(k,c);return this}};f.fn.scrollTop=function(k){if("undefined"==typeof k){var c=this[0]?f.data(this[0],"__nicescroll")||!1:!1;return c&&c.ishwscroll?c.getScrollTop():w.call(this)}return this.each(function(){var c=f.data(this,"__nicescroll")||!1;c&&c.ishwscroll?c.setScrollTop(parseInt(k)):w.call(f(this),k)})};var B=f.fn.scrollLeft;f.cssHooks.pageXOffset={get:function(k,c,h){return(c=f.data(k,"__nicescroll")||!1)&&c.ishwscroll?c.getScrollLeft():B.call(k)}, 115 | set:function(k,c){var h=f.data(k,"__nicescroll")||!1;h&&h.ishwscroll?h.setScrollLeft(parseInt(c)):B.call(k,c);return this}};f.fn.scrollLeft=function(k){if("undefined"==typeof k){var c=this[0]?f.data(this[0],"__nicescroll")||!1:!1;return c&&c.ishwscroll?c.getScrollLeft():B.call(this)}return this.each(function(){var c=f.data(this,"__nicescroll")||!1;c&&c.ishwscroll?c.setScrollLeft(parseInt(k)):B.call(f(this),k)})};var C=function(k){var c=this;this.length=0;this.name="nicescrollarray";this.each=function(d){for(var f= 116 | 0,h=0;fb;b++)if(b in this&&this[b]===a)return b;return-1};b=function(){function a(){}return a.prototype.extend=function(a,b){var c,d;for(c in b)d=b[c],null==a[c]&&(a[c]=d);return a},a.prototype.isMobile=function(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)},a.prototype.addEvent=function(a,b,c){return null!=a.addEventListener?a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c},a.prototype.removeEvent=function(a,b,c){return null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete a[b]},a.prototype.innerHeight=function(){return"innerHeight"in window?window.innerHeight:document.documentElement.clientHeight},a}(),c=this.WeakMap||this.MozWeakMap||(c=function(){function a(){this.keys=[],this.values=[]}return a.prototype.get=function(a){var b,c,d,e,f;for(f=this.keys,b=d=0,e=f.length;e>d;b=++d)if(c=f[b],c===a)return this.values[b]},a.prototype.set=function(a,b){var c,d,e,f,g;for(g=this.keys,c=e=0,f=g.length;f>e;c=++e)if(d=g[c],d===a)return void(this.values[c]=b);return this.keys.push(a),this.values.push(b)},a}()),a=this.MutationObserver||this.WebkitMutationObserver||this.MozMutationObserver||(a=function(){function a(){"undefined"!=typeof console&&null!==console&&console.warn("MutationObserver is not supported by your browser."),"undefined"!=typeof console&&null!==console&&console.warn("WOW.js cannot detect dom mutations, please call .sync() after loading new content.")}return a.notSupported=!0,a.prototype.observe=function(){},a}()),d=this.getComputedStyle||function(a){return this.getPropertyValue=function(b){var c;return"float"===b&&(b="styleFloat"),e.test(b)&&b.replace(e,function(a,b){return b.toUpperCase()}),(null!=(c=a.currentStyle)?c[b]:void 0)||null},this},e=/(\-([a-z]){1})/g,this.WOW=function(){function e(a){null==a&&(a={}),this.scrollCallback=f(this.scrollCallback,this),this.scrollHandler=f(this.scrollHandler,this),this.start=f(this.start,this),this.scrolled=!0,this.config=this.util().extend(a,this.defaults),this.animationNameCache=new c}return e.prototype.defaults={boxClass:"wow",animateClass:"animated",offset:0,mobile:!0,live:!0},e.prototype.init=function(){var a;return this.element=window.document.documentElement,"interactive"===(a=document.readyState)||"complete"===a?this.start():this.util().addEvent(document,"DOMContentLoaded",this.start),this.finished=[]},e.prototype.start=function(){var b,c,d,e;if(this.stopped=!1,this.boxes=function(){var a,c,d,e;for(d=this.element.querySelectorAll("."+this.config.boxClass),e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.all=function(){var a,c,d,e;for(d=this.boxes,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.boxes.length)if(this.disabled())this.resetStyle();else for(e=this.boxes,c=0,d=e.length;d>c;c++)b=e[c],this.applyStyle(b,!0);return this.disabled()||(this.util().addEvent(window,"scroll",this.scrollHandler),this.util().addEvent(window,"resize",this.scrollHandler),this.interval=setInterval(this.scrollCallback,50)),this.config.live?new a(function(a){return function(b){var c,d,e,f,g;for(g=[],e=0,f=b.length;f>e;e++)d=b[e],g.push(function(){var a,b,e,f;for(e=d.addedNodes||[],f=[],a=0,b=e.length;b>a;a++)c=e[a],f.push(this.doSync(c));return f}.call(a));return g}}(this)).observe(document.body,{childList:!0,subtree:!0}):void 0},e.prototype.stop=function(){return this.stopped=!0,this.util().removeEvent(window,"scroll",this.scrollHandler),this.util().removeEvent(window,"resize",this.scrollHandler),null!=this.interval?clearInterval(this.interval):void 0},e.prototype.sync=function(){return a.notSupported?this.doSync(this.element):void 0},e.prototype.doSync=function(a){var b,c,d,e,f;if(null==a&&(a=this.element),1===a.nodeType){for(a=a.parentNode||a,e=a.querySelectorAll("."+this.config.boxClass),f=[],c=0,d=e.length;d>c;c++)b=e[c],g.call(this.all,b)<0?(this.boxes.push(b),this.all.push(b),this.stopped||this.disabled()?this.resetStyle():this.applyStyle(b,!0),f.push(this.scrolled=!0)):f.push(void 0);return f}},e.prototype.show=function(a){return this.applyStyle(a),a.className=""+a.className+" "+this.config.animateClass},e.prototype.applyStyle=function(a,b){var c,d,e;return d=a.getAttribute("data-wow-duration"),c=a.getAttribute("data-wow-delay"),e=a.getAttribute("data-wow-iteration"),this.animate(function(f){return function(){return f.customStyle(a,b,d,c,e)}}(this))},e.prototype.animate=function(){return"requestAnimationFrame"in window?function(a){return window.requestAnimationFrame(a)}:function(a){return a()}}(),e.prototype.resetStyle=function(){var a,b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(a.style.visibility="visible");return e},e.prototype.customStyle=function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a},e.prototype.vendors=["moz","webkit"],e.prototype.vendorSet=function(a,b){var c,d,e,f;f=[];for(c in b)d=b[c],a[""+c]=d,f.push(function(){var b,f,g,h;for(g=this.vendors,h=[],b=0,f=g.length;f>b;b++)e=g[b],h.push(a[""+e+c.charAt(0).toUpperCase()+c.substr(1)]=d);return h}.call(this));return f},e.prototype.vendorCSS=function(a,b){var c,e,f,g,h,i;for(e=d(a),c=e.getPropertyCSSValue(b),i=this.vendors,g=0,h=i.length;h>g;g++)f=i[g],c=c||e.getPropertyCSSValue("-"+f+"-"+b);return c},e.prototype.animationName=function(a){var b;try{b=this.vendorCSS(a,"animation-name").cssText}catch(c){b=d(a).getPropertyValue("animation-name")}return"none"===b?"":b},e.prototype.cacheAnimationName=function(a){return this.animationNameCache.set(a,this.animationName(a))},e.prototype.cachedAnimationName=function(a){return this.animationNameCache.get(a)},e.prototype.scrollHandler=function(){return this.scrolled=!0},e.prototype.scrollCallback=function(){var a;return!this.scrolled||(this.scrolled=!1,this.boxes=function(){var b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],a&&(this.isVisible(a)?this.show(a):e.push(a));return e}.call(this),this.boxes.length||this.config.live)?void 0:this.stop()},e.prototype.offsetTop=function(a){for(var b;void 0===a.offsetTop;)a=a.parentNode;for(b=a.offsetTop;a=a.offsetParent;)b+=a.offsetTop;return b},e.prototype.isVisible=function(a){var b,c,d,e,f;return c=a.getAttribute("data-wow-offset")||this.config.offset,f=window.pageYOffset,e=f+Math.min(this.element.clientHeight,this.util().innerHeight())-c,d=this.offsetTop(a),b=d+a.clientHeight,e>=d&&b>=f},e.prototype.util=function(){return null!=this._util?this._util:this._util=new b},e.prototype.disabled=function(){return!this.config.mobile&&this.util().isMobile(navigator.userAgent)},e}()}).call(this); --------------------------------------------------------------------------------